Commit 4fab54c2 authored by nanahira's avatar nanahira

bump and add CallbackLayer

parent 81750222
......@@ -36,7 +36,7 @@
"typescript": "^4.6.4"
},
"peerDependencies": {
"koishi": "^4.7.2"
"koishi": "^4.7.4"
}
},
"node_modules/@babel/code-frame": {
......@@ -999,13 +999,13 @@
}
},
"node_modules/@koishijs/core": {
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.7.2.tgz",
"integrity": "sha512-yO5Pyki1RV+MSqR1IzX02z6wLlJRej7RSH7zW4/+nd5r1fimtDaODiQz/F7lGfcuVthIPDg2aPxJXkl8eLCoSw==",
"version": "4.7.4",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.7.4.tgz",
"integrity": "sha512-S4pPaO05WC0htkQVcTMTluBZv4g8sEEBJ2ItHN2zJA8syet3iKJidT+s2gYt8d2rBo0Ndlvo1gBLGLNl/Zc9yg==",
"peer": true,
"dependencies": {
"@koishijs/utils": "^5.4.5",
"cordis": "^1.2.2",
"cordis": "^1.3.3",
"fastest-levenshtein": "^1.0.12",
"minato": "^1.1.0"
},
......@@ -2279,9 +2279,9 @@
"peer": true
},
"node_modules/cordis": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-1.2.2.tgz",
"integrity": "sha512-R6RhHuBu6be5DGXBkIGyw3W/yPBPqr69KBVEGVgBY38DzMBIXilmsfAdVdIIEe3G0vlnn5rtAgsMg2yGwRpkiQ==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-1.3.3.tgz",
"integrity": "sha512-mpyBWAEVYX8/YHoGWIqaOjrOk6DmtrOWZfsBSinNR+nDBlB39Ks6aC1B5oZ7AdnVoRE2ZYBCGecoHrlxcRxd6w==",
"peer": true,
"dependencies": {
"cosmokit": "^1.1.2"
......@@ -4763,13 +4763,13 @@
}
},
"node_modules/koishi": {
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.7.2.tgz",
"integrity": "sha512-oH1yIGX8skfPO4WcLPpnNqt+qzETVux7OIAK9jkMQxHLJv1fq1/OqsLS0wTvpTJ8qFZLt49lZ3gbLujga43RPA==",
"version": "4.7.4",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.7.4.tgz",
"integrity": "sha512-VVHf3TyFsTuKrB8IZffxwmwiGx+zyhDo+DNNEFQjvomgqFdGEceAnLxNIf10K48aB1CDmkmi37b6uaURi4Z1Hw==",
"peer": true,
"dependencies": {
"@koa/router": "^10.1.1",
"@koishijs/core": "^4.7.2",
"@koishijs/core": "^4.7.4",
"@koishijs/utils": "^5.4.5",
"@types/koa": "*",
"@types/koa__router": "*",
......@@ -7648,13 +7648,13 @@
}
},
"@koishijs/core": {
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.7.2.tgz",
"integrity": "sha512-yO5Pyki1RV+MSqR1IzX02z6wLlJRej7RSH7zW4/+nd5r1fimtDaODiQz/F7lGfcuVthIPDg2aPxJXkl8eLCoSw==",
"version": "4.7.4",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.7.4.tgz",
"integrity": "sha512-S4pPaO05WC0htkQVcTMTluBZv4g8sEEBJ2ItHN2zJA8syet3iKJidT+s2gYt8d2rBo0Ndlvo1gBLGLNl/Zc9yg==",
"peer": true,
"requires": {
"@koishijs/utils": "^5.4.5",
"cordis": "^1.2.2",
"cordis": "^1.3.3",
"fastest-levenshtein": "^1.0.12",
"minato": "^1.1.0"
}
......@@ -8670,9 +8670,9 @@
"peer": true
},
"cordis": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-1.2.2.tgz",
"integrity": "sha512-R6RhHuBu6be5DGXBkIGyw3W/yPBPqr69KBVEGVgBY38DzMBIXilmsfAdVdIIEe3G0vlnn5rtAgsMg2yGwRpkiQ==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-1.3.3.tgz",
"integrity": "sha512-mpyBWAEVYX8/YHoGWIqaOjrOk6DmtrOWZfsBSinNR+nDBlB39Ks6aC1B5oZ7AdnVoRE2ZYBCGecoHrlxcRxd6w==",
"peer": true,
"requires": {
"cosmokit": "^1.1.2"
......@@ -10547,13 +10547,13 @@
}
},
"koishi": {
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.7.2.tgz",
"integrity": "sha512-oH1yIGX8skfPO4WcLPpnNqt+qzETVux7OIAK9jkMQxHLJv1fq1/OqsLS0wTvpTJ8qFZLt49lZ3gbLujga43RPA==",
"version": "4.7.4",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.7.4.tgz",
"integrity": "sha512-VVHf3TyFsTuKrB8IZffxwmwiGx+zyhDo+DNNEFQjvomgqFdGEceAnLxNIf10K48aB1CDmkmi37b6uaURi4Z1Hw==",
"peer": true,
"requires": {
"@koa/router": "^10.1.1",
"@koishijs/core": "^4.7.2",
"@koishijs/core": "^4.7.4",
"@koishijs/utils": "^5.4.5",
"@types/koa": "*",
"@types/koa__router": "*",
......
......@@ -66,6 +66,6 @@
"typed-reflector": "^1.0.10"
},
"peerDependencies": {
"koishi": "^4.7.2"
"koishi": "^4.7.4"
}
}
......@@ -4,6 +4,7 @@ import {
CommandDefinitionFun,
CommandLocaleDef,
CommandOptionConfigWithDescription,
ContextCallbackLayer,
EventName,
KoishiCommandDefinition,
KoishiCommandPutDef,
......@@ -272,3 +273,8 @@ export function DefineLocale(
ctx.i18n.define(r(locale), ...r(args)),
);
}
export const CallbackLayer = (
layer: ContextCallbackLayer,
): ClassDecorator & MethodDecorator =>
Metadata.append('KoishiContextLayers', layer);
// metadatas
import {
CommandDefinitionFun,
ContextCallbackLayer,
MappingStruct,
OnContextFunction,
TopLevelActionDef,
......@@ -21,6 +22,7 @@ export interface MetadataArrayMap {
KoishiDoRegisterKeys: string;
KoishiTopLevelAction: TopLevelActionDef;
KoishiPutClassFieldKeys: string;
KoishiContextLayers: ContextCallbackLayer;
}
export interface MetadataMap {
......
......@@ -203,3 +203,8 @@ export type PickEventFunction<M, K extends keyof M> = M[K] extends (
) => any
? (...args: FunctionParam<M[K]>) => Awaitable<FunctionReturn<M[K]>>
: M[K];
export type ContextCallbackLayer<T = any> = (
ctx: Context,
cb: ContextFunction<void>,
) => T;
import {
ContextCallbackLayer,
ContextFunction,
KoishiDoRegister,
KoishiDoRegisterKeys,
KoishiOnContextScope,
......@@ -76,6 +78,42 @@ export class Registrar<T = any> {
return { ...data, key: key as keyof T & string, result };
}
private runLayersWith<R>(
ctx: Context,
cb: ContextFunction<R>,
layers: ContextCallbackLayer[],
): Promise<Awaited<R>> {
const rest = [...layers];
const layer = rest.pop();
return new Promise<any>((resolve) => {
layer(ctx, async (nextCtx) => {
let result: R;
if (!rest.length) {
result = await cb(nextCtx);
} else {
result = await this.runLayersWith(nextCtx, cb, rest);
}
resolve(result);
});
});
}
runLayers<R>(ctx: Context, cb: ContextFunction<R>, key?: keyof T) {
let layers = reflector.getArray(
'KoishiContextLayers',
this.obj,
key as string,
);
if (!key && this.alternativeObject) {
const altLayers = reflector.getArray(
'KoishiContextLayers',
this.alternativeObject,
);
layers = layers.concat(altLayers);
}
return this.runLayersWith(ctx, cb, layers);
}
registerAll(
ctx: Context,
autoScope = false,
......
import {
CallbackLayer,
CommandUsage,
PutArg,
PutObject,
......@@ -60,6 +61,19 @@ class MyClass {
) {
return `I have ${count} ${name}.`;
}
@CallbackLayer((ctx, cb) => {
ctx['foo'] = 1;
cb(ctx);
})
@CallbackLayer((ctx, cb) => {
ctx['bar'] = 2;
cb(ctx);
})
@UseCommand('underwear')
async unUnderwear(@PutArg(0) count: number) {
return `I have ${count} underwears.`;
}
}
const registrar = new Registrar(new MyClass());
......@@ -132,4 +146,14 @@ describe('Register', () => {
'I have 7 socks.',
);
});
it('should work with layers', () => {
registrar.runLayers(
app,
(ctx) => registrar.register(app, 'unUnderwear'),
'unUnderwear',
);
expect(app['foo']).toBe(1);
expect(app['bar']).toBe(2);
});
});
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