surgio 2.25.2 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/dev +17 -0
- package/bin/dev.cmd +3 -0
- package/bin/run +8 -0
- package/bin/run.cmd +3 -0
- package/build/base-command.d.ts +18 -0
- package/build/base-command.js +74 -0
- package/build/commands/check.d.ts +10 -0
- package/build/commands/check.js +88 -0
- package/build/commands/clean-cache.d.ts +6 -0
- package/build/commands/clean-cache.js +29 -0
- package/build/commands/doctor.d.ts +6 -0
- package/build/commands/doctor.js +21 -0
- package/build/commands/generate.d.ts +7 -0
- package/build/commands/generate.js +93 -0
- package/build/commands/lint.d.ts +6 -0
- package/build/commands/lint.js +36 -0
- package/build/commands/new.d.ts +6 -0
- package/build/commands/new.js +36 -0
- package/build/commands/subscriptions.d.ts +7 -0
- package/build/commands/subscriptions.js +96 -0
- package/build/commands/upload.d.ts +6 -0
- package/build/commands/upload.js +87 -0
- package/build/config.d.ts +6 -0
- package/build/config.js +151 -0
- package/build/constant/constant.d.ts +17 -16
- package/build/constant/constant.js +3 -2
- package/build/constant/env.js +1 -1
- package/build/constant/error.js +1 -1
- package/build/constant/index.js +1 -1
- package/build/generate.d.ts +0 -1
- package/build/generate.js +3 -65
- package/build/generator/artifact.d.ts +299 -64
- package/build/generator/artifact.js +90 -92
- package/build/generator/index.d.ts +2 -0
- package/build/generator/index.js +19 -0
- package/build/generator/template.js +2 -6
- package/build/hooks/init.d.ts +3 -0
- package/build/hooks/init.js +32 -0
- package/build/index.d.ts +55 -53
- package/build/index.js +13 -51
- package/build/internal.d.ts +4 -0
- package/build/internal.js +21 -0
- package/build/misc/deprecation.d.ts +1 -6
- package/build/misc/deprecation.js +1 -8
- package/build/misc/flag_cn.js +1 -1
- package/build/provider/BlackSSLProvider.d.ts +4 -3
- package/build/provider/BlackSSLProvider.js +24 -16
- package/build/provider/ClashProvider.d.ts +7 -10
- package/build/provider/ClashProvider.js +165 -76
- package/build/provider/CustomProvider.d.ts +4 -3
- package/build/provider/CustomProvider.js +81 -50
- package/build/provider/Provider.d.ts +9 -22
- package/build/provider/Provider.js +31 -69
- package/build/provider/ShadowsocksJsonSubscribeProvider.d.ts +4 -5
- package/build/provider/ShadowsocksJsonSubscribeProvider.js +27 -21
- package/build/provider/ShadowsocksSubscribeProvider.d.ts +5 -8
- package/build/provider/ShadowsocksSubscribeProvider.js +30 -27
- package/build/provider/ShadowsocksrSubscribeProvider.d.ts +5 -8
- package/build/provider/ShadowsocksrSubscribeProvider.js +30 -23
- package/build/provider/SsdProvider.d.ts +5 -8
- package/build/provider/SsdProvider.js +56 -39
- package/build/provider/TrojanProvider.d.ts +5 -8
- package/build/provider/TrojanProvider.js +37 -30
- package/build/provider/V2rayNSubscribeProvider.d.ts +4 -5
- package/build/provider/V2rayNSubscribeProvider.js +61 -33
- package/build/provider/index.d.ts +16 -2
- package/build/provider/index.js +12 -5
- package/build/provider/types.d.ts +10 -1
- package/build/provider/types.js +1 -1
- package/build/redis.js +1 -1
- package/build/types.d.ts +45 -236
- package/build/types.js +2 -1
- package/build/utils/cache.js +29 -27
- package/build/utils/clash.d.ts +204 -3
- package/build/utils/clash.js +247 -106
- package/build/utils/configurables.d.ts +71 -0
- package/build/utils/configurables.js +8 -0
- package/build/utils/constant.js +1 -1
- package/build/utils/dns.js +1 -1
- package/build/utils/doctor.d.ts +2 -0
- package/build/utils/doctor.js +38 -0
- package/build/utils/env-flag.js +2 -2
- package/build/utils/error-helper.d.ts +2 -2
- package/build/utils/error-helper.js +30 -16
- package/build/utils/filter.d.ts +46 -43
- package/build/utils/filter.js +51 -30
- package/build/utils/flag.js +1 -1
- package/build/utils/http-client.js +38 -5
- package/build/utils/index.d.ts +13 -21
- package/build/utils/index.js +98 -117
- package/build/utils/linter.js +5 -2
- package/build/utils/loon.d.ts +3 -2
- package/build/utils/loon.js +67 -5
- package/build/utils/quantumult.d.ts +3 -3
- package/build/utils/quantumult.js +190 -258
- package/build/utils/relayable-url.js +1 -1
- package/build/utils/remote-snippet.js +3 -4
- package/build/utils/ss.js +27 -17
- package/build/utils/ssr.js +3 -4
- package/build/utils/subscription.js +7 -7
- package/build/utils/surfboard.d.ts +3 -2
- package/build/utils/surfboard.js +142 -126
- package/build/utils/surge.d.ts +4 -2
- package/build/utils/surge.js +328 -300
- package/build/utils/time.d.ts +1 -0
- package/build/utils/time.js +6 -0
- package/build/utils/tmp-helper.js +8 -1
- package/build/utils/trojan.js +19 -11
- package/build/utils/v2ray.js +2 -2
- package/build/validators/artifact.d.ts +35 -0
- package/build/validators/artifact.js +17 -0
- package/build/validators/common.d.ts +121 -0
- package/build/validators/common.js +52 -0
- package/build/validators/filter.d.ts +10 -0
- package/build/validators/filter.js +15 -0
- package/build/validators/hooks.d.ts +7 -0
- package/build/validators/hooks.js +8 -0
- package/build/validators/http.d.ts +137 -0
- package/build/validators/http.js +19 -0
- package/build/validators/index.d.ts +15 -0
- package/build/validators/index.js +32 -0
- package/build/validators/provider.d.ts +109 -0
- package/build/validators/provider.js +41 -0
- package/build/validators/shadowsocks.d.ts +86 -0
- package/build/validators/shadowsocks.js +29 -0
- package/build/validators/shadowsocksr.d.ts +77 -0
- package/build/validators/shadowsocksr.js +19 -0
- package/build/validators/snell.d.ts +71 -0
- package/build/validators/snell.js +20 -0
- package/build/validators/socks5.d.ts +77 -0
- package/build/validators/socks5.js +19 -0
- package/build/validators/surgio-config.d.ts +307 -0
- package/build/validators/surgio-config.js +95 -0
- package/build/validators/trojan.d.ts +86 -0
- package/build/validators/trojan.js +15 -0
- package/build/validators/tuic.d.ts +301 -0
- package/build/validators/tuic.js +21 -0
- package/build/validators/vmess.d.ts +92 -0
- package/build/validators/vmess.js +29 -0
- package/build/validators/wireguard.d.ts +123 -0
- package/build/validators/wireguard.js +26 -0
- package/config.d.ts +1 -0
- package/config.js +1 -0
- package/constant.d.ts +1 -0
- package/constant.js +1 -0
- package/generator.d.ts +1 -0
- package/generator.js +1 -0
- package/hygen-template/artifact/new/index.js +15 -15
- package/hygen-template/provider/new/index.js +8 -7
- package/hygen-template/template/new/index.js +3 -3
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/internal.d.ts +1 -0
- package/internal.js +1 -0
- package/package.json +112 -75
- package/provider.d.ts +1 -0
- package/provider.js +1 -0
- package/utils.d.ts +1 -0
- package/utils.js +1 -0
- package/bin/surgio.js +0 -8
- package/build/command/check.d.ts +0 -9
- package/build/command/check.js +0 -79
- package/build/command/clean-cache.d.ts +0 -8
- package/build/command/clean-cache.js +0 -43
- package/build/command/doctor.d.ts +0 -9
- package/build/command/doctor.js +0 -63
- package/build/command/generate.d.ts +0 -8
- package/build/command/generate.js +0 -64
- package/build/command/lint.d.ts +0 -7
- package/build/command/lint.js +0 -42
- package/build/command/new.d.ts +0 -7
- package/build/command/new.js +0 -44
- package/build/command/subscriptions.d.ts +0 -10
- package/build/command/subscriptions.js +0 -87
- package/build/command/upload.d.ts +0 -9
- package/build/command/upload.js +0 -101
- package/build/utils/command.d.ts +0 -2
- package/build/utils/command.js +0 -23
- package/build/utils/config.d.ts +0 -6
- package/build/utils/config.js +0 -245
- package/build/utils/patch-proxy.d.ts +0 -1
- package/build/utils/patch-proxy.js +0 -19
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// istanbul ignore file
|
|
7
|
+
const core_1 = require("@oclif/core");
|
|
8
|
+
const ali_oss_1 = __importDefault(require("ali-oss"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const node_dir_1 = __importDefault(require("node-dir"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const base_command_1 = __importDefault(require("../base-command"));
|
|
13
|
+
const redis_1 = __importDefault(require("../redis"));
|
|
14
|
+
const config_1 = require("../config");
|
|
15
|
+
class UploadCommand extends base_command_1.default {
|
|
16
|
+
static description = '上传规则到阿里云 OSS';
|
|
17
|
+
async run() {
|
|
18
|
+
const config = this.surgioConfig;
|
|
19
|
+
if (this.flags.output) {
|
|
20
|
+
(0, config_1.setConfig)('output', this.flags.output);
|
|
21
|
+
}
|
|
22
|
+
const ossConfig = {
|
|
23
|
+
region: config?.upload?.region,
|
|
24
|
+
bucket: config?.upload?.bucket,
|
|
25
|
+
endpoint: config?.upload?.endpoint,
|
|
26
|
+
accessKeyId: process.env.OSS_ACCESS_KEY_ID || config?.upload?.accessKeyId,
|
|
27
|
+
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET || config?.upload?.accessKeySecret,
|
|
28
|
+
};
|
|
29
|
+
const client = new ali_oss_1.default({
|
|
30
|
+
secure: true,
|
|
31
|
+
...ossConfig,
|
|
32
|
+
});
|
|
33
|
+
const prefix = config?.upload?.prefix || '/';
|
|
34
|
+
const fileList = await node_dir_1.default.promiseFiles(config.output);
|
|
35
|
+
const files = fileList.map((filePath) => ({
|
|
36
|
+
fileName: path_1.default.basename(filePath),
|
|
37
|
+
filePath,
|
|
38
|
+
}));
|
|
39
|
+
const fileNameList = files.map((file) => file.fileName);
|
|
40
|
+
const upload = () => {
|
|
41
|
+
return Promise.all(files.map((file) => {
|
|
42
|
+
const { fileName, filePath } = file;
|
|
43
|
+
const objectName = `${prefix}${fileName}`;
|
|
44
|
+
const readStream = fs_extra_1.default.createReadStream(filePath);
|
|
45
|
+
return client.put(objectName, readStream, {
|
|
46
|
+
mime: 'text/plain; charset=utf-8',
|
|
47
|
+
headers: {
|
|
48
|
+
'Cache-Control': 'private, no-cache, no-store',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}));
|
|
52
|
+
};
|
|
53
|
+
const deleteUnwanted = async () => {
|
|
54
|
+
const list = await client.list({
|
|
55
|
+
prefix,
|
|
56
|
+
delimiter: '/',
|
|
57
|
+
});
|
|
58
|
+
const deleteList = [];
|
|
59
|
+
for (const key in list.objects) {
|
|
60
|
+
if (list.objects.hasOwnProperty(key)) {
|
|
61
|
+
const object = list.objects[key];
|
|
62
|
+
const objectName = object.name.replace(prefix, '');
|
|
63
|
+
const isExist = fileNameList.indexOf(objectName) > -1;
|
|
64
|
+
if (objectName && !isExist) {
|
|
65
|
+
deleteList.push(object.name);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (deleteList.length) {
|
|
70
|
+
await client.deleteMulti(deleteList);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
this.ora.start('开始上传到阿里云 OSS');
|
|
74
|
+
await upload();
|
|
75
|
+
await deleteUnwanted();
|
|
76
|
+
await redis_1.default.destroyRedis();
|
|
77
|
+
this.ora.succeed();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
UploadCommand.flags = {
|
|
81
|
+
output: core_1.Flags.string({
|
|
82
|
+
char: 'o',
|
|
83
|
+
description: '生成规则的目录',
|
|
84
|
+
}),
|
|
85
|
+
};
|
|
86
|
+
exports.default = UploadCommand;
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3VwbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHVCQUF1QjtBQUN2QixzQ0FBbUM7QUFDbkMsc0RBQXlCO0FBQ3pCLHdEQUF5QjtBQUN6Qix3REFBMEI7QUFDMUIsZ0RBQXVCO0FBRXZCLG1FQUF5QztBQUN6QyxxREFBNEI7QUFDNUIsc0NBQXFDO0FBRXJDLE1BQU0sYUFBYyxTQUFRLHNCQUFpQztJQUMzRCxNQUFNLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQTtJQUU1QixLQUFLLENBQUMsR0FBRztRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7UUFFaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNyQixJQUFBLGtCQUFTLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDdkM7UUFFRCxNQUFNLFNBQVMsR0FBRztZQUNoQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQzlCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUTtZQUNsQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVc7WUFDekUsZUFBZSxFQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRSxlQUFlO1NBQ3ZFLENBQUE7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFHLENBQUM7WUFDckIsTUFBTSxFQUFFLElBQUk7WUFDWixHQUFHLFNBQVM7U0FDYixDQUFDLENBQUE7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxHQUFHLENBQUE7UUFDNUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsY0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDakMsUUFBUTtTQUNULENBQUMsQ0FBQyxDQUFBO1FBQ0gsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZELE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNsQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUE7Z0JBQ25DLE1BQU0sVUFBVSxHQUFHLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFBO2dCQUN6QyxNQUFNLFVBQVUsR0FBRyxrQkFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUVoRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRTtvQkFDeEMsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsT0FBTyxFQUFFO3dCQUNQLGVBQWUsRUFBRSw2QkFBNkI7cUJBQy9DO2lCQUNGLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUNILENBQUE7UUFDSCxDQUFDLENBQUE7UUFDRCxNQUFNLGNBQWMsR0FBRyxLQUFLLElBQUksRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQzdCLE1BQU07Z0JBQ04sU0FBUyxFQUFFLEdBQUc7YUFDZixDQUFDLENBQUE7WUFDRixNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUE7WUFFL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUM5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNoQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7b0JBQ2xELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7b0JBRXJELElBQUksVUFBVSxJQUFJLENBQUMsT0FBTyxFQUFFO3dCQUMxQixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDN0I7aUJBQ0Y7YUFDRjtZQUVELElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDckIsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO2FBQ3JDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDOUIsTUFBTSxNQUFNLEVBQUUsQ0FBQTtRQUNkLE1BQU0sY0FBYyxFQUFFLENBQUE7UUFDdEIsTUFBTSxlQUFLLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNwQixDQUFDOztBQUdILGFBQWEsQ0FBQyxLQUFLLEdBQUc7SUFDcEIsTUFBTSxFQUFFLFlBQUssQ0FBQyxNQUFNLENBQUM7UUFDbkIsSUFBSSxFQUFFLEdBQUc7UUFDVCxXQUFXLEVBQUUsU0FBUztLQUN2QixDQUFDO0NBQ0gsQ0FBQTtBQUVELGtCQUFlLGFBQWEsQ0FBQSJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CommandConfig, CommandConfigBeforeNormalize } from './types';
|
|
2
|
+
export declare const loadConfig: (cwd: string, override?: Partial<CommandConfig>) => CommandConfig;
|
|
3
|
+
export declare const getConfig: () => CommandConfig;
|
|
4
|
+
export declare const setConfig: <T extends "artifacts" | "customParams" | "customFilters" | "remoteSnippets" | "urlBase" | "upload" | "binPath" | "flags" | "surgeConfig" | "surfboardConfig" | "quantumultXConfig" | "clashConfig" | "gateway" | "checkHostname" | "proxyTestUrl" | "proxyTestInterval" | "internetTestUrl" | "analytics" | "cache" | "publicUrl" | "output" | "providerDir" | "templateDir" | "configDir">(key: T, value: CommandConfig[T]) => CommandConfig;
|
|
5
|
+
export declare const normalizeConfig: (cwd: string, userConfig: Partial<CommandConfigBeforeNormalize>) => CommandConfig;
|
|
6
|
+
export declare const validateConfig: (userConfig: Partial<CommandConfig>) => CommandConfigBeforeNormalize;
|
package/build/config.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateConfig = exports.normalizeConfig = exports.setConfig = exports.getConfig = exports.loadConfig = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const url_1 = require("url");
|
|
11
|
+
const constant_1 = require("./constant");
|
|
12
|
+
const redis_1 = __importDefault(require("./redis"));
|
|
13
|
+
const validators_1 = require("./validators");
|
|
14
|
+
const flag_1 = require("./utils/flag");
|
|
15
|
+
const utils_1 = require("./utils");
|
|
16
|
+
let finalConfig = null;
|
|
17
|
+
const loadConfig = (cwd, override) => {
|
|
18
|
+
const absPath = path_1.default.join(cwd, 'surgio.conf.js');
|
|
19
|
+
// istanbul ignore next
|
|
20
|
+
if (!fs_extra_1.default.existsSync(absPath)) {
|
|
21
|
+
throw new Error(`配置文件 ${absPath} 不存在`);
|
|
22
|
+
}
|
|
23
|
+
const userConfig = (0, exports.validateConfig)(lodash_1.default.cloneDeep(require(absPath)));
|
|
24
|
+
if (userConfig.flags) {
|
|
25
|
+
Object.keys(userConfig.flags).forEach((emoji) => {
|
|
26
|
+
if (userConfig.flags) {
|
|
27
|
+
if (typeof userConfig.flags[emoji] === 'string') {
|
|
28
|
+
(0, flag_1.addFlagMap)(userConfig.flags[emoji], emoji);
|
|
29
|
+
}
|
|
30
|
+
else if (lodash_1.default.isRegExp(userConfig.flags[emoji])) {
|
|
31
|
+
(0, flag_1.addFlagMap)(userConfig.flags[emoji], emoji);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
;
|
|
35
|
+
userConfig.flags[emoji].forEach((name) => {
|
|
36
|
+
(0, flag_1.addFlagMap)(name, emoji);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (override) {
|
|
43
|
+
return {
|
|
44
|
+
...(0, exports.normalizeConfig)(cwd, userConfig),
|
|
45
|
+
...override,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
finalConfig = (0, exports.normalizeConfig)(cwd, userConfig);
|
|
49
|
+
return finalConfig;
|
|
50
|
+
};
|
|
51
|
+
exports.loadConfig = loadConfig;
|
|
52
|
+
const getConfig = () => {
|
|
53
|
+
// istanbul ignore next
|
|
54
|
+
if (!finalConfig) {
|
|
55
|
+
throw new Error('请先调用 loadConfig 方法');
|
|
56
|
+
}
|
|
57
|
+
return finalConfig;
|
|
58
|
+
};
|
|
59
|
+
exports.getConfig = getConfig;
|
|
60
|
+
const setConfig = (key, value) => {
|
|
61
|
+
// istanbul ignore next
|
|
62
|
+
if (!finalConfig) {
|
|
63
|
+
throw new Error('请先调用 loadConfig 方法');
|
|
64
|
+
}
|
|
65
|
+
if (lodash_1.default.isPlainObject(value)) {
|
|
66
|
+
finalConfig[key] = {
|
|
67
|
+
...finalConfig[key],
|
|
68
|
+
...value,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
finalConfig[key] = value;
|
|
73
|
+
}
|
|
74
|
+
return finalConfig;
|
|
75
|
+
};
|
|
76
|
+
exports.setConfig = setConfig;
|
|
77
|
+
const normalizeConfig = (cwd, userConfig) => {
|
|
78
|
+
const defaultConfig = {
|
|
79
|
+
artifacts: [],
|
|
80
|
+
urlBase: '/',
|
|
81
|
+
output: path_1.default.join(cwd, './dist'),
|
|
82
|
+
templateDir: path_1.default.join(cwd, './template'),
|
|
83
|
+
providerDir: path_1.default.join(cwd, './provider'),
|
|
84
|
+
configDir: (0, utils_1.ensureConfigFolder)(),
|
|
85
|
+
surgeConfig: {
|
|
86
|
+
resolveHostname: false,
|
|
87
|
+
vmessAEAD: true,
|
|
88
|
+
},
|
|
89
|
+
clashConfig: {
|
|
90
|
+
enableShadowTls: false,
|
|
91
|
+
enableTuic: false,
|
|
92
|
+
},
|
|
93
|
+
quantumultXConfig: {
|
|
94
|
+
vmessAEAD: true,
|
|
95
|
+
},
|
|
96
|
+
surfboardConfig: {
|
|
97
|
+
vmessAEAD: true,
|
|
98
|
+
},
|
|
99
|
+
proxyTestUrl: constant_1.PROXY_TEST_URL,
|
|
100
|
+
proxyTestInterval: constant_1.PROXY_TEST_INTERVAL,
|
|
101
|
+
internetTestUrl: constant_1.INTERNET_TEST_URL,
|
|
102
|
+
checkHostname: false,
|
|
103
|
+
cache: {
|
|
104
|
+
type: 'default',
|
|
105
|
+
},
|
|
106
|
+
gateway: {
|
|
107
|
+
passRequestUserAgent: false,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
const config = lodash_1.default.defaultsDeep(userConfig, defaultConfig);
|
|
111
|
+
// istanbul ignore next
|
|
112
|
+
if (!fs_extra_1.default.existsSync(config.templateDir)) {
|
|
113
|
+
throw new Error(`仓库内缺少 ${config.templateDir} 目录`);
|
|
114
|
+
}
|
|
115
|
+
// istanbul ignore next
|
|
116
|
+
if (!fs_extra_1.default.existsSync(config.providerDir)) {
|
|
117
|
+
throw new Error(`仓库内缺少 ${config.providerDir} 目录`);
|
|
118
|
+
}
|
|
119
|
+
if (/http/i.test(config.urlBase)) {
|
|
120
|
+
const urlObject = new url_1.URL(config.urlBase);
|
|
121
|
+
config.publicUrl = urlObject.origin + '/';
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
config.publicUrl = '/';
|
|
125
|
+
}
|
|
126
|
+
// istanbul ignore next
|
|
127
|
+
if (config.cache && config.cache.type === 'redis') {
|
|
128
|
+
if (!config.cache.redisUrl) {
|
|
129
|
+
throw new Error('缓存配置错误,请检查 cache.redisUrl 配置');
|
|
130
|
+
}
|
|
131
|
+
redis_1.default.createRedis(config.cache.redisUrl);
|
|
132
|
+
}
|
|
133
|
+
// istanbul ignore next
|
|
134
|
+
if (config.gateway) {
|
|
135
|
+
if (config.gateway.auth && !config.gateway.accessToken) {
|
|
136
|
+
throw new Error('请检查 gateway.accessToken 配置');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return config;
|
|
140
|
+
};
|
|
141
|
+
exports.normalizeConfig = normalizeConfig;
|
|
142
|
+
const validateConfig = (userConfig) => {
|
|
143
|
+
const result = validators_1.SurgioConfigValidator.safeParse(userConfig);
|
|
144
|
+
// istanbul ignore next
|
|
145
|
+
if (!result.success) {
|
|
146
|
+
throw result.error;
|
|
147
|
+
}
|
|
148
|
+
return result.data;
|
|
149
|
+
};
|
|
150
|
+
exports.validateConfig = validateConfig;
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx3REFBeUI7QUFDekIsb0RBQXNCO0FBQ3RCLGdEQUF1QjtBQUN2Qiw2QkFBeUI7QUFFekIseUNBSW1CO0FBQ25CLG9EQUEyQjtBQUUzQiw2Q0FBb0Q7QUFDcEQsdUNBQXlDO0FBQ3pDLG1DQUE0QztBQUU1QyxJQUFJLFdBQVcsR0FBeUIsSUFBSSxDQUFBO0FBRXJDLE1BQU0sVUFBVSxHQUFHLENBQ3hCLEdBQVcsRUFDWCxRQUFpQyxFQUNsQixFQUFFO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFFaEQsdUJBQXVCO0lBQ3ZCLElBQUksQ0FBQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsT0FBTyxNQUFNLENBQUMsQ0FBQTtLQUN2QztJQUVELE1BQU0sVUFBVSxHQUFHLElBQUEsc0JBQWMsRUFBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWhFLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRTtRQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM5QyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDL0MsSUFBQSxpQkFBVSxFQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFXLEVBQUUsS0FBSyxDQUFDLENBQUE7aUJBQ3JEO3FCQUFNLElBQUksZ0JBQUMsQ0FBQyxR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
|
|
@@ -1,26 +1,27 @@
|
|
|
1
1
|
export declare const NETWORK_SURGIO_UA = "surgio";
|
|
2
2
|
export declare const OBFS_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1";
|
|
3
3
|
export declare const PROXY_TEST_URL = "http://cp.cloudflare.com/generate_204";
|
|
4
|
+
export declare const INTERNET_TEST_URL = "http://connect.rom.miui.com/generate_204";
|
|
4
5
|
export declare const PROXY_TEST_INTERVAL = 1200;
|
|
5
|
-
export declare const CLASH_SUPPORTED_RULE:
|
|
6
|
-
export declare const QUANTUMULT_X_SUPPORTED_RULE:
|
|
7
|
-
export declare const LOON_SUPPORTED_RULE:
|
|
8
|
-
export declare const MELLOW_UNSUPPORTED_RULE:
|
|
9
|
-
export declare const SURFBOARD_SUPPORTED_RULE:
|
|
6
|
+
export declare const CLASH_SUPPORTED_RULE: readonly ["DOMAIN-SUFFIX", "DOMAIN-KEYWORD", "DOMAIN", "SRC-IP-CIDR", "IP-CIDR", "IP-CIDR6", "GEOIP", "DST-PORT", "SRC-PORT", "MATCH", "FINAL", "PROCESS-NAME"];
|
|
7
|
+
export declare const QUANTUMULT_X_SUPPORTED_RULE: readonly ["USER-AGENT", "HOST", "HOST-KEYWORD", "HOST-SUFFIX", "DOMAIN", "DOMAIN-SUFFIX", "DOMAIN-KEYWORD", "IP-CIDR", "IP-CIDR6", "GEOIP", "FINAL"];
|
|
8
|
+
export declare const LOON_SUPPORTED_RULE: readonly ["DOMAIN-SUFFIX", "DOMAIN", "DOMAIN-KEYWORD", "USER-AGENT", "URL-REGEX", "IP-CIDR", "GEOIP", "FINAL"];
|
|
9
|
+
export declare const MELLOW_UNSUPPORTED_RULE: readonly ["URL-REGEX", "USER-AGENT", "AND", "OR", "NOT", "DEST-PORT", "IN-PORT", "SRC-IP", "RULE-SET"];
|
|
10
|
+
export declare const SURFBOARD_SUPPORTED_RULE: readonly ["DOMAIN-SUFFIX", "DOMAIN", "DOMAIN-KEYWORD", "IP-CIDR", "IP-CIDR6", "GEOIP", "FINAL", "PROCESS-NAME", "RULE-SET", "DOMAIN-SET"];
|
|
10
11
|
export declare const CATEGORIES: {
|
|
11
|
-
SNIPPET:
|
|
12
|
-
SURGE:
|
|
13
|
-
QUANTUMULT_X:
|
|
14
|
-
QUANTUMULT_X_SERVER:
|
|
15
|
-
QUANTUMULT_X_FILTER:
|
|
16
|
-
QUANTUMULT_X_REWRITE:
|
|
17
|
-
CLASH:
|
|
18
|
-
LOON:
|
|
19
|
-
SURFBOARD:
|
|
12
|
+
readonly SNIPPET: "Snippet";
|
|
13
|
+
readonly SURGE: "Surge";
|
|
14
|
+
readonly QUANTUMULT_X: "Quantumult X";
|
|
15
|
+
readonly QUANTUMULT_X_SERVER: "Quantumult X Server";
|
|
16
|
+
readonly QUANTUMULT_X_FILTER: "Quantumult X Filter";
|
|
17
|
+
readonly QUANTUMULT_X_REWRITE: "Quantumult X Rewrite";
|
|
18
|
+
readonly CLASH: "Clash";
|
|
19
|
+
readonly LOON: "Loon";
|
|
20
|
+
readonly SURFBOARD: "Surfboard";
|
|
20
21
|
};
|
|
21
22
|
export declare const RELAY_SERVICE = "https://surgio-cors.herokuapp.com/";
|
|
22
23
|
export declare const TMP_FOLDER_NAME = "surgio-config";
|
|
23
24
|
export declare const CACHE_KEYS: {
|
|
24
|
-
RemoteSnippets:
|
|
25
|
-
Provider:
|
|
25
|
+
readonly RemoteSnippets: "remote-snippets";
|
|
26
|
+
readonly Provider: "provider";
|
|
26
27
|
};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// istanbul ignore file
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.CACHE_KEYS = exports.TMP_FOLDER_NAME = exports.RELAY_SERVICE = exports.CATEGORIES = exports.SURFBOARD_SUPPORTED_RULE = exports.MELLOW_UNSUPPORTED_RULE = exports.LOON_SUPPORTED_RULE = exports.QUANTUMULT_X_SUPPORTED_RULE = exports.CLASH_SUPPORTED_RULE = exports.PROXY_TEST_INTERVAL = exports.PROXY_TEST_URL = exports.OBFS_UA = exports.NETWORK_SURGIO_UA = void 0;
|
|
4
|
+
exports.CACHE_KEYS = exports.TMP_FOLDER_NAME = exports.RELAY_SERVICE = exports.CATEGORIES = exports.SURFBOARD_SUPPORTED_RULE = exports.MELLOW_UNSUPPORTED_RULE = exports.LOON_SUPPORTED_RULE = exports.QUANTUMULT_X_SUPPORTED_RULE = exports.CLASH_SUPPORTED_RULE = exports.PROXY_TEST_INTERVAL = exports.INTERNET_TEST_URL = exports.PROXY_TEST_URL = exports.OBFS_UA = exports.NETWORK_SURGIO_UA = void 0;
|
|
5
5
|
exports.NETWORK_SURGIO_UA = 'surgio';
|
|
6
6
|
exports.OBFS_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1';
|
|
7
7
|
exports.PROXY_TEST_URL = 'http://cp.cloudflare.com/generate_204';
|
|
8
|
+
exports.INTERNET_TEST_URL = 'http://connect.rom.miui.com/generate_204';
|
|
8
9
|
exports.PROXY_TEST_INTERVAL = 1200; // 1200s
|
|
9
10
|
exports.CLASH_SUPPORTED_RULE = [
|
|
10
11
|
'DOMAIN-SUFFIX',
|
|
@@ -85,4 +86,4 @@ exports.CACHE_KEYS = {
|
|
|
85
86
|
RemoteSnippets: 'remote-snippets',
|
|
86
87
|
Provider: 'provider',
|
|
87
88
|
};
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnQvY29uc3RhbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHVCQUF1Qjs7O0FBRVYsUUFBQSxpQkFBaUIsR0FBRyxRQUFRLENBQUE7QUFFNUIsUUFBQSxPQUFPLEdBQ2xCLDJJQUEySSxDQUFBO0FBRWhJLFFBQUEsY0FBYyxHQUFHLHVDQUF1QyxDQUFBO0FBRXhELFFBQUEsaUJBQWlCLEdBQUcsMENBQTBDLENBQUE7QUFFOUQsUUFBQSxtQkFBbUIsR0FBRyxJQUFJLENBQUEsQ0FBQyxRQUFRO0FBRW5DLFFBQUEsb0JBQW9CLEdBQUc7SUFDbEMsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsYUFBYTtJQUNiLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxjQUFjO0NBQ04sQ0FBQTtBQUVHLFFBQUEsMkJBQTJCLEdBQUc7SUFDekMsWUFBWTtJQUNaLE1BQU07SUFDTixjQUFjO0lBQ2QsYUFBYTtJQUNiLFFBQVE7SUFDUixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87Q0FDQyxDQUFBO0FBRVYsZ0VBQWdFO0FBQ25ELFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsZUFBZTtJQUNmLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87Q0FDQyxDQUFBO0FBRUcsUUFBQSx1QkFBdUIsR0FBRztJQUNyQyxXQUFXO0lBQ1gsWUFBWTtJQUNaLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7Q0FDRixDQUFBO0FBRVYsMERBQTBEO0FBQzdDLFFBQUEsd0JBQXdCLEdBQUc7SUFDdEMsZUFBZTtJQUNmLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLGNBQWM7SUFDZCxVQUFVO0lBQ1YsWUFBWTtDQUNKLENBQUE7QUFFRyxRQUFBLFVBQVUsR0FBRztJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLFlBQVksRUFBRSxjQUFjO0lBQzVCLG1CQUFtQixFQUFFLHFCQUFxQjtJQUMxQyxtQkFBbUIsRUFBRSxxQkFBcUI7SUFDMUMsb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixTQUFTLEVBQUUsV0FBVztDQUNkLENBQUE7QUFFRyxRQUFBLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQTtBQUVwRCxRQUFBLGVBQWUsR0FBRyxlQUFlLENBQUE7QUFFakMsUUFBQSxVQUFVLEdBQUc7SUFDeEIsY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyxRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUEifQ==
|
package/build/constant/env.js
CHANGED
|
@@ -9,4 +9,4 @@ exports.ENV_SURGIO_NETWORK_CLASH_UA = 'SURGIO_NETWORK_CLASH_UA';
|
|
|
9
9
|
exports.ENV_SURGIO_REMOTE_SNIPPET_CACHE_MAXAGE = 'SURGIO_REMOTE_SNIPPET_CACHE_MAXAGE';
|
|
10
10
|
exports.ENV_SURGIO_PROVIDER_CACHE_MAXAGE = 'SURGIO_PROVIDER_CACHE_MAXAGE';
|
|
11
11
|
exports.ENV_SURGIO_GFW_FREE = 'SURGIO_GFW_FREE';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50L2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLHVCQUF1QixHQUFHLHdCQUF3QixDQUFBO0FBRWxELFFBQUEsMkJBQTJCLEdBQUcsZ0NBQWdDLENBQUE7QUFFOUQsUUFBQSw4QkFBOEIsR0FBRyw0QkFBNEIsQ0FBQTtBQUU3RCxRQUFBLHdCQUF3QixHQUFHLHNCQUFzQixDQUFBO0FBRWpELFFBQUEsMkJBQTJCLEdBQUcseUJBQXlCLENBQUE7QUFFdkQsUUFBQSxzQ0FBc0MsR0FDakQsb0NBQW9DLENBQUE7QUFFekIsUUFBQSxnQ0FBZ0MsR0FBRyw4QkFBOEIsQ0FBQTtBQUVqRSxRQUFBLG1CQUFtQixHQUFHLGlCQUFpQixDQUFBIn0=
|
package/build/constant/error.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ERR_INVALID_FILTER = void 0;
|
|
4
4
|
exports.ERR_INVALID_FILTER = '传入的过滤器无效,请检查语法和变量名是否正确';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnQvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQSJ9
|
package/build/constant/index.js
CHANGED
|
@@ -17,4 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./env"), exports);
|
|
18
18
|
__exportStar(require("./error"), exports);
|
|
19
19
|
__exportStar(require("./constant"), exports);
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFxQjtBQUNyQiwwQ0FBdUI7QUFDdkIsNkNBQTBCIn0=
|
package/build/generate.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import { Environment } from 'nunjucks';
|
|
2
2
|
import { ArtifactConfig, CommandConfig, RemoteSnippet } from './types';
|
|
3
3
|
export declare function generate(config: CommandConfig, artifact: ArtifactConfig, remoteSnippetList: ReadonlyArray<RemoteSnippet>, templateEngine: Environment): Promise<string>;
|
|
4
|
-
export default function (config: CommandConfig, skipFail?: boolean, cacheSnippet?: boolean): Promise<void>;
|
package/build/generate.js
CHANGED
|
@@ -1,75 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.generate = void 0;
|
|
7
|
-
const
|
|
8
|
-
const ora_1 = __importDefault(require("ora"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const logger_1 = require("@surgio/logger");
|
|
11
|
-
const artifact_1 = require("./generator/artifact");
|
|
12
|
-
const template_1 = require("./generator/template");
|
|
13
|
-
const remote_snippet_1 = require("./utils/remote-snippet");
|
|
14
|
-
const spinner = (0, ora_1.default)();
|
|
15
|
-
async function run(config, skipFail, cacheSnippet) {
|
|
16
|
-
const artifactList = config.artifacts;
|
|
17
|
-
const distPath = config.output;
|
|
18
|
-
const remoteSnippetsConfig = config.remoteSnippets || [];
|
|
19
|
-
const remoteSnippetList = await (0, remote_snippet_1.loadRemoteSnippetList)(remoteSnippetsConfig, cacheSnippet);
|
|
20
|
-
const templateEngine = (0, template_1.getEngine)(config.templateDir);
|
|
21
|
-
await fs_extra_1.default.mkdirp(distPath);
|
|
22
|
-
for (const artifact of artifactList) {
|
|
23
|
-
spinner.start(`正在生成规则 ${artifact.name}`);
|
|
24
|
-
try {
|
|
25
|
-
const artifactInstance = new artifact_1.Artifact(config, artifact, {
|
|
26
|
-
remoteSnippetList,
|
|
27
|
-
});
|
|
28
|
-
artifactInstance.once('initProvider:end', () => {
|
|
29
|
-
spinner.text = `已处理 Provider ${artifactInstance.initProgress}/${artifactInstance.providerNameList.length}...`;
|
|
30
|
-
});
|
|
31
|
-
await artifactInstance.init();
|
|
32
|
-
const result = artifactInstance.render(templateEngine);
|
|
33
|
-
const destFilePath = path_1.default.join(config.output, artifact.name);
|
|
34
|
-
if (artifact.destDir) {
|
|
35
|
-
fs_extra_1.default.accessSync(artifact.destDir, fs_extra_1.default.constants.W_OK);
|
|
36
|
-
await fs_extra_1.default.writeFile(path_1.default.join(artifact.destDir, artifact.name), result);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
await fs_extra_1.default.writeFile(destFilePath, result);
|
|
40
|
-
}
|
|
41
|
-
spinner.succeed(`规则 ${artifact.name} 生成成功`);
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
spinner.fail(`规则 ${artifact.name} 生成失败`);
|
|
45
|
-
// istanbul ignore next
|
|
46
|
-
if (skipFail) {
|
|
47
|
-
console.error(err.stack || err);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
throw err;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
4
|
+
const generator_1 = require("./generator");
|
|
55
5
|
async function generate(config, artifact, remoteSnippetList, templateEngine) {
|
|
56
|
-
const artifactInstance = new
|
|
6
|
+
const artifactInstance = new generator_1.Artifact(config, artifact, {
|
|
57
7
|
remoteSnippetList,
|
|
58
8
|
});
|
|
59
9
|
await artifactInstance.init();
|
|
60
10
|
return artifactInstance.render(templateEngine);
|
|
61
11
|
}
|
|
62
12
|
exports.generate = generate;
|
|
63
|
-
|
|
64
|
-
logger_1.logger.info('开始生成规则');
|
|
65
|
-
await run(config, skipFail, cacheSnippet).catch((err) => {
|
|
66
|
-
// istanbul ignore next
|
|
67
|
-
if (spinner.isSpinning) {
|
|
68
|
-
spinner.fail();
|
|
69
|
-
}
|
|
70
|
-
throw err;
|
|
71
|
-
});
|
|
72
|
-
logger_1.logger.info('规则生成成功');
|
|
73
|
-
}
|
|
74
|
-
exports.default = default_1;
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvZ2VuZXJhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7QUFFYix3REFBMEI7QUFFMUIsOENBQXNCO0FBQ3RCLGdEQUF3QjtBQUN4QiwyQ0FBd0M7QUFDeEMsbURBQWdEO0FBRWhELG1EQUFpRDtBQUVqRCwyREFBK0Q7QUFFL0QsTUFBTSxPQUFPLEdBQUcsSUFBQSxhQUFHLEdBQUUsQ0FBQztBQUV0QixLQUFLLFVBQVUsR0FBRyxDQUNoQixNQUFxQixFQUNyQixRQUFrQixFQUNsQixZQUFzQjtJQUV0QixNQUFNLFlBQVksR0FBa0MsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUNyRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQy9CLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDekQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUEsc0NBQXFCLEVBQ25ELG9CQUFvQixFQUNwQixZQUFZLENBQ2IsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLElBQUEsb0JBQVMsRUFBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFckQsTUFBTSxrQkFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUxQixLQUFLLE1BQU0sUUFBUSxJQUFJLFlBQVksRUFBRTtRQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxtQkFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7Z0JBQ3RELGlCQUFpQjthQUNsQixDQUFDLENBQUM7WUFFSCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO2dCQUM3QyxPQUFPLENBQUMsSUFBSSxH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
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2VuZXJhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFBOzs7QUFJWiwyQ0FBc0M7QUFHL0IsS0FBSyxVQUFVLFFBQVEsQ0FDNUIsTUFBcUIsRUFDckIsUUFBd0IsRUFDeEIsaUJBQStDLEVBQy9DLGNBQTJCO0lBRTNCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxvQkFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDdEQsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFN0IsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDaEQsQ0FBQztBQWJELDRCQWFDIn0=
|