@koishijs/loader
Version:
Config Loader for Koishi
194 lines (192 loc) • 7.04 kB
JavaScript
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