Commit f762b468 authored by nanahira's avatar nanahira

put inst at first

parent d71b6b96
...@@ -38,10 +38,10 @@ export class DynamicMiddlewareDispatcher<F extends AnyFunc> { ...@@ -38,10 +38,10 @@ export class DynamicMiddlewareDispatcher<F extends AnyFunc> {
return undefined; return undefined;
} }
nextCalled = true; nextCalled = true;
return dispatch( return dispatch(i + 1, [
i + 1, ...passedArgs,
passedArgs.length === 0 ? useArgs : (passedArgs as Parameters<F>), ...useArgs.slice(passedArgs.length),
); ] as Parameters<F>);
}; };
const runMw = async (cb: () => MiddlewareReturn<F>) => { const runMw = async (cb: () => MiddlewareReturn<F>) => {
......
...@@ -2,16 +2,16 @@ import { Middleware, MiddlewareResult } from './types'; ...@@ -2,16 +2,16 @@ import { Middleware, MiddlewareResult } from './types';
import { AnyClass, ClassType } from '../types'; import { AnyClass, ClassType } from '../types';
import { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher'; import { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher';
export type ProtoMiddlewareArgs<A extends any[], T = any> = [ export type ProtoMiddlewareArgs<A extends any[] = [], T = any> = [
...args: A,
inst: T, inst: T,
...args: A,
]; ];
export type ProtoMiddlewareFunc<A extends any[], T = any> = ( export type ProtoMiddlewareFunc<A extends any[] = [], T = any> = (
...args: ProtoMiddlewareArgs<A, T> ...args: ProtoMiddlewareArgs<A, T>
) => T; ) => T;
export class ProtoMiddlewareDispatcher< export class ProtoMiddlewareDispatcher<
A extends any[], A extends any[] = [],
> extends DynamicMiddlewareDispatcher<ProtoMiddlewareFunc<A>> { > extends DynamicMiddlewareDispatcher<ProtoMiddlewareFunc<A>> {
private middlewareProtoMap = new Map< private middlewareProtoMap = new Map<
AnyClass, AnyClass,
...@@ -93,8 +93,8 @@ export class ProtoMiddlewareDispatcher< ...@@ -93,8 +93,8 @@ export class ProtoMiddlewareDispatcher<
} }
} }
result.push((...args) => { result.push((inst, ...args) => {
return args[args.length - 2]; // inst return inst;
}); });
return result; return result;
......
...@@ -4,7 +4,16 @@ export type AnyFunc = (...args: any[]) => any; ...@@ -4,7 +4,16 @@ export type AnyFunc = (...args: any[]) => any;
export type MiddlewareValue<F extends AnyFunc> = Awaited<ReturnType<F>>; export type MiddlewareValue<F extends AnyFunc> = Awaited<ReturnType<F>>;
export type MiddlewareResult<F extends AnyFunc> = Promise<MiddlewareValue<F>>; export type MiddlewareResult<F extends AnyFunc> = Promise<MiddlewareValue<F>>;
export type MiddlewareNextArgs<F extends AnyFunc> = Parameters<F> | [];
type StaircaseParams<A extends any[]> = A extends []
? []
: A extends [...infer Rest, any]
? A | StaircaseParams<Rest>
: never;
export type MiddlewareNextArgs<F extends AnyFunc> =
| StaircaseParams<Parameters<F>>
| [];
export type MiddlewareNext<F extends AnyFunc> = ( export type MiddlewareNext<F extends AnyFunc> = (
...args: MiddlewareNextArgs<F> ...args: MiddlewareNextArgs<F>
) => MiddlewareResult<F>; ) => MiddlewareResult<F>;
......
...@@ -16,7 +16,7 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -16,7 +16,7 @@ describe('ProtoMiddlewareDispatcher', () => {
d.middleware( d.middleware(
Base, Base,
async (x, inst, next) => { async (inst, x, next) => {
order.push('base:prior1'); order.push('base:prior1');
return next(); return next();
}, },
...@@ -24,7 +24,7 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -24,7 +24,7 @@ describe('ProtoMiddlewareDispatcher', () => {
); );
d.middleware( d.middleware(
Base, Base,
async (x, inst, next) => { async (inst, x, next) => {
order.push('base:prior2'); order.push('base:prior2');
return next(); return next();
}, },
...@@ -32,25 +32,25 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -32,25 +32,25 @@ describe('ProtoMiddlewareDispatcher', () => {
); );
d.middleware( d.middleware(
Sub, Sub,
async (x, inst, next) => { async (inst, x, next) => {
order.push('sub:prior'); order.push('sub:prior');
return next(); return next();
}, },
true, true,
); );
d.middleware(Sub, async (x, inst, next) => { d.middleware(Sub, async (inst, x, next) => {
order.push('sub:normal0'); order.push('sub:normal0');
return next(); return next();
}); });
d.middleware(Sub, async (x, inst, next) => { d.middleware(Sub, async (inst, x, next) => {
order.push('sub:normal'); order.push('sub:normal');
expect(inst).toBeInstanceOf(Sub); expect(inst).toBeInstanceOf(Sub);
expect(inst.value).toBe(5); expect(inst.value).toBe(5);
const newSub = new Sub(); const newSub = new Sub();
newSub.value = inst.value + x; newSub.value = inst.value + x;
return next(7, newSub); // override args return next(newSub, 555); // override args
}); });
d.middleware(Base, async (x, inst, next) => { d.middleware(Base, async (inst, x, next) => {
order.push('base:normal'); order.push('base:normal');
expect(inst).toBeInstanceOf(Base); expect(inst).toBeInstanceOf(Base);
expect(inst.value).toBe(8); // 5 + 3 expect(inst.value).toBe(8); // 5 + 3
...@@ -61,7 +61,7 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -61,7 +61,7 @@ describe('ProtoMiddlewareDispatcher', () => {
const sub = new Sub(); const sub = new Sub();
sub.value = 5; sub.value = 5;
const res = await d.dispatch(3, sub); const res = await d.dispatch(sub, 3);
expect(order).toEqual([ expect(order).toEqual([
'base:prior2', 'base:prior2',
'base:prior1', 'base:prior1',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment