clash.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. const identity = <T>(x: T): T => x;
  2. // https://dreamacro.github.io/clash/configuration/rules.html
  3. const PROCESSOR: Record<string, (raw: string, type: string, value: string) => string> = {
  4. DOMAIN: identity,
  5. 'DOMAIN-SUFFIX': identity,
  6. 'DOMAIN-KEYWORD': identity,
  7. GEOIP: identity,
  8. 'IP-CIDR': identity,
  9. 'IP-CIDR6': identity,
  10. 'SRC-IP-CIDR': identity,
  11. 'SRC-PORT': identity,
  12. 'DST-PORT': identity,
  13. 'PROCESS-NAME': identity,
  14. 'PROCESS-PATH': identity,
  15. 'DEST-PORT': (_raw, type, value) => `DST-PORT,${value}`,
  16. 'IN-PORT': (_raw, type, value) => `SRC-PORT,${value}`
  17. };
  18. export const surgeRulesetToClashClassicalTextRuleset = (rules: string[] | Set<string>) => {
  19. return Array.from(rules).reduce<string[]>((acc, cur) => {
  20. let buf = '';
  21. let type = '';
  22. let i = 0;
  23. for (const len = cur.length; i < len; i++) {
  24. if (cur[i] === ',') {
  25. type = buf;
  26. break;
  27. }
  28. buf += cur[i];
  29. }
  30. if (type === '') {
  31. return acc;
  32. }
  33. const value = cur.slice(i + 1);
  34. if (type in PROCESSOR) {
  35. acc.push(PROCESSOR[type](cur, type, value));
  36. }
  37. return acc;
  38. }, []);
  39. };
  40. export const surgeDomainsetToClashDomainset = (domainset: string[]) => {
  41. return domainset.map(i => (i[0] === '.' ? `+${i}` : i));
  42. };
  43. export const surgeDomainsetToClashRuleset = (domainset: string[]) => {
  44. return domainset.map(i => (i[0] === '.' ? `DOMAIN-SUFFIX,${i.slice(1)}` : `DOMAIN,${i}`));
  45. };