nodelistparser 1.0.3 → 1.1.0
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 +23 -6
- package/dist/cjs/index.js +1 -1
- package/dist/es/index.d.mts +23 -6
- package/dist/es/index.mjs +1 -1
- package/package.json +13 -13
package/dist/cjs/index.d.ts
CHANGED
|
@@ -99,7 +99,10 @@ declare function decode$1(raw: string): SupportedConfig;
|
|
|
99
99
|
declare function encode$1(config: SupportedConfig): string;
|
|
100
100
|
|
|
101
101
|
declare namespace index$4 {
|
|
102
|
-
export {
|
|
102
|
+
export {
|
|
103
|
+
decode$1 as decode,
|
|
104
|
+
encode$1 as encode,
|
|
105
|
+
};
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
declare function decode(config: Record<string, any>): SupportedConfig;
|
|
@@ -154,6 +157,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
154
157
|
tfo: boolean | undefined;
|
|
155
158
|
'skip-cert-verify': boolean;
|
|
156
159
|
udp: boolean;
|
|
160
|
+
version: number;
|
|
157
161
|
token: string;
|
|
158
162
|
name: string;
|
|
159
163
|
type: string;
|
|
@@ -177,6 +181,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
177
181
|
tfo: boolean | undefined;
|
|
178
182
|
'skip-cert-verify': boolean;
|
|
179
183
|
udp: boolean;
|
|
184
|
+
version: number;
|
|
180
185
|
password: string;
|
|
181
186
|
name: string;
|
|
182
187
|
type: string;
|
|
@@ -283,7 +288,10 @@ declare function encode(config: SupportedConfig): {
|
|
|
283
288
|
declare const index$3_decode: typeof decode;
|
|
284
289
|
declare const index$3_encode: typeof encode;
|
|
285
290
|
declare namespace index$3 {
|
|
286
|
-
export {
|
|
291
|
+
export {
|
|
292
|
+
index$3_decode as decode,
|
|
293
|
+
index$3_encode as encode,
|
|
294
|
+
};
|
|
287
295
|
}
|
|
288
296
|
|
|
289
297
|
declare function decodeOne(sip002: string): ShadowSocksConfig;
|
|
@@ -294,20 +302,29 @@ declare const index$2_decodeBase64Multiline: typeof decodeBase64Multiline;
|
|
|
294
302
|
declare const index$2_decodeMultiline: typeof decodeMultiline;
|
|
295
303
|
declare const index$2_decodeOne: typeof decodeOne;
|
|
296
304
|
declare namespace index$2 {
|
|
297
|
-
export {
|
|
305
|
+
export {
|
|
306
|
+
index$2_decodeBase64Multiline as decodeBase64Multiline,
|
|
307
|
+
index$2_decodeMultiline as decodeMultiline,
|
|
308
|
+
index$2_decodeOne as decodeOne,
|
|
309
|
+
};
|
|
298
310
|
}
|
|
299
311
|
|
|
300
312
|
declare function parse$1(line: string): TrojanConfig;
|
|
301
313
|
|
|
302
314
|
declare namespace index$1 {
|
|
303
|
-
export {
|
|
315
|
+
export {
|
|
316
|
+
parse$1 as parse,
|
|
317
|
+
};
|
|
304
318
|
}
|
|
305
319
|
|
|
306
320
|
declare function parse(line: string): VmessConfig;
|
|
307
321
|
|
|
308
322
|
declare const index_parse: typeof parse;
|
|
309
323
|
declare namespace index {
|
|
310
|
-
export {
|
|
324
|
+
export {
|
|
325
|
+
index_parse as parse,
|
|
326
|
+
};
|
|
311
327
|
}
|
|
312
328
|
|
|
313
|
-
export {
|
|
329
|
+
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 };
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=require("foxts/guard"),s=require("node:buffer");const r=e=>"true"===e,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=e=>n.has(e),i=new Set(["version","download-bandwidth","port-hopping-interval","udp-port"]),u=e=>i.has(e),d=new Set([]),c=e=>d.has(e),l=new Set(["username","password","sni","encrypt-method","psk","obfs","obfs-host","uuid","alpn","block-quic","ws-path","ws-headers","port-hopping","token"]),w=e=>l.has(e),m=Symbol("unsupported"),f=e=>e.filter(Boolean).join(", ");function v(e){return e.split(",").reduce((e,s)=>{let[r,t]=s.split(":");return e[r.trim()]=t.trim(),e},{})}function y(e){let s,r
|
|
1
|
+
var e=require("foxts/guard"),s=require("node:buffer");const r=e=>"true"===e,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=e=>n.has(e),i=new Set(["version","download-bandwidth","port-hopping-interval","udp-port"]),u=e=>i.has(e),d=new Set([]),c=e=>d.has(e),l=new Set(["username","password","sni","encrypt-method","psk","obfs","obfs-host","uuid","alpn","block-quic","ws-path","ws-headers","port-hopping","token"]),w=e=>l.has(e),m=Symbol("unsupported"),f=e=>e.filter(Boolean).join(", ");function v(e){return e.split(",").reduce((e,s)=>{let[r,t]=s.split(":");return e[r.trim()]=t.trim(),e},{})}function y(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 h(e){return atob(e).replaceAll("\r\n","\n").split("\n").filter(Boolean)}const $=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?v(s.wsHeaders):void 0,cipher:"auto","ws-opts":{path:s.wsPath,headers:s.wsHeaders?v(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:h,decodeMultiline:function(e){return h(e).map(e=>y(e))},decodeOne:y},exports.surge={__proto__:null,decode:function(e){let[s,n]=o(e),[i,d,l,...f]=p(n),v=t(l),y=Object.fromEntries(f.map(e=>{let[s,n]=o(e);return a(s)?[s,r(n)]:u(s)?[s,t(n)]:c(s)?[s,p(n)]:w(s)?'"'===n[0]&&n.endsWith('"')||"'"===n[0]&&n.endsWith("'")?[s,n.slice(1,-1)]:[s,n]:[s,m]})),h={raw:e,name:s,server:d,port:v,tfo:y.tfo,blockQuic:y["block-quic"]};switch(i){case"snell":return{type:"snell",psk:y.psk,version:y.version,reuse:y.reuse,...h};case"ss":return{type:"ss",cipher:y["encrypt-method"],password:y.password,udp:y["udp-relay"],obfs:y.obfs,obfsHost:y["obfs-host"],obfsUri:y["obfs-uri"],udpPort:y["udp-port"],...h};case"trojan":return{type:"trojan",password:y.password,sni:y.sni,skipCertVerify:y["skip-cert-verify"],udp:y["udp-relay"],...h};case"tuic":return{type:"tuic",sni:y.sni,uuid:y.uuid,alpn:y.alpn,token:y.token,skipCertVerify:y["skip-cert-verify"],...h};case"tuic-v5":return{type:"tuic-v5",uuid:y.uuid,alpn:y.alpn,password:y.password,sni:y.sni,skipCertVerify:y["skip-cert-verify"],...h};case"socks5":return{type:"socks5",username:f[0],password:f[1],udp:y["udp-relay"],...h};case"http":return{type:"http",username:f[0],password:f[1],...h};case"vmess":return{type:"vmess",username:y.username,tls:y.tls,vmessAead:y["vmess-aead"],ws:y.ws,wsPath:y["ws-path"],wsHeaders:y["ws-headers"],skipCertVerify:y["skip-cert-verify"],udp:y["udp-relay"],sni:y.sni,...h};case"hysteria2":return{type:"hysteria2",password:y.password,skipCertVerify:y["skip-cert-verify"],downloadBandwidth:y["download-bandwidth"],portHopping:y["port-hopping"],portHoppingInterval:y["port-hopping-interval"],...h};default:throw TypeError(`Unsupported type: ${i} (surge decode)`)}},encode:function(s){let r=[s.tfo&&"tfo=true",s.blockQuic&&`block-quic=${s.blockQuic}`];switch(s.type){case"snell":return f([`${s.name} = snell, ${s.server}, ${s.port}, psk=${s.psk}, version=${s.version}, reuse=${s.reuse}`,...r]);case"ss":return f([`${s.name} = ss, ${s.server}, ${s.port}, encrypt-method=${s.cipher}, password=${s.password}`,s.udp&&"udp-relay=true",s.udpPort&&`udp-port=${s.udpPort}`,s.obfs&&`obfs=${s.obfs}`,s.obfsHost&&`obfs-host=${s.obfsHost}`,s.obfsUri&&`obfs-uri=${s.obfsUri}`,...r]);case"trojan":return f([`${s.name} = trojan, ${s.server}, ${s.port}, password=${s.password}`,s.sni&&`sni=${s.sni}`,s.skipCertVerify&&"skip-cert-verify=true",...r,s.udp&&"udp-relay=true"]);case"tuic":return f([`${s.name} = tuic, ${s.server}, ${s.port}, sni=${s.sni}, uuid=${s.uuid}, alpn=${s.alpn}, token=${s.token}`,...r]);case"socks5":return f([`${s.name} = socks5, ${s.server}, ${s.port}, ${s.username}, ${s.password}`,s.udp&&"udp-relay=true",...r]);case"http":return f([`${s.name} = http, ${s.server}, ${s.port}, ${s.username}, ${s.password}`,...r]);case"vmess":return f([`${s.name} = vmess, ${s.server}, ${s.port}`,`username=${s.username}`,`tls=${s.tls}`,`vmess-aead=${s.vmessAead}`,"ws=true",s.wsPath&&`ws-path=${"/"===s.wsPath[0]?s.wsPath:`/${s.wsPath}`}`,s.wsHeaders&&`ws-headers=${s.wsHeaders}`,`skip-cert-verify=${s.skipCertVerify}`,`tfo=${s.tfo}`,`udp-relay=${s.udp}`]);case"hysteria2":return f([`${s.name} = hysteria2, ${s.server}, ${s.port}`,`password=${s.password}`,`download-bandwidth=${s.downloadBandwidth}`,s.portHopping&&`port-hopping="${s.portHopping}"`,s.portHoppingInterval&&`port-hopping-interval=${s.portHoppingInterval}`,`skip-cert-verify=${s.skipCertVerify}`,...r]);case"tuic-v5":return f([`${s.name} = tuic-v5, ${s.server}, ${s.port}`,`password=${s.password}`,`uuid=${s.uuid}`,`alpn=${s.alpn}`,`skip-cert-verify=${s.skipCertVerify}`,`sni=${s.sni}`,...r]);default:e.never(s,"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 r=JSON.parse($.decode(s.Buffer.from(e.slice(8),"base64"))),t=r.ps,p=r.path;return{raw:e,name:t,server:r.add,port:Number.parseInt(r.port,10),type:"vmess",username:r.id,tls:r.tls,vmessAead:"0"===r.aid,sni:r.sni,ws:"ws"===r.net,wsPath:"/"===p[0]?p:`/${p}`,wsHeaders:r.sni||r.host?`Host:${r.sni||r.host}`:r.add,skipCertVerify:!0,udp:!0}}};
|
package/dist/es/index.d.mts
CHANGED
|
@@ -99,7 +99,10 @@ declare function decode$1(raw: string): SupportedConfig;
|
|
|
99
99
|
declare function encode$1(config: SupportedConfig): string;
|
|
100
100
|
|
|
101
101
|
declare namespace index$4 {
|
|
102
|
-
export {
|
|
102
|
+
export {
|
|
103
|
+
decode$1 as decode,
|
|
104
|
+
encode$1 as encode,
|
|
105
|
+
};
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
declare function decode(config: Record<string, any>): SupportedConfig;
|
|
@@ -154,6 +157,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
154
157
|
tfo: boolean | undefined;
|
|
155
158
|
'skip-cert-verify': boolean;
|
|
156
159
|
udp: boolean;
|
|
160
|
+
version: number;
|
|
157
161
|
token: string;
|
|
158
162
|
name: string;
|
|
159
163
|
type: string;
|
|
@@ -177,6 +181,7 @@ declare function encode(config: SupportedConfig): {
|
|
|
177
181
|
tfo: boolean | undefined;
|
|
178
182
|
'skip-cert-verify': boolean;
|
|
179
183
|
udp: boolean;
|
|
184
|
+
version: number;
|
|
180
185
|
password: string;
|
|
181
186
|
name: string;
|
|
182
187
|
type: string;
|
|
@@ -283,7 +288,10 @@ declare function encode(config: SupportedConfig): {
|
|
|
283
288
|
declare const index$3_decode: typeof decode;
|
|
284
289
|
declare const index$3_encode: typeof encode;
|
|
285
290
|
declare namespace index$3 {
|
|
286
|
-
export {
|
|
291
|
+
export {
|
|
292
|
+
index$3_decode as decode,
|
|
293
|
+
index$3_encode as encode,
|
|
294
|
+
};
|
|
287
295
|
}
|
|
288
296
|
|
|
289
297
|
declare function decodeOne(sip002: string): ShadowSocksConfig;
|
|
@@ -294,20 +302,29 @@ declare const index$2_decodeBase64Multiline: typeof decodeBase64Multiline;
|
|
|
294
302
|
declare const index$2_decodeMultiline: typeof decodeMultiline;
|
|
295
303
|
declare const index$2_decodeOne: typeof decodeOne;
|
|
296
304
|
declare namespace index$2 {
|
|
297
|
-
export {
|
|
305
|
+
export {
|
|
306
|
+
index$2_decodeBase64Multiline as decodeBase64Multiline,
|
|
307
|
+
index$2_decodeMultiline as decodeMultiline,
|
|
308
|
+
index$2_decodeOne as decodeOne,
|
|
309
|
+
};
|
|
298
310
|
}
|
|
299
311
|
|
|
300
312
|
declare function parse$1(line: string): TrojanConfig;
|
|
301
313
|
|
|
302
314
|
declare namespace index$1 {
|
|
303
|
-
export {
|
|
315
|
+
export {
|
|
316
|
+
parse$1 as parse,
|
|
317
|
+
};
|
|
304
318
|
}
|
|
305
319
|
|
|
306
320
|
declare function parse(line: string): VmessConfig;
|
|
307
321
|
|
|
308
322
|
declare const index_parse: typeof parse;
|
|
309
323
|
declare namespace index {
|
|
310
|
-
export {
|
|
324
|
+
export {
|
|
325
|
+
index_parse as parse,
|
|
326
|
+
};
|
|
311
327
|
}
|
|
312
328
|
|
|
313
|
-
export {
|
|
329
|
+
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 };
|
package/dist/es/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{never as e}from"foxts/guard";import{Buffer as s}from"node:buffer";let r=e=>"true"===e,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 n=new Set(["udp-relay","tfo","reuse","skip-cert-verify","tls","vmess-aead","ws"]),a=e=>n.has(e),i=new Set(["version","download-bandwidth","port-hopping-interval","udp-port"]),d=e=>i.has(e),u=new Set([]),
|
|
1
|
+
import{never as e}from"foxts/guard";import{Buffer as s}from"node:buffer";let r=e=>"true"===e,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 n=new Set(["udp-relay","tfo","reuse","skip-cert-verify","tls","vmess-aead","ws"]),a=e=>n.has(e),i=new Set(["version","download-bandwidth","port-hopping-interval","udp-port"]),d=e=>i.has(e),u=new Set([]),c=e=>u.has(e),l=new Set(["username","password","sni","encrypt-method","psk","obfs","obfs-host","uuid","alpn","block-quic","ws-path","ws-headers","port-hopping","token"]),w=e=>l.has(e),m=Symbol("unsupported"),f=e=>e.filter(Boolean).join(", ");var v={__proto__:null,decode:function(e){let[s,n]=o(e),[i,u,l,...f]=p(n),v=t(l),y=Object.fromEntries(f.map(e=>{let[s,n]=o(e);return a(s)?[s,r(n)]:d(s)?[s,t(n)]:c(s)?[s,p(n)]:w(s)?'"'===n[0]&&n.endsWith('"')||"'"===n[0]&&n.endsWith("'")?[s,n.slice(1,-1)]:[s,n]:[s,m]})),h={raw:e,name:s,server:u,port:v,tfo:y.tfo,blockQuic:y["block-quic"]};switch(i){case"snell":return{type:"snell",psk:y.psk,version:y.version,reuse:y.reuse,...h};case"ss":return{type:"ss",cipher:y["encrypt-method"],password:y.password,udp:y["udp-relay"],obfs:y.obfs,obfsHost:y["obfs-host"],obfsUri:y["obfs-uri"],udpPort:y["udp-port"],...h};case"trojan":return{type:"trojan",password:y.password,sni:y.sni,skipCertVerify:y["skip-cert-verify"],udp:y["udp-relay"],...h};case"tuic":return{type:"tuic",sni:y.sni,uuid:y.uuid,alpn:y.alpn,token:y.token,skipCertVerify:y["skip-cert-verify"],...h};case"tuic-v5":return{type:"tuic-v5",uuid:y.uuid,alpn:y.alpn,password:y.password,sni:y.sni,skipCertVerify:y["skip-cert-verify"],...h};case"socks5":return{type:"socks5",username:f[0],password:f[1],udp:y["udp-relay"],...h};case"http":return{type:"http",username:f[0],password:f[1],...h};case"vmess":return{type:"vmess",username:y.username,tls:y.tls,vmessAead:y["vmess-aead"],ws:y.ws,wsPath:y["ws-path"],wsHeaders:y["ws-headers"],skipCertVerify:y["skip-cert-verify"],udp:y["udp-relay"],sni:y.sni,...h};case"hysteria2":return{type:"hysteria2",password:y.password,skipCertVerify:y["skip-cert-verify"],downloadBandwidth:y["download-bandwidth"],portHopping:y["port-hopping"],portHoppingInterval:y["port-hopping-interval"],...h};default:throw TypeError(`Unsupported type: ${i} (surge decode)`)}},encode:function(s){let r=[s.tfo&&"tfo=true",s.blockQuic&&`block-quic=${s.blockQuic}`];switch(s.type){case"snell":return f([`${s.name} = snell, ${s.server}, ${s.port}, psk=${s.psk}, version=${s.version}, reuse=${s.reuse}`,...r]);case"ss":return f([`${s.name} = ss, ${s.server}, ${s.port}, encrypt-method=${s.cipher}, password=${s.password}`,s.udp&&"udp-relay=true",s.udpPort&&`udp-port=${s.udpPort}`,s.obfs&&`obfs=${s.obfs}`,s.obfsHost&&`obfs-host=${s.obfsHost}`,s.obfsUri&&`obfs-uri=${s.obfsUri}`,...r]);case"trojan":return f([`${s.name} = trojan, ${s.server}, ${s.port}, password=${s.password}`,s.sni&&`sni=${s.sni}`,s.skipCertVerify&&"skip-cert-verify=true",...r,s.udp&&"udp-relay=true"]);case"tuic":return f([`${s.name} = tuic, ${s.server}, ${s.port}, sni=${s.sni}, uuid=${s.uuid}, alpn=${s.alpn}, token=${s.token}`,...r]);case"socks5":return f([`${s.name} = socks5, ${s.server}, ${s.port}, ${s.username}, ${s.password}`,s.udp&&"udp-relay=true",...r]);case"http":return f([`${s.name} = http, ${s.server}, ${s.port}, ${s.username}, ${s.password}`,...r]);case"vmess":return f([`${s.name} = vmess, ${s.server}, ${s.port}`,`username=${s.username}`,`tls=${s.tls}`,`vmess-aead=${s.vmessAead}`,"ws=true",s.wsPath&&`ws-path=${"/"===s.wsPath[0]?s.wsPath:`/${s.wsPath}`}`,s.wsHeaders&&`ws-headers=${s.wsHeaders}`,`skip-cert-verify=${s.skipCertVerify}`,`tfo=${s.tfo}`,`udp-relay=${s.udp}`]);case"hysteria2":return f([`${s.name} = hysteria2, ${s.server}, ${s.port}`,`password=${s.password}`,`download-bandwidth=${s.downloadBandwidth}`,s.portHopping&&`port-hopping="${s.portHopping}"`,s.portHoppingInterval&&`port-hopping-interval=${s.portHoppingInterval}`,`skip-cert-verify=${s.skipCertVerify}`,...r]);case"tuic-v5":return f([`${s.name} = tuic-v5, ${s.server}, ${s.port}`,`password=${s.password}`,`uuid=${s.uuid}`,`alpn=${s.alpn}`,`skip-cert-verify=${s.skipCertVerify}`,`sni=${s.sni}`,...r]);default:e(s,"type (clash encode)")}}};function y(e){return e.split(",").reduce((e,s)=>{let[r,t]=s.split(":");return e[r.trim()]=t.trim(),e},{})}var h={__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?y(s.wsHeaders):void 0,cipher:"auto","ws-opts":{path:s.wsPath,headers:s.wsHeaders?y(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 $(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,d]=a.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 b(e){return atob(e).replaceAll("\r\n","\n").split("\n").filter(Boolean)}var k={__proto__:null,decodeBase64Multiline:b,decodeMultiline:function(e){return b(e).map(e=>$(e))},decodeOne:$},g={__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 H=new TextDecoder;var _={__proto__:null,parse:function(e){let r=JSON.parse(H.decode(s.from(e.slice(8),"base64"))),t=r.ps,p=r.path;return{raw:e,name:t,server:r.add,port:Number.parseInt(r.port,10),type:"vmess",username:r.id,tls:r.tls,vmessAead:"0"===r.aid,sni:r.sni,ws:"ws"===r.net,wsPath:"/"===p[0]?p:`/${p}`,wsHeaders:r.sni||r.host?`Host:${r.sni||r.host}`:r.add,skipCertVerify:!0,udp:!0}}};export{h as clash,k as ss,v as surge,g as trojan,_ as vmess};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodelistparser",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Surge / Mihomo (Clash.Meta) nodelist / proxy provider parser and generator.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -34,22 +34,22 @@
|
|
|
34
34
|
"author": "Sukka <https://skk.moe>",
|
|
35
35
|
"license": "MIT",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"foxts": "^
|
|
37
|
+
"foxts": "^3.3.1"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@eslint-sukka/node": "^6.
|
|
41
|
-
"@swc-node/register": "^1.10.
|
|
42
|
-
"@swc/core": "^1.11.
|
|
40
|
+
"@eslint-sukka/node": "^6.20.0",
|
|
41
|
+
"@swc-node/register": "^1.10.10",
|
|
42
|
+
"@swc/core": "^1.11.24",
|
|
43
43
|
"@types/mocha": "^10.0.10",
|
|
44
|
-
"@types/node": "^22.
|
|
45
|
-
"bumpp": "^10.
|
|
46
|
-
"bunchee": "^6.
|
|
47
|
-
"eslint": "^9.
|
|
48
|
-
"eslint-config-sukka": "^6.
|
|
49
|
-
"eslint-formatter-sukka": "^6.
|
|
44
|
+
"@types/node": "^22.15.18",
|
|
45
|
+
"bumpp": "^10.1.1",
|
|
46
|
+
"bunchee": "^6.5.2",
|
|
47
|
+
"eslint": "^9.27.0",
|
|
48
|
+
"eslint-config-sukka": "^6.20.0",
|
|
49
|
+
"eslint-formatter-sukka": "^6.20.0",
|
|
50
50
|
"expect": "^29.7.0",
|
|
51
|
-
"mocha": "^11.
|
|
52
|
-
"typescript": "^5.8.
|
|
51
|
+
"mocha": "^11.3.0",
|
|
52
|
+
"typescript": "^5.8.3"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"lint": "eslint --format=sukka .",
|