@tsed/common 6.85.0 → 6.87.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.
@@ -1,19 +1,17 @@
1
1
  import { InjectorService } from "@tsed/di";
2
2
  import { ControllerProvider } from "../domain/ControllerProvider";
3
- import { PlatformRouterMethods } from "../interfaces/PlatformRouterMethods";
3
+ import { PlatformRouter } from "../services/PlatformRouter";
4
4
  /**
5
5
  * @ignore
6
6
  */
7
- export declare class PlatformControllerBuilder {
8
- private provider;
9
- constructor(provider: ControllerProvider);
10
- /**
11
- * @returns {any}
12
- */
13
- build(injector: InjectorService): PlatformRouterMethods;
14
- private buildEndpoints;
15
- private buildEndpoint;
16
- private getMiddlewares;
17
- private buildChildrenCtrls;
18
- private buildMiddlewares;
19
- }
7
+ export declare function getRouter(injector: InjectorService, provider: ControllerProvider): any;
8
+ /**
9
+ * @ignore
10
+ */
11
+ export declare function createRouter(injector: InjectorService, provider: ControllerProvider): PlatformRouter;
12
+ /**
13
+ * @ignore
14
+ * @param injector
15
+ * @param provider
16
+ */
17
+ export declare function buildRouter(injector: InjectorService, provider: ControllerProvider): PlatformRouter<TsED.Router>;
@@ -1,7 +1,6 @@
1
1
  import { ControllerMiddlewares, Provider, TokenProvider } from "@tsed/di";
2
- import { PlatformRouterMethods } from "../interfaces/PlatformRouterMethods";
3
2
  export declare class ControllerProvider<T = any> extends Provider<T> {
4
- private router;
3
+ readonly tokenRouter: string;
5
4
  constructor(provide: TokenProvider, options?: Partial<Provider>);
6
5
  /**
7
6
  *
@@ -22,6 +21,4 @@ export declare class ControllerProvider<T = any> extends Provider<T> {
22
21
  * @param middlewares
23
22
  */
24
23
  set middlewares(middlewares: ControllerMiddlewares);
25
- getRouter<T extends PlatformRouterMethods = any>(): T;
26
- setRouter(router: PlatformRouterMethods): this;
27
24
  }
package/lib/index.d.ts CHANGED
@@ -19,6 +19,5 @@ export * from "./interfaces";
19
19
  export * from "./middlewares";
20
20
  export * from "./domain";
21
21
  export * from "./services";
22
- export * from "./registries/ControllerRegistry";
23
22
  export * from "./utils";
24
23
  export * from "./PlatformModule";
package/lib/index.js CHANGED
@@ -986,6 +986,7 @@ const PLATFORM_ROUTER_OPTIONS = Symbol.for("PlatformRouterOptions");
986
986
  exports.PlatformRouter = PlatformRouter_1 = class PlatformRouter {
987
987
  constructor(platformHandler) {
988
988
  this.platformHandler = platformHandler;
989
+ this.isBuilt = false;
989
990
  this.rawRouter = this.raw = PlatformRouter_1.createRawRouter();
990
991
  }
991
992
  /**
@@ -1292,72 +1293,77 @@ tslib.__decorate([tslib.__param(0, platformParams.Context()), tslib.__metadata("
1292
1293
 
1293
1294
  exports.AcceptMimesMiddleware = tslib.__decorate([platformMiddlewares.Middleware()], exports.AcceptMimesMiddleware);
1294
1295
 
1295
- /**
1296
- * Create Ts.ED context handler
1297
- * @param fn
1298
- * @ignore
1299
- */
1296
+ const ROUTER_OPTIONS = Symbol.for("ROUTER_OPTIONS");
1300
1297
 
1301
- function useCtxHandler(fn) {
1302
- fn.type = exports.HandlerType.CTX_FN;
1303
- return fn;
1304
- }
1298
+ let AUTO_INC = 0;
1299
+ class ControllerProvider extends di.Provider {
1300
+ constructor(provide, options = {}) {
1301
+ super(provide, options);
1302
+ this.type = di.ProviderType.CONTROLLER;
1303
+ this.tokenRouter = `${this.name}_ROUTER_${AUTO_INC++}`;
1304
+ }
1305
+ /**
1306
+ *
1307
+ */
1305
1308
 
1306
- /**
1307
- * @ignore
1308
- */
1309
1309
 
1310
- function formatMethod(method) {
1311
- return (method === schema.OperationMethods.CUSTOM ? "use" : method || "use").toLowerCase();
1312
- }
1313
- /**
1314
- * @ignore
1315
- */
1310
+ get routerOptions() {
1311
+ return this.store.get(ROUTER_OPTIONS) || {};
1312
+ }
1313
+ /**
1314
+ *
1315
+ * @param value
1316
+ */
1316
1317
 
1317
1318
 
1318
- class PlatformControllerBuilder {
1319
- constructor(provider) {
1320
- this.provider = provider;
1319
+ set routerOptions(value) {
1320
+ this.store.set(ROUTER_OPTIONS, value);
1321
1321
  }
1322
1322
  /**
1323
- * @returns {any}
1323
+ *
1324
+ * @returns {any[]}
1324
1325
  */
1325
1326
 
1326
1327
 
1327
- build(injector) {
1328
- const {
1329
- middlewares: {
1330
- useBefore
1331
- }
1332
- } = this.provider; // Controller lifecycle
1328
+ get middlewares() {
1329
+ return Object.assign({
1330
+ use: [],
1331
+ useAfter: [],
1332
+ useBefore: []
1333
+ }, this.store.get("middlewares", {}));
1334
+ }
1335
+ /**
1336
+ *
1337
+ * @param middlewares
1338
+ */
1333
1339
 
1334
- this.buildMiddlewares(useBefore) // Controller before-middleware
1335
- .buildEndpoints() // All endpoints and his middlewares
1336
- .buildChildrenCtrls(injector); // Children controllers
1337
1340
 
1338
- return this.provider.getRouter();
1339
- }
1341
+ set middlewares(middlewares) {
1342
+ const mdlwrs = this.middlewares;
1340
1343
 
1341
- buildEndpoints() {
1342
- schema.getOperationsRoutes(this.provider.token).forEach(operationRoute => {
1343
- this.buildEndpoint(operationRoute);
1344
- });
1345
- return this;
1346
- }
1344
+ const concat = (key, a, b) => a[key] = a[key].concat(b[key]);
1347
1345
 
1348
- buildEndpoint(operationRoute) {
1349
- let handlers = this.getMiddlewares(operationRoute);
1350
- const router = this.provider.getRouter();
1351
- router.addRoute({
1352
- handlers,
1353
- token: operationRoute.token,
1354
- method: formatMethod(operationRoute.method),
1355
- path: operationRoute.path,
1356
- isFinal: operationRoute.isFinal
1346
+ Object.keys(middlewares).forEach(key => {
1347
+ concat(key, mdlwrs, middlewares);
1357
1348
  });
1349
+ this.store.set("middlewares", mdlwrs);
1358
1350
  }
1359
1351
 
1360
- getMiddlewares(operationRoute) {
1352
+ }
1353
+
1354
+ /**
1355
+ * Create Ts.ED context handler
1356
+ * @param fn
1357
+ * @ignore
1358
+ */
1359
+
1360
+ function useCtxHandler(fn) {
1361
+ fn.type = exports.HandlerType.CTX_FN;
1362
+ return fn;
1363
+ }
1364
+
1365
+ exports.PlatformMiddlewaresChain = class PlatformMiddlewaresChain {
1366
+ get(provider, operationRoute) {
1361
1367
  const {
1362
1368
  endpoint
1363
1369
  } = operationRoute;
@@ -1371,11 +1377,10 @@ class PlatformControllerBuilder {
1371
1377
  use,
1372
1378
  useAfter
1373
1379
  }
1374
- } = this.provider;
1380
+ } = provider;
1375
1381
  const hasFiles = [...operationRoute.endpoint.children.values()].find(item => item.paramType === platformParams.ParamTypes.FILES);
1376
1382
  return [].concat(useCtxHandler(bindEndpointMiddleware(endpoint))).concat(exports.PlatformAcceptMimesMiddleware).concat(hasFiles && exports.PlatformMulterMiddleware).concat(beforeMiddlewares) // Endpoint before-middlewares
1377
1383
  .concat(use) // Controller use-middlewares
1378
- // .concat(endpoint.cache && PlatformCacheMiddleware)
1379
1384
  .concat(mldwrs) // Endpoint middlewares
1380
1385
  .concat(endpoint) // Endpoint metadata
1381
1386
  .concat(afterMiddlewares) // Endpoint after-middlewares
@@ -1383,32 +1388,97 @@ class PlatformControllerBuilder {
1383
1388
  .filter(item => !!item);
1384
1389
  }
1385
1390
 
1386
- buildChildrenCtrls(injector) {
1387
- const {
1388
- children
1389
- } = this.provider;
1390
- const router = this.provider.getRouter();
1391
+ };
1392
+ exports.PlatformMiddlewaresChain = tslib.__decorate([di.Injectable()], exports.PlatformMiddlewaresChain);
1393
+
1394
+ di.GlobalProviders.createRegistry(di.ProviderType.CONTROLLER, ControllerProvider, {
1395
+ onInvoke(provider, locals, {
1396
+ injector
1397
+ }) {
1398
+ const router = createRouter(injector, provider);
1399
+ locals.set(exports.PlatformRouter, router);
1400
+ }
1401
+
1402
+ });
1403
+ /**
1404
+ * @ignore
1405
+ */
1406
+
1407
+ function formatMethod(method) {
1408
+ return (method === schema.OperationMethods.CUSTOM ? "use" : method || "use").toLowerCase();
1409
+ }
1410
+ /**
1411
+ * @ignore
1412
+ */
1413
+
1414
+
1415
+ function getRouter(injector, provider) {
1416
+ return injector.get(provider.tokenRouter);
1417
+ }
1418
+ /**
1419
+ * @ignore
1420
+ */
1421
+
1422
+ function createRouter(injector, provider) {
1423
+ const token = provider.tokenRouter;
1424
+
1425
+ if (injector.has(token)) {
1426
+ return getRouter(injector, provider);
1427
+ }
1428
+
1429
+ const router = exports.PlatformRouter.create(injector, provider.routerOptions);
1430
+ return injector.add(token, {
1431
+ useValue: router
1432
+ }).invoke(token);
1433
+ }
1434
+ /**
1435
+ * @ignore
1436
+ * @param injector
1437
+ * @param provider
1438
+ */
1439
+
1440
+ function buildRouter(injector, provider) {
1441
+ const {
1442
+ middlewares: {
1443
+ useBefore
1444
+ },
1445
+ children
1446
+ } = provider; // Controller lifecycle
1447
+
1448
+ const router = createRouter(injector, provider);
1449
+
1450
+ if (!router.isBuilt) {
1451
+ router.isBuilt = true;
1452
+ const platformMiddlewaresChain = injector.get(exports.PlatformMiddlewaresChain);
1453
+ useBefore // Controller before-middleware
1454
+ .filter(o => typeof o === "function").forEach(middleware => {
1455
+ router.use(middleware);
1456
+ }); // build all endpoints and his middlewares
1457
+
1458
+ schema.getOperationsRoutes(provider.token).forEach(operationRoute => {
1459
+ const handlers = platformMiddlewaresChain == null ? void 0 : platformMiddlewaresChain.get(provider, operationRoute);
1460
+ router.addRoute({
1461
+ handlers,
1462
+ token: operationRoute.token,
1463
+ method: formatMethod(operationRoute.method),
1464
+ path: operationRoute.path,
1465
+ isFinal: operationRoute.isFinal
1466
+ });
1467
+ }); // build children controllers
1468
+
1391
1469
  children.forEach(child => {
1392
- const provider = injector.getProvider(child);
1470
+ const childProvider = injector.getProvider(child);
1393
1471
  /* istanbul ignore next */
1394
1472
 
1395
- if (!provider) {
1473
+ if (!childProvider) {
1396
1474
  throw new Error("Controller component not found in the ControllerRegistry");
1397
1475
  }
1398
1476
 
1399
- new PlatformControllerBuilder(provider).build(injector);
1400
- router.use(provider.path, provider.getRouter());
1401
- });
1402
- }
1403
-
1404
- buildMiddlewares(middlewares) {
1405
- const router = this.provider.getRouter();
1406
- middlewares.filter(o => typeof o === "function").forEach(middleware => {
1407
- router.use(middleware);
1477
+ router.use(childProvider.path, buildRouter(injector, childProvider));
1408
1478
  });
1409
- return this;
1410
1479
  }
1411
1480
 
1481
+ return router;
1412
1482
  }
1413
1483
 
1414
1484
  /**
@@ -2005,71 +2075,6 @@ class PlatformRouteDetails extends schema.JsonOperationRoute {
2005
2075
 
2006
2076
  }
2007
2077
 
2008
- const ROUTER_OPTIONS = Symbol.for("ROUTER_OPTIONS");
2009
-
2010
- class ControllerProvider extends di.Provider {
2011
- constructor(provide, options = {}) {
2012
- super(provide, options);
2013
- this.type = di.ProviderType.CONTROLLER;
2014
- }
2015
- /**
2016
- *
2017
- */
2018
-
2019
-
2020
- get routerOptions() {
2021
- return this.store.get(ROUTER_OPTIONS) || {};
2022
- }
2023
- /**
2024
- *
2025
- * @param value
2026
- */
2027
-
2028
-
2029
- set routerOptions(value) {
2030
- this.store.set(ROUTER_OPTIONS, value);
2031
- }
2032
- /**
2033
- *
2034
- * @returns {any[]}
2035
- */
2036
-
2037
-
2038
- get middlewares() {
2039
- return Object.assign({
2040
- use: [],
2041
- useAfter: [],
2042
- useBefore: []
2043
- }, this.store.get("middlewares", {}));
2044
- }
2045
- /**
2046
- *
2047
- * @param middlewares
2048
- */
2049
-
2050
-
2051
- set middlewares(middlewares) {
2052
- const mdlwrs = this.middlewares;
2053
-
2054
- const concat = (key, a, b) => a[key] = a[key].concat(b[key]);
2055
-
2056
- Object.keys(middlewares).forEach(key => {
2057
- concat(key, mdlwrs, middlewares);
2058
- });
2059
- this.store.set("middlewares", mdlwrs);
2060
- }
2061
-
2062
- getRouter() {
2063
- return this.router;
2064
- }
2065
-
2066
- setRouter(router) {
2067
- this.router = router;
2068
- return this;
2069
- }
2070
-
2071
- }
2072
-
2073
2078
  /**
2074
2079
  * @deprecated Since 2020-11-11. Use getProperties from @tsed/schema
2075
2080
  */
@@ -2093,13 +2098,6 @@ exports.PropertyMetadata = class PropertyMetadata extends schema.JsonPropertySto
2093
2098
  };
2094
2099
  exports.PropertyMetadata = tslib.__decorate([schema.JsonEntityComponent(core.DecoratorTypes.PROP)], exports.PropertyMetadata);
2095
2100
 
2096
- di.GlobalProviders.createRegistry(di.ProviderType.CONTROLLER, ControllerProvider, {
2097
- onInvoke(provider, locals) {
2098
- locals.set(exports.PlatformRouter, provider.getRouter());
2099
- }
2100
-
2101
- });
2102
-
2103
2101
  /**
2104
2102
  * `Platform` is used to provide all routes collected by annotation `@Controller`.
2105
2103
  *
@@ -2146,7 +2144,7 @@ exports.Platform = class Platform {
2146
2144
  provider
2147
2145
  });
2148
2146
 
2149
- this.app.use(ctrlPath, ...[].concat(provider.getRouter().callback()));
2147
+ this.app.use(ctrlPath, ...[].concat(getRouter(injector, provider).callback()));
2150
2148
  this._routes = schema.getOperationsRoutes(provider.token, {
2151
2149
  withChildren: true,
2152
2150
  basePath
@@ -2191,7 +2189,7 @@ exports.Platform = class Platform {
2191
2189
  injector
2192
2190
  } = this;
2193
2191
  injector.getProviders(di.ProviderType.CONTROLLER).map(provider => {
2194
- provider.setRouter(exports.PlatformRouter.create(injector, provider.routerOptions));
2192
+ createRouter(injector, provider);
2195
2193
  });
2196
2194
  }
2197
2195
  /**
@@ -2206,14 +2204,15 @@ exports.Platform = class Platform {
2206
2204
  } = this;
2207
2205
  injector.getProviders(di.ProviderType.CONTROLLER).map(provider => {
2208
2206
  if (!provider.hasParent()) {
2209
- return new PlatformControllerBuilder(provider).build(injector);
2207
+ return buildRouter(injector, provider);
2210
2208
  }
2211
2209
  });
2212
2210
  }
2213
2211
 
2214
2212
  };
2215
2213
  exports.Platform = tslib.__decorate([di.Injectable({
2216
- scope: di.ProviderScope.SINGLETON
2214
+ scope: di.ProviderScope.SINGLETON,
2215
+ imports: [exports.PlatformMiddlewaresChain]
2217
2216
  }), tslib.__metadata("design:paramtypes", [di.InjectorService, exports.PlatformApplication])], exports.Platform);
2218
2217
 
2219
2218
  logger.$log.name = "TSED";
@@ -3510,7 +3509,6 @@ exports.Next = Next;
3510
3509
  exports.PLATFORM_ROUTER_OPTIONS = PLATFORM_ROUTER_OPTIONS;
3511
3510
  exports.PlatformBuilder = PlatformBuilder;
3512
3511
  exports.PlatformContext = PlatformContext;
3513
- exports.PlatformControllerBuilder = PlatformControllerBuilder;
3514
3512
  exports.PlatformModule = PlatformModule;
3515
3513
  exports.PlatformRouteDetails = PlatformRouteDetails;
3516
3514
  exports.PlatformTest = PlatformTest;
@@ -3521,11 +3519,14 @@ exports.Res = Res;
3521
3519
  exports.Response = Response;
3522
3520
  exports.ResponseData = ResponseData;
3523
3521
  exports.bindEndpointMiddleware = bindEndpointMiddleware;
3522
+ exports.buildRouter = buildRouter;
3524
3523
  exports.createContext = createContext;
3525
3524
  exports.createHttpServer = createHttpServer;
3526
3525
  exports.createHttpsServer = createHttpsServer;
3527
3526
  exports.createInjector = createInjector;
3528
3527
  exports.createPlatformApplication = createPlatformApplication;
3528
+ exports.createRouter = createRouter;
3529
+ exports.getRouter = getRouter;
3529
3530
  exports.listenHttpServer = listenHttpServer;
3530
3531
  exports.listenHttpsServer = listenHttpsServer;
3531
3532
  exports.listenServer = listenServer;