UNPKG

surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

162 lines 5.63 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateConfig = exports.normalizeConfig = exports.setConfig = exports.getConfig = exports.loadConfig = void 0; const path_1 = __importDefault(require("path")); const url_1 = require("url"); const fs_extra_1 = __importDefault(require("fs-extra")); const lodash_1 = __importDefault(require("lodash")); const constant_1 = require("./constant"); const redis_1 = __importDefault(require("./redis")); const validators_1 = require("./validators"); const flag_1 = require("./utils/flag"); const utils_1 = require("./utils"); let finalConfig = null; const loadConfig = (cwd, override) => { const absPath = path_1.default.join(cwd, 'surgio.conf.js'); // istanbul ignore next if (!fs_extra_1.default.existsSync(absPath)) { throw new Error(`配置文件 ${absPath} 不存在`); } const userConfig = (0, exports.validateConfig)(lodash_1.default.cloneDeep(require(absPath))); if (userConfig.flags) { Object.keys(userConfig.flags).forEach((emoji) => { if (userConfig.flags) { if (typeof userConfig.flags[emoji] === 'string') { (0, flag_1.addFlagMap)(userConfig.flags[emoji], emoji); } else if (lodash_1.default.isRegExp(userConfig.flags[emoji])) { (0, flag_1.addFlagMap)(userConfig.flags[emoji], emoji); } else { ; userConfig.flags[emoji].forEach((name) => { (0, flag_1.addFlagMap)(name, emoji); }); } } }); } if (override) { return { ...(0, exports.normalizeConfig)(cwd, userConfig), ...override, }; } finalConfig = (0, exports.normalizeConfig)(cwd, userConfig); return finalConfig; }; exports.loadConfig = loadConfig; const getConfig = () => { // istanbul ignore next if (!finalConfig) { throw new Error('请先调用 loadConfig 方法'); } return finalConfig; }; exports.getConfig = getConfig; const setConfig = (key, value) => { // istanbul ignore next if (!finalConfig) { throw new Error('请先调用 loadConfig 方法'); } if (lodash_1.default.isPlainObject(value)) { finalConfig[key] = { ...finalConfig[key], ...value, }; } else { finalConfig[key] = value; } return finalConfig; }; exports.setConfig = setConfig; const normalizeConfig = (cwd, userConfig) => { const defaultConfig = { artifacts: [], urlBase: '/', output: path_1.default.join(cwd, './dist'), templateDir: path_1.default.join(cwd, './template'), providerDir: path_1.default.join(cwd, './provider'), configDir: (0, utils_1.ensureConfigFolder)(), surgeConfig: { resolveHostname: false, vmessAEAD: true, }, clashConfig: { enableShadowTls: false, enableTuic: false, enableHysteria2: false, enableVless: false, clashCore: 'clash', }, quantumultXConfig: { vmessAEAD: true, }, surfboardConfig: { vmessAEAD: true, }, proxyTestUrl: constant_1.PROXY_TEST_URL, proxyTestInterval: constant_1.PROXY_TEST_INTERVAL, internetTestUrl: constant_1.INTERNET_TEST_URL, internetTestInterval: constant_1.INTERNET_TEST_INTERVAL, checkHostname: false, resolveHostname: false, cache: { type: 'default', }, gateway: { passRequestUserAgent: false, passRequestHeaders: [], }, }; const config = lodash_1.default.defaultsDeep(userConfig, defaultConfig); // istanbul ignore next if (!fs_extra_1.default.existsSync(config.templateDir)) { throw new Error(`仓库内缺少 ${config.templateDir} 目录`); } // istanbul ignore next if (!fs_extra_1.default.existsSync(config.providerDir)) { throw new Error(`仓库内缺少 ${config.providerDir} 目录`); } if (/http/i.test(config.urlBase)) { const urlObject = new url_1.URL(config.urlBase); config.publicUrl = urlObject.origin + '/'; } else { config.publicUrl = '/'; } // istanbul ignore next if (config.cache && config.cache.type === 'redis') { if (!config.cache.redisUrl) { throw new Error('缓存配置错误,请检查 cache.redisUrl 配置'); } redis_1.default.createRedis(config.cache.redisUrl); } // istanbul ignore next if (config.gateway) { if (config.gateway.auth && !config.gateway.accessToken) { throw new Error('请检查 gateway.accessToken 配置'); } } // istanbul ignore next if (config.gateway?.passRequestUserAgent && !config.gateway.passRequestHeaders.includes('user-agent')) { config.gateway.passRequestHeaders.push('user-agent'); } return config; }; exports.normalizeConfig = normalizeConfig; const validateConfig = (userConfig) => { const result = validators_1.SurgioConfigValidator.safeParse(userConfig); // istanbul ignore next if (!result.success) { throw result.error; } return result.data; }; exports.validateConfig = validateConfig; //# sourceMappingURL=config.js.map