build-chn-cidr.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
  2. import { resolve as pathResolve } from 'path';
  3. import { compareAndWriteFile, withBannerArray } from './lib/create-file';
  4. import { processLineFromReadline } from './lib/process-line';
  5. import { task, traceAsync, traceSync } from './lib/trace-runner';
  6. import { exclude } from 'fast-cidr-tools';
  7. import picocolors from 'picocolors';
  8. import { createMemoizedPromise } from './lib/memo-promise';
  9. // https://github.com/misakaio/chnroutes2/issues/25
  10. const EXCLUDE_CIDRS = [
  11. '223.118.0.0/15',
  12. '223.120.0.0/15'
  13. ];
  14. const INCLUDE_CIDRS = [
  15. '211.99.96.0/19' // wy.com.cn
  16. ];
  17. export const getChnCidrPromise = createMemoizedPromise(async () => {
  18. const cidr = await traceAsync(
  19. picocolors.gray('download chnroutes2'),
  20. async () => processLineFromReadline(await fetchRemoteTextByLine('https://raw.githubusercontent.com/misakaio/chnroutes2/master/chnroutes.txt')),
  21. picocolors.gray
  22. );
  23. return traceSync(
  24. picocolors.gray('processing chnroutes2'),
  25. () => exclude([...cidr, ...INCLUDE_CIDRS], EXCLUDE_CIDRS, true),
  26. picocolors.gray
  27. );
  28. });
  29. export const buildChnCidr = task(import.meta.path, async () => {
  30. const filteredCidr = await getChnCidrPromise();
  31. // Can not use SHARED_DESCRIPTION here as different license
  32. const description = [
  33. 'License: CC BY-SA 2.0',
  34. 'Homepage: https://ruleset.skk.moe',
  35. 'GitHub: https://github.com/SukkaW/Surge',
  36. '',
  37. 'Data from https://misaka.io (misakaio @ GitHub)'
  38. ];
  39. // Can not use createRuleset here, as Clash support advanced ipset syntax
  40. return Promise.all([
  41. compareAndWriteFile(
  42. withBannerArray(
  43. 'Sukka\'s Ruleset - Mainland China IPv4 CIDR',
  44. description,
  45. new Date(),
  46. filteredCidr.map(i => `IP-CIDR,${i}`)
  47. ),
  48. pathResolve(import.meta.dir, '../List/ip/china_ip.conf')
  49. ),
  50. compareAndWriteFile(
  51. withBannerArray(
  52. 'Sukka\'s Ruleset - Mainland China IPv4 CIDR',
  53. description,
  54. new Date(),
  55. filteredCidr
  56. ),
  57. pathResolve(import.meta.dir, '../Clash/ip/china_ip.txt')
  58. )
  59. ]);
  60. });
  61. if (import.meta.main) {
  62. buildChnCidr();
  63. }