From 1303744eba12cf5380c0df0d7378b64f0cc829d3 Mon Sep 17 00:00:00 2001 From: Shigma Date: Wed, 28 Jun 2023 02:13:31 +0800 Subject: [PATCH] feat(loader): support loader.keyFor() given plugin, returns short name --- packages/koishi/package.json | 2 +- packages/loader/package.json | 3 ++- packages/loader/src/index.ts | 10 +++------- packages/loader/src/shared.ts | 15 +++++++++++++-- packages/loader/tests/index.spec.ts | 4 ++-- packages/loader/tests/utils.ts | 6 ++---- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/koishi/package.json b/packages/koishi/package.json index 03c0fe395c..dd271caf02 100644 --- a/packages/koishi/package.json +++ b/packages/koishi/package.json @@ -47,7 +47,7 @@ ], "dependencies": { "@koishijs/core": "4.13.5", - "@koishijs/loader": "3.2.5", + "@koishijs/loader": "3.3.0", "@koishijs/utils": "^7.0.2", "@satorijs/satori": "^2.4.0", "cac": "^6.7.14", diff --git a/packages/loader/package.json b/packages/loader/package.json index 1641173f0a..c16261cbf2 100644 --- a/packages/loader/package.json +++ b/packages/loader/package.json @@ -1,7 +1,7 @@ { "name": "@koishijs/loader", "description": "Config Loader for Koishi", - "version": "3.2.5", + "version": "3.3.0", "main": "lib/index.js", "module": "lib/shared.mjs", "typings": "lib/index.d.ts", @@ -14,6 +14,7 @@ "require": "./lib/shared.js", "import": "./lib/shared.mjs" }, + "./src/*": "./src/*", "./package.json": "./package.json" }, "files": [ diff --git a/packages/loader/src/index.ts b/packages/loader/src/index.ts index b542344f6e..0fdfd1a8d3 100644 --- a/packages/loader/src/index.ts +++ b/packages/loader/src/index.ts @@ -1,5 +1,5 @@ import { Logger } from '@koishijs/core' -import { Loader, unwrapExports } from './shared' +import { Loader } from './shared' import { promises as fs } from 'fs' import * as dotenv from 'dotenv' import ns from 'ns-require' @@ -55,18 +55,14 @@ export default class NodeLoader extends Loader { return await super.readConfig() } - async resolve(name: string) { - return this.scope.resolve(name) - } - - async resolvePlugin(name: string) { + async import(name: string) { try { this.cache[name] ||= this.scope.resolve(name) } catch (err) { logger.error(err.message) return } - return unwrapExports(require(this.cache[name])) + return require(this.cache[name]) } fullReload(code = Loader.exitCode) { diff --git a/packages/loader/src/shared.ts b/packages/loader/src/shared.ts index 18108ecced..7303e023df 100644 --- a/packages/loader/src/shared.ts +++ b/packages/loader/src/shared.ts @@ -126,8 +126,9 @@ export abstract class Loader { public cache: Dict = Object.create(null) public prolog?: Logger.Record[] - abstract resolve(name: string): Promise - abstract resolvePlugin(name: string): Promise + private store = new WeakMap() + + abstract import(name: string): Promise abstract fullReload(code?: number): void async init(filename?: string) { @@ -215,6 +216,16 @@ export abstract class Loader { } } + async resolvePlugin(name: string) { + const plugin = unwrapExports(await this.import(name)) + if (plugin) this.store.set(plugin, name) + return plugin + } + + keyFor(plugin: any) { + return this.store.get(plugin) + } + private async forkPlugin(name: string, config: any, parent: Context) { const plugin = await this.resolvePlugin(name) if (!plugin) return diff --git a/packages/loader/tests/index.spec.ts b/packages/loader/tests/index.spec.ts index a16f2ecd46..27c15fba9f 100644 --- a/packages/loader/tests/index.spec.ts +++ b/packages/loader/tests/index.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai' -import { Context } from 'koishi' +import { Context, sleep } from 'koishi' import * as jest from 'jest-mock' import mock from '@koishijs/plugin-mock' import Loader from './utils' @@ -53,7 +53,7 @@ describe('@koishijs/loader', () => { }, } app.scope.update(loader.config) - await app.lifecycle.flush() + await sleep(0) expect(app.config.prefix).to.deep.equal(['/']) expect(app.registry.get(loader.data.foo)).to.be.not.ok expect(app.registry.get(loader.data.bar)).to.be.ok diff --git a/packages/loader/tests/utils.ts b/packages/loader/tests/utils.ts index 950997fc7a..dc1a889015 100644 --- a/packages/loader/tests/utils.ts +++ b/packages/loader/tests/utils.ts @@ -1,13 +1,11 @@ -import { Dict, Logger, Plugin } from 'koishi' +import { Dict, Plugin } from 'koishi' import { Loader } from '../src' import * as jest from 'jest-mock' -const logger = new Logger('app') - export default class TestLoader extends Loader { data: Dict = Object.create(null) - async resolvePlugin(name: string) { + async import(name: string) { return this.data[name] ||= { name, apply: (ctx) => {