diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..1495e77
Binary files /dev/null and b/.DS_Store differ
diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml
index 851d0ff..395241c 100644
--- a/backend/.idea/workspace.xml
+++ b/backend/.idea/workspace.xml
@@ -20,21 +20,19 @@
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
+
+
@@ -92,7 +90,8 @@
-
+
+
@@ -112,133 +111,169 @@
-
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
-
-
+
+
+
+
-
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/sub-store.js b/backend/sub-store.js
index 6e23d3f..eb99cf4 100644
--- a/backend/sub-store.js
+++ b/backend/sub-store.js
@@ -92,7 +92,7 @@ const AVAILABLE_OPERATORS = {
async function refreshResource(req, res) {
const {url} = req.body;
const cachedResources = $.read(RESOURCE_CACHE_KEY);
- cachedResources[url] = await $.http.get(url).then(resp => resp => resp.body).catch(err => {
+ cachedResources[url] = await $.http.get(url).then(resp => resp.body).catch(err => {
res.status(500).json({
status: "failed",
message: `Cannot refresh remote resource: ${url}\n Reason: ${err}`
@@ -146,7 +146,22 @@ async function parseSub(sub, platform) {
$.log("=======================================================================");
$.log(`Processing subscription: ${sub.name}, target platform ==> ${platform}.`);
+ $.log(`Initializing parser...`);
const $parser = ProxyParser(platform);
+ // Parsers
+ $parser.addParsers([
+ Clash_All,
+ // URI format parsers
+ URI_SS, URI_SSR, URI_VMess, URI_Trojan,
+ // Quantumult X platform
+ QX_SS, QX_SSR, QX_VMess, QX_Trojan, QX_Http,
+ // Loon platform
+ Loon_SS, Loon_SSR, Loon_VMess, Loon_Trojan, Loon_Http,
+ // Surge platform
+ Surge_SS, Surge_VMess, Surge_Trojan, Surge_Http
+ ]);
+
+ $.log(`Parser initialized.`);
let proxies = $parser.parse(raw);
// filters
@@ -180,6 +195,11 @@ async function parseSub(sub, platform) {
}
}
}
+
+ // Producers
+ $parser.addProducers([
+ QX_Producer, Loon_Producer, Surge_Producer, Raw_Producer
+ ]);
return $parser.produce(proxies);
}
@@ -418,11 +438,12 @@ function ProxyParser(targetPlatform) {
const parsers = [];
const producers = [];
- function addParsers(...args) {
+ function addParsers(args) {
args.forEach(a => parsers.push(a()));
+ $.log(`${args.length} parser added.`);
}
- function addProducers(...args) {
+ function addProducers(args) {
args.forEach(a => producers.push(a()))
}
@@ -529,26 +550,8 @@ function ProxyParser(targetPlatform) {
return output.join("\n");
}
- // Parsers
- addParsers(
- Clash_All,
- // URI format parsers
- URI_SS, URI_SSR, URI_VMess, URI_Trojan,
- // Quantumult X platform
- QX_SS, QX_SSR, QX_VMess, QX_Trojan, QX_Http,
- // Loon platform
- Loon_SS, Loon_SSR, Loon_VMess, Loon_Trojan, Loon_Http,
- // Surge platform
- Surge_SS, Surge_VMess, Surge_Trojan, Surge_Http
- );
-
- // Producers
- addProducers(
- QX_Producer, Loon_Producer, Surge_Producer, Raw_Producer
- );
-
return {
- parse, produce
+ parse, produce, addParsers, addProducers
};
}
@@ -1418,26 +1421,21 @@ function SetPropertyOperator(key, val) {
}
// add or remove flag for proxies
-function FlagOperator(type = 1) {
+function FlagOperator(add = true) {
return {
name: "Flag Operator",
func: proxies => {
return proxies.map(proxy => {
- switch (type) {
- case 0:
- // no flag
- proxy.name = removeFlag(proxy.name);
- break
- case 1:
- // get flag
- const newFlag = getFlag(proxy.name);
- // remove old flag
- proxy.name = removeFlag(proxy.name);
- proxy.name = newFlag + " " + proxy.name;
- proxy.name = proxy.name.replace(/🇹🇼/g, "🇨🇳");
- break;
- default:
- throw new Error("Unknown flag type: " + type);
+ if (!add)
+ // no flag
+ proxy.name = removeFlag(proxy.name);
+ else {
+ // get flag
+ const newFlag = getFlag(proxy.name);
+ // remove old flag
+ proxy.name = removeFlag(proxy.name);
+ proxy.name = newFlag + " " + proxy.name;
+ proxy.name = proxy.name.replace(/🇹🇼/g, "🇨🇳");
}
return proxy;
})
@@ -2139,7 +2137,7 @@ function express(port = 3000) {
app.use((req, res, next) => {
res.set(DEFAULT_HEADERS);
next();
- })
+ });
// adapter
app.start = () => {
@@ -2187,7 +2185,6 @@ function express(port = 3000) {
}
}
if (handler) {
- $.notify(`DISPATCHING:`, `${method}, ${url}`, path);
// dispatch to next handler
const next = () => {
dispatch(method, url, i);
@@ -2851,7 +2848,7 @@ var YAML =
if (currentObj != null) res.push(currentObj);
currentObj = {};
isMap = true;
- continue;
+
} else if (m = line.match(/^-\s*(.*)/)) {
if (currentObj != null)
currentObj.push(processValue(m[1]));
@@ -2864,7 +2861,7 @@ var YAML =
}
res.push(processValue(m[1]));
}
- continue;
+
}
}
diff --git a/web/.gitignore b/web/.gitignore
index 403adbc..3557e17 100644
--- a/web/.gitignore
+++ b/web/.gitignore
@@ -21,3 +21,5 @@ pnpm-debug.log*
*.njsproj
*.sln
*.sw?
+
+.vercel
diff --git a/web/package-lock.json b/web/package-lock.json
index c8bbad1..c7b8485 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1325,6 +1325,12 @@
"@types/node": "*"
}
},
+ "@types/html-minifier-terser": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz",
+ "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==",
+ "dev": true
+ },
"@types/http-proxy": {
"version": "1.17.4",
"resolved": "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz?cache=0&sync_timestamp=1596839386031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.4.tgz",
@@ -1761,6 +1767,12 @@
"integrity": "sha1-4a1IbmxUUBY0xsOXxcEh2qODYHw=",
"dev": true
},
+ "big.js": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+ "dev": true
+ },
"cacache": {
"version": "13.0.1",
"resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
@@ -1787,6 +1799,12 @@
"unique-filename": "^1.1.1"
}
},
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "dev": true
+ },
"find-cache-dir": {
"version": "3.3.1",
"resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz",
@@ -1808,6 +1826,39 @@
"path-exists": "^4.0.0"
}
},
+ "html-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
+ "dev": true,
+ "requires": {
+ "html-minifier": "^3.2.3",
+ "loader-utils": "^0.2.16",
+ "lodash": "^4.17.3",
+ "pretty-error": "^2.0.2",
+ "tapable": "^1.0.0",
+ "toposort": "^1.0.0",
+ "util.promisify": "1.0.0"
+ }
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+ "dev": true,
+ "requires": {
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0",
+ "object-assign": "^4.0.1"
+ }
+ },
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
@@ -1888,6 +1939,16 @@
"terser": "^4.6.12",
"webpack-sources": "^1.4.3"
}
+ },
+ "util.promisify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
}
}
},
@@ -3100,13 +3161,13 @@
"dev": true
},
"camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz",
- "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
+ "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
"dev": true,
"requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
+ "pascal-case": "^3.1.1",
+ "tslib": "^1.10.0"
}
},
"camelcase": {
@@ -3275,8 +3336,8 @@
},
"clean-css": {
"version": "4.2.3",
- "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz",
- "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+ "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
"dev": true,
"requires": {
"source-map": "~0.6.0"
@@ -3284,8 +3345,8 @@
"dependencies": {
"source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz",
- "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
@@ -4485,8 +4546,8 @@
},
"dom-converter": {
"version": "0.2.0",
- "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz",
- "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
"dev": true,
"requires": {
"utila": "~0.4"
@@ -4524,8 +4585,8 @@
},
"domhandler": {
"version": "2.4.2",
- "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz",
- "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
"dev": true,
"requires": {
"domelementtype": "1"
@@ -4541,6 +4602,16 @@
"domelementtype": "1"
}
},
+ "dot-case": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz",
+ "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.3",
+ "tslib": "^1.10.0"
+ }
+ },
"dot-prop": {
"version": "5.2.0",
"resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1597574828045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz",
@@ -5921,8 +5992,8 @@
},
"html-minifier": {
"version": "3.5.21",
- "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz",
- "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
+ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
"dev": true,
"requires": {
"camel-case": "3.0.x",
@@ -5934,10 +6005,67 @@
"uglify-js": "3.4.x"
},
"dependencies": {
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.1"
+ }
+ },
"commander": {
"version": "2.17.1",
- "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz",
- "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+ "dev": true
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^1.1.1"
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ }
+ }
+ },
+ "html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+ "dev": true,
+ "requires": {
+ "camel-case": "^4.1.1",
+ "clean-css": "^4.2.3",
+ "commander": "^4.1.1",
+ "he": "^1.2.0",
+ "param-case": "^3.0.3",
+ "relateurl": "^0.2.7",
+ "terser": "^4.6.3"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true
}
}
@@ -5948,55 +6076,46 @@
"integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
"dev": true
},
- "html-webpack-plugin": {
- "version": "3.2.0",
- "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz",
- "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
+ "html-webpack-inline-source-plugin": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz",
+ "integrity": "sha512-0ZNU57u7283vrXSF5a4VDnVOMWiSwypKIp1z/XfXWoVHLA1r3Xmyxx5+Lz+mnthz/UvxL1OAf41w5UIF68Jngw==",
"dev": true,
"requires": {
- "html-minifier": "^3.2.3",
- "loader-utils": "^0.2.16",
- "lodash": "^4.17.3",
- "pretty-error": "^2.0.2",
- "tapable": "^1.0.0",
- "toposort": "^1.0.0",
+ "escape-string-regexp": "^1.0.5",
+ "slash": "^1.0.0",
+ "source-map-url": "^0.4.0"
+ },
+ "dependencies": {
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ }
+ }
+ },
+ "html-webpack-plugin": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz",
+ "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==",
+ "dev": true,
+ "requires": {
+ "@types/html-minifier-terser": "^5.0.0",
+ "@types/tapable": "^1.0.5",
+ "@types/webpack": "^4.41.8",
+ "html-minifier-terser": "^5.0.1",
+ "loader-utils": "^1.2.3",
+ "lodash": "^4.17.15",
+ "pretty-error": "^2.1.1",
+ "tapable": "^1.1.3",
"util.promisify": "1.0.0"
},
"dependencies": {
- "big.js": {
- "version": "3.2.0",
- "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz",
- "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
- "dev": true
- },
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
- "dev": true
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "loader-utils": {
- "version": "0.2.17",
- "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz",
- "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
- "dev": true,
- "requires": {
- "big.js": "^3.1.3",
- "emojis-list": "^2.0.0",
- "json5": "^0.5.0",
- "object-assign": "^4.0.1"
- }
- },
"util.promisify": {
"version": "1.0.0",
- "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1589682767473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz",
- "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
"dev": true,
"requires": {
"define-properties": "^1.1.2",
@@ -6007,8 +6126,8 @@
},
"htmlparser2": {
"version": "3.10.1",
- "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz",
- "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
"dev": true,
"requires": {
"domelementtype": "^1.3.1",
@@ -6021,14 +6140,14 @@
"dependencies": {
"entities": {
"version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz",
- "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
"dev": true
},
"readable-stream": {
"version": "3.6.0",
- "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz",
- "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
@@ -7058,10 +7177,13 @@
}
},
"lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz",
- "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
- "dev": true
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
+ "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.10.0"
+ }
},
"lru-cache": {
"version": "5.1.1",
@@ -7502,12 +7624,13 @@
"dev": true
},
"no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz",
- "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
+ "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
"dev": true,
"requires": {
- "lower-case": "^1.1.1"
+ "lower-case": "^2.0.1",
+ "tslib": "^1.10.0"
}
},
"node-forge": {
@@ -7961,12 +8084,13 @@
}
},
"param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz",
- "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
+ "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==",
"dev": true,
"requires": {
- "no-case": "^2.2.0"
+ "dot-case": "^3.0.3",
+ "tslib": "^1.10.0"
}
},
"parent-module": {
@@ -8032,6 +8156,16 @@
"integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=",
"dev": true
},
+ "pascal-case": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
+ "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.3",
+ "tslib": "^1.10.0"
+ }
+ },
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz",
@@ -9150,8 +9284,8 @@
},
"renderkid": {
"version": "2.0.3",
- "resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz",
- "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
+ "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
"dev": true,
"requires": {
"css-select": "^1.1.0",
@@ -9181,8 +9315,8 @@
},
"css-what": {
"version": "2.1.3",
- "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz",
- "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
"dev": true
},
"domutils": {
@@ -10628,8 +10762,8 @@
},
"uglify-js": {
"version": "3.4.10",
- "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1596387201241&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz",
- "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
+ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
"dev": true,
"requires": {
"commander": "~2.19.0",
@@ -10638,14 +10772,14 @@
"dependencies": {
"commander": {
"version": "2.19.0",
- "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz",
- "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
"dev": true
},
"source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz",
- "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
diff --git a/web/package.json b/web/package.json
index 018100c..8d8c123 100644
--- a/web/package.json
+++ b/web/package.json
@@ -5,7 +5,8 @@
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
- "lint": "vue-cli-service lint"
+ "lint": "vue-cli-service lint",
+ "vercel-build": "npm run build"
},
"dependencies": {
"@dzangolab/vue-country-flag-icon": "^0.2.0",
diff --git a/web/public/favicon.ico b/web/public/favicon.ico
index df36fcf..a0a1ee2 100644
Binary files a/web/public/favicon.ico and b/web/public/favicon.ico differ
diff --git a/web/public/index.html b/web/public/index.html
index 0324028..5eac9eb 100644
--- a/web/public/index.html
+++ b/web/public/index.html
@@ -9,11 +9,11 @@
-
-
-
+
+
+
-
<%= htmlWebpackPlugin.options.title %>
+ Sub-Store
diff --git a/web/src/config.js b/web/src/config.js
index 6cf5a03..e770cfa 100644
--- a/web/src/config.js
+++ b/web/src/config.js
@@ -1,3 +1,3 @@
-const DEBUG = true;
+const DEBUG = false;
-export const BACKEND_BASE = DEBUG ? `http://192.168.1.134:3000` : `http://sub.store`;
\ No newline at end of file
+export const BACKEND_BASE = DEBUG ? `http://192.168.1.134:3000` : `https://sub.store`;
\ No newline at end of file
diff --git a/web/src/router/index.js b/web/src/router/index.js
index b408bc9..8ae2627 100644
--- a/web/src/router/index.js
+++ b/web/src/router/index.js
@@ -48,7 +48,7 @@ const router = new Router({
router.beforeEach((to, from, next) => {
const {meta} = to;
- document.title = to.meta.title
+ // document.title = to.meta.title
store.commit("SET_NAV_TITLE", meta.title);
next();
})
diff --git a/web/src/store/index.js b/web/src/store/index.js
index 1b3f537..4f52c84 100644
--- a/web/src/store/index.js
+++ b/web/src/store/index.js
@@ -39,53 +39,55 @@ const store = new Vuex.Store({
actions: {
// fetch subscriptions
async FETCH_SUBSCRIPTIONS({state}) {
- axios.get("/sub").then(resp => {
+ return axios.get("/sub").then(resp => {
const {data} = resp.data;
state.subscriptions = data;
});
},
// fetch collections
async FETCH_COLLECTIONS({state}) {
- axios.get("/collection").then(resp => {
+ return axios.get("/collection").then(resp => {
const {data} = resp.data;
state.collections = data;
});
},
// update subscriptions
- async UPDATE_SUBSCRIPTION({commit, dispatch}, {name, sub}) {
- axios.patch(`/sub/${name}`, sub).then(() => {
+ async UPDATE_SUBSCRIPTION({dispatch}, {name, sub}) {
+ return axios.patch(`/sub/${name}`, sub).then(() => {
dispatch("FETCH_SUBSCRIPTIONS");
dispatch("FETCH_COLLECTIONS");
- commit("SET_SUCCESS_MESSAGE", `成功更新订阅${sub.name || name}`);
- }).catch(err => {
- commit("SET_ERROR_MESSAGE", err);
});
},
// new subscription
- async NEW_SUBSCRIPTION() {
-
+ async NEW_SUBSCRIPTION({dispatch}, sub) {
+ return axios.post(`/sub`, sub).then(() => {
+ dispatch("FETCH_SUBSCRIPTIONS");
+ });
},
// delete subscription
- async DELETE_SUBSCRIPTION({commit, dispatch}, name) {
- axios.delete(`/sub/${name}`).then(() => {
+ async DELETE_SUBSCRIPTION({dispatch}, name) {
+ return axios.delete(`/sub/${name}`).then(() => {
dispatch("FETCH_SUBSCRIPTIONS");
dispatch("FETCH_COLLECTIONS");
- commit("SET_SUCCESS_MESSAGE", `成功删除订阅${name}`);
- }).catch(err => {
- commit("SET_ERROR_MESSAGE", err);
- })
+ });
},
// update collection
- async UPDATE_COLLECTION() {
-
+ async UPDATE_COLLECTION({dispatch}, {name, collection}) {
+ return axios.patch(`/collection/${name}`, collection).then(() => {
+ dispatch("FETCH_COLLECTIONS");
+ });
},
// new collection
- async NEW_COLLECTION() {
-
+ async NEW_COLLECTION({dispatch}, collection) {
+ return axios.post(`/collection`, collection).then(() => {
+ dispatch("FETCH_COLLECTIONS");
+ })
},
// delete collection
- async DELETE_COLLECTION() {
-
+ async DELETE_COLLECTION({dispatch}, name) {
+ return axios.delete(`/collection/${name}`).then(() => {
+ dispatch("FETCH_COLLECTIONS");
+ })
}
},
diff --git a/web/src/utils/index.js b/web/src/utils/index.js
index 963927b..227f555 100644
--- a/web/src/utils/index.js
+++ b/web/src/utils/index.js
@@ -1,4 +1,5 @@
import Axios from 'axios';
+import store from "@/store";
import {BACKEND_BASE} from "@/config";
export const axios = Axios.create({
@@ -8,4 +9,12 @@ export const axios = Axios.create({
export function isEmptyObj(obj) {
return Object.keys(obj).length === 0;
+}
+
+export function showInfo(msg) {
+ store.commit("SET_SUCCESS_MESSAGE", msg);
+}
+
+export function showError(err) {
+ store.commit("SET_ERROR_MESSAGE", err);
}
\ No newline at end of file
diff --git a/web/src/views/CollectionEditor.vue b/web/src/views/CollectionEditor.vue
index 5797bae..bdce245 100644
--- a/web/src/views/CollectionEditor.vue
+++ b/web/src/views/CollectionEditor.vue
@@ -1,10 +1,107 @@
-
+
+
+ 订阅配置
+
+ 订阅名称
+
+
+ 包含的订阅
+
+
+
+ mdi-cloud
+
+
+ {{ sub.name }}
+
+
+
+
+
+
+
+
+ save_alt
+ settings_backup_restore
+
+
+
diff --git a/web/src/views/SubEditor.vue b/web/src/views/SubEditor.vue
index f71026b..7b82193 100644
--- a/web/src/views/SubEditor.vue
+++ b/web/src/views/SubEditor.vue
@@ -2,7 +2,7 @@
基本信息
-
+
-
+
+
+ save_alt
+ settings_backup_restore
+
常用选项
+
+ 过滤非法节点
+
+
+
+
+
+
+
+
+
国旗
+
+
+
-
@@ -66,16 +89,16 @@
dense
class="mt-0 mb-0"
>
- 证书验证
+ 跳过证书验证
-
+
-
+
@@ -109,31 +132,12 @@
-
-
-
-
-