@nest-boot/middleware 7.2.3 → 7.3.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.
@@ -11,8 +11,12 @@ export interface MiddlewareConfig {
11
11
  routes: (string | Type | RouteInfo)[];
12
12
  /** Routes to exclude from the middleware */
13
13
  excludeRoutes: (string | RouteInfo)[];
14
- /** Middlewares that must be applied before this one */
14
+ /** Middlewares that must be registered and applied before this one */
15
15
  dependencyMiddlewares: Type<NestMiddleware>[];
16
+ /** Middlewares that should be applied before this one when registered */
17
+ afterMiddlewares: Type<NestMiddleware>[];
18
+ /** Middlewares that should be applied after this one when registered */
19
+ beforeMiddlewares: Type<NestMiddleware>[];
16
20
  /** Whether to disable global exclude routes for this middleware */
17
21
  disabledGlobalExcludeRoutes: boolean;
18
22
  }
@@ -18,6 +18,10 @@ export declare class MiddlewareConfigurator {
18
18
  private readonly excludeRoutes;
19
19
  /** Middleware types that must run before this middleware. @internal */
20
20
  private readonly dependencyMiddlewares;
21
+ /** Middleware types that should run before this middleware when registered. @internal */
22
+ private readonly afterMiddlewares;
23
+ /** Middleware types that should run after this middleware when registered. @internal */
24
+ private readonly beforeMiddlewares;
21
25
  /**
22
26
  * Creates a new MiddlewareConfigurator instance.
23
27
  * @param manager - The middleware manager that owns this configurator
@@ -36,7 +40,33 @@ export declare class MiddlewareConfigurator {
36
40
  */
37
41
  exclude(...routes: (string | RouteInfo)[]): this;
38
42
  /**
39
- * Declares middleware dependencies for ordering.
43
+ * Declares middlewares that should run after this middleware when registered.
44
+ *
45
+ * @remarks
46
+ * This is a soft ordering hint. Unregistered middleware types are ignored.
47
+ *
48
+ * @param beforeMiddlewares - Middleware types that should run after this middleware
49
+ * @returns This configurator for chaining
50
+ */
51
+ before(...beforeMiddlewares: Type<NestMiddleware>[]): this;
52
+ /**
53
+ * Declares middlewares that should run before this middleware when registered.
54
+ *
55
+ * @remarks
56
+ * This is a soft ordering hint. Unregistered middleware types are ignored.
57
+ *
58
+ * @param afterMiddlewares - Middleware types that should run before this middleware
59
+ * @returns This configurator for chaining
60
+ */
61
+ after(...afterMiddlewares: Type<NestMiddleware>[]): this;
62
+ /**
63
+ * Declares middleware dependencies for ordering. Dependencies must be registered
64
+ * and must run before this middleware.
65
+ *
66
+ * @remarks
67
+ * This is a hard prerequisite. An unregistered dependency throws during
68
+ * middleware configuration.
69
+ *
40
70
  * @param dependencyMiddlewares - Middleware types that must run before this middleware
41
71
  * @returns This configurator for chaining
42
72
  */
@@ -23,6 +23,10 @@ class MiddlewareConfigurator {
23
23
  this.excludeRoutes = [];
24
24
  /** Middleware types that must run before this middleware. @internal */
25
25
  this.dependencyMiddlewares = [];
26
+ /** Middleware types that should run before this middleware when registered. @internal */
27
+ this.afterMiddlewares = [];
28
+ /** Middleware types that should run after this middleware when registered. @internal */
29
+ this.beforeMiddlewares = [];
26
30
  }
27
31
  /**
28
32
  * Disables global route exclusions for these middlewares.
@@ -42,7 +46,39 @@ class MiddlewareConfigurator {
42
46
  return this;
43
47
  }
44
48
  /**
45
- * Declares middleware dependencies for ordering.
49
+ * Declares middlewares that should run after this middleware when registered.
50
+ *
51
+ * @remarks
52
+ * This is a soft ordering hint. Unregistered middleware types are ignored.
53
+ *
54
+ * @param beforeMiddlewares - Middleware types that should run after this middleware
55
+ * @returns This configurator for chaining
56
+ */
57
+ before(...beforeMiddlewares) {
58
+ this.beforeMiddlewares.push(...beforeMiddlewares);
59
+ return this;
60
+ }
61
+ /**
62
+ * Declares middlewares that should run before this middleware when registered.
63
+ *
64
+ * @remarks
65
+ * This is a soft ordering hint. Unregistered middleware types are ignored.
66
+ *
67
+ * @param afterMiddlewares - Middleware types that should run before this middleware
68
+ * @returns This configurator for chaining
69
+ */
70
+ after(...afterMiddlewares) {
71
+ this.afterMiddlewares.push(...afterMiddlewares);
72
+ return this;
73
+ }
74
+ /**
75
+ * Declares middleware dependencies for ordering. Dependencies must be registered
76
+ * and must run before this middleware.
77
+ *
78
+ * @remarks
79
+ * This is a hard prerequisite. An unregistered dependency throws during
80
+ * middleware configuration.
81
+ *
46
82
  * @param dependencyMiddlewares - Middleware types that must run before this middleware
47
83
  * @returns This configurator for chaining
48
84
  */
@@ -72,6 +108,8 @@ class MiddlewareConfigurator {
72
108
  routes,
73
109
  excludeRoutes: this.excludeRoutes,
74
110
  dependencyMiddlewares: this.dependencyMiddlewares,
111
+ afterMiddlewares: this.afterMiddlewares,
112
+ beforeMiddlewares: this.beforeMiddlewares,
75
113
  disabledGlobalExcludeRoutes: this.disabledGlobalExcludeRoutes,
76
114
  });
77
115
  });
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.configurator.js","sourceRoot":"","sources":["../src/middleware.configurator.ts"],"names":[],"mappings":";;;AAMA;;;;;;GAMG;AACH,MAAa,sBAAsB;IAUjC;;;;OAIG;IACH,YACmB,OAA0B,EAC1B,WAA2C;QAD3C,YAAO,GAAP,OAAO,CAAmB;QAC1B,gBAAW,GAAX,WAAW,CAAgC;QAhB9D,oFAAoF;QAC5E,gCAA2B,GAAG,KAAK,CAAC;QAE5C,4DAA4D;QAC3C,kBAAa,GAA2B,EAAE,CAAC;QAE5D,uEAAuE;QACtD,0BAAqB,GAA2B,EAAE,CAAC;IAUjE,CAAC;IAEJ;;;OAGG;IACI,0BAA0B;QAC/B,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,GAAG,MAA8B;QAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,GAAG,qBAA6C;QAClE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,SAAS,CACd,GAAG,MAAqC;QAExC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC/C,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;oBAC7B,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;wBACxB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACjC,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBACD,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;gBACjD,2BAA2B,EAAE,IAAI,CAAC,2BAA2B;aAC9D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AA/ED,wDA+EC"}
1
+ {"version":3,"file":"middleware.configurator.js","sourceRoot":"","sources":["../src/middleware.configurator.ts"],"names":[],"mappings":";;;AAMA;;;;;;GAMG;AACH,MAAa,sBAAsB;IAgBjC;;;;OAIG;IACH,YACmB,OAA0B,EAC1B,WAA2C;QAD3C,YAAO,GAAP,OAAO,CAAmB;QAC1B,gBAAW,GAAX,WAAW,CAAgC;QAtB9D,oFAAoF;QAC5E,gCAA2B,GAAG,KAAK,CAAC;QAE5C,4DAA4D;QAC3C,kBAAa,GAA2B,EAAE,CAAC;QAE5D,uEAAuE;QACtD,0BAAqB,GAA2B,EAAE,CAAC;QAEpE,yFAAyF;QACxE,qBAAgB,GAA2B,EAAE,CAAC;QAE/D,wFAAwF;QACvE,sBAAiB,GAA2B,EAAE,CAAC;IAU7D,CAAC;IAEJ;;;OAGG;IACI,0BAA0B;QAC/B,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,GAAG,MAA8B;QAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,GAAG,iBAAyC;QACxD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,GAAG,gBAAwC;QACtD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACI,YAAY,CAAC,GAAG,qBAA6C;QAClE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,SAAS,CACd,GAAG,MAAqC;QAExC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC/C,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;oBAC7B,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;wBACxB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACjC,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBACD,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;gBACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,2BAA2B,EAAE,IAAI,CAAC,2BAA2B;aAC9D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAzHD,wDAyHC"}
@@ -34,6 +34,31 @@ let MiddlewareManager = class MiddlewareManager {
34
34
  typeToMiddleware.set(middleware.constructor, middleware);
35
35
  }
36
36
  }
37
+ const resolveDependencyMiddleware = (middlewareType) => {
38
+ const middleware = typeToMiddleware.get(middlewareType);
39
+ if (!middleware) {
40
+ throw new Error(`Dependency middleware ${middlewareType.name} is not registered`);
41
+ }
42
+ return middleware;
43
+ };
44
+ const dependencyMap = new Map();
45
+ for (const [middleware, config] of this.middlewareConfigMap) {
46
+ dependencyMap.set(middleware, config.dependencyMiddlewares.map((dependencyMiddleware) => resolveDependencyMiddleware(dependencyMiddleware)));
47
+ }
48
+ for (const [middleware, config] of this.middlewareConfigMap) {
49
+ for (const afterMiddleware of config.afterMiddlewares) {
50
+ const dependency = typeToMiddleware.get(afterMiddleware);
51
+ if (dependency) {
52
+ dependencyMap.get(middleware)?.push(dependency);
53
+ }
54
+ }
55
+ for (const beforeMiddleware of config.beforeMiddlewares) {
56
+ const dependent = typeToMiddleware.get(beforeMiddleware);
57
+ if (dependent) {
58
+ dependencyMap.get(dependent)?.push(middleware);
59
+ }
60
+ }
61
+ }
37
62
  const visit = (middleware) => {
38
63
  if (visited.has(middleware)) {
39
64
  return;
@@ -42,15 +67,9 @@ let MiddlewareManager = class MiddlewareManager {
42
67
  throw new Error("Circular dependency detected in middleware");
43
68
  }
44
69
  visiting.add(middleware);
45
- const config = this.middlewareConfigMap.get(middleware);
46
- if (config?.dependencyMiddlewares) {
47
- for (const dependencyMiddleware of config.dependencyMiddlewares) {
48
- const depMiddleware = typeToMiddleware.get(dependencyMiddleware);
49
- if (!depMiddleware) {
50
- throw new Error(`Dependency middleware ${dependencyMiddleware.name} is not registered`);
51
- }
52
- visit(depMiddleware);
53
- }
70
+ const dependencies = dependencyMap.get(middleware) ?? [];
71
+ for (const dependency of dependencies) {
72
+ visit(dependency);
54
73
  }
55
74
  visiting.delete(middleware);
56
75
  visited.add(middleware);
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.manager.js","sourceRoot":"","sources":["../src/middleware.manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.manager.js","sourceRoot":"","sources":["../src/middleware.manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const MiddlewareExports = __importStar(require("."));
37
+ const middleware_manager_1 = require("./middleware.manager");
38
+ const middleware_module_1 = require("./middleware.module");
39
+ class RecordingMiddleware {
40
+ constructor(name, calls) {
41
+ this.name = name;
42
+ this.calls = calls;
43
+ }
44
+ use(_req, _res, next) {
45
+ this.calls.push(this.name);
46
+ next();
47
+ }
48
+ }
49
+ class FirstMiddleware extends RecordingMiddleware {
50
+ }
51
+ class SecondMiddleware extends RecordingMiddleware {
52
+ }
53
+ class MissingMiddleware extends RecordingMiddleware {
54
+ }
55
+ const createMiddlewareConsumer = () => {
56
+ const middlewares = [];
57
+ const proxy = {
58
+ exclude: jest.fn().mockReturnThis(),
59
+ forRoutes: jest.fn().mockReturnThis(),
60
+ };
61
+ const consumer = {
62
+ apply: jest.fn((middleware) => {
63
+ middlewares.push(middleware);
64
+ return proxy;
65
+ }),
66
+ };
67
+ return { consumer, middlewares, proxy };
68
+ };
69
+ const collectMiddlewares = (manager) => {
70
+ const { consumer, middlewares } = createMiddlewareConsumer();
71
+ manager.configure(consumer);
72
+ return middlewares;
73
+ };
74
+ const runMiddlewares = (middlewares) => {
75
+ for (const middleware of middlewares) {
76
+ middleware({}, {}, jest.fn());
77
+ }
78
+ };
79
+ describe("MiddlewareManager", () => {
80
+ it("exports middleware APIs from the package entrypoint", () => {
81
+ expect(MiddlewareExports.MiddlewareManager).toBe(middleware_manager_1.MiddlewareManager);
82
+ expect(MiddlewareExports.MiddlewareModule).toBe(middleware_module_1.MiddlewareModule);
83
+ });
84
+ it("applies middleware after target middleware", () => {
85
+ const calls = [];
86
+ const first = new FirstMiddleware("first", calls);
87
+ const second = new SecondMiddleware("second", calls);
88
+ const manager = new middleware_manager_1.MiddlewareManager();
89
+ manager.apply(second).after(FirstMiddleware).forRoutes("*");
90
+ manager.apply(first).forRoutes("*");
91
+ runMiddlewares(collectMiddlewares(manager));
92
+ expect(calls).toEqual(["first", "second"]);
93
+ });
94
+ it("applies hard dependency middleware before current middleware", () => {
95
+ const calls = [];
96
+ const first = new FirstMiddleware("first", calls);
97
+ const second = new SecondMiddleware("second", calls);
98
+ const manager = new middleware_manager_1.MiddlewareManager();
99
+ manager.apply(second).dependencies(FirstMiddleware).forRoutes("*");
100
+ manager.apply(first).forRoutes("*");
101
+ runMiddlewares(collectMiddlewares(manager));
102
+ expect(calls).toEqual(["first", "second"]);
103
+ });
104
+ it("applies middleware before target middleware", () => {
105
+ const calls = [];
106
+ const first = new FirstMiddleware("first", calls);
107
+ const second = new SecondMiddleware("second", calls);
108
+ const manager = new middleware_manager_1.MiddlewareManager();
109
+ manager.apply(second).forRoutes("*");
110
+ manager.apply(first).before(SecondMiddleware).forRoutes("*");
111
+ runMiddlewares(collectMiddlewares(manager));
112
+ expect(calls).toEqual(["first", "second"]);
113
+ });
114
+ it("ignores after target middleware when it is not registered", () => {
115
+ const calls = [];
116
+ const first = new FirstMiddleware("first", calls);
117
+ const manager = new middleware_manager_1.MiddlewareManager();
118
+ manager.apply(first).after(MissingMiddleware).forRoutes("*");
119
+ runMiddlewares(collectMiddlewares(manager));
120
+ expect(calls).toEqual(["first"]);
121
+ });
122
+ it("ignores before target middleware when it is not registered", () => {
123
+ const calls = [];
124
+ const first = new FirstMiddleware("first", calls);
125
+ const manager = new middleware_manager_1.MiddlewareManager();
126
+ manager.apply(first).before(MissingMiddleware).forRoutes("*");
127
+ runMiddlewares(collectMiddlewares(manager));
128
+ expect(calls).toEqual(["first"]);
129
+ });
130
+ it("throws when dependencies reference an unregistered middleware", () => {
131
+ const calls = [];
132
+ const first = new FirstMiddleware("first", calls);
133
+ const manager = new middleware_manager_1.MiddlewareManager();
134
+ manager.apply(first).dependencies(MissingMiddleware).forRoutes("*");
135
+ expect(() => collectMiddlewares(manager)).toThrow("Dependency middleware MissingMiddleware is not registered");
136
+ });
137
+ it("throws when middleware ordering is circular", () => {
138
+ const calls = [];
139
+ const first = new FirstMiddleware("first", calls);
140
+ const second = new SecondMiddleware("second", calls);
141
+ const manager = new middleware_manager_1.MiddlewareManager();
142
+ manager.apply(first).before(SecondMiddleware).forRoutes("*");
143
+ manager.apply(second).before(FirstMiddleware).forRoutes("*");
144
+ expect(() => collectMiddlewares(manager)).toThrow("Circular dependency detected in middleware");
145
+ });
146
+ it("applies function middleware with route exclusions", () => {
147
+ const calls = [];
148
+ const manager = new middleware_manager_1.MiddlewareManager();
149
+ const { consumer, middlewares, proxy } = createMiddlewareConsumer();
150
+ manager
151
+ .globalExclude("/global")
152
+ .apply((_req, _res, next) => {
153
+ calls.push("function");
154
+ next();
155
+ })
156
+ .exclude("/local")
157
+ .forRoutes("/route");
158
+ manager.configure(consumer);
159
+ runMiddlewares(middlewares);
160
+ expect(proxy.exclude).toHaveBeenCalledWith("/global", "/local");
161
+ expect(proxy.forRoutes).toHaveBeenCalledWith("/route");
162
+ expect(calls).toEqual(["function"]);
163
+ });
164
+ it("can disable global exclude routes for a middleware", () => {
165
+ const calls = [];
166
+ const first = new FirstMiddleware("first", calls);
167
+ const manager = new middleware_manager_1.MiddlewareManager();
168
+ const { consumer, proxy } = createMiddlewareConsumer();
169
+ manager
170
+ .globalExclude("/global")
171
+ .apply(first)
172
+ .disableGlobalExcludeRoutes()
173
+ .exclude("/local")
174
+ .forRoutes("/route");
175
+ manager.configure(consumer);
176
+ expect(proxy.exclude).toHaveBeenCalledWith("/local");
177
+ expect(proxy.exclude).not.toHaveBeenCalledWith("/global");
178
+ });
179
+ it("returns manager without registering middleware when no routes are provided", () => {
180
+ const calls = [];
181
+ const first = new FirstMiddleware("first", calls);
182
+ const manager = new middleware_manager_1.MiddlewareManager();
183
+ expect(manager.apply(first).forRoutes()).toBe(manager);
184
+ expect(collectMiddlewares(manager)).toEqual([]);
185
+ });
186
+ it("delegates module configuration to the middleware manager", () => {
187
+ const configure = jest.fn();
188
+ const manager = {
189
+ configure,
190
+ };
191
+ const consumer = {};
192
+ const module = new middleware_module_1.MiddlewareModule(manager);
193
+ module.configure(consumer);
194
+ expect(configure).toHaveBeenCalledWith(consumer);
195
+ });
196
+ });
197
+ //# sourceMappingURL=middleware.manager.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.manager.spec.js","sourceRoot":"","sources":["../src/middleware.manager.spec.ts"],"names":[],"mappings":"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"}