mirror of
https://github.com/diced/zipline.git
synced 2025-12-25 12:25:08 -08:00
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import { FastifyInstance } from "fastify";
|
|
import { readdirSync, statSync } from "fs";
|
|
import { join } from "path";
|
|
import { Plugin } from "./Plugin";
|
|
|
|
export class PluginLoader {
|
|
public directory: string;
|
|
public files: string[];
|
|
public plugins: Plugin[] = [];
|
|
public builtIns: Plugin[] = [];
|
|
public fastify: FastifyInstance;
|
|
|
|
constructor(fastify: FastifyInstance, ...directory: string[]) {
|
|
this.directory = join(...directory);
|
|
this.fastify = fastify;
|
|
}
|
|
|
|
public getAllFiles(builtIn: boolean = false): string[] {
|
|
const result = [];
|
|
|
|
const r = (dir: string) => {
|
|
for (const file of readdirSync(dir)) {
|
|
const p = join(dir, file);
|
|
const s = statSync(p);
|
|
if (s.isDirectory()) r(p);
|
|
else result.push(p);
|
|
}
|
|
};
|
|
|
|
r(builtIn ? join(process.cwd(), process.env.NODE_ENV !== 'development' ? 'dist' : 'src', 'lib', 'plugin', 'builtins') : this.directory);
|
|
|
|
return result;
|
|
}
|
|
|
|
public async loadPlugins(builtIn: boolean = false): Promise<Plugin[]> {
|
|
const files = this.getAllFiles(builtIn);
|
|
|
|
for (const pluginFile of files) {
|
|
const im = await import(pluginFile);
|
|
builtIn ? this.builtIns.push(new im.default()) : this.plugins.push(new im.default());
|
|
}
|
|
|
|
return builtIn ? this.builtIns.sort((a, b) => a.priority - b.priority) : this.plugins.sort((a, b) => a.priority - b.priority);
|
|
}
|
|
} |