UNPKG

surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

100 lines 4.37 kB
"use strict"; 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