Commit 7250cab8 authored by nanahira's avatar nanahira

rework multi plugin with factory

parent 5551d867
import { ClonePlugin } from './utility/clone-plugin';
import { Context } from 'koishi';
import { BasePlugin, PartialDeep } from './base-plugin';
import { ClassPluginConfig, MultiPluginConfig, TypeFromClass } from './def';
import {
ClassPluginConfig,
Instances,
MultiPluginConfig,
TypeFromClass,
} from './def';
import { ClassType } from 'schemastery-gen';
import { ToInstancesConfig } from './utility/to-instance-config';
import Schema from 'schemastery';
import { PluginSchema, UsingService } from './decorators';
import { UseEvent } from 'koishi-decorators';
import { CreatePluginFactory } from './plugin-factory';
export class MultiInstancePluginFramework<
InnerPlugin extends new (ctx: Context, config: any) => any,
OuterConfig,
> extends BasePlugin<
MultiPluginConfig<ClassPluginConfig<InnerPlugin>, OuterConfig>,
MultiPluginConfig<ClassPluginConfig<InnerPlugin>, PartialDeep<OuterConfig>>
Instances<ClassPluginConfig<InnerPlugin>>,
Instances<ClassPluginConfig<InnerPlugin>>
> {
instances: TypeFromClass<InnerPlugin>[] = [];
......@@ -47,10 +52,7 @@ export function MultiInstancePlugin<
InnerPlugin extends new (ctx: Context, config: any) => any,
OuterConfig,
>(innerPlugin: InnerPlugin, outerConfig?: ClassType<OuterConfig>) {
const pluginClass = class SpecificMultiInstancePlugin extends MultiInstancePluginFramework<
InnerPlugin,
OuterConfig
> {
const basePlugin = class SpecificMultiInstancePlugin extends MultiInstancePluginFramework<InnerPlugin> {
_getInnerPlugin() {
return innerPlugin;
}
......@@ -59,17 +61,16 @@ export function MultiInstancePlugin<
(innerPlugin['Config'] ||
innerPlugin['schema'] ||
Schema.any()) as ClassType<ClassPluginConfig<InnerPlugin>>,
outerConfig,
);
if (schema) {
PluginSchema(schema)(pluginClass);
}
const factory = CreatePluginFactory(basePlugin, schema);
const plugin = factory(outerConfig);
if (innerPlugin['using']) {
UsingService(...(innerPlugin['using'] as (keyof Context.Services)[]))(
pluginClass,
plugin,
);
}
return pluginClass;
return plugin;
}
......@@ -9,7 +9,7 @@ export function CreatePluginFactory<C, IC, P extends { config: IC }>(
): <S>(specificConfig?: ClassType<S>) => new (
ctx: Context,
config: PartialDeep<S> & C,
) => Omit<C, 'config'> & {
) => Omit<P, 'config'> & {
config: IC & S;
};
export function CreatePluginFactory(
......
......@@ -8,30 +8,8 @@ import { Instances, ParamsFromClass, TypeFromClass } from '../def';
export function ToInstancesConfig<Inner extends new (...args: any[]) => any>(
instanceConfig: Inner,
): new () => Instances<TypeFromClass<Inner>>;
export function ToInstancesConfig<
Inner extends AnyClass,
Outer extends AnyClass,
>(
instanceConfig: Inner,
outerConfig?: Outer,
): new (...args: ParamsFromClass<Outer>) => Instances<TypeFromClass<Inner>> &
TypeFromClass<Outer>;
export function ToInstancesConfig<
Inner extends AnyClass,
Outer extends AnyClass,
>(
instanceConfig: Inner,
outerConfig?: Outer,
): new (...args: ParamsFromClass<Outer>) => Instances<TypeFromClass<Inner>> &
TypeFromClass<Outer> {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
outerConfig ??= class EmptyConfig {};
if (outerConfig[OriginalClassSym]) {
outerConfig = outerConfig[OriginalClassSym];
}
const instanceConfigClass = class MixedInstancesConfig extends outerConfig {
): new () => Instances<TypeFromClass<Inner>> {
const instanceConfigClass = class InstancesConfig {
instances: TypeFromClass<Inner>[];
};
SchemaProperty({
......
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