surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
100 lines • 4.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const core_1 = require("@oclif/core");
const fs_extra_1 = __importDefault(require("fs-extra"));
const base_command_1 = __importDefault(require("../base-command"));
const generator_1 = require("../generator");
const config_1 = require("../config");
const linter_1 = require("../utils/linter");
const utils_1 = require("../utils");
class GenerateCommand extends base_command_1.default {
static description = '生成规则';
async run() {
if (!this.flags['skip-lint']) {
const result = await (0, linter_1.checkAndFix)(this.projectDir);
if (!result) {
throw new Error('JS 语法检查不通过,请根据提示修改文件(参考 https://url.royli.dev/SeB6m)');
}
}
if (this.flags.output) {
(0, config_1.setConfig)('output', this.flags.output);
}
await this.generate(this.flags['skip-fail'], this.flags['cache-snippet']);
await this.cleanup();
}
async generate(skipFail, cacheSnippet) {
this.ora.info('开始生成规则');
const config = this.surgioConfig;
const artifactList = config.artifacts;
const distPath = config.output;
const remoteSnippetsConfig = config.remoteSnippets || [];
const remoteSnippetList = await (0, utils_1.loadRemoteSnippetList)(remoteSnippetsConfig, cacheSnippet);
const templateEngine = (0, generator_1.getEngine)(config.templateDir, {
clashCore: config.clashConfig?.clashCore,
});
await fs_extra_1.default.mkdirp(distPath);
for (const artifact of artifactList) {
this.ora.start(`正在生成规则 ${artifact.name}`);
try {
const artifactInstance = new generator_1.Artifact(config, artifact, {
remoteSnippetList,
});
artifactInstance.once('initProvider:end', () => {
this.ora.text = `已处理 Provider ${artifactInstance.initProgress}/${artifactInstance.providerNameList.length}...`;
});
await artifactInstance.init();
const result = artifactInstance.render(templateEngine);
const destFilePath = path_1.default.join(config.output, artifact.name);
if (artifact.destDir) {
fs_extra_1.default.accessSync(artifact.destDir, fs_extra_1.default.constants.W_OK);
await fs_extra_1.default.writeFile(path_1.default.join(artifact.destDir, artifact.name), result);
}
else {
await fs_extra_1.default.writeFile(destFilePath, result);
}
if (artifact.destDirs) {
for (const destDir of artifact.destDirs) {
fs_extra_1.default.accessSync(destDir, fs_extra_1.default.constants.W_OK);
await fs_extra_1.default.promises.writeFile(path_1.default.join(destDir, artifact.name), result);
}
}
this.ora.succeed(`规则 ${artifact.name} 生成成功`);
}
catch (err) {
this.ora.fail(`规则 ${artifact.name} 生成失败`);
// istanbul ignore next
if (skipFail && err instanceof Error) {
console.error(err.stack || err);
}
else {
throw err;
}
}
}
this.ora.succeed('规则生成成功');
}
}
GenerateCommand.flags = {
output: core_1.Flags.string({
char: 'o',
description: '生成规则的目录',
}),
'cache-snippet': core_1.Flags.boolean({
default: false,
description: '缓存远程片段',
}),
'skip-fail': core_1.Flags.boolean({
default: false,
description: '跳过生成失败的 Artifact',
}),
'skip-lint': core_1.Flags.boolean({
default: false,
description: '跳过代码检查',
}),
};
exports.default = GenerateCommand;
//# sourceMappingURL=generate.js.map