surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
74 lines • 3.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.render = exports.combineExtendFunctions = exports.extendEndpoints = exports.extendOutbounds = exports.createExtendFunction = void 0;
const path_1 = require("path");
const lodash_1 = __importDefault(require("lodash"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const createExtendFunction = (extendKey) => {
const extendFunction = (extendValue) => {
return (jsonInput, extendContext = {}) => {
const jsonInputCopy = lodash_1.default.cloneDeep(jsonInput);
const isExist = lodash_1.default.get(jsonInputCopy, extendKey);
const extendValueIsFunction = lodash_1.default.isFunction(extendValue);
const valueToExtend = extendValueIsFunction
? extendValue(extendContext)
: extendValue;
if (isExist) {
if (lodash_1.default.isArray(isExist)) {
if (lodash_1.default.isArray(valueToExtend)) {
lodash_1.default.set(jsonInputCopy, extendKey, [...isExist, ...valueToExtend]);
}
else {
lodash_1.default.set(jsonInputCopy, extendKey, [...isExist, valueToExtend]);
}
}
else if (lodash_1.default.isPlainObject(isExist) && lodash_1.default.isPlainObject(valueToExtend)) {
lodash_1.default.set(jsonInputCopy, extendKey, lodash_1.default.mergeWith({}, isExist, valueToExtend, (objValue, srcValue) => {
if (lodash_1.default.isArray(objValue) && lodash_1.default.isArray(srcValue)) {
return [...objValue, ...srcValue];
}
return undefined;
}));
}
else {
lodash_1.default.set(jsonInputCopy, extendKey, valueToExtend);
}
}
else {
lodash_1.default.set(jsonInputCopy, extendKey, valueToExtend);
}
return jsonInputCopy;
};
};
return extendFunction;
};
exports.createExtendFunction = createExtendFunction;
exports.extendOutbounds = (0, exports.createExtendFunction)('outbounds');
exports.extendEndpoints = (0, exports.createExtendFunction)('endpoints');
const combineExtendFunctions = (...args) => {
return (jsonInput, extendContext = {}) => {
return args.reduce((acc, extend) => extend(acc, extendContext), jsonInput);
};
};
exports.combineExtendFunctions = combineExtendFunctions;
const render = (templateDir, fileName, extend, extendContext) => {
const templatePath = (0, path_1.join)(templateDir, fileName);
const jsonInput = fs_extra_1.default.readJsonSync(templatePath);
try {
const jsonOutput = extend(jsonInput, extendContext);
return JSON.stringify(jsonOutput, null, 2);
}
catch (error) {
// istanbul ignore next
if (error instanceof Error) {
throw new Error(`Error when rendering JSON template ${fileName}: ${error.message}`);
}
// istanbul ignore next
throw new Error(`Error when rendering JSON template ${fileName}`);
}
};
exports.render = render;
//# sourceMappingURL=json-template.js.map