Skip to content

Commit 8ae0a43

Browse files
author
Shady Khalifa
committed
feat(@nestjs/core): add the appilty to have a path prop for the Module by using RouterModule.
1 parent 2f3732e commit 8ae0a43

File tree

11 files changed

+1375
-348
lines changed

11 files changed

+1375
-348
lines changed

lib/core/router/interfaces/explorer.inteface.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import { Controller } from '@nestjs/common/interfaces/index';
22
import { Metatype } from '@nestjs/common/interfaces/metatype.interface';
33
export interface RouterExplorer {
44
explore(instance: Controller, metatype: Metatype<Controller>, module: string): any;
5-
fetchRouterPath(metatype: Metatype<Controller>): string;
5+
fetchRouterPath(metatype: Metatype<Controller>, prefix?: string): string;
66
}

lib/core/router/router-explorer.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export declare class ExpressRouterExplorer implements RouterExplorer {
2020
private readonly logger;
2121
constructor(metadataScanner?: MetadataScanner, routerProxy?: RouterProxy, expressAdapter?: ExpressAdapter, exceptionsFilter?: ExceptionsFilter, config?: ApplicationConfig, container?: NestContainer);
2222
explore(instance: Controller, metatype: Metatype<Controller>, module: string): any;
23-
fetchRouterPath(metatype: Metatype<Controller>): string;
23+
fetchRouterPath(metatype: Metatype<Controller>, prefix?: string): string;
2424
validateRoutePath(path: string): string;
2525
scanForPaths(instance: Controller, prototype?: any): RoutePathProperties[];
2626
exploreMethodMetadata(instance: Controller, instancePrototype: any, methodName: string): RoutePathProperties;

lib/core/router/router-explorer.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ class ExpressRouterExplorer {
3232
this.applyPathsToRouterProxy(router, routerPaths, instance, module);
3333
return router;
3434
}
35-
fetchRouterPath(metatype) {
36-
const path = Reflect.getMetadata(constants_1.PATH_METADATA, metatype);
35+
fetchRouterPath(metatype, prefix) {
36+
let path = Reflect.getMetadata(constants_1.PATH_METADATA, metatype);
37+
if (prefix)
38+
path = prefix + this.validateRoutePath(path);
3739
return this.validateRoutePath(path);
3840
}
3941
validateRoutePath(path) {

lib/core/router/routes-resolver.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export declare class RoutesResolver implements Resolver {
1414
private readonly routerBuilder;
1515
constructor(container: NestContainer, expressAdapter: any, config: ApplicationConfig);
1616
resolve(express: Application): void;
17-
setupRouters(routes: Map<string, InstanceWrapper<Controller>>, moduleName: string, express: Application): void;
17+
setupRouters(routes: Map<string, InstanceWrapper<Controller>>, moduleName: string, modulePath: string, express: Application): void;
1818
setupNotFoundHandler(express: Application): void;
1919
setupExceptionHandler(express: Application): void;
2020
}

lib/core/router/routes-resolver.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const router_exception_filters_1 = require("./router-exception-filters");
77
const metadata_scanner_1 = require("../metadata-scanner");
88
const router_explorer_1 = require("./router-explorer");
99
const common_1 = require("@nestjs/common");
10+
const constants_1 = require("@nestjs/common/constants");
1011
class RoutesResolver {
1112
constructor(container, expressAdapter, config) {
1213
this.container = container;
@@ -19,13 +20,16 @@ class RoutesResolver {
1920
}
2021
resolve(express) {
2122
const modules = this.container.getModules();
22-
modules.forEach(({ routes }, moduleName) => this.setupRouters(routes, moduleName, express));
23+
modules.forEach((module, moduleName) => {
24+
const path = Reflect.getMetadata(constants_1.MODULE_PATH, module.metatype);
25+
this.setupRouters(module.routes, moduleName, path, express);
26+
});
2327
this.setupNotFoundHandler(express);
2428
this.setupExceptionHandler(express);
2529
}
26-
setupRouters(routes, moduleName, express) {
30+
setupRouters(routes, moduleName, modulePath, express) {
2731
routes.forEach(({ instance, metatype }) => {
28-
const path = this.routerBuilder.fetchRouterPath(metatype);
32+
const path = this.routerBuilder.fetchRouterPath(metatype, modulePath);
2933
const controllerName = metatype.name;
3034
this.logger.log(messages_1.ControllerMappingMessage(controllerName, path));
3135
const router = this.routerBuilder.explore(instance, metatype, moduleName);

src/core/router/interfaces/explorer.inteface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ import { Metatype } from '@nestjs/common/interfaces/metatype.interface';
33

44
export interface RouterExplorer {
55
explore(instance: Controller, metatype: Metatype<Controller>, module: string);
6-
fetchRouterPath(metatype: Metatype<Controller>): string;
6+
fetchRouterPath(metatype: Metatype<Controller>, prefix?: string): string;
77
}

src/core/router/router-explorer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ export class ExpressRouterExplorer implements RouterExplorer {
6060
return router;
6161
}
6262

63-
public fetchRouterPath(metatype: Metatype<Controller>): string {
64-
const path = Reflect.getMetadata(PATH_METADATA, metatype);
63+
public fetchRouterPath(
64+
metatype: Metatype<Controller>,
65+
prefix?: string,
66+
): string {
67+
let path = Reflect.getMetadata(PATH_METADATA, metatype);
68+
if (prefix) path = prefix + this.validateRoutePath(path);
6569
return this.validateRoutePath(path);
6670
}
6771

src/core/router/routes-resolver.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { RouterExplorer } from './interfaces/explorer.inteface';
1111
import { ExpressRouterExplorer } from './router-explorer';
1212
import { ApplicationConfig } from './../application-config';
1313
import { NotFoundException } from '@nestjs/common';
14-
14+
import { MODULE_PATH } from '@nestjs/common/constants';
1515
export class RoutesResolver implements Resolver {
1616
private readonly logger = new Logger(RoutesResolver.name, true);
1717
private readonly routerProxy = new RouterProxy();
@@ -36,9 +36,12 @@ export class RoutesResolver implements Resolver {
3636

3737
public resolve(express: Application) {
3838
const modules = this.container.getModules();
39-
modules.forEach(({ routes }, moduleName) =>
40-
this.setupRouters(routes, moduleName, express),
41-
);
39+
modules.forEach(({ routes, metatype }, moduleName) => {
40+
const path = metatype
41+
? Reflect.getMetadata(MODULE_PATH, metatype)
42+
: undefined;
43+
this.setupRouters(routes, moduleName, path, express);
44+
});
4245

4346
this.setupNotFoundHandler(express);
4447
this.setupExceptionHandler(express);
@@ -47,10 +50,11 @@ export class RoutesResolver implements Resolver {
4750
public setupRouters(
4851
routes: Map<string, InstanceWrapper<Controller>>,
4952
moduleName: string,
53+
modulePath: string,
5054
express: Application,
5155
) {
5256
routes.forEach(({ instance, metatype }) => {
53-
const path = this.routerBuilder.fetchRouterPath(metatype);
57+
const path = this.routerBuilder.fetchRouterPath(metatype, modulePath);
5458
const controllerName = metatype.name;
5559

5660
this.logger.log(ControllerMappingMessage(controllerName, path));

src/core/test/router/router-explorer.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,17 @@ describe('RouterExplorer', () => {
6767
expect(bindStub.callCount).to.be.eql(paths.length);
6868
});
6969
});
70+
71+
describe('fetchRouterPath', () => {
72+
it('should return expected path', () => {
73+
expect(routerBuilder.fetchRouterPath(TestRoute)).to.be.eql('/global');
74+
expect(routerBuilder.fetchRouterPath(TestRoute, '/module')).to.be.eql(
75+
'/module/global',
76+
);
77+
});
78+
79+
it('should throw it a there is a bad path expected path', () => {
80+
expect(() => routerBuilder.validateRoutePath(undefined)).to.throw();
81+
});
82+
});
7083
});

src/core/test/router/routes-resolver.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ describe('RoutesResolver', () => {
5151
});
5252

5353
const use = sinon.spy();
54-
routesResolver.setupRouters(routes, '', { use } as any);
54+
routesResolver.setupRouters(routes, '', undefined, { use } as any);
5555
expect(use.calledWith('/global', router)).to.be.true;
5656
});
5757
});

0 commit comments

Comments
 (0)