mirror of
https://github.com/SukkaW/Surge.git
synced 2025-12-12 01:00:34 +08:00
102 lines
3.9 KiB
JavaScript
102 lines
3.9 KiB
JavaScript
// @ts-check
|
|
|
|
const path = require('path');
|
|
const { task } = require('./lib/trace-runner');
|
|
const { compareAndWriteFile } = require('./lib/create-file');
|
|
const tldts = require('tldts');
|
|
|
|
function escapeRegExp(string = '') {
|
|
const reRegExpChar = /[$()*+.?[\\\]^{|}]/g;
|
|
const reHasRegExpChar = new RegExp(reRegExpChar.source);
|
|
|
|
return string && reHasRegExpChar.test(string)
|
|
? string.replaceAll(reRegExpChar, '\\$&')
|
|
: string;
|
|
}
|
|
|
|
const REDIRECT = /** @type {const} */ ([
|
|
// Gravatar
|
|
['gravatar.neworld.org/', 'https://secure.gravatar.com/'],
|
|
['cdn.v2ex.com/gravatar/', 'https://secure.gravatar.com/avatar/'],
|
|
// U.SB
|
|
['cdnjs.loli.net/', 'https://cdnjs.cloudflare.com/'],
|
|
['fonts.loli.net/', 'https://fonts.googleapis.com/'],
|
|
['gstatic.loli.net/', 'https://fonts.gstatic.com/'],
|
|
['themes.loli.net/', 'https://themes.googleusercontent.com/'],
|
|
['ajax.loli.net/', 'https://ajax.googleapis.com/'],
|
|
['gravatar.loli.net/', 'https://secure.gravatar.com/'],
|
|
// Geekzu
|
|
['gapis.geekzu.org/ajax/', 'https://ajax.googleapis.com/'],
|
|
['fonts.geekzu.org/', 'https://fonts.googleapis.com/'],
|
|
['gapis.geekzu.org/g-fonts/', 'https://fonts.gstatic.com/'],
|
|
['gapis.geekzu.org/g-themes/', 'https://themes.googleusercontent.com/'],
|
|
['sdn.geekzu.org/', 'https://secure.gravatar.com/'],
|
|
// cravatar
|
|
['cravatar.cn/', 'https://secure.gravatar.com/'],
|
|
// libravatar
|
|
['seccdn.libravatar.org/gravatarproxy/', 'https://secure.gravatar.com/'],
|
|
// ghproxy
|
|
['ghproxy.com/', ''],
|
|
['ghps.cc/', ''],
|
|
// gh-proxy
|
|
['github.moeyy.xyz/', ''],
|
|
// 7ED Services
|
|
['use.sevencdn.com/css', 'https://fonts.googleapis.com/css'],
|
|
['use.sevencdn.com/ajax/libs/', 'https://cdnjs.cloudflare.com/ajax/libs/'],
|
|
['use.sevencdn.com/gajax/', 'https://ajax.googleapis.com/ajax/'],
|
|
['use.sevencdn.com/chart', 'https://chart.googleapis.com/chart'],
|
|
['use.sevencdn.com/avatar', 'https://secure.gravatar.com/avatar'],
|
|
['raw.gitmirror.com/', 'https://raw.githubusercontent.com/'],
|
|
['gist.gitmirror.com/', 'https://gist.githubusercontent.com/'],
|
|
['raw.githubusercontents.com/', 'https://raw.githubusercontent.com/'],
|
|
['gist.githubusercontents.com/', 'https://gist.githubusercontent.com/'],
|
|
['cdn.gitmirror.com/', 'https://cdn.statically.io/'],
|
|
// FastGit
|
|
['raw.fastgit.org/', 'https://raw.githubusercontent.com/'],
|
|
['assets.fastgit.org/', 'https://github.githubassets.com/'],
|
|
// jsDelivr
|
|
['fastly.jsdelivr.net/', 'https://cdn.jsdelivr.net/'],
|
|
['gcore.jsdelivr.net/', 'https://cdn.jsdelivr.net/'],
|
|
// ops.ci
|
|
['jsdelivr.ops.ci/', 'https://cdn.jsdelivr.net/'],
|
|
['fonts.ops.ci/', 'https://fonts.googleapis.com/'],
|
|
// onmicrosoft.cn
|
|
['jsd.onmicrosoft.cn/', 'https://cdn.jsdelivr.net/'],
|
|
['npm.onmicrosoft.cn/', 'https://unpkg.com/'],
|
|
['cdnjs.onmicrosoft.cn/', 'https://cdnjs.cloudflare.com/ajax/libs/'],
|
|
// KGitHub
|
|
['raw.kgithub.com/', 'https://raw.githubusercontent.com/'],
|
|
['raw.kkgithub.com/', 'https://raw.githubusercontent.com/'],
|
|
// Misc
|
|
['pics.javbus.com/', 'https://i0.wp.com/pics.javbus.com/'],
|
|
['googlefonts.wp-china-yes.net/', 'https://fonts.googleapis.com/'],
|
|
['googleajax.wp-china-yes.net/', 'https://ajax.googleapis.com/']
|
|
]);
|
|
|
|
const buildRedirectModule = task(__filename, async () => {
|
|
const domains = Array.from(new Set(REDIRECT.map(([from]) => tldts.getHostname(from, { detectIp: false })))).filter(Boolean);
|
|
|
|
return compareAndWriteFile(
|
|
[
|
|
'#!name=[Sukka] URL Redirect',
|
|
`#!desc=Last Updated: ${new Date().toISOString()}`,
|
|
'',
|
|
'[MITM]',
|
|
`hostname = %APPEND% ${domains.join(', ')}`,
|
|
'',
|
|
'[URL Rewrite]',
|
|
...REDIRECT.map(([from, to]) => {
|
|
const src = `^https?://${escapeRegExp(from)}(.*)`;
|
|
return `${src} ${to}$1 302`;
|
|
})
|
|
],
|
|
path.resolve(__dirname, '../Modules/sukka_url_redirect.sgmodule')
|
|
);
|
|
});
|
|
|
|
module.exports.buildRedirectModule = buildRedirectModule;
|
|
|
|
if (require.main === module) {
|
|
buildRedirectModule();
|
|
}
|