surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
162 lines • 5.63 kB
JavaScript
;
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