@e22m4u/ts-rest-router 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README-ru.md +227 -0
  2. package/README.md +227 -0
  3. package/dist/cjs/index.cjs +448 -153
  4. package/dist/esm/controller-registry.d.ts +53 -11
  5. package/dist/esm/controller-registry.js +242 -104
  6. package/dist/esm/debuggable-service.js +1 -1
  7. package/dist/esm/decorators/action/action-decorator.d.ts +7 -8
  8. package/dist/esm/decorators/action/action-decorator.js +1 -5
  9. package/dist/esm/decorators/action/action-decorator.spec.js +16 -16
  10. package/dist/esm/decorators/action/action-metadata.d.ts +0 -1
  11. package/dist/esm/decorators/after/after-decorator.d.ts +9 -0
  12. package/dist/esm/decorators/after/after-decorator.js +22 -0
  13. package/dist/esm/decorators/after/after-decorator.spec.d.ts +1 -0
  14. package/dist/esm/decorators/after/after-decorator.spec.js +115 -0
  15. package/dist/esm/decorators/after/after-metadata.d.ts +13 -0
  16. package/dist/esm/decorators/after/after-metadata.js +5 -0
  17. package/dist/esm/decorators/after/after-reflector.d.ts +22 -0
  18. package/dist/esm/decorators/after/after-reflector.js +29 -0
  19. package/dist/esm/decorators/after/after-reflector.spec.d.ts +1 -0
  20. package/dist/esm/decorators/after/after-reflector.spec.js +102 -0
  21. package/dist/esm/decorators/after/index.d.ts +3 -0
  22. package/dist/esm/decorators/after/index.js +3 -0
  23. package/dist/esm/decorators/before/before-decorator.d.ts +9 -0
  24. package/dist/esm/decorators/before/before-decorator.js +22 -0
  25. package/dist/esm/decorators/before/before-decorator.spec.d.ts +1 -0
  26. package/dist/esm/decorators/before/before-decorator.spec.js +115 -0
  27. package/dist/esm/decorators/before/before-metadata.d.ts +13 -0
  28. package/dist/esm/decorators/before/before-metadata.js +5 -0
  29. package/dist/esm/decorators/before/before-reflector.d.ts +22 -0
  30. package/dist/esm/decorators/before/before-reflector.js +29 -0
  31. package/dist/esm/decorators/before/before-reflector.spec.d.ts +1 -0
  32. package/dist/esm/decorators/before/before-reflector.spec.js +102 -0
  33. package/dist/esm/decorators/before/index.d.ts +3 -0
  34. package/dist/esm/decorators/before/index.js +3 -0
  35. package/dist/esm/decorators/controller/controller-decorator.d.ts +2 -1
  36. package/dist/esm/decorators/controller/controller-decorator.js +27 -6
  37. package/dist/esm/decorators/controller/controller-decorator.spec.js +37 -15
  38. package/dist/esm/decorators/controller/controller-metadata.d.ts +0 -1
  39. package/dist/esm/decorators/index.d.ts +2 -0
  40. package/dist/esm/decorators/index.js +2 -0
  41. package/dist/esm/decorators/request-context/request-context-decorator.d.ts +2 -3
  42. package/dist/esm/decorators/request-context/request-context-decorator.js +3 -6
  43. package/dist/esm/decorators/request-context/request-context-decorator.spec.js +2 -17
  44. package/dist/esm/decorators/request-context/request-context-metadata.d.ts +0 -1
  45. package/dist/esm/decorators/request-data/request-data-decorator.d.ts +7 -3
  46. package/dist/esm/decorators/request-data/request-data-decorator.js +16 -16
  47. package/dist/esm/decorators/request-data/request-data-decorator.spec.js +12 -10
  48. package/dist/esm/decorators/request-data/request-data-metadata.d.ts +0 -1
  49. package/dist/esm/utils/create-debugger.d.ts +35 -2
  50. package/dist/esm/utils/create-debugger.js +71 -5
  51. package/package.json +17 -17
  52. package/src/controller-registry.spec.ts +601 -275
  53. package/src/controller-registry.ts +263 -128
  54. package/src/debuggable-service.ts +1 -1
  55. package/src/decorators/action/action-decorator.spec.ts +16 -16
  56. package/src/decorators/action/action-decorator.ts +10 -12
  57. package/src/decorators/action/action-metadata.ts +0 -1
  58. package/src/decorators/after/after-decorator.spec.ts +92 -0
  59. package/src/decorators/after/after-decorator.ts +40 -0
  60. package/src/decorators/after/after-metadata.ts +17 -0
  61. package/src/decorators/after/after-reflector.spec.ts +107 -0
  62. package/src/decorators/after/after-reflector.ts +45 -0
  63. package/src/decorators/after/index.ts +3 -0
  64. package/src/decorators/before/before-decorator.spec.ts +92 -0
  65. package/src/decorators/before/before-decorator.ts +40 -0
  66. package/src/decorators/before/before-metadata.ts +17 -0
  67. package/src/decorators/before/before-reflector.spec.ts +111 -0
  68. package/src/decorators/before/before-reflector.ts +50 -0
  69. package/src/decorators/before/index.ts +3 -0
  70. package/src/decorators/controller/controller-decorator.spec.ts +33 -16
  71. package/src/decorators/controller/controller-decorator.ts +33 -6
  72. package/src/decorators/controller/controller-metadata.ts +0 -1
  73. package/src/decorators/index.ts +2 -0
  74. package/src/decorators/request-context/request-context-decorator.spec.ts +2 -15
  75. package/src/decorators/request-context/request-context-decorator.ts +3 -8
  76. package/src/decorators/request-context/request-context-metadata.ts +0 -1
  77. package/src/decorators/request-data/request-data-decorator.spec.ts +12 -11
  78. package/src/decorators/request-data/request-data-decorator.ts +41 -16
  79. package/src/decorators/request-data/request-data-metadata.ts +0 -1
  80. package/src/utils/create-debugger.ts +84 -7
@@ -29,10 +29,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
 
31
31
  // dist/esm/index.js
32
- var esm_exports = {};
33
- __export(esm_exports, {
32
+ var index_exports = {};
33
+ __export(index_exports, {
34
34
  ACTIONS_METADATA_KEY: () => ACTIONS_METADATA_KEY,
35
+ AFTER_METADATA_KEY: () => AFTER_METADATA_KEY,
35
36
  ActionReflector: () => ActionReflector,
37
+ AfterReflector: () => AfterReflector,
38
+ BEFORE_METADATA_KEY: () => BEFORE_METADATA_KEY,
39
+ BeforeReflector: () => BeforeReflector,
36
40
  CONTROLLER_METADATA_KEY: () => CONTROLLER_METADATA_KEY,
37
41
  ControllerReflector: () => ControllerReflector,
38
42
  ControllerRegistry: () => ControllerRegistry,
@@ -44,8 +48,10 @@ __export(esm_exports, {
44
48
  RequestDataSource: () => RequestDataSource,
45
49
  RestRouter: () => RestRouter,
46
50
  action: () => action,
51
+ after: () => after,
52
+ before: () => before,
47
53
  body: () => body,
48
- bodyParam: () => bodyParam,
54
+ bodyProp: () => bodyProp,
49
55
  capitalize: () => capitalize,
50
56
  controller: () => controller,
51
57
  cookie: () => cookie,
@@ -69,7 +75,7 @@ __export(esm_exports, {
69
75
  response: () => response,
70
76
  toCamelCase: () => toCamelCase
71
77
  });
72
- module.exports = __toCommonJS(esm_exports);
78
+ module.exports = __toCommonJS(index_exports);
73
79
 
74
80
  // dist/esm/utils/capitalize.js
75
81
  function capitalize(input) {
@@ -92,13 +98,38 @@ function toCamelCase(input) {
92
98
  __name(toCamelCase, "toCamelCase");
93
99
 
94
100
  // dist/esm/utils/create-debugger.js
101
+ var import_util = require("util");
95
102
  var import_debug = __toESM(require("debug"), 1);
96
103
  var import_js_format2 = require("@e22m4u/js-format");
104
+ function colorizeString(input) {
105
+ const c = Number(import_debug.default["selectColor"](input));
106
+ const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c);
107
+ return `${colorCode};1m${input}\x1B[0m`;
108
+ }
109
+ __name(colorizeString, "colorizeString");
97
110
  function createDebugger(name) {
98
- const debug = (0, import_debug.default)(`tsRestRouter:${name}`);
99
- return function(message, ...args) {
100
- const interpolatedMessage = (0, import_js_format2.format)(message, ...args);
101
- return debug(interpolatedMessage);
111
+ const debuggerName = `tsRestRouter:${name}`;
112
+ const debug = (0, import_debug.default)(debuggerName);
113
+ return function(messageOrData, ...args) {
114
+ let prefix = "";
115
+ if (typeof this === "string") {
116
+ const isDebugUsesColors = debug.useColors;
117
+ prefix = isDebugUsesColors ? colorizeString(`[${this}] `) : `[${this}] `;
118
+ }
119
+ if (typeof messageOrData === "string") {
120
+ const interpolatedMessage = (0, import_js_format2.format)(messageOrData, ...args);
121
+ return debug(prefix + interpolatedMessage);
122
+ }
123
+ const inspectOptions = {
124
+ showHidden: false,
125
+ depth: null,
126
+ colors: true,
127
+ compact: false
128
+ };
129
+ const multiString = (0, import_util.inspect)(messageOrData, inspectOptions);
130
+ const rows = multiString.split("\n");
131
+ const colorizedDebuggerName = colorizeString(debuggerName);
132
+ [...args, ...rows].forEach((v) => console.log(` ${colorizedDebuggerName} ${prefix}${v}`));
102
133
  };
103
134
  }
104
135
  __name(createDebugger, "createDebugger");
@@ -122,7 +153,7 @@ var _DebuggableService = class _DebuggableService extends import_js_service.Serv
122
153
  super(container);
123
154
  const serviceName = toCamelCase(this.constructor.name);
124
155
  this.debug = createDebugger(serviceName);
125
- this.debug("%v is created.", this.constructor);
156
+ this.debug.bind("constructor")("Service created.");
126
157
  }
127
158
  };
128
159
  __name(_DebuggableService, "DebuggableService");
@@ -132,14 +163,113 @@ var DebuggableService = _DebuggableService;
132
163
  var import_js_format4 = require("@e22m4u/js-format");
133
164
  var import_js_trie_router2 = require("@e22m4u/js-trie-router");
134
165
  var import_ts_data_schema2 = require("@e22m4u/ts-data-schema");
135
- var import_ts_data_schema3 = require("@e22m4u/ts-data-schema");
136
166
 
137
- // dist/esm/decorators/action/action-metadata.js
167
+ // dist/esm/decorators/after/after-metadata.js
138
168
  var import_ts_reflector = require("@e22m4u/ts-reflector");
139
- var ACTIONS_METADATA_KEY = new import_ts_reflector.MetadataKey("actionsMetadataKey");
169
+ var AFTER_METADATA_KEY = new import_ts_reflector.MetadataKey("afterMetadataKey");
140
170
 
141
- // dist/esm/decorators/action/action-reflector.js
171
+ // dist/esm/decorators/after/after-reflector.js
142
172
  var import_ts_reflector2 = require("@e22m4u/ts-reflector");
173
+ var _AfterReflector = class _AfterReflector {
174
+ /**
175
+ * Set metadata.
176
+ *
177
+ * @param metadata
178
+ * @param target
179
+ * @param propertyKey
180
+ */
181
+ static addMetadata(metadata, target, propertyKey) {
182
+ const oldArray = import_ts_reflector2.Reflector.getOwnMetadata(AFTER_METADATA_KEY, target, propertyKey) ?? [];
183
+ const newArray = [metadata, ...oldArray];
184
+ import_ts_reflector2.Reflector.defineMetadata(AFTER_METADATA_KEY, newArray, target, propertyKey);
185
+ }
186
+ /**
187
+ * Get metadata.
188
+ *
189
+ * @param target
190
+ * @param propertyKey
191
+ */
192
+ static getMetadata(target, propertyKey) {
193
+ const metadata = import_ts_reflector2.Reflector.getOwnMetadata(AFTER_METADATA_KEY, target, propertyKey);
194
+ return metadata ?? [];
195
+ }
196
+ };
197
+ __name(_AfterReflector, "AfterReflector");
198
+ var AfterReflector = _AfterReflector;
199
+
200
+ // dist/esm/decorators/after/after-decorator.js
201
+ var import_ts_reflector3 = require("@e22m4u/ts-reflector");
202
+ var import_ts_reflector4 = require("@e22m4u/ts-reflector");
203
+ function after(middleware) {
204
+ return function(target, propertyKey, descriptor) {
205
+ const decoratorType = (0, import_ts_reflector4.getDecoratorTargetType)(target, propertyKey, descriptor);
206
+ if (decoratorType === import_ts_reflector3.DecoratorTargetType.CONSTRUCTOR) {
207
+ AfterReflector.addMetadata({ middleware }, target);
208
+ } else if (decoratorType === import_ts_reflector3.DecoratorTargetType.INSTANCE_METHOD) {
209
+ AfterReflector.addMetadata({ propertyKey, middleware }, target.constructor, propertyKey);
210
+ } else {
211
+ throw new Error("@after decorator is only supported on a class or an instance method.");
212
+ }
213
+ };
214
+ }
215
+ __name(after, "after");
216
+
217
+ // dist/esm/decorators/before/before-metadata.js
218
+ var import_ts_reflector5 = require("@e22m4u/ts-reflector");
219
+ var BEFORE_METADATA_KEY = new import_ts_reflector5.MetadataKey("beforeMetadataKey");
220
+
221
+ // dist/esm/decorators/before/before-reflector.js
222
+ var import_ts_reflector6 = require("@e22m4u/ts-reflector");
223
+ var _BeforeReflector = class _BeforeReflector {
224
+ /**
225
+ * Set metadata.
226
+ *
227
+ * @param metadata
228
+ * @param target
229
+ * @param propertyKey
230
+ */
231
+ static addMetadata(metadata, target, propertyKey) {
232
+ const oldArray = import_ts_reflector6.Reflector.getOwnMetadata(BEFORE_METADATA_KEY, target, propertyKey) ?? [];
233
+ const newArray = [metadata, ...oldArray];
234
+ import_ts_reflector6.Reflector.defineMetadata(BEFORE_METADATA_KEY, newArray, target, propertyKey);
235
+ }
236
+ /**
237
+ * Get metadata.
238
+ *
239
+ * @param target
240
+ * @param propertyKey
241
+ */
242
+ static getMetadata(target, propertyKey) {
243
+ const metadata = import_ts_reflector6.Reflector.getOwnMetadata(BEFORE_METADATA_KEY, target, propertyKey);
244
+ return metadata ?? [];
245
+ }
246
+ };
247
+ __name(_BeforeReflector, "BeforeReflector");
248
+ var BeforeReflector = _BeforeReflector;
249
+
250
+ // dist/esm/decorators/before/before-decorator.js
251
+ var import_ts_reflector7 = require("@e22m4u/ts-reflector");
252
+ var import_ts_reflector8 = require("@e22m4u/ts-reflector");
253
+ function before(middleware) {
254
+ return function(target, propertyKey, descriptor) {
255
+ const decoratorType = (0, import_ts_reflector8.getDecoratorTargetType)(target, propertyKey, descriptor);
256
+ if (decoratorType === import_ts_reflector7.DecoratorTargetType.CONSTRUCTOR) {
257
+ BeforeReflector.addMetadata({ middleware }, target);
258
+ } else if (decoratorType === import_ts_reflector7.DecoratorTargetType.INSTANCE_METHOD) {
259
+ BeforeReflector.addMetadata({ propertyKey, middleware }, target.constructor, propertyKey);
260
+ } else {
261
+ throw new Error("@before decorator is only supported on a class or an instance method.");
262
+ }
263
+ };
264
+ }
265
+ __name(before, "before");
266
+
267
+ // dist/esm/decorators/action/action-metadata.js
268
+ var import_ts_reflector9 = require("@e22m4u/ts-reflector");
269
+ var ACTIONS_METADATA_KEY = new import_ts_reflector9.MetadataKey("actionsMetadataKey");
270
+
271
+ // dist/esm/decorators/action/action-reflector.js
272
+ var import_ts_reflector10 = require("@e22m4u/ts-reflector");
143
273
  var _ActionReflector = class _ActionReflector {
144
274
  /**
145
275
  * Set metadata.
@@ -149,10 +279,10 @@ var _ActionReflector = class _ActionReflector {
149
279
  * @param propertyKey
150
280
  */
151
281
  static setMetadata(metadata, target, propertyKey) {
152
- const oldMap = import_ts_reflector2.Reflector.getOwnMetadata(ACTIONS_METADATA_KEY, target);
282
+ const oldMap = import_ts_reflector10.Reflector.getOwnMetadata(ACTIONS_METADATA_KEY, target);
153
283
  const newMap = new Map(oldMap);
154
284
  newMap.set(propertyKey, metadata);
155
- import_ts_reflector2.Reflector.defineMetadata(ACTIONS_METADATA_KEY, newMap, target);
285
+ import_ts_reflector10.Reflector.defineMetadata(ACTIONS_METADATA_KEY, newMap, target);
156
286
  }
157
287
  /**
158
288
  * Get metadata.
@@ -160,7 +290,7 @@ var _ActionReflector = class _ActionReflector {
160
290
  * @param target
161
291
  */
162
292
  static getMetadata(target) {
163
- const metadata = import_ts_reflector2.Reflector.getOwnMetadata(ACTIONS_METADATA_KEY, target);
293
+ const metadata = import_ts_reflector10.Reflector.getOwnMetadata(ACTIONS_METADATA_KEY, target);
164
294
  return metadata ?? /* @__PURE__ */ new Map();
165
295
  }
166
296
  };
@@ -169,18 +299,14 @@ var ActionReflector = _ActionReflector;
169
299
 
170
300
  // dist/esm/decorators/action/action-decorator.js
171
301
  var import_js_trie_router = require("@e22m4u/js-trie-router");
172
- var import_ts_reflector3 = require("@e22m4u/ts-reflector");
173
- var import_ts_reflector4 = require("@e22m4u/ts-reflector");
302
+ var import_ts_reflector11 = require("@e22m4u/ts-reflector");
303
+ var import_ts_reflector12 = require("@e22m4u/ts-reflector");
174
304
  function action(options) {
175
305
  return function(target, propertyKey, descriptor) {
176
- const decoratorType = (0, import_ts_reflector4.getDecoratorTargetType)(target, propertyKey, descriptor);
177
- if (decoratorType !== import_ts_reflector3.DecoratorTargetType.INSTANCE_METHOD)
306
+ const decoratorType = (0, import_ts_reflector12.getDecoratorTargetType)(target, propertyKey, descriptor);
307
+ if (decoratorType !== import_ts_reflector11.DecoratorTargetType.INSTANCE_METHOD)
178
308
  throw new Error("@action decorator is only supported on an instance method.");
179
- const metadata = {
180
- ...options,
181
- propertyKey
182
- };
183
- ActionReflector.setMetadata(metadata, target.constructor, propertyKey);
309
+ ActionReflector.setMetadata({ ...options, propertyKey }, target.constructor, propertyKey);
184
310
  };
185
311
  }
186
312
  __name(action, "action");
@@ -201,15 +327,15 @@ var del = /* @__PURE__ */ __name((path, options) => {
201
327
  }, "del");
202
328
 
203
329
  // dist/esm/decorators/controller/controller-metadata.js
204
- var import_ts_reflector5 = require("@e22m4u/ts-reflector");
205
- var CONTROLLER_METADATA_KEY = new import_ts_reflector5.MetadataKey("controllerMetadataKey");
330
+ var import_ts_reflector13 = require("@e22m4u/ts-reflector");
331
+ var CONTROLLER_METADATA_KEY = new import_ts_reflector13.MetadataKey("controllerMetadataKey");
206
332
 
207
333
  // dist/esm/decorators/controller/controller-decorator.js
208
- var import_ts_reflector7 = require("@e22m4u/ts-reflector");
209
- var import_ts_reflector8 = require("@e22m4u/ts-reflector");
334
+ var import_ts_reflector15 = require("@e22m4u/ts-reflector");
335
+ var import_ts_reflector16 = require("@e22m4u/ts-reflector");
210
336
 
211
337
  // dist/esm/decorators/controller/controller-reflector.js
212
- var import_ts_reflector6 = require("@e22m4u/ts-reflector");
338
+ var import_ts_reflector14 = require("@e22m4u/ts-reflector");
213
339
  var _ControllerReflector = class _ControllerReflector {
214
340
  /**
215
341
  * Set metadata.
@@ -218,7 +344,7 @@ var _ControllerReflector = class _ControllerReflector {
218
344
  * @param target
219
345
  */
220
346
  static setMetadata(metadata, target) {
221
- return import_ts_reflector6.Reflector.defineMetadata(CONTROLLER_METADATA_KEY, metadata, target);
347
+ return import_ts_reflector14.Reflector.defineMetadata(CONTROLLER_METADATA_KEY, metadata, target);
222
348
  }
223
349
  /**
224
350
  * Get metadata.
@@ -226,29 +352,34 @@ var _ControllerReflector = class _ControllerReflector {
226
352
  * @param target
227
353
  */
228
354
  static getMetadata(target) {
229
- return import_ts_reflector6.Reflector.getOwnMetadata(CONTROLLER_METADATA_KEY, target);
355
+ return import_ts_reflector14.Reflector.getOwnMetadata(CONTROLLER_METADATA_KEY, target);
230
356
  }
231
357
  };
232
358
  __name(_ControllerReflector, "ControllerReflector");
233
359
  var ControllerReflector = _ControllerReflector;
234
360
 
235
361
  // dist/esm/decorators/controller/controller-decorator.js
236
- function controller(options) {
362
+ function controller(pathOrOptions, options) {
237
363
  return function(target) {
238
- const decoratorType = (0, import_ts_reflector8.getDecoratorTargetType)(target);
239
- if (decoratorType !== import_ts_reflector7.DecoratorTargetType.CONSTRUCTOR)
364
+ const decoratorType = (0, import_ts_reflector16.getDecoratorTargetType)(target);
365
+ if (decoratorType !== import_ts_reflector15.DecoratorTargetType.CONSTRUCTOR)
240
366
  throw new Error("@controller decorator is only supported on a class.");
241
- const metadata = {
242
- ...options,
243
- className: target.name
244
- };
245
- ControllerReflector.setMetadata(metadata, target);
367
+ if (typeof pathOrOptions === "string") {
368
+ if (!options) {
369
+ options = { path: pathOrOptions };
370
+ } else {
371
+ options.path = pathOrOptions;
372
+ }
373
+ } else if (typeof pathOrOptions === "object") {
374
+ options = pathOrOptions;
375
+ }
376
+ ControllerReflector.setMetadata({ ...options, className: target.name }, target);
246
377
  };
247
378
  }
248
379
  __name(controller, "controller");
249
380
 
250
381
  // dist/esm/decorators/request-data/request-data-metadata.js
251
- var import_ts_reflector9 = require("@e22m4u/ts-reflector");
382
+ var import_ts_reflector17 = require("@e22m4u/ts-reflector");
252
383
  var RequestDataSource;
253
384
  (function(RequestDataSource2) {
254
385
  RequestDataSource2["PARAMS"] = "params";
@@ -257,15 +388,15 @@ var RequestDataSource;
257
388
  RequestDataSource2["COOKIE"] = "cookie";
258
389
  RequestDataSource2["BODY"] = "body";
259
390
  })(RequestDataSource || (RequestDataSource = {}));
260
- var REQUEST_DATA_METADATA_KEY = new import_ts_reflector9.MetadataKey("requestDataMetadataKey");
391
+ var REQUEST_DATA_METADATA_KEY = new import_ts_reflector17.MetadataKey("requestDataMetadataKey");
261
392
 
262
393
  // dist/esm/decorators/request-data/request-data-decorator.js
263
394
  var import_ts_data_schema = require("@e22m4u/ts-data-schema");
264
- var import_ts_reflector11 = require("@e22m4u/ts-reflector");
265
- var import_ts_reflector12 = require("@e22m4u/ts-reflector");
395
+ var import_ts_reflector19 = require("@e22m4u/ts-reflector");
396
+ var import_ts_reflector20 = require("@e22m4u/ts-reflector");
266
397
 
267
398
  // dist/esm/decorators/request-data/request-data-reflector.js
268
- var import_ts_reflector10 = require("@e22m4u/ts-reflector");
399
+ var import_ts_reflector18 = require("@e22m4u/ts-reflector");
269
400
  var _RequestDataReflector = class _RequestDataReflector {
270
401
  /**
271
402
  * Set metadata.
@@ -276,10 +407,10 @@ var _RequestDataReflector = class _RequestDataReflector {
276
407
  * @param propertyKey
277
408
  */
278
409
  static setMetadata(metadata, target, index, propertyKey) {
279
- const oldMap = import_ts_reflector10.Reflector.getOwnMetadata(REQUEST_DATA_METADATA_KEY, target, propertyKey);
410
+ const oldMap = import_ts_reflector18.Reflector.getOwnMetadata(REQUEST_DATA_METADATA_KEY, target, propertyKey);
280
411
  const newMap = new Map(oldMap);
281
412
  newMap.set(index, metadata);
282
- import_ts_reflector10.Reflector.defineMetadata(REQUEST_DATA_METADATA_KEY, newMap, target, propertyKey);
413
+ import_ts_reflector18.Reflector.defineMetadata(REQUEST_DATA_METADATA_KEY, newMap, target, propertyKey);
283
414
  }
284
415
  /**
285
416
  * Get metadata.
@@ -288,7 +419,7 @@ var _RequestDataReflector = class _RequestDataReflector {
288
419
  * @param propertyKey
289
420
  */
290
421
  static getMetadata(target, propertyKey) {
291
- const metadata = import_ts_reflector10.Reflector.getOwnMetadata(REQUEST_DATA_METADATA_KEY, target, propertyKey);
422
+ const metadata = import_ts_reflector18.Reflector.getOwnMetadata(REQUEST_DATA_METADATA_KEY, target, propertyKey);
292
423
  return metadata ?? /* @__PURE__ */ new Map();
293
424
  }
294
425
  };
@@ -296,23 +427,23 @@ __name(_RequestDataReflector, "RequestDataReflector");
296
427
  var RequestDataReflector = _RequestDataReflector;
297
428
 
298
429
  // dist/esm/decorators/request-data/request-data-decorator.js
299
- function requestData(metadata) {
430
+ function requestData(options) {
300
431
  return function(target, propertyKey, indexOrDescriptor) {
301
- const decoratorType = (0, import_ts_reflector12.getDecoratorTargetType)(target, propertyKey, indexOrDescriptor);
302
- if (decoratorType !== import_ts_reflector11.DecoratorTargetType.INSTANCE_METHOD_PARAMETER)
432
+ const decoratorType = (0, import_ts_reflector20.getDecoratorTargetType)(target, propertyKey, indexOrDescriptor);
433
+ if (decoratorType !== import_ts_reflector19.DecoratorTargetType.INSTANCE_METHOD_PARAMETER)
303
434
  throw new Error("@requestData decorator is only supported on an instance method parameter.");
304
- RequestDataReflector.setMetadata(metadata, target.constructor, indexOrDescriptor, propertyKey);
435
+ RequestDataReflector.setMetadata(options, target.constructor, indexOrDescriptor, propertyKey);
305
436
  };
306
437
  }
307
438
  __name(requestData, "requestData");
308
- function createDataDecorator(source) {
439
+ function createRequestDataDecoratorWithSource(source) {
309
440
  return function() {
310
441
  const schema = { type: import_ts_data_schema.DataType.OBJECT };
311
442
  return requestData({ schema, source });
312
443
  };
313
444
  }
314
- __name(createDataDecorator, "createDataDecorator");
315
- function createPropertyDecorator(source) {
445
+ __name(createRequestDataDecoratorWithSource, "createRequestDataDecoratorWithSource");
446
+ function createRequestDataPropertyDecoratorWithSource(source) {
316
447
  return function(propertyKey, schemaOrType) {
317
448
  const properties = {};
318
449
  const rootSchema = { type: import_ts_data_schema.DataType.OBJECT };
@@ -330,16 +461,16 @@ function createPropertyDecorator(source) {
330
461
  });
331
462
  };
332
463
  }
333
- __name(createPropertyDecorator, "createPropertyDecorator");
334
- var params = createDataDecorator(RequestDataSource.PARAMS);
335
- var param = createPropertyDecorator(RequestDataSource.PARAMS);
336
- var queries = createDataDecorator(RequestDataSource.QUERY);
337
- var query = createPropertyDecorator(RequestDataSource.QUERY);
338
- var headers = createDataDecorator(RequestDataSource.HEADERS);
339
- var header = createPropertyDecorator(RequestDataSource.HEADERS);
340
- var cookies = createDataDecorator(RequestDataSource.COOKIE);
341
- var cookie = createPropertyDecorator(RequestDataSource.COOKIE);
342
- var bodyParam = createPropertyDecorator(RequestDataSource.BODY);
464
+ __name(createRequestDataPropertyDecoratorWithSource, "createRequestDataPropertyDecoratorWithSource");
465
+ var params = createRequestDataDecoratorWithSource(RequestDataSource.PARAMS);
466
+ var param = createRequestDataPropertyDecoratorWithSource(RequestDataSource.PARAMS);
467
+ var queries = createRequestDataDecoratorWithSource(RequestDataSource.QUERY);
468
+ var query = createRequestDataPropertyDecoratorWithSource(RequestDataSource.QUERY);
469
+ var headers = createRequestDataDecoratorWithSource(RequestDataSource.HEADERS);
470
+ var header = createRequestDataPropertyDecoratorWithSource(RequestDataSource.HEADERS);
471
+ var cookies = createRequestDataDecoratorWithSource(RequestDataSource.COOKIE);
472
+ var cookie = createRequestDataPropertyDecoratorWithSource(RequestDataSource.COOKIE);
473
+ var bodyProp = createRequestDataPropertyDecoratorWithSource(RequestDataSource.BODY);
343
474
  function body(schemaOrType) {
344
475
  let schema;
345
476
  if (typeof schemaOrType === "object") {
@@ -354,15 +485,15 @@ function body(schemaOrType) {
354
485
  __name(body, "body");
355
486
 
356
487
  // dist/esm/decorators/request-context/request-context-metadata.js
357
- var import_ts_reflector13 = require("@e22m4u/ts-reflector");
358
- var REQUEST_CONTEXT_METADATA_KEY = new import_ts_reflector13.MetadataKey("requestContextMetadataKey");
488
+ var import_ts_reflector21 = require("@e22m4u/ts-reflector");
489
+ var REQUEST_CONTEXT_METADATA_KEY = new import_ts_reflector21.MetadataKey("requestContextMetadataKey");
359
490
 
360
491
  // dist/esm/decorators/request-context/request-context-decorator.js
361
- var import_ts_reflector15 = require("@e22m4u/ts-reflector");
362
- var import_ts_reflector16 = require("@e22m4u/ts-reflector");
492
+ var import_ts_reflector23 = require("@e22m4u/ts-reflector");
493
+ var import_ts_reflector24 = require("@e22m4u/ts-reflector");
363
494
 
364
495
  // dist/esm/decorators/request-context/request-context-reflector.js
365
- var import_ts_reflector14 = require("@e22m4u/ts-reflector");
496
+ var import_ts_reflector22 = require("@e22m4u/ts-reflector");
366
497
  var _RequestContextReflector = class _RequestContextReflector {
367
498
  /**
368
499
  * Set metadata.
@@ -373,10 +504,10 @@ var _RequestContextReflector = class _RequestContextReflector {
373
504
  * @param propertyKey
374
505
  */
375
506
  static setMetadata(metadata, target, index, propertyKey) {
376
- const oldMap = import_ts_reflector14.Reflector.getOwnMetadata(REQUEST_CONTEXT_METADATA_KEY, target, propertyKey);
507
+ const oldMap = import_ts_reflector22.Reflector.getOwnMetadata(REQUEST_CONTEXT_METADATA_KEY, target, propertyKey);
377
508
  const newMap = new Map(oldMap);
378
509
  newMap.set(index, metadata);
379
- import_ts_reflector14.Reflector.defineMetadata(REQUEST_CONTEXT_METADATA_KEY, newMap, target, propertyKey);
510
+ import_ts_reflector22.Reflector.defineMetadata(REQUEST_CONTEXT_METADATA_KEY, newMap, target, propertyKey);
380
511
  }
381
512
  /**
382
513
  * Get metadata.
@@ -385,7 +516,7 @@ var _RequestContextReflector = class _RequestContextReflector {
385
516
  * @param propertyKey
386
517
  */
387
518
  static getMetadata(target, propertyKey) {
388
- const metadata = import_ts_reflector14.Reflector.getOwnMetadata(REQUEST_CONTEXT_METADATA_KEY, target, propertyKey);
519
+ const metadata = import_ts_reflector22.Reflector.getOwnMetadata(REQUEST_CONTEXT_METADATA_KEY, target, propertyKey);
389
520
  return metadata ?? /* @__PURE__ */ new Map();
390
521
  }
391
522
  };
@@ -393,13 +524,12 @@ __name(_RequestContextReflector, "RequestContextReflector");
393
524
  var RequestContextReflector = _RequestContextReflector;
394
525
 
395
526
  // dist/esm/decorators/request-context/request-context-decorator.js
396
- function requestContext(propertyOrMetadata) {
527
+ function requestContext(propertyName) {
397
528
  return function(target, propertyKey, indexOrDescriptor) {
398
- const decoratorType = (0, import_ts_reflector16.getDecoratorTargetType)(target, propertyKey, indexOrDescriptor);
399
- if (decoratorType !== import_ts_reflector15.DecoratorTargetType.INSTANCE_METHOD_PARAMETER)
529
+ const decoratorType = (0, import_ts_reflector24.getDecoratorTargetType)(target, propertyKey, indexOrDescriptor);
530
+ if (decoratorType !== import_ts_reflector23.DecoratorTargetType.INSTANCE_METHOD_PARAMETER)
400
531
  throw new Error("@requestContext decorator is only supported on an instance method parameter.");
401
- const metadata = typeof propertyOrMetadata !== "object" ? { property: propertyOrMetadata } : propertyOrMetadata;
402
- RequestContextReflector.setMetadata(metadata, target.constructor, indexOrDescriptor, propertyKey);
532
+ RequestContextReflector.setMetadata({ property: propertyName }, target.constructor, indexOrDescriptor, propertyKey);
403
533
  };
404
534
  }
405
535
  __name(requestContext, "requestContext");
@@ -412,6 +542,9 @@ function response() {
412
542
  }
413
543
  __name(response, "response");
414
544
 
545
+ // dist/esm/controller-registry.js
546
+ var import_ts_data_schema3 = require("@e22m4u/ts-data-schema");
547
+
415
548
  // dist/esm/errors/not-a-controller-error.js
416
549
  var import_js_format3 = require("@e22m4u/js-format");
417
550
  var _NotAControllerError = class _NotAControllerError extends import_js_format3.Errorf {
@@ -440,41 +573,60 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
440
573
  * @param options
441
574
  */
442
575
  addController(ctor, options) {
576
+ const debug = this.debug.bind(this.addController.name);
443
577
  if (this.hasController(ctor))
444
578
  throw new import_js_format4.Errorf("The controller %v is already registered.");
445
579
  const controllerMd = ControllerReflector.getMetadata(ctor);
446
580
  if (!controllerMd)
447
581
  throw new NotAControllerError(ctor);
448
- this.debug("Adding controller %s.", ctor.name);
449
- const pathPrefix = this.getPathPrefixByControllerMetadata(controllerMd, options);
450
- this.debug("Path prefix is %v.", pathPrefix);
451
- const preHandlers = this.getPreHandlersByControllerMetadata(controllerMd, options);
452
- this.debug("%v total pre-handlers found.", preHandlers.length);
453
- const postHandlers = this.getPostHandlersByControllerMetadata(controllerMd, options);
454
- this.debug("%v total post-handlers found.", postHandlers.length);
582
+ debug("Adding controller %s.", ctor.name);
583
+ let pathPrefix = "";
584
+ pathPrefix += this.getPathPrefixFromControllerRootOptions(options);
585
+ pathPrefix += "/";
586
+ pathPrefix += this.getPathPrefixFromControllerMetadata(ctor);
587
+ pathPrefix = pathPrefix.replace(/\/{2,}/g, "/").replace(/\/$/, "");
588
+ debug("Controller path prefix is %v.", pathPrefix);
589
+ const preHandlers = [
590
+ ...this.getPreHandlersFromControllerRootOptions(options),
591
+ ...this.getPreHandlersFromBeforeMetadata(ctor),
592
+ ...this.getPreHandlersFromControllerMetadata(ctor)
593
+ ];
594
+ debug("Controller has %v pre-handlers.", preHandlers.length);
595
+ const postHandlers = [
596
+ ...this.getPostHandlersFromControllerRootOptions(options),
597
+ ...this.getPostHandlersFromAfterMetadata(ctor),
598
+ ...this.getPostHandlersFromControllerMetadata(ctor)
599
+ ];
600
+ debug("Controller has %v post-handlers.", postHandlers.length);
455
601
  const actionsMd = ActionReflector.getMetadata(ctor);
456
- this.debug("%v actions found.", actionsMd.size);
602
+ debug("%v actions found.", actionsMd.size);
457
603
  const router = this.getService(import_js_trie_router2.TrieRouter);
458
604
  actionsMd.forEach((actionMd, actionName) => {
459
- this.debug("Adding route for %s.%s.", ctor.name, actionName);
460
- this.debug("Route path is %v.", actionMd.path);
461
- const prefixedRoutePath = `${pathPrefix}/${actionMd.path}`.replace(/\/\//g, "/");
462
- this.debug("Prefixed route path is %v.", prefixedRoutePath);
463
- const actionPreHandlers = Array.isArray(actionMd.before) ? actionMd.before : actionMd.before ? [actionMd.before] : [];
464
- this.debug("%v action pre-handlers found.", actionPreHandlers.length);
465
- const mergedPreHandlers = [...preHandlers, ...actionPreHandlers];
466
- const actionPostHandlers = Array.isArray(actionMd.after) ? actionMd.after : actionMd.after ? [actionMd.after] : [];
467
- this.debug("%v action post-handlers found.", actionPostHandlers.length);
468
- const mergedPostHandlers = [...postHandlers, ...actionPostHandlers];
605
+ debug("Adding route for %s.%s.", ctor.name, actionName);
606
+ debug("Route path is %v.", actionMd.path);
607
+ const prefixedRoutePath = `${pathPrefix}/${actionMd.path}`.replace(/\/{2,}/g, "/").replace(/\/$/, "");
608
+ debug("Prefixed route path is %v.", prefixedRoutePath);
609
+ const actionPreHandlers = [
610
+ ...preHandlers,
611
+ ...this.getPreHandlersFromBeforeMetadata(ctor, actionName),
612
+ ...this.getPreHandlersFromActionMetadata(ctor, actionName)
613
+ ];
614
+ debug("%v action pre-handlers in total.", actionPreHandlers.length);
615
+ const actionPostHandlers = [
616
+ ...postHandlers,
617
+ ...this.getPostHandlersFromAfterMetadata(ctor, actionName),
618
+ ...this.getPostHandlersFromActionMetadata(ctor, actionName)
619
+ ];
620
+ debug("%v action post-handlers in total.", actionPostHandlers.length);
469
621
  const routeHandler = this.createRouteHandler(ctor, actionName);
470
622
  router.defineRoute({
471
623
  method: actionMd.method,
472
624
  path: prefixedRoutePath,
473
- preHandler: mergedPreHandlers,
625
+ preHandler: actionPreHandlers,
474
626
  handler: routeHandler,
475
- postHandler: mergedPostHandlers
627
+ postHandler: actionPostHandlers
476
628
  });
477
- this.debug("Route %s %v is added.", actionMd.method.toUpperCase(), prefixedRoutePath);
629
+ debug("Route %s %v is added.", actionMd.method.toUpperCase(), prefixedRoutePath);
478
630
  });
479
631
  this.controllers.add(ctor);
480
632
  return this;
@@ -488,57 +640,193 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
488
640
  return this.controllers.has(ctor);
489
641
  }
490
642
  /**
491
- * Get path prefix by controller metadata.
643
+ * Get path prefix from controller root options.
492
644
  *
493
- * @param controllerMd
494
645
  * @param options
495
646
  */
496
- getPathPrefixByControllerMetadata(controllerMd, options) {
497
- const rootPathPrefix = (options == null ? void 0 : options.pathPrefix) || "";
498
- this.debug("Root path prefix is %v.", rootPathPrefix);
499
- const controllerPathPrefix = controllerMd.path || "";
500
- this.debug("Controller path prefix is %v.", controllerPathPrefix);
501
- const mergedPathPrefix = `/${rootPathPrefix}/${controllerPathPrefix}`.replace(/\/\//g, "/").replace(/\/$/, "");
502
- this.debug("Merged path prefix is %v.", mergedPathPrefix);
503
- return mergedPathPrefix;
647
+ getPathPrefixFromControllerRootOptions(options) {
648
+ const debug = this.debug.bind(this.getPathPrefixFromControllerRootOptions.name);
649
+ debug("Getting path prefix from controller root options.");
650
+ const res = (options == null ? void 0 : options.pathPrefix) || "";
651
+ debug("Controller path prefix is %v.", res);
652
+ return res;
504
653
  }
505
654
  /**
506
- * Get pre-handlers by controller metadata.
655
+ * Get path prefix from controller metadata.
656
+ *
657
+ * @param ctor
658
+ */
659
+ getPathPrefixFromControllerMetadata(ctor) {
660
+ const debug = this.debug.bind(this.getPathPrefixFromControllerMetadata.name);
661
+ debug("Getting path prefix from @controller metadata.");
662
+ debug("Metadata target is %s.", ctor.name);
663
+ const md = ControllerReflector.getMetadata(ctor);
664
+ if (!md)
665
+ throw new import_js_format4.Errorf("Controller %v has no metadata.", ctor);
666
+ const res = md.path || "";
667
+ debug("Controller path prefix is %v.", res);
668
+ return md.path || "";
669
+ }
670
+ /**
671
+ * Getting pre-handlers from controller root options.
507
672
  *
508
- * @param controllerMd
509
673
  * @param options
510
674
  */
511
- getPreHandlersByControllerMetadata(controllerMd, options) {
512
- let rootPreHandlers = [];
675
+ getPreHandlersFromControllerRootOptions(options) {
676
+ const debug = this.debug.bind(this.getPreHandlersFromControllerRootOptions.name);
677
+ debug("Getting pre-handlers from controller root options.");
678
+ let res = [];
513
679
  if (options == null ? void 0 : options.before)
514
- rootPreHandlers = Array.isArray(options == null ? void 0 : options.before) ? options.before : [options.before];
515
- this.debug("%v root pre-handlers found.", rootPreHandlers.length);
516
- let ctlPreHandlers = [];
517
- if (controllerMd.before)
518
- ctlPreHandlers = Array.isArray(controllerMd.before) ? controllerMd.before : [controllerMd.before];
519
- this.debug("%v controller pre-handlers found.", ctlPreHandlers.length);
520
- const mergedPreHandlers = [...rootPreHandlers, ...ctlPreHandlers];
521
- this.debug("%v merged pre-handlers.", mergedPreHandlers.length);
522
- return mergedPreHandlers;
680
+ res = Array.isArray(options.before) ? options.before : [options.before];
681
+ debug("%v pre-handlers found.", res.length);
682
+ return res;
523
683
  }
524
684
  /**
525
- * Get post-handlers by controller metadata.
685
+ * Getting post-handlers from controller root options.
526
686
  *
527
- * @param controllerMd
528
687
  * @param options
529
688
  */
530
- getPostHandlersByControllerMetadata(controllerMd, options) {
531
- let rootPostHandlers = [];
689
+ getPostHandlersFromControllerRootOptions(options) {
690
+ const debug = this.debug.bind(this.getPostHandlersFromControllerRootOptions.name);
691
+ debug("Getting post-handlers from controller root options.");
692
+ let res = [];
532
693
  if (options == null ? void 0 : options.after)
533
- rootPostHandlers = Array.isArray(options.after) ? options.after : [options.after];
534
- this.debug("%v root post-handlers found.", rootPostHandlers.length);
535
- let ctlPostHandlers = [];
536
- if (controllerMd.after)
537
- ctlPostHandlers = Array.isArray(controllerMd.after) ? controllerMd.after : [controllerMd.after];
538
- this.debug("%v controller post-handlers found.", ctlPostHandlers.length);
539
- const mergedPostHandlers = [...rootPostHandlers, ...ctlPostHandlers];
540
- this.debug("%v merged post-handlers.", mergedPostHandlers.length);
541
- return mergedPostHandlers;
694
+ res = Array.isArray(options.after) ? options.after : [options.after];
695
+ debug("%v post-handlers found.", res.length);
696
+ return res;
697
+ }
698
+ /**
699
+ * Get pre-handlers from before metadata.
700
+ *
701
+ * @param ctor
702
+ * @param actionName
703
+ */
704
+ getPreHandlersFromBeforeMetadata(ctor, actionName) {
705
+ const debug = this.debug.bind(this.getPreHandlersFromBeforeMetadata.name);
706
+ debug("Getting pre-handlers from @before metadata.");
707
+ if (actionName) {
708
+ debug("Target is %s.%s.", ctor.name, actionName);
709
+ } else {
710
+ debug("Target is %s.", ctor.name);
711
+ }
712
+ let preHandlers = [];
713
+ const mdArray = BeforeReflector.getMetadata(ctor, actionName);
714
+ mdArray.forEach((md) => {
715
+ if (Array.isArray(md.middleware)) {
716
+ preHandlers = [...preHandlers, ...md.middleware];
717
+ } else {
718
+ preHandlers.push(md.middleware);
719
+ }
720
+ });
721
+ if (mdArray.length) {
722
+ debug("%v pre-handlers found.", mdArray.length);
723
+ } else {
724
+ debug("No pre-handlers found.");
725
+ }
726
+ return preHandlers;
727
+ }
728
+ /**
729
+ * Get post-handlers from after metadata.
730
+ *
731
+ * @param ctor
732
+ * @param actionName
733
+ */
734
+ getPostHandlersFromAfterMetadata(ctor, actionName) {
735
+ const debug = this.debug.bind(this.getPostHandlersFromAfterMetadata.name);
736
+ debug("Getting post-handlers from @after metadata.");
737
+ if (actionName) {
738
+ debug("Target is %s.%s.", ctor.name, actionName);
739
+ } else {
740
+ debug("Target is %s.", ctor.name);
741
+ }
742
+ let res = [];
743
+ const mdArray = AfterReflector.getMetadata(ctor, actionName);
744
+ mdArray.forEach((md) => {
745
+ if (Array.isArray(md.middleware)) {
746
+ res = [...res, ...md.middleware];
747
+ } else {
748
+ res.push(md.middleware);
749
+ }
750
+ });
751
+ if (mdArray.length) {
752
+ debug("%v post-handlers found.", mdArray.length);
753
+ } else {
754
+ debug("No post-handlers found.");
755
+ }
756
+ return res;
757
+ }
758
+ /**
759
+ * Get pre-handlers from controller metadata.
760
+ *
761
+ * @param ctor
762
+ */
763
+ getPreHandlersFromControllerMetadata(ctor) {
764
+ const debug = this.debug.bind(this.getPreHandlersFromControllerMetadata.name);
765
+ debug("Getting pre-handlers from @controller metadata.");
766
+ debug("Target is %s.", ctor.name);
767
+ const md = ControllerReflector.getMetadata(ctor);
768
+ if (!md)
769
+ throw new import_js_format4.Errorf("Controller %v has no metadata.", ctor);
770
+ let res = [];
771
+ if (md.before)
772
+ res = Array.isArray(md.before) ? md.before : [md.before];
773
+ debug("%v pre-handlers found.", res.length);
774
+ return res;
775
+ }
776
+ /**
777
+ * Get post-handlers from controller metadata.
778
+ *
779
+ * @param ctor
780
+ */
781
+ getPostHandlersFromControllerMetadata(ctor) {
782
+ const debug = this.debug.bind(this.getPostHandlersFromControllerMetadata.name);
783
+ debug("Getting post-handlers from @controller metadata.");
784
+ const md = ControllerReflector.getMetadata(ctor);
785
+ if (!md)
786
+ throw new import_js_format4.Errorf("Controller %v has no metadata.", ctor);
787
+ let res = [];
788
+ if (md.after)
789
+ res = Array.isArray(md.after) ? md.after : [md.after];
790
+ debug("%v post-handlers found.", res.length);
791
+ return res;
792
+ }
793
+ /**
794
+ * Get pre-handlers from action metadata.
795
+ *
796
+ * @param ctor
797
+ * @param actionName
798
+ */
799
+ getPreHandlersFromActionMetadata(ctor, actionName) {
800
+ const debug = this.debug.bind(this.getPreHandlersFromActionMetadata.name);
801
+ debug("Getting pre-handlers from @action metadata.");
802
+ const actionsMd = ActionReflector.getMetadata(ctor);
803
+ const actionMd = actionsMd.get(actionName);
804
+ if (!actionMd)
805
+ throw new import_js_format4.Errorf("Action %s.%s has no metadata.", ctor.name, actionName);
806
+ let res = [];
807
+ if (actionMd.before)
808
+ res = Array.isArray(actionMd.before) ? actionMd.before : [actionMd.before];
809
+ debug("%v pre-handlers found.", res.length);
810
+ return res;
811
+ }
812
+ /**
813
+ * Get post-handlers from action metadata.
814
+ *
815
+ * @param ctor
816
+ * @param actionName
817
+ */
818
+ getPostHandlersFromActionMetadata(ctor, actionName) {
819
+ const debug = this.debug.bind(this.getPreHandlersFromActionMetadata.name);
820
+ debug("Getting post-handlers from @action metadata.");
821
+ const actionsMd = ActionReflector.getMetadata(ctor);
822
+ const actionMd = actionsMd.get(actionName);
823
+ if (!actionMd)
824
+ throw new import_js_format4.Errorf("Action %s.%s has no metadata.", ctor.name, actionName);
825
+ let res = [];
826
+ if (actionMd.after)
827
+ res = Array.isArray(actionMd.after) ? actionMd.after : [actionMd.after];
828
+ debug("%v pre-handlers found.", res.length);
829
+ return res;
542
830
  }
543
831
  /**
544
832
  * Create route handler.
@@ -548,34 +836,35 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
548
836
  * @protected
549
837
  */
550
838
  createRouteHandler(controllerCtor, actionName) {
551
- this.debug("Creating route handler for %s.%s.", controllerCtor.name, actionName);
839
+ const debug = this.debug.bind(this.createRouteHandler.name);
840
+ debug("Creating route handler for %s.%s.", controllerCtor.name, actionName);
552
841
  const requestContextMetadataMap = RequestContextReflector.getMetadata(controllerCtor, actionName);
553
842
  const requestDataMetadataMap = RequestDataReflector.getMetadata(controllerCtor, actionName);
554
843
  const argsNumber = controllerCtor.prototype[actionName].length;
555
844
  const dataTypeCaster = this.getService(import_ts_data_schema3.DataTypeCaster);
556
845
  const dataValidator = this.getService(import_ts_data_schema2.DataValidator);
557
846
  return (requestContext2) => {
558
- this.debug("Executing route handler for %s.%s.", controllerCtor.name, actionName);
847
+ debug("Executing route handler for %s.%s.", controllerCtor.name, actionName);
559
848
  const args = Array(argsNumber).fill(void 0).map((_, index) => {
560
849
  const requestContextMd = requestContextMetadataMap.get(index);
561
850
  if (requestContextMd != null) {
562
- this.debug("Argument %v has request context metadata.", index);
851
+ debug("Argument %v has request context metadata.", index);
563
852
  if (requestContextMd.property == null) {
564
- this.debug("Request context property is not specified.");
565
- this.debug("Argument %v is set to %v.", index, requestContext2);
853
+ debug("Request context property is not specified.");
854
+ debug("Argument %v is set to %v.", index, requestContext2);
566
855
  return requestContext2;
567
856
  }
568
857
  const propName = requestContextMd.property;
569
858
  const propValue = requestContext2[propName];
570
- this.debug("Request context property is %v.", propName);
571
- this.debug("Argument %v is set to %v.", index, propValue);
859
+ debug("Request context property is %v.", propName);
860
+ debug("Argument %v is set to %v.", index, propValue);
572
861
  return propValue;
573
862
  } else {
574
- this.debug("No RequestContextMetadata specified for %v argument.", index);
863
+ debug("No RequestContextMetadata specified for %v argument.", index);
575
864
  }
576
865
  const requestDataMd = requestDataMetadataMap.get(index);
577
866
  if (requestDataMd != null) {
578
- this.debug("Argument %v has request data metadata.", index);
867
+ debug("Argument %v has request data metadata.", index);
579
868
  let data;
580
869
  switch (requestDataMd.source) {
581
870
  case RequestDataSource.PARAMS:
@@ -594,29 +883,29 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
594
883
  data = requestContext2.body;
595
884
  break;
596
885
  }
597
- this.debug("Request data source is %v.", requestDataMd.source);
886
+ debug("Request data source is %v.", requestDataMd.source);
598
887
  if (requestDataMd.schema) {
599
888
  data = dataTypeCaster.cast(data, requestDataMd.schema, {
600
889
  noTypeCastError: true,
601
890
  sourcePath: requestDataMd.source
602
891
  });
603
- this.debug("Data type casting is passed.");
892
+ debug("Data type casting is passed.");
604
893
  dataValidator.validate(data, requestDataMd.schema, requestDataMd.source);
605
- this.debug("Data validation is passed.");
894
+ debug("Data validation is passed.");
606
895
  }
607
896
  if (requestDataMd.property == null) {
608
- this.debug("Request data property is not specified.");
609
- this.debug("Argument %v is set to %v.", index, data);
897
+ debug("Request data property is not specified.");
898
+ debug("Argument %v is set to %v.", index, data);
610
899
  return data;
611
900
  }
612
901
  const dataAsObject = data;
613
902
  const propName = requestDataMd.property;
614
903
  const propValue = dataAsObject[propName];
615
- this.debug("Request data property is %v.", propName);
616
- this.debug("Argument %v is set to %v.", index, propValue);
904
+ debug("Request data property is %v.", propName);
905
+ debug("Argument %v is set to %v.", index, propValue);
617
906
  return propValue;
618
907
  } else {
619
- this.debug("No RequestDataMetadata specified for %v argument.", index);
908
+ debug("No RequestDataMetadata specified for %v argument.", index);
620
909
  }
621
910
  });
622
911
  const controller2 = this.getService(controllerCtor);
@@ -651,7 +940,11 @@ var RestRouter = _RestRouter;
651
940
  // Annotate the CommonJS export names for ESM import in node:
652
941
  0 && (module.exports = {
653
942
  ACTIONS_METADATA_KEY,
943
+ AFTER_METADATA_KEY,
654
944
  ActionReflector,
945
+ AfterReflector,
946
+ BEFORE_METADATA_KEY,
947
+ BeforeReflector,
655
948
  CONTROLLER_METADATA_KEY,
656
949
  ControllerReflector,
657
950
  ControllerRegistry,
@@ -663,8 +956,10 @@ var RestRouter = _RestRouter;
663
956
  RequestDataSource,
664
957
  RestRouter,
665
958
  action,
959
+ after,
960
+ before,
666
961
  body,
667
- bodyParam,
962
+ bodyProp,
668
963
  capitalize,
669
964
  controller,
670
965
  cookie,