build-domestic-ruleset.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // @ts-check
  2. const path = require('path');
  3. const { DOMESTICS } = require('../Source/non_ip/domestic');
  4. const { readFileByLine } = require('./lib/fetch-remote-text-by-line');
  5. const { processLine } = require('./lib/process-line');
  6. const { compareAndWriteFile, createRuleset } = require('./lib/create-file');
  7. const domainSorter = require('./lib/stable-sort-domain');
  8. const { task } = require('./lib/trace-runner');
  9. const buildDomesticRuleset = task(__filename, async () => {
  10. const rl = readFileByLine(path.resolve(__dirname, '../Source/non_ip/domestic.conf'));
  11. const results = [];
  12. for await (const l of rl) {
  13. const line = processLine(l);
  14. if (line) {
  15. results.push(line);
  16. }
  17. }
  18. results.push(
  19. ...Object.entries(DOMESTICS)
  20. .reduce(
  21. (acc, [key, { domains }]) => {
  22. if (key === 'SYSTEM') {
  23. return acc;
  24. }
  25. return [...acc, ...domains];
  26. },
  27. /** @type {string[]} */([])
  28. )
  29. .sort(domainSorter)
  30. .map((domain) => `DOMAIN-SUFFIX,${domain}`)
  31. );
  32. const rulesetDescription = [
  33. 'License: AGPL 3.0',
  34. 'Homepage: https://ruleset.skk.moe',
  35. 'GitHub: https://github.com/SukkaW/Surge',
  36. '',
  37. 'This file contains known addresses that are avaliable in the Mainland China.'
  38. ];
  39. await Promise.all([
  40. ...createRuleset(
  41. 'Sukka\'s Ruleset - Domestic Domains',
  42. rulesetDescription,
  43. new Date(),
  44. results,
  45. 'ruleset',
  46. path.resolve(__dirname, '../List/non_ip/domestic.conf'),
  47. path.resolve(__dirname, '../Clash/non_ip/domestic.txt')
  48. ),
  49. compareAndWriteFile(
  50. [
  51. '#!name=[Sukka] Local DNS Mapping',
  52. `#!desc=Last Updated: ${new Date().toISOString()}`,
  53. '',
  54. '[Host]',
  55. ...Object.entries(DOMESTICS)
  56. .flatMap(
  57. ([, { domains, dns }]) => domains.flatMap((domain) => [
  58. `${domain} = server:${dns}`,
  59. `*.${domain} = server:${dns}`
  60. ])
  61. )
  62. ],
  63. path.resolve(__dirname, '../Modules/sukka_local_dns_mapping.sgmodule')
  64. )
  65. ]);
  66. });
  67. module.exports.buildDomesticRuleset = buildDomesticRuleset;
  68. if (require.main === module) {
  69. buildDomesticRuleset();
  70. }