build-domestic-direct-lan-ruleset-dns-mapping-module.ts 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // @ts-check
  2. import path from 'path';
  3. import { DOMESTICS } from '../Source/non_ip/domestic';
  4. import { DIRECTS, LANS } from '../Source/non_ip/direct';
  5. import { readFileIntoProcessedArray } from './lib/fetch-text-by-line';
  6. import { compareAndWriteFile, createRuleset } from './lib/create-file';
  7. import { task } from './trace';
  8. import { SHARED_DESCRIPTION } from './lib/constants';
  9. import { createMemoizedPromise } from './lib/memo-promise';
  10. export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => {
  11. const domestics = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/domestic.conf'));
  12. const directs = await readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/direct.conf'));
  13. const lans: string[] = [];
  14. Object.entries(DOMESTICS).forEach(([, { domains }]) => {
  15. domestics.push(...domains.map((domain) => `DOMAIN-SUFFIX,${domain}`));
  16. });
  17. Object.entries(DIRECTS).forEach(([, { domains }]) => {
  18. directs.push(...domains.map((domain) => `DOMAIN-SUFFIX,${domain}`));
  19. });
  20. Object.entries(LANS).forEach(([, { domains }]) => {
  21. lans.push(...domains.map((domain) => `DOMAIN-SUFFIX,${domain}`));
  22. });
  23. return [domestics, directs, lans] as const;
  24. });
  25. export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(async (span) => {
  26. const res = await getDomesticAndDirectDomainsRulesetPromise();
  27. return Promise.all([
  28. createRuleset(
  29. span,
  30. 'Sukka\'s Ruleset - Domestic Domains',
  31. [
  32. ...SHARED_DESCRIPTION,
  33. '',
  34. 'This file contains known addresses that are avaliable in the Mainland China.'
  35. ],
  36. new Date(),
  37. res[0],
  38. 'ruleset',
  39. path.resolve(import.meta.dir, '../List/non_ip/domestic.conf'),
  40. path.resolve(import.meta.dir, '../Clash/non_ip/domestic.txt')
  41. ),
  42. createRuleset(
  43. span,
  44. 'Sukka\'s Ruleset - Direct Rules',
  45. [
  46. ...SHARED_DESCRIPTION,
  47. '',
  48. 'This file contains domains and process that should not be proxied.'
  49. ],
  50. new Date(),
  51. res[1],
  52. 'ruleset',
  53. path.resolve(import.meta.dir, '../List/non_ip/direct.conf'),
  54. path.resolve(import.meta.dir, '../Clash/non_ip/direct.txt')
  55. ),
  56. createRuleset(
  57. span,
  58. 'Sukka\'s Ruleset - LAN',
  59. [
  60. ...SHARED_DESCRIPTION,
  61. '',
  62. 'This file includes rules for LAN DOMAIN and reserved TLDs.'
  63. ],
  64. new Date(),
  65. res[2],
  66. 'ruleset',
  67. path.resolve(import.meta.dir, '../List/non_ip/lan.conf'),
  68. path.resolve(import.meta.dir, '../Clash/non_ip/lan.txt')
  69. ),
  70. compareAndWriteFile(
  71. span,
  72. [
  73. '#!name=[Sukka] Local DNS Mapping',
  74. `#!desc=Last Updated: ${new Date().toISOString()}`,
  75. '',
  76. '[Host]',
  77. ...([...Object.entries(DOMESTICS), ...Object.entries(DIRECTS), ...Object.entries(LANS)])
  78. .flatMap(([, { domains, dns, ...rest }]) => [
  79. ...(
  80. 'hosts' in rest
  81. ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`)
  82. : []
  83. ),
  84. ...domains.flatMap((domain) => [
  85. `${domain} = server:${dns}`,
  86. `*.${domain} = server:${dns}`
  87. ])
  88. ])
  89. ],
  90. path.resolve(import.meta.dir, '../Modules/sukka_local_dns_mapping.sgmodule')
  91. )
  92. ]);
  93. });