Skip to content

Commit 9fcb6e8

Browse files
authored
feat: allow to remove middleware by id (#1599)
1 parent c8f6d7c commit 9fcb6e8

File tree

2 files changed

+87
-27
lines changed

2 files changed

+87
-27
lines changed

src/middleware.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ export class MiddlewareExecutor<TValue, THandlers extends string> {
110110
.filter(Boolean) as Middleware<TValue, THandlers>[];
111111
}
112112

113+
remove(middlewareIds: string | string[]) {
114+
if (!middlewareIds && !middlewareIds.length) return;
115+
this.middleware = this.middleware.filter((md) =>
116+
typeof middlewareIds === 'string'
117+
? middlewareIds !== md.id
118+
: !middlewareIds.includes(md.id),
119+
);
120+
}
121+
113122
protected async executeMiddlewareChain({
114123
eventName,
115124
initialValue,

test/unit/middleware.test.ts

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,33 @@ import {
66
MiddlewareStatus,
77
} from '../../src/middleware';
88

9+
const middleware1: Middleware<{ value: number }, 'test'> = {
10+
id: 'middleware-1',
11+
handlers: {
12+
test: async ({ state, next }) => {
13+
return next(state);
14+
},
15+
},
16+
};
17+
18+
const middleware2: Middleware<{ value: number }, 'test'> = {
19+
id: 'middleware-2',
20+
handlers: {
21+
test: async ({ state, next }) => {
22+
return next(state);
23+
},
24+
},
25+
};
26+
27+
const middleware3: Middleware<{ value: number }, 'test'> = {
28+
id: 'middleware-3',
29+
handlers: {
30+
test: async ({ state, next }) => {
31+
return next(state);
32+
},
33+
},
34+
};
35+
936
describe('MiddlewareExecutor', () => {
1037
let executor: MiddlewareExecutor<{ value: number }, 'test'>;
1138

@@ -301,33 +328,6 @@ describe('MiddlewareExecutor', () => {
301328

302329
describe('setOrder', () => {
303330
it('should reorder middleware based on provided order', () => {
304-
const middleware1: Middleware<{ value: number }, 'test'> = {
305-
id: 'middleware-1',
306-
handlers: {
307-
test: async ({ state, next }) => {
308-
return next(state);
309-
},
310-
},
311-
};
312-
313-
const middleware2: Middleware<{ value: number }, 'test'> = {
314-
id: 'middleware-2',
315-
handlers: {
316-
test: async ({ state, next }) => {
317-
return next(state);
318-
},
319-
},
320-
};
321-
322-
const middleware3: Middleware<{ value: number }, 'test'> = {
323-
id: 'middleware-3',
324-
handlers: {
325-
test: async ({ state, next }) => {
326-
return next(state);
327-
},
328-
},
329-
};
330-
331331
executor.use([middleware1, middleware2, middleware3]);
332332

333333
executor.setOrder(['middleware-3', 'middleware-1', 'middleware-2']);
@@ -371,6 +371,57 @@ describe('MiddlewareExecutor', () => {
371371
});
372372
});
373373

374+
describe('remove', () => {
375+
it('should remove existing middleware by single id', () => {
376+
executor.use([middleware1, middleware2, middleware3]);
377+
378+
executor.remove(middleware2.id);
379+
// @ts-expect-error access private property for testing
380+
const middlewareList = (executor as Middleware<{ value: number }, 'test'>)
381+
.middleware;
382+
expect(middlewareList).toHaveLength(2);
383+
expect(middlewareList[0]).toEqual(middleware1);
384+
expect(middlewareList[1]).toEqual(middleware3);
385+
});
386+
387+
it('should remove existing middleware by id array', () => {
388+
executor.use([middleware1, middleware2, middleware3]);
389+
390+
executor.remove([middleware3.id, middleware2.id]);
391+
// @ts-expect-error access private property for testing
392+
const middlewareList = (executor as Middleware<{ value: number }, 'test'>)
393+
.middleware;
394+
expect(middlewareList).toHaveLength(1);
395+
expect(middlewareList[0]).toEqual(middleware1);
396+
});
397+
398+
it('should not change existing middleware if id array is empty', () => {
399+
executor.use([middleware1, middleware2, middleware3]);
400+
401+
executor.remove([]);
402+
// @ts-expect-error access private property for testing
403+
const middlewareList = (executor as Middleware<{ value: number }, 'test'>)
404+
.middleware;
405+
expect(middlewareList).toHaveLength(3);
406+
expect(middlewareList[0]).toEqual(middleware1);
407+
expect(middlewareList[1]).toEqual(middleware2);
408+
expect(middlewareList[2]).toEqual(middleware3);
409+
});
410+
411+
it('should not change existing middleware if id is empty string', () => {
412+
executor.use([middleware1, middleware2, middleware3]);
413+
414+
executor.remove('');
415+
// @ts-expect-error access private property for testing
416+
const middlewareList = (executor as Middleware<{ value: number }, 'test'>)
417+
.middleware;
418+
expect(middlewareList).toHaveLength(3);
419+
expect(middlewareList[0]).toEqual(middleware1);
420+
expect(middlewareList[1]).toEqual(middleware2);
421+
expect(middlewareList[2]).toEqual(middleware3);
422+
});
423+
});
424+
374425
describe('execute', () => {
375426
it('should execute middleware chain in order', async () => {
376427
const middleware1: Middleware<{ value: number }, 'test'> = {

0 commit comments

Comments
 (0)