Commit 455de00f authored by nanahira's avatar nanahira

move to plugin factory

parent 22c9700c
import { Schema } from 'koishi';
import { Awaitable, Context } from 'koishi'; import { Awaitable, Context } from 'koishi';
import { DefinePlugin, RegisterSchema, SchemaProperty } from 'koishi-thirdeye';
import { import {
DefineMultiSourcePlugin, DefinePlugin,
PicResult, MultiInstancePlugin,
PicSourceConfig, RegisterSchema,
PicSourcePlugin, SchemaProperty,
} from '../src'; } from 'koishi-thirdeye';
import { PicResult, PicSourceConfig, PicSourcePlugin } from '../src';
@RegisterSchema() @RegisterSchema()
class Config extends PicSourceConfig { class Config extends PicSourceConfig {
@SchemaProperty({ default: 'zh-CN' })
name: string;
@SchemaProperty({ default: 'https://cdn02.moecube.com:444' }) @SchemaProperty({ default: 'https://cdn02.moecube.com:444' })
endpoint: string; endpoint: string;
} }
@DefinePlugin({ name: 'test-source', schema: Config }) @DefinePlugin()
class TestPicSourcePlugin extends PicSourcePlugin<Config> { class TestPicSourcePlugin extends PicSourcePlugin(Config) {
randomPic(picTags: string[]): Awaitable<PicResult> { randomPic(picTags: string[]): Awaitable<PicResult> {
return { return {
url: `${this.config.endpoint}/images/ygopro-images-${this.name}/${ url: `${this.config.endpoint}/images/ygopro-images-${this.name}/${
...@@ -26,23 +28,23 @@ class TestPicSourcePlugin extends PicSourcePlugin<Config> { ...@@ -26,23 +28,23 @@ class TestPicSourcePlugin extends PicSourcePlugin<Config> {
} }
} }
export class TestMultiPicSourcePlugin extends DefineMultiSourcePlugin( @DefinePlugin()
export class TestMultiPicSourcePlugin extends MultiInstancePlugin(
TestPicSourcePlugin, TestPicSourcePlugin,
Config,
) {} ) {}
console.log((TestMultiPicSourcePlugin['Config'] as Schema).dict.instances.type);
export default class ExtrasInDev { export default class ExtrasInDev {
constructor(ctx: Context) { constructor(ctx: Context) {
ctx.plugin(TestMultiPicSourcePlugin, { ctx.plugin(TestMultiPicSourcePlugin, {
instances: [ instances: [
{ {
name: 'zh-CN', // name: 'zh-CN',
isDefault: true, isDefault: true,
endpoint: 'https://cdn02.moecube.com:444', endpoint: 'https://cdn02.moecube.com:444',
}, },
{ name: 'en-US' }, {
name: 'en-US',
},
], ],
}); });
} }
......
This diff is collapsed.
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
}, },
"homepage": "https://github.com/koishijs/koishi-plugin-pics", "homepage": "https://github.com/koishijs/koishi-plugin-pics",
"dependencies": { "dependencies": {
"koishi-thirdeye": "^10.0.5", "koishi-thirdeye": "^10.0.20",
"lodash": "^4.17.21" "lodash": "^4.17.21"
}, },
"devDependencies": { "devDependencies": {
...@@ -51,13 +51,13 @@ ...@@ -51,13 +51,13 @@
"ts-jest": "^27.1.3", "ts-jest": "^27.1.3",
"ts-loader": "^9.2.6", "ts-loader": "^9.2.6",
"ts-node": "^10.5.0", "ts-node": "^10.5.0",
"typescript": "^4.4.4", "typescript": "^4.6.4",
"webpack": "^5.59.1", "webpack": "^5.59.1",
"webpack-cli": "^4.9.1", "webpack-cli": "^4.9.1",
"ws": "^8.3.0" "ws": "^8.3.0"
}, },
"peerDependencies": { "peerDependencies": {
"koishi": "^4.6.1" "koishi": "^4.6.2"
}, },
"jest": { "jest": {
"moduleFileExtensions": [ "moduleFileExtensions": [
......
...@@ -27,13 +27,11 @@ export type PicsPluginConfigLike = Partial<PicsPluginConfig>; ...@@ -27,13 +27,11 @@ export type PicsPluginConfigLike = Partial<PicsPluginConfig>;
// For convenience of plugins // For convenience of plugins
export class PicSourceConfig implements PicSourceInfo { export class PicSourceConfig implements PicSourceInfo {
constructor(config: Partial<PicSourceInfo>) {}
@SchemaProperty({ type: 'string', default: [], description: '图源标签' }) @SchemaProperty({ type: 'string', default: [], description: '图源标签' })
tags: string[]; tags: string[];
@SchemaProperty({ default: 1, description: '图源权重' }) @SchemaProperty({ default: 1, description: '图源权重' })
weight: number; weight: number;
@SchemaProperty({ default: 1, description: '图源名称', required: true }) @SchemaProperty({ description: '图源名称', required: true })
name: string; name: string;
@SchemaProperty({ description: '图源描述' }) @SchemaProperty({ description: '图源描述' })
description?: string; description?: string;
......
import { Awaitable } from 'koishi'; import { Awaitable } from 'koishi';
import { ClassType, SchemaClass, SchemaProperty } from 'koishi-thirdeye';
import { Context } from 'vm';
export interface PicSourceInfo { export interface PicSourceInfo {
tags?: string[]; tags?: string[];
...@@ -25,49 +23,3 @@ export interface PicMiddlewareInfo { ...@@ -25,49 +23,3 @@ export interface PicMiddlewareInfo {
name?: string; name?: string;
prepend?: boolean; prepend?: boolean;
} }
export interface Instances<T> {
instances: T[];
}
export function ToInstancesConfig<T>(
instanceConfig: ClassType<T>,
): new () => Instances<T> {
const instanceConfigClass = class InstancesConfig {
instances: T[];
};
SchemaProperty({
type: SchemaClass(instanceConfig),
default: [],
array: true,
})(instanceConfigClass.prototype, 'instances');
return instanceConfigClass;
}
export function ClonePlugin<P extends { new (...args: any[]): any }>(
target: P,
name: string,
): P {
const pluginName = target.name;
const clonedPlugin = class extends target {};
for (const property of ['Config', 'schema', 'using']) {
Object.defineProperty(clonedPlugin, property, {
enumerable: true,
configurable: true,
writable: true,
value: target[property],
});
}
Object.defineProperty(clonedPlugin, 'name', {
enumerable: true,
configurable: true,
writable: true,
value: pluginName,
});
return clonedPlugin;
}
export type TypeFromClass<T> = T extends { new (...args: any[]): infer U }
? U
: never;
...@@ -2,6 +2,7 @@ import { Awaitable, Logger } from 'koishi'; ...@@ -2,6 +2,7 @@ import { Awaitable, Logger } from 'koishi';
import { PicMiddlewareConfig } from './config'; import { PicMiddlewareConfig } from './config';
import { import {
BasePlugin, BasePlugin,
CreatePluginFactory,
Inject, Inject,
InjectLogger, InjectLogger,
LifecycleEvents, LifecycleEvents,
...@@ -9,10 +10,8 @@ import { ...@@ -9,10 +10,8 @@ import {
import PicsContainer from './index'; import PicsContainer from './index';
import { PicMiddleware, PicNext } from './def'; import { PicMiddleware, PicNext } from './def';
export class PicMiddlewareBase< export class BasePicMiddlewarePlugin
C extends PicMiddlewareConfig = PicMiddlewareConfig, extends BasePlugin<PicMiddlewareConfig>
>
extends BasePlugin<C>
implements PicMiddleware, LifecycleEvents implements PicMiddleware, LifecycleEvents
{ {
@Inject(true) @Inject(true)
...@@ -30,3 +29,8 @@ export class PicMiddlewareBase< ...@@ -30,3 +29,8 @@ export class PicMiddlewareBase<
return next(url); return next(url);
} }
} }
export const PicMiddlewarePlugin = CreatePluginFactory(
BasePicMiddlewarePlugin,
PicMiddlewareConfig,
);
import { DefinePlugin, Inject } from 'koishi-thirdeye'; import { DefinePlugin, Inject } from 'koishi-thirdeye';
import { Assets } from 'koishi'; import { Assets } from 'koishi';
import { PicMiddlewareBase } from '../middleware';
import { PicMiddlewareConfig } from '../config';
import { PicNext } from '../def'; import { PicNext } from '../def';
import { PicMiddlewarePlugin } from '../middleware';
@DefinePlugin({ schema: PicMiddlewareConfig }) @DefinePlugin()
export class PicAssetsTransformMiddleware extends PicMiddlewareBase { export class PicAssetsTransformMiddleware extends PicMiddlewarePlugin() {
@Inject() @Inject()
private assets: Assets; private assets: Assets;
......
import { DefinePlugin } from 'koishi-thirdeye'; import { DefinePlugin } from 'koishi-thirdeye';
import { PicMiddlewareBase } from '../middleware'; import { PicMiddlewarePlugin } from '../middleware';
import { PicMiddlewareConfig } from '../config';
import { PicNext } from '../def'; import { PicNext } from '../def';
@DefinePlugin({ schema: PicMiddlewareConfig }) @DefinePlugin()
export class PicDownloaderMiddleware extends PicMiddlewareBase { export class PicDownloaderMiddleware extends PicMiddlewarePlugin() {
override async use(url: string, next: PicNext) { override async use(url: string, next: PicNext) {
const downloadedUrl = await this.pics.download(url); const downloadedUrl = await this.pics.download(url);
return next(downloadedUrl); return next(downloadedUrl);
......
import { Context, Awaitable, Logger, Plugin } from 'koishi'; import { Context, Awaitable, Logger } from 'koishi';
import { import {
PartialDeep, PartialDeep,
InjectConfig, InjectConfig,
Inject, Inject,
InjectLogger, InjectLogger,
BasePlugin, CreatePluginFactory,
ClassType,
DefinePlugin,
LifecycleEvents,
} from 'koishi-thirdeye'; } from 'koishi-thirdeye';
import PicsContainer from '.'; import PicsContainer from '.';
import { PicSourceConfig } from './config'; import { PicSourceConfig } from './config';
import { import { PicSourceInfo, PicResult } from './def';
PicSourceInfo,
PicResult,
Instances,
ToInstancesConfig,
ClonePlugin,
TypeFromClass,
} from './def';
export class PicSource implements PicSourceInfo { export class PicSource implements PicSourceInfo {
constructor(protected ctx: Context) {} constructor(public ctx: Context) {}
tags: string[] = []; tags: string[] = [];
weight = 1; weight = 1;
name = 'default'; name = 'default';
...@@ -50,19 +40,19 @@ export class PicSource implements PicSourceInfo { ...@@ -50,19 +40,19 @@ export class PicSource implements PicSourceInfo {
} }
} }
export class PicSourcePlugin<C extends PicSourceConfig> extends PicSource { export class BasePicSourcePlugin extends PicSource {
constructor(ctx: Context, config: PartialDeep<C>) { constructor(ctx: Context, config: PartialDeep<PicSourceConfig>) {
super(ctx); super(ctx);
} }
@InjectConfig() @InjectConfig()
protected config: C; config: PicSourceConfig;
@Inject(true) @Inject(true)
protected pics: PicsContainer; pics: PicsContainer;
@InjectLogger() @InjectLogger()
protected logger: Logger; logger: Logger;
onApply() { onApply() {
this.config.applyTo(this); this.config.applyTo(this);
...@@ -70,56 +60,7 @@ export class PicSourcePlugin<C extends PicSourceConfig> extends PicSource { ...@@ -70,56 +60,7 @@ export class PicSourcePlugin<C extends PicSourceConfig> extends PicSource {
} }
} }
export class MultiPicSourcePlugin<C extends PicSourceConfig> export const PicSourcePlugin = CreatePluginFactory(
extends BasePlugin<Instances<C>> BasePicSourcePlugin,
implements LifecycleEvents PicSourceConfig,
{ );
@Inject(true)
protected pics: PicsContainer;
@InjectLogger()
protected logger: Logger;
getSourcePlugin(): new (ctx: Context, config: any) => PicSourcePlugin<C> {
throw new Error(`Not implemented`);
}
registerSourceInstances() {
const sourcePlugin = this.getSourcePlugin();
for (const instanceConfig of this.config.instances) {
const clonedSourcePlugin = ClonePlugin(
sourcePlugin,
`${instanceConfig.name}-${instanceConfig.name}`,
);
this.ctx.plugin(clonedSourcePlugin, instanceConfig);
}
}
onApply() {
this.registerSourceInstances();
}
}
export function DefineMultiSourcePlugin<C extends ClassType<PicSourceConfig>>(
SourcePlugin: new (ctx: Context, config: TypeFromClass<C>) => PicSourcePlugin<
TypeFromClass<C>
>,
SourceConfig: C,
name = SourcePlugin.name,
): new (
context: Context,
config: Instances<PartialDeep<TypeFromClass<C>>>,
) => MultiPicSourcePlugin<TypeFromClass<C>> {
const pluginClass = class SpecificMultiPicSourcePlugin extends MultiPicSourcePlugin<
TypeFromClass<C>
> {
getSourcePlugin() {
return SourcePlugin;
}
};
return DefinePlugin({
name,
schema: ToInstancesConfig(SourceConfig),
})(pluginClass);
}
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