Commit 7250cab8 authored by nanahira's avatar nanahira

rework multi plugin with factory

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