UNPKG

@koishijs/loader

Version:
194 lines (192 loc) 7.04 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { default: () => NodeLoader }); module.exports = __toCommonJS(index_exports); var import_core = require("@koishijs/core"); var import_fs = require("fs"); var dotenv = __toESM(require("dotenv")); var import_ns_require = __toESM(require("ns-require")); var import_shared = __toESM(require("./shared")); var import_module = require("module"); __reExport(index_exports, require("./shared"), module.exports); var logger = new import_core.Logger("app"); for (const key in require.extensions) { import_shared.default.extensions.add(key); } var initialKeys = Object.getOwnPropertyNames(process.env); var NodeLoader = class extends import_shared.default { static { __name(this, "NodeLoader"); } scope; localKeys = []; async init(filename) { await super.init(filename); this.scope = (0, import_ns_require.default)({ namespace: "koishi", prefix: "plugin", official: "koishijs", dirname: this.baseDir }); } migrateEntry(name, config) { config ??= {}; if (["database-mysql", "database-mongo", "database-postgres"].includes(name)) { config.database ??= "koishi"; } else if (name === "database-sqlite") { config.path ??= "data/koishi.db"; } else { return super.migrateEntry(name, config); } return config; } async migrate() { try { let addDep = function(name) { meta.dependencies[name] = deps[name]; isDirty = true; }, getProxyAgent = function(plugins) { for (const [key, value] of Object.entries(plugins)) { const name = key.replace(/^~/, "").split(":")[0]; let result; if (name === "http") { result = value?.proxyAgent; delete value.proxyAgent; } else if (name === "group") { result = getProxyAgent(value); } if (result) return result; } }, setProxyAgent = function(plugins) { for (const [key, value] of Object.entries(plugins)) { const name = key.replace(/^~/, "").split(":")[0]; if (name === "proxy-agent") { plugins[key] = { ...value, proxyAgent }; return true; } else if (name === "group") { const result = setProxyAgent(value); if (result) return result; } } }; __name(addDep, "addDep"); __name(getProxyAgent, "getProxyAgent"); __name(setProxyAgent, "setProxyAgent"); let isDirty = false; const meta = JSON.parse(await import_fs.promises.readFile("package.json", "utf8")); const require2 = (0, import_module.createRequire)(__filename); const deps = require2("koishi/package.json").dependencies; if (!meta.dependencies["@koishijs/plugin-http"]) { const { request = {} } = this.config; delete this.config["request"]; this.config.plugins = { http: request, ...this.config.plugins }; addDep("@koishijs/plugin-http"); } if (!meta.dependencies["@koishijs/plugin-proxy-agent"]) { this.config.plugins = { "proxy-agent": {}, ...this.config.plugins }; addDep("@koishijs/plugin-proxy-agent"); } const proxyAgent = getProxyAgent(this.config.plugins); if (proxyAgent) setProxyAgent(this.config.plugins); if (this.config["port"]) { const { port, host, maxPort, selfUrl } = this.config; delete this.config["port"]; delete this.config["host"]; delete this.config["maxPort"]; delete this.config["selfUrl"]; this.config.plugins = { server: { port, host, maxPort, selfUrl }, ...this.config.plugins }; addDep("@koishijs/plugin-server"); } if (isDirty) { meta.dependencies = Object.fromEntries(Object.entries(meta.dependencies).sort(([a], [b]) => a.localeCompare(b))); await import_fs.promises.writeFile("package.json", JSON.stringify(meta, null, 2) + "\n"); } } catch (error) { logger.warn("failed to migrate manifest"); logger.warn(error); } await super.migrate(); } async readConfig(initial = false) { for (const key of this.localKeys) { delete process.env[key]; } const parsed = {}; for (const filename of this.envFiles) { try { const raw = await import_fs.promises.readFile(filename, "utf8"); Object.assign(parsed, dotenv.parse(raw)); } catch { } } this.localKeys = []; for (const key in parsed) { if (initialKeys.includes(key)) continue; process.env[key] = parsed[key]; this.localKeys.push(key); } return await super.readConfig(initial); } async import(name) { try { this.cache[name] ||= this.scope.resolve(name); } catch (err) { logger.error(err.message); return; } return require(this.cache[name]); } fullReload(code = import_shared.default.exitCode) { const body = JSON.stringify(this.envData); process.send({ type: "shared", body }, (err) => { if (err) logger.error("failed to send shared data"); logger.info("trigger full reload"); process.exit(code); }); } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ...require("./shared") }); //# sourceMappingURL=index.js.map