nodelistparser 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.d.ts +3 -5
- package/dist/cjs/index.js +1 -1
- package/dist/es/index.d.mts +3 -5
- package/dist/es/index.mjs +1 -1
- package/package.json +13 -13
package/dist/cjs/index.d.ts
CHANGED
|
@@ -54,14 +54,12 @@ interface TrojanBasicConfig extends SharedConfigBase, TlsSharedConfig {
|
|
|
54
54
|
}
|
|
55
55
|
interface TuicConfig extends SharedConfigBase, TlsSharedConfig {
|
|
56
56
|
type: 'tuic';
|
|
57
|
-
sni: string;
|
|
58
57
|
uuid: string;
|
|
59
58
|
alpn: string;
|
|
60
59
|
token: string;
|
|
61
60
|
}
|
|
62
61
|
interface TuicV5Config extends SharedConfigBase, TlsSharedConfig {
|
|
63
62
|
type: 'tuic-v5';
|
|
64
|
-
sni: string;
|
|
65
63
|
uuid: string;
|
|
66
64
|
alpn: string;
|
|
67
65
|
password: string;
|
|
@@ -163,7 +161,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
163
161
|
type: string;
|
|
164
162
|
server: string;
|
|
165
163
|
port: number;
|
|
166
|
-
sni: string;
|
|
164
|
+
sni: string | undefined;
|
|
167
165
|
uuid: string;
|
|
168
166
|
alpn: string[];
|
|
169
167
|
alterId?: undefined;
|
|
@@ -187,7 +185,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
187
185
|
type: string;
|
|
188
186
|
server: string;
|
|
189
187
|
port: number;
|
|
190
|
-
sni: string;
|
|
188
|
+
sni: string | undefined;
|
|
191
189
|
uuid: string;
|
|
192
190
|
alpn: string[];
|
|
193
191
|
alterId?: undefined;
|
|
@@ -327,4 +325,4 @@ declare namespace index {
|
|
|
327
325
|
}
|
|
328
326
|
|
|
329
327
|
export { index$3 as clash, index$2 as ss, index$4 as surge, index$1 as trojan, index as vmess };
|
|
330
|
-
export type { HttpProxyConfig, Hysteria2Config, ShadowSocksConfig, SharedConfigBase, SnellConfig, Socks5Config, SupportedConfig, TrojanBasicConfig, TrojanConfig, TuicConfig, TuicV5Config, VmessConfig };
|
|
328
|
+
export type { HttpProxyConfig, Hysteria2Config, ShadowSocksConfig, SharedConfigBase, SnellConfig, Socks5Config, SupportedConfig, TlsSharedConfig, TrojanBasicConfig, TrojanConfig, TuicConfig, TuicV5Config, VmessConfig };
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=require("foxts/guard"),s=require("node:buffer");const
|
|
1
|
+
var e=require("foxts/guard"),s=require("foxts/string-join"),r=require("node:buffer");const t=Number,p=e=>e.split(",").map(e=>e.trim());function o(e){let s=e.indexOf("=");return -1===s?["",""]:[e.slice(0,s).trim(),e.slice(s+1).trim()]}const n=new Set(["udp-relay","tfo","reuse","skip-cert-verify","tls","vmess-aead","ws"]),a=new Set(["version","download-bandwidth","port-hopping-interval","udp-port"]),i=new Set([]),u=new Set(["username","password","sni","encrypt-method","psk","obfs","obfs-host","uuid","alpn","block-quic","ws-path","ws-headers","port-hopping","token"]),d=Symbol("unsupported");function c(e){return e.split(",").reduce((e,s)=>{let[r,t]=s.split(":");return e[r.trim()]=t.trim(),e},{})}function l(e){let s,r,[p,o]=e.split("://");if("ss"!==p)throw Error(`[ss.decodeOne] Unsupported type: ${p}`);let[n,a]=o.split("@");n.includes(":")?[s,r]=n.split(":"):[s,r]=atob(n).split(":");let[i,u]=a.split(":"),[d,c]=u.split("#"),[l,w]=d.split("/"),m=null;if(w)try{m=new URLSearchParams(w).get("plugin")}catch(s){let e=Error(`[ss.decodeOne] Invalid plugins: ${w}`);throw e.cause=s,e}let f=(m?.split(";")??[]).reduce((e,s)=>{let[r,t]=s.split("=");return e[r]=t,e},{});return{raw:e,type:"ss",name:decodeURIComponent(c),server:i,port:t(l),cipher:s,password:r,udp:!0,obfs:"obfs-local"in f&&"obfs"in f&&("http"===f.obfs||"tls"===f.obfs)?f.obfs:void 0,obfsHost:"obfs-host"in f?f["obfs-host"]:void 0}}function w(e){return atob(e).replaceAll("\r\n","\n").split("\n").filter(Boolean)}const m=new TextDecoder;exports.clash={__proto__:null,decode:function(e){if(!("type"in e)||"string"!=typeof e.type)throw TypeError("Missing or invalid type field");let s=JSON.stringify(e);switch(e.type){case"http":return{type:"http",name:e.name,server:e.server,port:Number(e.port),username:e.username,password:e.password,raw:s};case"ss":return{type:"ss",name:e.name,server:e.server,port:Number(e.port),cipher:e.cipher,password:e.password,udp:e.udp||!1,obfs:"obfs"===e.plugin?e["plugin-opts"].mode:void 0,raw:s};case"socks5":return{type:"socks5",name:e.name,server:e.server,port:Number(e.port),username:e.username,password:e.password,udp:e.udp||!1,raw:s};case"trojan":return{type:"trojan",name:e.name,server:e.server,port:Number(e.port),password:e.password,sni:e.sni,skipCertVerify:e["skip-cert-verify"]||!1,udp:e.udp||!1,raw:s};case"vmess":return{type:"vmess",name:e.name,server:e.server,port:Number(e.port),username:e.uuid,vmessAead:1===e.alterId||"1"===e.alterId,sni:e.servername,ws:"ws"===e.network,wsPath:e["ws-path"],wsHeaders:e["ws-headers"]?Object.entries(e["ws-headers"]).map(([e,s])=>`${e}:${s}`).join(", "):void 0,tls:e.tls||!1,udp:e.udp??!0,raw:s,skipCertVerify:e["skip-cert-verify"]||!1};default:throw TypeError(`Unsupported type: ${e.type} (clash decode)`)}},encode:function(s){let r={tfo:s.tfo};switch(s.type){case"ss":return{name:s.name,type:"ss",server:s.server,port:s.port,cipher:s.cipher,password:s.password,udp:s.udp,...s.obfs?{plugin:"obfs","plugin-opts":{mode:s.obfs,host:s.obfsHost,uri:s.obfsUri}}:{},...r};case"trojan":return{name:s.name,type:"trojan",server:s.server,port:s.port,password:s.password,sni:s.sni,"skip-cert-verify":s.skipCertVerify,udp:s.udp,...r};case"tuic":case"tuic-v5":return{name:s.name,type:"tuic",server:s.server,port:s.port,sni:s.sni,uuid:s.uuid,alpn:s.alpn.split(",").map(e=>e.trim()),..."tuic"===s.type?{token:s.token}:{password:s.password},"skip-cert-verify":s.skipCertVerify,udp:!0,version:"tuic"===s.type?4:"tuic-v5"===s.type?5:e.never(s),...r};case"socks5":return{name:s.name,type:"socks5",server:s.server,port:s.port,username:s.username,password:s.password,udp:s.udp,...r};case"http":return{name:s.name,type:"http",server:s.server,port:s.port,username:s.username,password:s.password,...r};case"vmess":return{alterId:s.vmessAead?0:void 0,tls:s.tls,udp:s.udp,uuid:s.username,name:s.name,servername:s.sni,"ws-path":s.wsPath,server:s.server,"ws-headers":s.wsHeaders?c(s.wsHeaders):void 0,cipher:"auto","ws-opts":{path:s.wsPath,headers:s.wsHeaders?c(s.wsHeaders):void 0},type:"vmess",port:s.port,network:s.ws?"ws":"tcp"};case"hysteria2":return{name:s.name,type:"hysteria2",server:s.server,port:s.port,ports:s.portHopping,password:s.password,down:s.downloadBandwidth+" Mbps","skip-cert-verify":s.skipCertVerify};default:throw TypeError(`Unsupported type: ${s.type} (clash encode)`)}}},exports.ss={__proto__:null,decodeBase64Multiline:w,decodeMultiline:function(e){return w(e).map(e=>l(e))},decodeOne:l},exports.surge={__proto__:null,decode:function(e){let[s,r]=o(e),[c,l,w,...m]=p(r),f=t(w),v=Object.fromEntries(m.map(e=>{let[s,r]=o(e);return n.has(s)?[s,"true"===r]:a.has(s)?[s,t(r)]:i.has(s)?[s,p(r)]:u.has(s)?'"'===r[0]&&r.endsWith('"')||"'"===r[0]&&r.endsWith("'")?[s,r.slice(1,-1)]:[s,r]:[s,d]})),h={raw:e,name:s,server:l,port:f,tfo:v.tfo,blockQuic:v["block-quic"]},y={sni:v.sni,skipCertVerify:v["skip-cert-verify"]};switch(c){case"snell":return{type:"snell",psk:v.psk,version:v.version,reuse:v.reuse,...h};case"ss":return{type:"ss",cipher:v["encrypt-method"],password:v.password,udp:v["udp-relay"],obfs:v.obfs,obfsHost:v["obfs-host"],obfsUri:v["obfs-uri"],udpPort:v["udp-port"],...h};case"trojan":return{type:"trojan",password:v.password,udp:v["udp-relay"],...y,...h};case"tuic":return{type:"tuic",uuid:v.uuid,alpn:v.alpn,token:v.token,...y,...h};case"tuic-v5":return{type:"tuic-v5",uuid:v.uuid,alpn:v.alpn,password:v.password,...y,...h};case"socks5":return{type:"socks5",username:m[0],password:m[1],udp:v["udp-relay"],...h};case"http":return{type:"http",username:m[0],password:m[1],...h};case"vmess":return{type:"vmess",username:v.username,tls:v.tls,vmessAead:v["vmess-aead"],ws:v.ws,wsPath:v["ws-path"],wsHeaders:v["ws-headers"],udp:v["udp-relay"],...y,...h};case"hysteria2":return{type:"hysteria2",password:v.password,skipCertVerify:v["skip-cert-verify"],downloadBandwidth:v["download-bandwidth"],portHopping:v["port-hopping"],portHoppingInterval:v["port-hopping-interval"],...h};default:throw TypeError(`Unsupported type: ${c} (surge decode)`)}},encode:function(r){let t=[r.tfo&&"tfo=true",r.blockQuic&&`block-quic=${r.blockQuic}`];switch(r.type){case"snell":return s.stringJoin([`${r.name} = snell, ${r.server}, ${r.port}, psk=${r.psk}, version=${r.version}, reuse=${r.reuse}`,...t],", ");case"ss":return s.stringJoin([`${r.name} = ss, ${r.server}, ${r.port}, encrypt-method=${r.cipher}, password=${r.password}`,r.udp&&"udp-relay=true",r.udpPort&&`udp-port=${r.udpPort}`,r.obfs&&`obfs=${r.obfs}`,r.obfsHost&&`obfs-host=${r.obfsHost}`,r.obfsUri&&`obfs-uri=${r.obfsUri}`,...t],", ");case"trojan":return s.stringJoin([`${r.name} = trojan, ${r.server}, ${r.port}, password=${r.password}`,r.sni&&`sni=${r.sni}`,r.skipCertVerify&&"skip-cert-verify=true",...t,r.udp&&"udp-relay=true"],", ");case"tuic":return s.stringJoin([`${r.name} = tuic, ${r.server}, ${r.port}, sni=${r.sni}, uuid=${r.uuid}, alpn=${r.alpn}, token=${r.token}`,...t],", ");case"socks5":return s.stringJoin([`${r.name} = socks5, ${r.server}, ${r.port}, ${r.username}, ${r.password}`,r.udp&&"udp-relay=true",...t],", ");case"http":return s.stringJoin([`${r.name} = http, ${r.server}, ${r.port}, ${r.username}, ${r.password}`,...t],", ");case"vmess":return s.stringJoin([`${r.name} = vmess, ${r.server}, ${r.port}`,`username=${r.username}`,`tls=${r.tls}`,`vmess-aead=${r.vmessAead}`,"ws=true",r.wsPath&&`ws-path=${"/"===r.wsPath[0]?r.wsPath:`/${r.wsPath}`}`,r.wsHeaders&&`ws-headers=${r.wsHeaders}`,`skip-cert-verify=${r.skipCertVerify}`,`tfo=${r.tfo}`,`udp-relay=${r.udp}`],", ");case"hysteria2":return s.stringJoin([`${r.name} = hysteria2, ${r.server}, ${r.port}`,`password=${r.password}`,`download-bandwidth=${r.downloadBandwidth}`,r.portHopping&&`port-hopping="${r.portHopping}"`,r.portHoppingInterval&&`port-hopping-interval=${r.portHoppingInterval}`,`skip-cert-verify=${r.skipCertVerify}`,...t],", ");case"tuic-v5":return s.stringJoin([`${r.name} = tuic-v5, ${r.server}, ${r.port}`,`password=${r.password}`,`uuid=${r.uuid}`,`alpn=${r.alpn}`,`skip-cert-verify=${r.skipCertVerify}`,`sni=${r.sni}`,...t],", ");default:e.never(r,"type (clash encode)")}}},exports.trojan={__proto__:null,parse:function(e){let s=new URL(e),r=s.username,t=s.hostname,p=Number.parseInt(s.port,10);if(Number.isNaN(p))throw TypeError("invalid port: "+s.port);return{raw:e,name:decodeURIComponent(s.hash.slice(1)),type:"trojan",server:t,port:p,password:r,udp:!0,sni:s.searchParams.get("sni")??t,skipCertVerify:!0}}},exports.vmess={__proto__:null,parse:function(e){let s=JSON.parse(m.decode(r.Buffer.from(e.slice(8),"base64"))),t=s.ps,p=s.path;return{raw:e,name:t,server:s.add,port:Number.parseInt(s.port,10),type:"vmess",username:s.id,tls:s.tls,vmessAead:"0"===s.aid,sni:s.sni,ws:"ws"===s.net,wsPath:"/"===p[0]?p:`/${p}`,wsHeaders:s.sni||s.host?`Host:${s.sni||s.host}`:s.add,skipCertVerify:!0,udp:!0}}};
|
package/dist/es/index.d.mts
CHANGED
|
@@ -54,14 +54,12 @@ interface TrojanBasicConfig extends SharedConfigBase, TlsSharedConfig {
|
|
|
54
54
|
}
|
|
55
55
|
interface TuicConfig extends SharedConfigBase, TlsSharedConfig {
|
|
56
56
|
type: 'tuic';
|
|
57
|
-
sni: string;
|
|
58
57
|
uuid: string;
|
|
59
58
|
alpn: string;
|
|
60
59
|
token: string;
|
|
61
60
|
}
|
|
62
61
|
interface TuicV5Config extends SharedConfigBase, TlsSharedConfig {
|
|
63
62
|
type: 'tuic-v5';
|
|
64
|
-
sni: string;
|
|
65
63
|
uuid: string;
|
|
66
64
|
alpn: string;
|
|
67
65
|
password: string;
|
|
@@ -163,7 +161,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
163
161
|
type: string;
|
|
164
162
|
server: string;
|
|
165
163
|
port: number;
|
|
166
|
-
sni: string;
|
|
164
|
+
sni: string | undefined;
|
|
167
165
|
uuid: string;
|
|
168
166
|
alpn: string[];
|
|
169
167
|
alterId?: undefined;
|
|
@@ -187,7 +185,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
187
185
|
type: string;
|
|
188
186
|
server: string;
|
|
189
187
|
port: number;
|
|
190
|
-
sni: string;
|
|
188
|
+
sni: string | undefined;
|
|
191
189
|
uuid: string;
|
|
192
190
|
alpn: string[];
|
|
193
191
|
alterId?: undefined;
|
|
@@ -327,4 +325,4 @@ declare namespace index {
|
|
|
327
325
|
}
|
|
328
326
|
|
|
329
327
|
export { index$3 as clash, index$2 as ss, index$4 as surge, index$1 as trojan, index as vmess };
|
|
330
|
-
export type { HttpProxyConfig, Hysteria2Config, ShadowSocksConfig, SharedConfigBase, SnellConfig, Socks5Config, SupportedConfig, TrojanBasicConfig, TrojanConfig, TuicConfig, TuicV5Config, VmessConfig };
|
|
328
|
+
export type { HttpProxyConfig, Hysteria2Config, ShadowSocksConfig, SharedConfigBase, SnellConfig, Socks5Config, SupportedConfig, TlsSharedConfig, TrojanBasicConfig, TrojanConfig, TuicConfig, TuicV5Config, VmessConfig };
|
package/dist/es/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{never as e}from"foxts/guard";import{
|
|
1
|
+
import{never as e}from"foxts/guard";import{stringJoin as s}from"foxts/string-join";import{Buffer as r}from"node:buffer";let t=Number,p=e=>e.split(",").map(e=>e.trim());function o(e){let s=e.indexOf("=");return -1===s?["",""]:[e.slice(0,s).trim(),e.slice(s+1).trim()]}let a=new Set(["udp-relay","tfo","reuse","skip-cert-verify","tls","vmess-aead","ws"]),n=new Set(["version","download-bandwidth","port-hopping-interval","udp-port"]),i=new Set([]),d=new Set(["username","password","sni","encrypt-method","psk","obfs","obfs-host","uuid","alpn","block-quic","ws-path","ws-headers","port-hopping","token"]),u=Symbol("unsupported");var c={__proto__:null,decode:function(e){let[s,r]=o(e),[c,l,w,...m]=p(r),f=t(w),v=Object.fromEntries(m.map(e=>{let[s,r]=o(e);return a.has(s)?[s,"true"===r]:n.has(s)?[s,t(r)]:i.has(s)?[s,p(r)]:d.has(s)?'"'===r[0]&&r.endsWith('"')||"'"===r[0]&&r.endsWith("'")?[s,r.slice(1,-1)]:[s,r]:[s,u]})),h={raw:e,name:s,server:l,port:f,tfo:v.tfo,blockQuic:v["block-quic"]},y={sni:v.sni,skipCertVerify:v["skip-cert-verify"]};switch(c){case"snell":return{type:"snell",psk:v.psk,version:v.version,reuse:v.reuse,...h};case"ss":return{type:"ss",cipher:v["encrypt-method"],password:v.password,udp:v["udp-relay"],obfs:v.obfs,obfsHost:v["obfs-host"],obfsUri:v["obfs-uri"],udpPort:v["udp-port"],...h};case"trojan":return{type:"trojan",password:v.password,udp:v["udp-relay"],...y,...h};case"tuic":return{type:"tuic",uuid:v.uuid,alpn:v.alpn,token:v.token,...y,...h};case"tuic-v5":return{type:"tuic-v5",uuid:v.uuid,alpn:v.alpn,password:v.password,...y,...h};case"socks5":return{type:"socks5",username:m[0],password:m[1],udp:v["udp-relay"],...h};case"http":return{type:"http",username:m[0],password:m[1],...h};case"vmess":return{type:"vmess",username:v.username,tls:v.tls,vmessAead:v["vmess-aead"],ws:v.ws,wsPath:v["ws-path"],wsHeaders:v["ws-headers"],udp:v["udp-relay"],...y,...h};case"hysteria2":return{type:"hysteria2",password:v.password,skipCertVerify:v["skip-cert-verify"],downloadBandwidth:v["download-bandwidth"],portHopping:v["port-hopping"],portHoppingInterval:v["port-hopping-interval"],...h};default:throw TypeError(`Unsupported type: ${c} (surge decode)`)}},encode:function(r){let t=[r.tfo&&"tfo=true",r.blockQuic&&`block-quic=${r.blockQuic}`];switch(r.type){case"snell":return s([`${r.name} = snell, ${r.server}, ${r.port}, psk=${r.psk}, version=${r.version}, reuse=${r.reuse}`,...t],", ");case"ss":return s([`${r.name} = ss, ${r.server}, ${r.port}, encrypt-method=${r.cipher}, password=${r.password}`,r.udp&&"udp-relay=true",r.udpPort&&`udp-port=${r.udpPort}`,r.obfs&&`obfs=${r.obfs}`,r.obfsHost&&`obfs-host=${r.obfsHost}`,r.obfsUri&&`obfs-uri=${r.obfsUri}`,...t],", ");case"trojan":return s([`${r.name} = trojan, ${r.server}, ${r.port}, password=${r.password}`,r.sni&&`sni=${r.sni}`,r.skipCertVerify&&"skip-cert-verify=true",...t,r.udp&&"udp-relay=true"],", ");case"tuic":return s([`${r.name} = tuic, ${r.server}, ${r.port}, sni=${r.sni}, uuid=${r.uuid}, alpn=${r.alpn}, token=${r.token}`,...t],", ");case"socks5":return s([`${r.name} = socks5, ${r.server}, ${r.port}, ${r.username}, ${r.password}`,r.udp&&"udp-relay=true",...t],", ");case"http":return s([`${r.name} = http, ${r.server}, ${r.port}, ${r.username}, ${r.password}`,...t],", ");case"vmess":return s([`${r.name} = vmess, ${r.server}, ${r.port}`,`username=${r.username}`,`tls=${r.tls}`,`vmess-aead=${r.vmessAead}`,"ws=true",r.wsPath&&`ws-path=${"/"===r.wsPath[0]?r.wsPath:`/${r.wsPath}`}`,r.wsHeaders&&`ws-headers=${r.wsHeaders}`,`skip-cert-verify=${r.skipCertVerify}`,`tfo=${r.tfo}`,`udp-relay=${r.udp}`],", ");case"hysteria2":return s([`${r.name} = hysteria2, ${r.server}, ${r.port}`,`password=${r.password}`,`download-bandwidth=${r.downloadBandwidth}`,r.portHopping&&`port-hopping="${r.portHopping}"`,r.portHoppingInterval&&`port-hopping-interval=${r.portHoppingInterval}`,`skip-cert-verify=${r.skipCertVerify}`,...t],", ");case"tuic-v5":return s([`${r.name} = tuic-v5, ${r.server}, ${r.port}`,`password=${r.password}`,`uuid=${r.uuid}`,`alpn=${r.alpn}`,`skip-cert-verify=${r.skipCertVerify}`,`sni=${r.sni}`,...t],", ");default:e(r,"type (clash encode)")}}};function l(e){return e.split(",").reduce((e,s)=>{let[r,t]=s.split(":");return e[r.trim()]=t.trim(),e},{})}var w={__proto__:null,decode:function(e){if(!("type"in e)||"string"!=typeof e.type)throw TypeError("Missing or invalid type field");let s=JSON.stringify(e);switch(e.type){case"http":return{type:"http",name:e.name,server:e.server,port:Number(e.port),username:e.username,password:e.password,raw:s};case"ss":return{type:"ss",name:e.name,server:e.server,port:Number(e.port),cipher:e.cipher,password:e.password,udp:e.udp||!1,obfs:"obfs"===e.plugin?e["plugin-opts"].mode:void 0,raw:s};case"socks5":return{type:"socks5",name:e.name,server:e.server,port:Number(e.port),username:e.username,password:e.password,udp:e.udp||!1,raw:s};case"trojan":return{type:"trojan",name:e.name,server:e.server,port:Number(e.port),password:e.password,sni:e.sni,skipCertVerify:e["skip-cert-verify"]||!1,udp:e.udp||!1,raw:s};case"vmess":return{type:"vmess",name:e.name,server:e.server,port:Number(e.port),username:e.uuid,vmessAead:1===e.alterId||"1"===e.alterId,sni:e.servername,ws:"ws"===e.network,wsPath:e["ws-path"],wsHeaders:e["ws-headers"]?Object.entries(e["ws-headers"]).map(([e,s])=>`${e}:${s}`).join(", "):void 0,tls:e.tls||!1,udp:e.udp??!0,raw:s,skipCertVerify:e["skip-cert-verify"]||!1};default:throw TypeError(`Unsupported type: ${e.type} (clash decode)`)}},encode:function(s){let r={tfo:s.tfo};switch(s.type){case"ss":return{name:s.name,type:"ss",server:s.server,port:s.port,cipher:s.cipher,password:s.password,udp:s.udp,...s.obfs?{plugin:"obfs","plugin-opts":{mode:s.obfs,host:s.obfsHost,uri:s.obfsUri}}:{},...r};case"trojan":return{name:s.name,type:"trojan",server:s.server,port:s.port,password:s.password,sni:s.sni,"skip-cert-verify":s.skipCertVerify,udp:s.udp,...r};case"tuic":case"tuic-v5":return{name:s.name,type:"tuic",server:s.server,port:s.port,sni:s.sni,uuid:s.uuid,alpn:s.alpn.split(",").map(e=>e.trim()),..."tuic"===s.type?{token:s.token}:{password:s.password},"skip-cert-verify":s.skipCertVerify,udp:!0,version:"tuic"===s.type?4:"tuic-v5"===s.type?5:e(s),...r};case"socks5":return{name:s.name,type:"socks5",server:s.server,port:s.port,username:s.username,password:s.password,udp:s.udp,...r};case"http":return{name:s.name,type:"http",server:s.server,port:s.port,username:s.username,password:s.password,...r};case"vmess":return{alterId:s.vmessAead?0:void 0,tls:s.tls,udp:s.udp,uuid:s.username,name:s.name,servername:s.sni,"ws-path":s.wsPath,server:s.server,"ws-headers":s.wsHeaders?l(s.wsHeaders):void 0,cipher:"auto","ws-opts":{path:s.wsPath,headers:s.wsHeaders?l(s.wsHeaders):void 0},type:"vmess",port:s.port,network:s.ws?"ws":"tcp"};case"hysteria2":return{name:s.name,type:"hysteria2",server:s.server,port:s.port,ports:s.portHopping,password:s.password,down:s.downloadBandwidth+" Mbps","skip-cert-verify":s.skipCertVerify};default:throw TypeError(`Unsupported type: ${s.type} (clash encode)`)}}};function m(e){let s,r,[p,o]=e.split("://");if("ss"!==p)throw Error(`[ss.decodeOne] Unsupported type: ${p}`);let[a,n]=o.split("@");a.includes(":")?[s,r]=a.split(":"):[s,r]=atob(a).split(":");let[i,d]=n.split(":"),[u,c]=d.split("#"),[l,w]=u.split("/"),m=null;if(w)try{m=new URLSearchParams(w).get("plugin")}catch(s){let e=Error(`[ss.decodeOne] Invalid plugins: ${w}`);throw e.cause=s,e}let f=(m?.split(";")??[]).reduce((e,s)=>{let[r,t]=s.split("=");return e[r]=t,e},{});return{raw:e,type:"ss",name:decodeURIComponent(c),server:i,port:t(l),cipher:s,password:r,udp:!0,obfs:"obfs-local"in f&&"obfs"in f&&("http"===f.obfs||"tls"===f.obfs)?f.obfs:void 0,obfsHost:"obfs-host"in f?f["obfs-host"]:void 0}}function f(e){return atob(e).replaceAll("\r\n","\n").split("\n").filter(Boolean)}var v={__proto__:null,decodeBase64Multiline:f,decodeMultiline:function(e){return f(e).map(e=>m(e))},decodeOne:m},h={__proto__:null,parse:function(e){let s=new URL(e),r=s.username,t=s.hostname,p=Number.parseInt(s.port,10);if(Number.isNaN(p))throw TypeError("invalid port: "+s.port);return{raw:e,name:decodeURIComponent(s.hash.slice(1)),type:"trojan",server:t,port:p,password:r,udp:!0,sni:s.searchParams.get("sni")??t,skipCertVerify:!0}}};let y=new TextDecoder;var $={__proto__:null,parse:function(e){let s=JSON.parse(y.decode(r.from(e.slice(8),"base64"))),t=s.ps,p=s.path;return{raw:e,name:t,server:s.add,port:Number.parseInt(s.port,10),type:"vmess",username:s.id,tls:s.tls,vmessAead:"0"===s.aid,sni:s.sni,ws:"ws"===s.net,wsPath:"/"===p[0]?p:`/${p}`,wsHeaders:s.sni||s.host?`Host:${s.sni||s.host}`:s.add,skipCertVerify:!0,udp:!0}}};export{w as clash,v as ss,c as surge,h as trojan,$ as vmess};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodelistparser",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Surge / Mihomo (Clash.Meta) nodelist / proxy provider parser and generator.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -34,28 +34,28 @@
|
|
|
34
34
|
"author": "Sukka <https://skk.moe>",
|
|
35
35
|
"license": "MIT",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"foxts": "^3.
|
|
37
|
+
"foxts": "^3.8.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@eslint-sukka/node": "^6.
|
|
40
|
+
"@eslint-sukka/node": "^6.22.1",
|
|
41
41
|
"@swc-node/register": "^1.10.10",
|
|
42
|
-
"@swc/core": "^1.11
|
|
42
|
+
"@swc/core": "^1.12.11",
|
|
43
43
|
"@types/mocha": "^10.0.10",
|
|
44
|
-
"@types/node": "^22.
|
|
45
|
-
"bumpp": "^10.
|
|
46
|
-
"bunchee": "^6.5.
|
|
47
|
-
"eslint": "^9.
|
|
48
|
-
"eslint-config-sukka": "^6.
|
|
49
|
-
"eslint-formatter-sukka": "^6.
|
|
50
|
-
"expect": "^
|
|
51
|
-
"mocha": "^11.
|
|
44
|
+
"@types/node": "^22.16.2",
|
|
45
|
+
"bumpp": "^10.2.0",
|
|
46
|
+
"bunchee": "^6.5.4",
|
|
47
|
+
"eslint": "^9.30.1",
|
|
48
|
+
"eslint-config-sukka": "^6.22.1",
|
|
49
|
+
"eslint-formatter-sukka": "^6.22.1",
|
|
50
|
+
"expect": "^30.0.4",
|
|
51
|
+
"mocha": "^11.7.1",
|
|
52
52
|
"typescript": "^5.8.3"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"lint": "eslint --format=sukka .",
|
|
56
56
|
"build": "bunchee --minify --no-sourcemap",
|
|
57
57
|
"test": "mocha --require @swc-node/register src/*.test.ts src/**/*.test.ts",
|
|
58
|
-
"prerelease": "pnpm run lint && pnpm run build",
|
|
58
|
+
"prerelease": "pnpm run lint && pnpm run test && pnpm run build",
|
|
59
59
|
"release": "bumpp -r --all --commit \"release: %s\" --tag \"%s\""
|
|
60
60
|
}
|
|
61
61
|
}
|