Commit acb983b3 authored by nanahira's avatar nanahira

fix things of schema register

parent 27420ac9
......@@ -18,6 +18,7 @@ import {
MetadataMap,
OnContextFunction,
Selection,
SystemInjectFun,
} from './def';
import 'reflect-metadata';
import { App, Argv, Command, Context, FieldCollector, Session } from 'koishi';
......@@ -208,7 +209,7 @@ export function Provide(
return Metadata.appendUnique(KoishiServiceProvideSym, name);
}
const InjectSystem = (fun: (obj: PluginClass) => any) =>
const InjectSystem = (fun: SystemInjectFun) =>
Metadata.set(KoishiSystemInjectSym, fun, KoishiSystemInjectSymKeys);
export const InjectContext = (select?: Selection) =>
......@@ -223,9 +224,10 @@ export const InjectApp = () => InjectSystem((obj) => obj.__ctx.app);
export const InjectConfig = (raw = false) =>
InjectSystem((obj) => (raw ? obj.__rawConfig : obj.__config));
export const InjectLogger = (name?: string) =>
InjectSystem((obj) =>
InjectSystem((obj, config) =>
obj.__ctx.logger(
name ||
config.name ||
Object.getPrototypeOf(Object.getPrototypeOf(obj))?.constructor?.name ||
'default',
),
......
......@@ -4,8 +4,8 @@ import {
CommandDefinitionFun,
DoRegisterConfig,
OnContextFunction,
SystemInjectFun,
} from './interfaces';
import { PluginClass } from '../register';
export const KoishiOnContextScope = 'KoishiOnContextScope';
export const KoishiDoRegister = 'KoishiDoRegister';
......@@ -33,5 +33,5 @@ export interface MetadataArrayMap {
export interface MetadataMap {
KoishiDoRegister: DoRegisterConfig;
KoishiServiceInjectSym: keyof Context.Services;
KoishiSystemInjectSym: (obj: PluginClass) => any;
KoishiSystemInjectSym: SystemInjectFun;
}
......@@ -13,6 +13,7 @@ import {
User,
} from 'koishi';
import { MetadataArrayMap, MetadataMap } from './constants';
import { KoishiPluginRegistrationOptions, PluginClass } from '../register';
export interface Type<T = any> extends Function {
new (...args: any[]): T;
......@@ -142,3 +143,8 @@ export type CommandPutConfig<
> = MappingStruct<CommandPutConfigMap, K>;
export type CommandDefinitionFun = (cmd: Command) => Command;
export type SystemInjectFun = <T = any>(
obj: PluginClass<T>,
pluginMeta: KoishiPluginRegistrationOptions<T>,
) => any;
......@@ -51,14 +51,26 @@ function getContextFromFilters(ctx: Context, filters: OnContextFunction[]) {
return targetCtx;
}
function getSchemaFromOption<T>(schema: Schema<T> | Type<T>): Schema<T> {
if (!schema) {
return;
}
if (typeof schema !== 'function') {
return schema;
}
return schemaFromClass(schema);
}
export function KoishiPlugin<T = any>(
options: KoishiPluginRegistrationOptions<T> = {},
) {
return function <C extends { new (...args: any[]): any; schema?: Schema }>(
originalClass: C,
) {
return function <
C extends { new (...args: any[]): any; schema?: Schema; name?: string }
>(originalClass: C) {
const newClass = class extends originalClass implements PluginClass {
static schema = options.schema || originalClass.schema || undefined;
static schema = getSchemaFromOption(
options.schema || originalClass.schema,
);
__ctx: Context;
__config: T;
__rawConfig: T;
......@@ -73,7 +85,7 @@ export function KoishiPlugin<T = any>(
Object.defineProperty(this, key, {
configurable: true,
enumerable: true,
get: () => valueFunction(this),
get: () => valueFunction(this, options),
});
}
}
......
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