@liblaf/sub-store 0.1.3 β†’ 0.1.4

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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{run as Mr}from"@stricli/core";import{buildApplication as lr,buildRouteMap as cr}from"@stricli/core";var Y="TODO",F="0.1.3";import nr from"fs/promises";import{buildCommand as ar}from"@stricli/core";import fr from"consola";var p={name:{common:"Unknown"},cca2:"UN",flag:"\uD83C\uDDFA\uD83C\uDDF3"};class w{provider;connection=!1;country=p;emby=!1;info=!1;multiplier=1;constructor(r){this.provider=r}get prettyName(){let r=this.name;if(this.provider.name==="JMS"){let e=this.name.match(/@(?<name>[\w-]+)/);if(e)r=e.groups?.name??this.name}if(r.startsWith("\u3010"))return`[${this.provider.name}]${r}`;return`[${this.provider.name}] ${r}`}}import m from"zod";var u=m.looseObject({name:m.string(),type:m.string(),server:m.string()}),h=m.looseObject({name:m.string(),type:m.enum(["select","url-test"]),proxies:m.array(m.string()),url:m.url().default("https://cp.cloudflare.com"),lazy:m.boolean().default(!0),"expected-status":m.int().min(100).max(599).default(204),icon:m.url().optional()}),x=m.looseObject({proxies:m.array(u).optional(),"proxy-groups":m.array(h).optional()});class d extends w{raw;constructor(r,e){super(e);this.raw=u.parse(r)}get name(){return this.raw.name}get type(){return this.raw.type}get server(){return this.raw.server}get mihomo(){return{...this.raw,name:this.prettyName}}}import V from"yaml";function l(r){let e=V.parse(r,{merge:!0});return x.parse(e)}import X from"fs/promises";import*as b from"remeda";import W from"yaml";class c{template;static async load(r){let e=await X.readFile(r,"utf8");return new c(e)}constructor(r){this.template=l(r)}render(r,e){let o=b.clone(this.template);o.proxies=r.map((t)=>t.mihomo);let i=this.renderGroupProxy();o["proxy-groups"]=[i];for(let t of e){let s=this.renderGroup(r,t);if(!s)continue;o["proxy-groups"].push(s),i.proxies.push(s.name)}return o=this.sanitize(o),W.stringify(o,{aliasDuplicateObjects:!1})}sanitize(r){return r=b.omitBy(r,(e,o)=>o.startsWith("__")),r}renderGroup(r,e){let o=r.filter(e.filter);if(o.length===0)return;let i=o.map((s)=>s.prettyName),t={name:e.name,type:e.type,proxies:i,url:e.url,icon:e.icon};return h.parse(t)}renderGroupProxy(){let r={name:"PROXY",type:"select",proxies:[],icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png"};return h.parse(r)}}function f(r){return!r.emby&&!r.info&&r.type!=="hysteria2"}var R={name:"PROXY",type:"select",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png",filter(r){return!1}},_={name:"INFO",type:"url-test",emoji:"\u2139\uFE0F",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Airport.png",filter(r){return r.info}},A={name:"Auto",type:"url-test",emoji:"\uD83D\uDE80",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Auto.png",filter(r){return f(r)&&r.multiplier<=2}},K=new Set(["HK","MO"]),H={name:"AI",type:"url-test",emoji:"\uD83E\uDD16",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/AI.png",filter(r){return f(r)&&!!r.country&&!K.has(r.country.cca2)}},G={name:"Download",type:"url-test",emoji:"\uD83D\uDCE5",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Download.png",filter(r){return f(r)&&r.multiplier<=1}},S={name:"Stream",type:"url-test",emoji:"\uD83D\uDCFA",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/YouTube.png",filter(r){return f(r)&&r.multiplier<2}};var T={name:"CitrusLab Emby",type:"url-test",emoji:"\uD83C\uDF5F",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Emby.png",url:"https://shenmi.link",filter(r){return r.provider.name==="CitrusLab"&&r.emby}};import J from"world-countries";import y from"@twemoji/api";function N(r){let{cca2:e,flag:o}=r,i=y.convert.toCodePoint(o),t="".concat(y.base,y.size,"/",i,y.ext);return{name:r.name.common,type:e===p.cca2?"select":"url-test",emoji:o,icon:t,filter(s){return f(s)&&s.country.cca2===e}}}function j(){return[R,_,A,H,G,S,T,...J.map(N),N(p)]}class n{async inferBulk(r){return await Promise.all(r.map((e)=>this.infer(e)))}}import Q from"consola";import q from"world-countries";class P extends n{async infer(r){if(r.country.cca2===p.cca2)r=this.inferFromName(r);if(r.country.cca2===p.cca2)r.country=p;return r}inferFromName(r){let e=r.name;for(let o of q){if(o.cca2==="CN")continue;for(let i of Z(o)){if(!i)continue;if(i.test(e))return Q.debug(`${e} ~ ${i} (${rr(o)})`),r.country=o,r}}return r}}function*Z(r){let e=new Set(["GB"]);function o(t){if(!t)return;if(e.has(t))return;return new RegExp(`\\b${t}\\b`)}function i(t){if(!t)return;if(e.has(t))return;return new RegExp(t,"iu")}for(let t of["en","zh"])for(let s of["narrow","short","long"]){let O=new Intl.DisplayNames(t,{style:s,type:"region"});if(s==="narrow"||s==="short")yield o(O.of(r.cca2));else if(s==="long")yield i(O.of(r.cca2))}yield i(r.name.common),yield i(r.name.official);for(let t in r.name.native)yield i(r.name.native[t].common),yield i(r.name.native[t].official);yield o(r.cca2),yield o(r.cca3),yield o(r.cioc);for(let t of r.capital)yield i(t);yield i(r.flag)}function rr(r){return`${r.flag} ${r.name.common} (${r.cca2})`}import er from"consola";class g extends n{pattern=/emby/i;async infer(r){if(r.emby=this.pattern.test(r.name),r.emby)er.debug(`${r.name} ~ ${this.pattern}`);return r}}import or from"consola";class v extends n{pattern=/Expire|Traffic|\u5269\u4F59|\u5957\u9910\u5230\u671F/iu;async infer(r){if(r.info=this.pattern.test(r.name),r.info)or.debug(`${r.name} ~ ${this.pattern}`);return r}}class C extends n{inferrers;constructor(r){super();if(!r)r=[new P,new g,new v];this.inferrers=r}async infer(r){for(let e of this.inferrers)r=await e.infer(r);return r}async inferBulk(r){return await Promise.all(r.map((e)=>this.infer(e)))}}import sr from"fs/promises";import pr from"yaml";import ir from"consola";import mr from"ky";import{z as a}from"zod";var I=a.object({name:a.string(),free:a.boolean().default(!1),jms:a.object({url:a.url()}).optional(),mihomo:a.object({url:a.url()}).optional()}),U=a.object({providers:a.array(I)});import Ee from"ky";var tr=process.env.SUBCONVERTER_URL||"https://url.v1.mk/sub";function B(r,e){let o=new URL(tr);return o.searchParams.set("url",r),o.searchParams.set("target",e),o.searchParams.set("list","true"),o}class E{name;jms;mihomo;constructor(r){let{name:e,jms:o,mihomo:i}=I.parse(r);this.name=e,this.jms=o,this.mihomo=i}async fetchOutboundsMihomo(){let r=this.getMihomoURL();if(!r)return[];let e=new Headers({"User-Agent":"clash.meta"}),o=await mr.get(r,{headers:e}).text();return l(o).proxies.map((t)=>new d(t,this))}warnFormat(r){ir.warn(`Provider '${this.name}' does not support '${r}'`)}getMihomoURL(){if(this.mihomo)return this.mihomo.url;if(this.jms)return B(this.jms.url,"clash");this.warnFormat("mihomo");return}}class M{providers;static async load(r){let e=await sr.readFile(r,"utf8"),o=pr.parse(e),i=U.parse(o);return new M(i.providers)}constructor(r){this.providers=r.map((e)=>new E(e))}async fetchMihomoOutbounds(){return(await Promise.all(this.providers.map((e)=>e.fetchOutboundsMihomo()))).flat()}}var L=ar({docs:{brief:""},async func(r){fr.level=6;let e=j(),o=await M.load(r.profile),i=await c.load(r.template),t=await o.fetchMihomoOutbounds();t=await new C().inferBulk(t);let O=i.render(t,e);await nr.writeFile(r.output,O)},parameters:{flags:{output:{kind:"parsed",brief:"",parse:String,default:"mihomo.yaml"},profile:{kind:"parsed",brief:"",parse:String,default:"profile.yaml"},template:{kind:"parsed",brief:"",parse:String,default:"templates/mihomo/default.yaml"}}}});var $=cr({routes:{mihomo:L},docs:{brief:Y}}),D=lr($,{name:"sub-store",versionInfo:{currentVersion:F}});import ur from"fs";import hr from"os";import dr from"path";var k={process,os:hr,fs:ur,path:dr};Mr(D,process.argv.slice(2),k);
3
+ import{run as _r}from"@stricli/core";import{buildApplication as vr,buildRouteMap as Rr}from"@stricli/core";var K="TODO",X="0.1.4";import gr from"fs/promises";import{buildCommand as br}from"@stricli/core";import Ar from"consola";import rr from"world-countries";var p={name:{common:"Unknown"},cca2:"UN",flag:"\uD83C\uDDFA\uD83C\uDDF3"};function I(r){return rr.find((e)=>e.cca2===r)}class S{provider;connection=!1;country=p;emby=!1;info=!1;multiplier=1;constructor(r){this.provider=r}get prettyName(){let r=this.name;if(this.provider.name==="JMS"){let e=this.name.match(/@(?<name>[\w-]+)/);if(e)r=e.groups?.name??this.name}if(r.startsWith("\u3010"))return`[${this.provider.name}]${r}`;return`[${this.provider.name}] ${r}`}}import s from"zod";var d=s.looseObject({name:s.string(),type:s.string(),server:s.string()}),M=s.looseObject({name:s.string(),type:s.enum(["select","url-test"]),proxies:s.array(s.string()),url:s.url().default("https://cp.cloudflare.com"),lazy:s.boolean().default(!0),"expected-status":s.int().min(100).max(599).default(204),icon:s.url().optional()}),x=s.looseObject({proxies:s.array(d).optional(),"proxy-groups":s.array(M).optional()});class y extends S{raw;constructor(r,e){super(e);this.raw=d.parse(r)}get name(){return this.raw.name}get type(){return this.raw.type}get server(){return this.raw.server}get mihomo(){return{...this.raw,name:this.prettyName}}}import er from"yaml";function f(r){let e=er.parse(r,{merge:!0});return x.parse(e)}import or from"fs/promises";import*as P from"remeda";import tr from"yaml";class h{template;static async load(r){let e=await or.readFile(r,"utf8");return new h(e)}constructor(r){this.template=f(r)}render(r,e){let o=P.clone(this.template);o.proxies=r.map((i)=>i.mihomo);let t=this.renderGroupProxy();o["proxy-groups"]=[t];for(let i of e){let m=this.renderGroup(r,i);if(!m)continue;o["proxy-groups"].push(m),t.proxies.push(m.name)}return o=this.sanitize(o),tr.stringify(o,{aliasDuplicateObjects:!1})}sanitize(r){return r=P.omitBy(r,(e,o)=>o.startsWith("__")),r}renderGroup(r,e){let o=r.filter(e.filter);if(o.length===0)return;let t=o.map((m)=>m.prettyName),i={name:e.name,type:e.type,proxies:t,url:e.url,icon:e.icon};return M.parse(i)}renderGroupProxy(){let r={name:"PROXY",type:"select",proxies:[],icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png"};return M.parse(r)}}function c(r){return!r.emby&&!r.info&&r.type!=="hysteria2"}var H={name:"INFO",type:"url-test",emoji:"\u2139\uFE0F",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Airport.png",filter(r){return r.info}},G={name:"Auto",type:"url-test",emoji:"\uD83D\uDE80",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Auto.png",filter(r){return c(r)&&r.multiplier<=2}},ir=new Set(["HK","MO"]),L={name:"AI",type:"url-test",emoji:"\uD83E\uDD16",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/AI.png",filter(r){return c(r)&&!!r.country&&!ir.has(r.country.cca2)}},j={name:"Download",type:"url-test",emoji:"\uD83D\uDCE5",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Download.png",filter(r){return c(r)&&r.multiplier<=1}},k={name:"Stream",type:"url-test",emoji:"\uD83D\uDCFA",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/YouTube.png",filter(r){return c(r)&&r.multiplier<2}};var N={name:"CitrusLab Emby",type:"url-test",emoji:"\uD83C\uDF5F",icon:"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Emby.png",url:"https://shenmi.link",filter(r){return r.provider.name==="CitrusLab"&&r.emby}};import sr from"world-countries";import g from"@twemoji/api";function T(r){let{cca2:e,flag:o}=r,t=g.convert.toCodePoint(o),i="".concat(g.base,g.size,"/",t,g.ext);return{name:r.name.common,type:e===p.cca2?"select":"url-test",emoji:o,icon:i,filter(m){return c(m)&&m.country.cca2===e}}}function D(){return[G,H,L,j,k,N,...sr.map(T),T(p)]}class n{async inferBulk(r){return await Promise.all(r.map((e)=>this.infer(e)))}}import U from"consola";import fr from"world-countries";import Q from"dns/promises";import lr from"dataloader";import W from"zod";import pr from"dataloader";import mr from"ky";import*as J from"remeda";import l from"zod";var nr=l.looseObject({ip:l.union([l.ipv4(),l.ipv6()]),location:l.looseObject({country_code:l.string().length(2)}).optional()}),ar=l.record(l.string(),nr);class b{endpoints="https://api.ipapi.is/";loader;key;constructor(){this.loader=new pr(async(r)=>await this.batchLoadFn(r),{maxBatchSize:100}),this.key=process.env.IPAPI_IS_KEY}async lookup(r){return await this.loader.load(r)}async batchLoadFn(r){let e=await mr.post(this.endpoints,{json:{ips:r,key:this.key}}).json();e=J.omit(e,["total_elapsed_ms"]);let o=ar.parse(e);return r.map((t)=>o[t])}}class A{api;loader;constructor(){this.api=new b,this.loader=new lr(async(r)=>await this.batchLoadFn(r))}async lookup(r){return await this.loader.load(r)}async batchLoadFn(r){return await Promise.all(r.map(async(e)=>await this.loadFn(e)))}async loadFn(r){let e=[];if(cr(r))e=[r];else e=(await Q.lookup(r,{all:!0})).map((i)=>i.address);let o=await Promise.all(e.map(async(t)=>await this.api.lookup(t)));for(let t of o){if(!t.location?.country_code)continue;return t}return{ip:e[0]||"",location:{country_code:"UN"}}}}function cr(r){return W.ipv4().safeParse(r).success||W.ipv6().safeParse(r).success}class v extends n{geoip=new A;async infer(r){if(r.emby||r.info)return r.country=p,r;if(r.country.cca2===p.cca2)r=this.inferFromName(r);if(r.country.cca2===p.cca2)r=await this.inferFromServer(r);if(r.country.cca2===p.cca2)U.fail(`${r.prettyName} (${z(r.country)})`);return r}inferFromName(r){let e=r.name;for(let o of fr){if(o.cca2==="CN")continue;for(let t of hr(o)){if(!t)continue;if(t.test(e))return U.success(`${r.prettyName} ~ ${t} (${z(o)})`),r.country=o,r}}return r}async inferFromServer(r){let e=await this.geoip.lookup(r.server);if(e.location?.country_code)r.country=I(e.location.country_code)||p;else r.country=p;if(r.country.cca2!==p.cca2)U.success(`${r.prettyName} -> ${e.ip} (${z(r.country)})`);return r}}function*hr(r){let e=new Set(["GB"]);function o(i){if(!i)return;if(e.has(i))return;return new RegExp(`\\b${i}\\b`)}function t(i){if(!i)return;if(e.has(i))return;return new RegExp(i,"iu")}for(let i of["en","zh"])for(let m of["narrow","short","long"]){let O=new Intl.DisplayNames(i,{style:m,type:"region"});if(m==="narrow"||m==="short")yield o(O.of(r.cca2));else if(m==="long")yield t(O.of(r.cca2))}yield t(r.name.common),yield t(r.name.official);for(let i in r.name.native)yield t(r.name.native[i].common),yield t(r.name.native[i].official);yield o(r.cca2),yield o(r.cca3),yield o(r.cioc);for(let i of r.capital)yield t(i);yield t(r.flag)}function z(r){return`${r.flag} ${r.name.common} (${r.cca2})`}import dr from"consola";class R extends n{pattern=/emby/i;async infer(r){if(r.emby=this.pattern.test(r.name),r.emby)dr.success(`${r.prettyName} ~ ${this.pattern}`);return r}}import Mr from"consola";class C extends n{pattern=/Expire|Traffic|\u5269\u4F59|\u5957\u9910\u5230\u671F/iu;async infer(r){if(r.info=this.pattern.test(r.name),r.info)Mr.success(`${r.prettyName} ~ ${this.pattern}`);return r}}class E extends n{inferrers;constructor(r){super();if(!r)r=[new R,new C,new v];this.inferrers=r}async infer(r){for(let e of this.inferrers)r=await e.infer(r);return r}async inferBulk(r){return await Promise.all(r.map((e)=>this.infer(e)))}}import xr from"fs/promises";import Pr from"yaml";import ur from"consola";import Or from"ky";import{z as a}from"zod";var w=a.object({name:a.string(),free:a.boolean().default(!1),jms:a.object({url:a.url()}).optional(),mihomo:a.object({url:a.url()}).optional()}),F=a.object({providers:a.array(w)});import io from"ky";var yr=process.env.SUBCONVERTER_URL||"https://url.v1.mk/sub";function q(r,e){let o=new URL(yr);return o.searchParams.set("url",r),o.searchParams.set("target",e),o.searchParams.set("list","true"),o}class _{name;jms;mihomo;constructor(r){let{name:e,jms:o,mihomo:t}=w.parse(r);this.name=e,this.jms=o,this.mihomo=t}async fetchOutboundsMihomo(){let r=this.getMihomoURL();if(!r)return[];let e=new Headers({"User-Agent":"clash.meta"}),o=await Or.get(r,{headers:e}).text();return f(o).proxies.map((i)=>new y(i,this))}warnFormat(r){ur.warn(`Provider '${this.name}' does not support '${r}'`)}getMihomoURL(){if(this.mihomo)return this.mihomo.url;if(this.jms)return q(this.jms.url,"clash");this.warnFormat("mihomo");return}}class u{providers;static async load(r){let e=await xr.readFile(r,"utf8"),o=Pr.parse(e),t=F.parse(o);return new u(t.providers)}constructor(r){this.providers=r.map((e)=>new _(e))}async fetchMihomoOutbounds(){return(await Promise.all(this.providers.map((e)=>e.fetchOutboundsMihomo()))).flat()}}var B=br({docs:{brief:""},async func(r){Ar.level=6;let e=D(),o=await u.load(r.profile),t=await h.load(r.template),i=await o.fetchMihomoOutbounds();i=await new E().inferBulk(i);let O=t.render(i,e);await gr.writeFile(r.output,O)},parameters:{flags:{output:{kind:"parsed",brief:"",parse:String,default:"mihomo.yaml"},profile:{kind:"parsed",brief:"",parse:String,default:"profile.yaml"},template:{kind:"parsed",brief:"",parse:String,default:"templates/mihomo/default.yaml"}}}});var Z=Rr({routes:{mihomo:B},docs:{brief:K}}),Y=vr(Z,{name:"sub-store",versionInfo:{currentVersion:X}});import Cr from"fs";import Er from"os";import wr from"path";var $={process,os:Er,fs:Cr,path:wr};_r(Y,process.argv.slice(2),$);
4
4
 
5
- //# debugId=04FBB758DC99131364756E2164756E21
5
+ //# debugId=88F705403D4840DA64756E2164756E21
6
6
  //# sourceMappingURL=sub-store.js.map
@@ -1,31 +1,34 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/bin/sub-store.ts", "../src/cli/app.ts", "../src/cli/mihomo.ts", "../src/outbound.ts", "../src/formats/mihomo/schema.ts", "../src/formats/mihomo/outbound.ts", "../src/formats/mihomo/parse.ts", "../src/formats/mihomo/template.ts", "../src/group/common.ts", "../src/group/extra.ts", "../src/group/factory.ts", "../src/group/country.ts", "../src/infer/abc.ts", "../src/infer/country.ts", "../src/infer/emby.ts", "../src/infer/info.ts", "../src/infer/container.ts", "../src/provider/profile.ts", "../src/provider/provider.ts", "../src/provider/schema.ts", "../src/provider/subconvert.ts", "../src/cli/context.ts"],
3
+ "sources": ["../src/bin/sub-store.ts", "../src/cli/app.ts", "../src/cli/mihomo.ts", "../src/utils/countries.ts", "../src/outbound.ts", "../src/formats/mihomo/schema.ts", "../src/formats/mihomo/outbound.ts", "../src/formats/mihomo/parse.ts", "../src/formats/mihomo/template.ts", "../src/group/common.ts", "../src/group/extra.ts", "../src/group/factory.ts", "../src/group/country.ts", "../src/infer/abc.ts", "../src/infer/country.ts", "../src/geoip/geoip.ts", "../src/geoip/ipapi.is.ts", "../src/infer/emby.ts", "../src/infer/info.ts", "../src/infer/container.ts", "../src/provider/profile.ts", "../src/provider/provider.ts", "../src/provider/schema.ts", "../src/provider/subconvert.ts", "../src/cli/context.ts"],
4
4
  "sourcesContent": [
5
5
  "#!/usr/bin/env bun\nimport { run } from \"@stricli/core\";\nimport { app, context } from \"../cli\";\n\nrun(app, process.argv.slice(2), context);\n",
6
6
  "import { buildApplication, buildRouteMap } from \"@stricli/core\";\nimport { description, version } from \"../../package.json\";\nimport { mihomo } from \"./mihomo\";\n\nexport const routes = buildRouteMap({\n routes: { mihomo },\n docs: { brief: description },\n});\n\nexport const app = buildApplication(routes, {\n name: \"sub-store\",\n versionInfo: { currentVersion: version },\n});\n",
7
7
  "import fs from \"node:fs/promises\";\nimport { buildCommand } from \"@stricli/core\";\nimport consola from \"consola\";\nimport { type MihomoOutbound, MihomoTemplate } from \"../formats\";\nimport { type Group, newGroups } from \"../group\";\nimport { InferrerContainer } from \"../infer\";\nimport { Profile } from \"../provider\";\nimport type { Context } from \"./context\";\n\ntype Flags = {\n output: string;\n profile: string;\n template: string;\n};\n\nexport const mihomo = buildCommand({\n docs: { brief: \"\" },\n async func(this: Context, flags: Flags): Promise<void> {\n consola.level = 6;\n const groups: Group[] = newGroups();\n const profile = await Profile.load(flags.profile);\n const template: MihomoTemplate = await MihomoTemplate.load(flags.template);\n let outbounds: MihomoOutbound[] = await profile.fetchMihomoOutbounds();\n const inferrer = new InferrerContainer();\n outbounds = await inferrer.inferBulk(outbounds);\n const config: string = template.render(outbounds, groups);\n await fs.writeFile(flags.output, config);\n },\n parameters: {\n flags: {\n output: {\n kind: \"parsed\",\n brief: \"\",\n parse: String,\n default: \"mihomo.yaml\",\n },\n profile: {\n kind: \"parsed\",\n brief: \"\",\n parse: String,\n default: \"profile.yaml\",\n },\n template: {\n kind: \"parsed\",\n brief: \"\",\n parse: String,\n default: \"templates/mihomo/default.yaml\",\n },\n },\n },\n});\n",
8
- "import type { Country } from \"world-countries\";\nimport type { Provider } from \"./provider\";\n\nexport const COUNTRY_UNKNOWN = {\n name: { common: \"Unknown\" },\n cca2: \"UN\",\n flag: \"πŸ‡ΊπŸ‡³\",\n} as Country;\n\nexport abstract class Outbound {\n public readonly provider: Provider;\n\n // inference\n public connection: boolean = false;\n public country: Country = COUNTRY_UNKNOWN;\n public emby: boolean = false;\n public info: boolean = false;\n public multiplier: number = 1.0;\n\n constructor(provider: Provider) {\n this.provider = provider;\n }\n\n abstract get name(): string;\n\n abstract get type(): string;\n\n abstract get server(): string;\n\n get prettyName(): string {\n let name: string = this.name;\n if (this.provider.name === \"JMS\") {\n const match = this.name.match(/@(?<name>[\\w-]+)/);\n if (match) name = match.groups?.name ?? this.name;\n }\n if (name.startsWith(\"【\")) return `[${this.provider.name}]${name}`;\n return `[${this.provider.name}] ${name}`;\n }\n}\n",
8
+ "import type { Country } from \"world-countries\";\nimport countries from \"world-countries\";\n\nexport const COUNTRY_UNKNOWN = {\n name: { common: \"Unknown\" },\n cca2: \"UN\",\n flag: \"πŸ‡ΊπŸ‡³\",\n} as Country;\n\nexport function lookupCountry(cca2: string): Country | undefined {\n return countries.find((country: Country): boolean => country.cca2 === cca2);\n}\n",
9
+ "import type { Country } from \"world-countries\";\nimport type { Provider } from \"./provider\";\nimport { COUNTRY_UNKNOWN } from \"./utils\";\n\nexport abstract class Outbound {\n public readonly provider: Provider;\n\n // inference\n public connection: boolean = false;\n public country: Country = COUNTRY_UNKNOWN;\n public emby: boolean = false;\n public info: boolean = false;\n public multiplier: number = 1.0;\n\n constructor(provider: Provider) {\n this.provider = provider;\n }\n\n abstract get name(): string;\n\n abstract get type(): string;\n\n abstract get server(): string;\n\n get prettyName(): string {\n let name: string = this.name;\n if (this.provider.name === \"JMS\") {\n const match = this.name.match(/@(?<name>[\\w-]+)/);\n if (match) name = match.groups?.name ?? this.name;\n }\n if (name.startsWith(\"【\")) return `[${this.provider.name}]${name}`;\n return `[${this.provider.name}] ${name}`;\n }\n}\n",
9
10
  "import z from \"zod\";\n\nexport const MIHOMO_NODE_SCHEMA = z.looseObject({\n name: z.string(),\n type: z.string(),\n server: z.string(),\n});\nexport type MihomoNode = z.infer<typeof MIHOMO_NODE_SCHEMA>;\nexport type MihomoNodeOptions = z.input<typeof MIHOMO_NODE_SCHEMA>;\n\nexport const MIHOMO_PROXY_GROUP_SCHEMA = z.looseObject({\n name: z.string(),\n type: z.enum([\"select\", \"url-test\"]),\n proxies: z.array(z.string()),\n url: z.url().default(\"https://cp.cloudflare.com\"),\n lazy: z.boolean().default(true),\n \"expected-status\": z.int().min(100).max(599).default(204),\n icon: z.url().optional(),\n});\nexport type MihomoProxyGroup = z.infer<typeof MIHOMO_PROXY_GROUP_SCHEMA>;\nexport type MihomoProxyGroupOptions = z.input<typeof MIHOMO_PROXY_GROUP_SCHEMA>;\n\nexport const MIHOMO_SCHEMA = z.looseObject({\n proxies: z.array(MIHOMO_NODE_SCHEMA).optional(),\n \"proxy-groups\": z.array(MIHOMO_PROXY_GROUP_SCHEMA).optional(),\n});\nexport type Mihomo = z.infer<typeof MIHOMO_SCHEMA>;\n",
10
11
  "import { Outbound } from \"../../outbound\";\nimport type { Provider } from \"../../provider\";\nimport type { MihomoNode, MihomoNodeOptions } from \"./schema\";\nimport { MIHOMO_NODE_SCHEMA } from \"./schema\";\n\nexport class MihomoOutbound extends Outbound {\n private readonly raw: MihomoNode;\n\n public constructor(raw: MihomoNodeOptions, provider: Provider) {\n super(provider);\n this.raw = MIHOMO_NODE_SCHEMA.parse(raw);\n }\n\n public override get name(): string {\n return this.raw.name;\n }\n\n public override get type(): string {\n return this.raw.type;\n }\n\n public override get server(): string {\n return this.raw.server;\n }\n\n public get mihomo(): MihomoNode {\n return { ...this.raw, name: this.prettyName };\n }\n}\n",
11
12
  "import YAML from \"yaml\";\nimport { MIHOMO_SCHEMA, type Mihomo } from \"./schema\";\n\nexport function mihomoParse(text: string): Mihomo {\n const data: any = YAML.parse(text, { merge: true });\n return MIHOMO_SCHEMA.parse(data);\n}\n",
12
- "import fs from \"node:fs/promises\";\nimport * as R from \"remeda\";\nimport YAML from \"yaml\";\nimport type { Group } from \"../../group\";\nimport type { MihomoOutbound } from \"./outbound\";\nimport { mihomoParse } from \"./parse\";\nimport {\n MIHOMO_PROXY_GROUP_SCHEMA,\n type Mihomo,\n type MihomoNode,\n type MihomoProxyGroup,\n type MihomoProxyGroupOptions,\n} from \"./schema\";\n\nexport class MihomoTemplate {\n template: Mihomo;\n\n static async load(path: string): Promise<MihomoTemplate> {\n const template: string = await fs.readFile(path, \"utf8\");\n return new MihomoTemplate(template);\n }\n\n public constructor(template: string) {\n this.template = mihomoParse(template);\n }\n\n public render(outbounds: MihomoOutbound[], groups: Group[]): string {\n let config: Mihomo = R.clone(this.template);\n config.proxies = outbounds.map((o: MihomoOutbound): MihomoNode => o.mihomo);\n const groupProxy: MihomoProxyGroup = this.renderGroupProxy();\n config[\"proxy-groups\"] = [groupProxy];\n for (const group of groups) {\n const rendered: MihomoProxyGroup | undefined = this.renderGroup(\n outbounds,\n group,\n );\n if (!rendered) continue;\n config[\"proxy-groups\"].push(rendered);\n groupProxy.proxies.push(rendered.name);\n }\n config = this.sanitize(config);\n return YAML.stringify(config, { aliasDuplicateObjects: false });\n }\n\n protected sanitize(config: Mihomo): Mihomo {\n config = R.omitBy(config, (_value, key: string): boolean =>\n key.startsWith(\"__\"),\n );\n return config;\n }\n\n protected renderGroup(\n outbounds: MihomoOutbound[],\n group: Group,\n ): MihomoProxyGroup | undefined {\n const filtered: MihomoOutbound[] = outbounds.filter(group.filter);\n if (filtered.length === 0) return undefined;\n const filteredNames: string[] = filtered.map(\n (o: MihomoOutbound): string => o.prettyName,\n );\n const options: MihomoProxyGroupOptions = {\n name: group.name,\n type: group.type,\n proxies: filteredNames,\n url: group.url,\n icon: group.icon,\n };\n return MIHOMO_PROXY_GROUP_SCHEMA.parse(options);\n }\n\n protected renderGroupProxy(): MihomoProxyGroup {\n const options: MihomoProxyGroupOptions = {\n name: \"PROXY\",\n type: \"select\",\n proxies: [],\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png\",\n };\n return MIHOMO_PROXY_GROUP_SCHEMA.parse(options);\n }\n}\n",
13
+ "import fs from \"node:fs/promises\";\nimport * as R from \"remeda\";\nimport YAML from \"yaml\";\nimport type { Group } from \"../../group\";\nimport type { MihomoOutbound } from \"./outbound\";\nimport { mihomoParse } from \"./parse\";\nimport {\n MIHOMO_PROXY_GROUP_SCHEMA,\n type Mihomo,\n type MihomoNode,\n type MihomoProxyGroup,\n type MihomoProxyGroupOptions,\n} from \"./schema\";\n\nexport class MihomoTemplate {\n template: Mihomo;\n\n static async load(path: string): Promise<MihomoTemplate> {\n const template: string = await fs.readFile(path, \"utf8\");\n return new MihomoTemplate(template);\n }\n\n public constructor(template: string) {\n this.template = mihomoParse(template);\n }\n\n public render(outbounds: readonly MihomoOutbound[], groups: Group[]): string {\n let config: Mihomo = R.clone(this.template);\n config.proxies = outbounds.map((o: MihomoOutbound): MihomoNode => o.mihomo);\n const groupProxy: MihomoProxyGroup = this.renderGroupProxy();\n config[\"proxy-groups\"] = [groupProxy];\n for (const group of groups) {\n const rendered: MihomoProxyGroup | undefined = this.renderGroup(\n outbounds,\n group,\n );\n if (!rendered) continue;\n config[\"proxy-groups\"].push(rendered);\n groupProxy.proxies.push(rendered.name);\n }\n config = this.sanitize(config);\n return YAML.stringify(config, { aliasDuplicateObjects: false });\n }\n\n protected sanitize(config: Mihomo): Mihomo {\n config = R.omitBy(config, (_value, key: string): boolean =>\n key.startsWith(\"__\"),\n );\n return config;\n }\n\n protected renderGroup(\n outbounds: readonly MihomoOutbound[],\n group: Group,\n ): MihomoProxyGroup | undefined {\n const filtered: MihomoOutbound[] = outbounds.filter(group.filter);\n if (filtered.length === 0) return undefined;\n const filteredNames: string[] = filtered.map(\n (o: MihomoOutbound): string => o.prettyName,\n );\n const options: MihomoProxyGroupOptions = {\n name: group.name,\n type: group.type,\n proxies: filteredNames,\n url: group.url,\n icon: group.icon,\n };\n return MIHOMO_PROXY_GROUP_SCHEMA.parse(options);\n }\n\n protected renderGroupProxy(): MihomoProxyGroup {\n const options: MihomoProxyGroupOptions = {\n name: \"PROXY\",\n type: \"select\",\n proxies: [],\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png\",\n };\n return MIHOMO_PROXY_GROUP_SCHEMA.parse(options);\n }\n}\n",
13
14
  "import type { Outbound } from \"../outbound\";\nimport type { Group } from \"./abc\";\n\nexport function good(outbound: Outbound): boolean {\n // connection quality of Hysteria2 is poor\n return !outbound.emby && !outbound.info && outbound.type !== \"hysteria2\";\n}\n\nexport const PROXY: Group = {\n name: \"PROXY\",\n type: \"select\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png\",\n filter(_outbound: Outbound): boolean {\n return false;\n },\n};\n\nexport const INFO: Group = {\n name: \"INFO\",\n type: \"url-test\",\n emoji: \"ℹ️\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Airport.png\",\n filter(outbound: Outbound): boolean {\n return outbound.info;\n },\n};\n\nexport const AUTO: Group = {\n name: \"Auto\",\n type: \"url-test\",\n emoji: \"πŸš€\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Auto.png\",\n filter(outbound: Outbound): boolean {\n return good(outbound) && outbound.multiplier <= 2.0;\n },\n};\n\nconst AI_EXCLUDE_REGIONS = new Set([\"HK\", \"MO\"]);\nexport const AI: Group = {\n name: \"AI\",\n type: \"url-test\",\n emoji: \"πŸ€–\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/AI.png\",\n filter(outbound: Outbound): boolean {\n return (\n good(outbound) &&\n !!outbound.country &&\n !AI_EXCLUDE_REGIONS.has(outbound.country.cca2)\n );\n },\n};\n\nexport const DOWNLOAD: Group = {\n name: \"Download\",\n type: \"url-test\",\n emoji: \"πŸ“₯\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Download.png\",\n filter(outbound: Outbound): boolean {\n return good(outbound) && outbound.multiplier <= 1.0;\n },\n};\n\nexport const STREAM: Group = {\n name: \"Stream\",\n type: \"url-test\",\n emoji: \"πŸ“Ί\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/YouTube.png\",\n filter(outbound: Outbound): boolean {\n return good(outbound) && outbound.multiplier < 2.0;\n },\n};\n",
14
15
  "import type { Outbound } from \"../outbound\";\nimport type { Group } from \"./abc\";\n\nexport const CITRUSLAB_EMBY: Group = {\n name: \"CitrusLab Emby\",\n type: \"url-test\",\n emoji: \"🍟\",\n icon: \"https://cdn.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Emby.png\",\n url: \"https://shenmi.link\",\n filter(outbound: Outbound): boolean {\n return outbound.provider.name === \"CitrusLab\" && outbound.emby;\n },\n};\n",
15
- "import countries from \"world-countries\";\nimport { COUNTRY_UNKNOWN } from \"../outbound\";\nimport type { Group } from \"./abc\";\nimport { AI, AUTO, DOWNLOAD, INFO, PROXY, STREAM } from \"./common\";\nimport { newCountryGroup } from \"./country\";\nimport { CITRUSLAB_EMBY } from \"./extra\";\n\nexport function newGroups(): Group[] {\n return [\n PROXY,\n INFO,\n AUTO,\n AI,\n DOWNLOAD,\n STREAM,\n CITRUSLAB_EMBY,\n ...countries.map(newCountryGroup),\n newCountryGroup(COUNTRY_UNKNOWN),\n ];\n}\n",
16
- "import twemoji from \"@twemoji/api\";\nimport type { Country } from \"world-countries\";\nimport { COUNTRY_UNKNOWN, type Outbound } from \"../outbound\";\nimport type { Group } from \"./abc\";\nimport { good } from \"./common\";\n\nexport function newCountryGroup(country: Country): Group {\n const { cca2, flag } = country;\n const codePoint: string = twemoji.convert.toCodePoint(flag);\n const icon: string = \"\".concat(\n twemoji.base,\n twemoji.size,\n \"/\",\n codePoint,\n twemoji.ext,\n );\n return {\n name: country.name.common,\n type: cca2 === COUNTRY_UNKNOWN.cca2 ? \"select\" : \"url-test\",\n emoji: flag,\n icon,\n filter(outbound: Outbound): boolean {\n return good(outbound) && outbound.country.cca2 === cca2;\n },\n };\n}\n",
17
- "import type { Outbound } from \"../outbound\";\n\nexport abstract class Inferrer {\n public abstract infer<T extends Outbound>(outbound: T): Promise<T>;\n\n public async inferBulk<T extends Outbound>(outbounds: T[]): Promise<T[]> {\n return await Promise.all(\n outbounds.map((outbound: T): Promise<T> => this.infer(outbound)),\n );\n }\n}\n",
18
- "import consola from \"consola\";\nimport countries, { type Country } from \"world-countries\";\nimport type { Outbound } from \"../outbound\";\nimport { COUNTRY_UNKNOWN } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\n\nexport class InferrerCountry extends Inferrer {\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n if (outbound.country.cca2 === COUNTRY_UNKNOWN.cca2)\n outbound = this.inferFromName(outbound);\n if (outbound.country.cca2 === COUNTRY_UNKNOWN.cca2)\n outbound.country = COUNTRY_UNKNOWN;\n return outbound;\n }\n\n protected inferFromName<T extends Outbound>(outbound: T): T {\n const name: string = outbound.name;\n for (const country of countries) {\n if (country.cca2 === \"CN\") continue;\n for (const pattern of patterns(country)) {\n if (!pattern) continue;\n if (pattern.test(name)) {\n consola.debug(`${name} ~ ${pattern} (${prettyCountry(country)})`);\n outbound.country = country;\n return outbound;\n }\n }\n }\n return outbound;\n }\n}\n\nfunction* patterns(country: Country): Generator<RegExp | undefined> {\n const EXCLUDE_PATTERNS = new Set([\n \"GB\", // gigabyte\n ]);\n\n function short(pattern?: string): RegExp | undefined {\n if (!pattern) return undefined;\n if (EXCLUDE_PATTERNS.has(pattern)) return undefined;\n return new RegExp(`\\\\b${pattern}\\\\b`);\n }\n\n function long(pattern?: string): RegExp | undefined {\n if (!pattern) return undefined;\n if (EXCLUDE_PATTERNS.has(pattern)) return undefined;\n return new RegExp(pattern, \"iu\");\n }\n\n for (const locale of [\"en\", \"zh\"]) {\n for (const style of [\"narrow\", \"short\", \"long\"]) {\n const display = new Intl.DisplayNames(locale, {\n style: style as Intl.RelativeTimeFormatStyle,\n type: \"region\",\n });\n if (style === \"narrow\" || style === \"short\") {\n yield short(display.of(country.cca2));\n } else if (style === \"long\") {\n yield long(display.of(country.cca2));\n }\n }\n }\n yield long(country.name.common);\n yield long(country.name.official);\n for (const lang in country.name.native) {\n yield long(country.name.native[lang]!.common);\n yield long(country.name.native[lang]!.official);\n }\n yield short(country.cca2);\n // yield long(country.ccn3);\n yield short(country.cca3);\n yield short(country.cioc);\n for (const capital of country.capital) yield long(capital);\n // for (const alt of country.altSpellings) yield long(alt);\n yield long(country.flag);\n}\n\nfunction prettyCountry(country: Country): string {\n return `${country.flag} ${country.name.common} (${country.cca2})`;\n}\n",
19
- "import consola from \"consola\";\nimport type { Outbound } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\n\nexport class InferrerEmby extends Inferrer {\n public readonly pattern: RegExp = /emby/i;\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n outbound.emby = this.pattern.test(outbound.name);\n if (outbound.emby) consola.debug(`${outbound.name} ~ ${this.pattern}`);\n return outbound;\n }\n}\n",
20
- "import consola from \"consola\";\nimport type { Outbound } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\n\nexport class InferrerInfo extends Inferrer {\n public readonly pattern: RegExp = /Expire|Traffic|剩余|ε₯—ι€εˆ°ζœŸ/iu;\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n outbound.info = this.pattern.test(outbound.name);\n if (outbound.info) consola.debug(`${outbound.name} ~ ${this.pattern}`);\n return outbound;\n }\n}\n",
21
- "import type { Outbound } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\nimport { InferrerCountry } from \"./country\";\nimport { InferrerEmby } from \"./emby\";\nimport { InferrerInfo } from \"./info\";\n\nexport class InferrerContainer extends Inferrer {\n public readonly inferrers: Inferrer[];\n\n public constructor(inferrers?: Inferrer[]) {\n super();\n if (!inferrers) {\n inferrers = [\n new InferrerCountry(),\n new InferrerEmby(),\n new InferrerInfo(),\n ];\n }\n this.inferrers = inferrers;\n }\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n for (const inferrer of this.inferrers)\n outbound = await inferrer.infer(outbound);\n return outbound;\n }\n\n public override async inferBulk<T extends Outbound>(\n outbounds: T[],\n ): Promise<T[]> {\n return await Promise.all(\n outbounds.map((outbound: T): Promise<T> => this.infer(outbound)),\n );\n }\n}\n",
22
- "import fs from \"node:fs/promises\";\nimport YAML from \"yaml\";\nimport type { MihomoOutbound } from \"../formats\";\nimport { Provider } from \"./provider\";\nimport type { ProfileModel, ProviderOptions } from \"./schema\";\nimport { PROFILE_SCHEMA } from \"./schema\";\n\nexport class Profile {\n public providers: Provider[];\n\n static async load(file: string): Promise<Profile> {\n const data: string = await fs.readFile(file, \"utf8\");\n const parsed: any = YAML.parse(data);\n const profile: ProfileModel = PROFILE_SCHEMA.parse(parsed);\n return new Profile(profile.providers);\n }\n\n constructor(providers: ProviderOptions[]) {\n this.providers = providers.map(\n (options: ProviderOptions): Provider => new Provider(options),\n );\n }\n\n async fetchMihomoOutbounds(): Promise<MihomoOutbound[]> {\n const outbounds = await Promise.all(\n this.providers.map((provider) => provider.fetchOutboundsMihomo()),\n );\n return outbounds.flat();\n }\n}\n",
16
+ "import countries from \"world-countries\";\nimport { COUNTRY_UNKNOWN } from \"../utils\";\nimport type { Group } from \"./abc\";\nimport { AI, AUTO, DOWNLOAD, INFO, STREAM } from \"./common\";\nimport { newCountryGroup } from \"./country\";\nimport { CITRUSLAB_EMBY } from \"./extra\";\n\nexport function newGroups(): Group[] {\n return [\n AUTO,\n INFO,\n AI,\n DOWNLOAD,\n STREAM,\n CITRUSLAB_EMBY,\n ...countries.map(newCountryGroup),\n newCountryGroup(COUNTRY_UNKNOWN),\n ];\n}\n",
17
+ "import twemoji from \"@twemoji/api\";\nimport type { Country } from \"world-countries\";\nimport type { Outbound } from \"../outbound\";\nimport { COUNTRY_UNKNOWN } from \"../utils\";\nimport type { Group } from \"./abc\";\nimport { good } from \"./common\";\n\nexport function newCountryGroup(country: Country): Group {\n const { cca2, flag } = country;\n const codePoint: string = twemoji.convert.toCodePoint(flag);\n const icon: string = \"\".concat(\n twemoji.base,\n twemoji.size,\n \"/\",\n codePoint,\n twemoji.ext,\n );\n return {\n name: country.name.common,\n type: cca2 === COUNTRY_UNKNOWN.cca2 ? \"select\" : \"url-test\",\n emoji: flag,\n icon,\n filter(outbound: Outbound): boolean {\n return good(outbound) && outbound.country.cca2 === cca2;\n },\n };\n}\n",
18
+ "import type { Outbound } from \"../outbound\";\n\nexport abstract class Inferrer {\n public abstract infer<T extends Outbound>(outbound: T): Promise<T>;\n\n public async inferBulk<T extends Outbound>(\n outbounds: readonly T[],\n ): Promise<T[]> {\n return await Promise.all(\n outbounds.map((outbound: T): Promise<T> => this.infer(outbound)),\n );\n }\n}\n",
19
+ "import consola from \"consola\";\nimport countries, { type Country } from \"world-countries\";\nimport { type ApiResponse, GeoIP } from \"../geoip\";\nimport type { Outbound } from \"../outbound\";\nimport { COUNTRY_UNKNOWN, lookupCountry } from \"../utils\";\nimport { Inferrer } from \"./abc\";\n\nexport class InferrerCountry extends Inferrer {\n private readonly geoip: GeoIP = new GeoIP();\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n if (outbound.emby || outbound.info) {\n outbound.country = COUNTRY_UNKNOWN;\n return outbound;\n }\n if (outbound.country.cca2 === COUNTRY_UNKNOWN.cca2)\n outbound = this.inferFromName(outbound);\n if (outbound.country.cca2 === COUNTRY_UNKNOWN.cca2)\n outbound = await this.inferFromServer(outbound);\n if (outbound.country.cca2 === COUNTRY_UNKNOWN.cca2) {\n consola.fail(\n `${outbound.prettyName} (${prettyCountry(outbound.country)})`,\n );\n }\n return outbound;\n }\n\n protected inferFromName<T extends Outbound>(outbound: T): T {\n const name: string = outbound.name;\n for (const country of countries) {\n if (country.cca2 === \"CN\") continue;\n for (const pattern of patterns(country)) {\n if (!pattern) continue;\n if (pattern.test(name)) {\n consola.success(\n `${outbound.prettyName} ~ ${pattern} (${prettyCountry(country)})`,\n );\n outbound.country = country;\n return outbound;\n }\n }\n }\n return outbound;\n }\n\n protected async inferFromServer<T extends Outbound>(outbound: T): Promise<T> {\n const response: ApiResponse = await this.geoip.lookup(outbound.server);\n if (response.location?.country_code) {\n outbound.country =\n lookupCountry(response.location.country_code) || COUNTRY_UNKNOWN;\n } else {\n outbound.country = COUNTRY_UNKNOWN;\n }\n if (outbound.country.cca2 !== COUNTRY_UNKNOWN.cca2) {\n consola.success(\n `${outbound.prettyName} -> ${response.ip} (${prettyCountry(outbound.country)})`,\n );\n }\n return outbound;\n }\n}\n\nfunction* patterns(country: Country): Generator<RegExp | undefined> {\n const EXCLUDE_PATTERNS = new Set([\n \"GB\", // gigabyte\n ]);\n\n function short(pattern?: string): RegExp | undefined {\n if (!pattern) return undefined;\n if (EXCLUDE_PATTERNS.has(pattern)) return undefined;\n return new RegExp(`\\\\b${pattern}\\\\b`);\n }\n\n function long(pattern?: string): RegExp | undefined {\n if (!pattern) return undefined;\n if (EXCLUDE_PATTERNS.has(pattern)) return undefined;\n return new RegExp(pattern, \"iu\");\n }\n\n for (const locale of [\"en\", \"zh\"]) {\n for (const style of [\"narrow\", \"short\", \"long\"]) {\n const display = new Intl.DisplayNames(locale, {\n style: style as Intl.RelativeTimeFormatStyle,\n type: \"region\",\n });\n if (style === \"narrow\" || style === \"short\") {\n yield short(display.of(country.cca2));\n } else if (style === \"long\") {\n yield long(display.of(country.cca2));\n }\n }\n }\n yield long(country.name.common);\n yield long(country.name.official);\n for (const lang in country.name.native) {\n yield long(country.name.native[lang]!.common);\n yield long(country.name.native[lang]!.official);\n }\n yield short(country.cca2);\n // yield long(country.ccn3);\n yield short(country.cca3);\n yield short(country.cioc);\n for (const capital of country.capital) yield long(capital);\n // for (const alt of country.altSpellings) yield long(alt);\n yield long(country.flag);\n}\n\nfunction prettyCountry(country: Country): string {\n return `${country.flag} ${country.name.common} (${country.cca2})`;\n}\n",
20
+ "import type { LookupAddress } from \"node:dns\";\nimport dns from \"node:dns/promises\";\nimport DataLoader from \"dataloader\";\nimport z from \"zod\";\nimport { type ApiResponse, IpapiIs } from \"./ipapi.is\";\n\nexport class GeoIP {\n private api: IpapiIs;\n private loader: DataLoader<string, ApiResponse>;\n\n public constructor() {\n this.api = new IpapiIs();\n this.loader = new DataLoader(\n async (servers: readonly string[]): Promise<ApiResponse[]> =>\n await this.batchLoadFn(servers),\n );\n }\n\n public async lookup(server: string): Promise<ApiResponse> {\n return await this.loader.load(server);\n }\n\n protected async batchLoadFn(\n servers: readonly string[],\n ): Promise<ApiResponse[]> {\n return await Promise.all(\n servers.map(\n async (server: string): Promise<ApiResponse> =>\n await this.loadFn(server),\n ),\n );\n }\n\n protected async loadFn(server: string): Promise<ApiResponse> {\n let ips: string[] = [];\n if (isIpAddr(server)) {\n ips = [server];\n } else {\n const addresses: LookupAddress[] = await dns.lookup(server, {\n all: true,\n });\n ips = addresses.map((addr: LookupAddress): string => addr.address);\n }\n const responses: ApiResponse[] = await Promise.all(\n ips.map(\n async (ip: string): Promise<ApiResponse> => await this.api.lookup(ip),\n ),\n );\n for (const response of responses) {\n if (!response.location?.country_code) continue;\n return response;\n }\n return { ip: ips[0] || \"\", location: { country_code: \"UN\" } };\n }\n}\n\nfunction isIpAddr(data: string): boolean {\n return z.ipv4().safeParse(data).success || z.ipv6().safeParse(data).success;\n}\n",
21
+ "import DataLoader from \"dataloader\";\nimport ky from \"ky\";\nimport * as R from \"remeda\";\nimport z from \"zod\";\n\nconst RESPONSE_SCHEMA = z.looseObject({\n ip: z.union([z.ipv4(), z.ipv6()]),\n location: z.looseObject({ country_code: z.string().length(2) }).optional(),\n});\nexport type ApiResponse = z.infer<typeof RESPONSE_SCHEMA>;\nconst BULK_RESPONSE_SCHEMA = z.record(z.string(), RESPONSE_SCHEMA);\ntype BulkApiResponse = z.infer<typeof BULK_RESPONSE_SCHEMA>;\n\nexport class IpapiIs {\n public readonly endpoints: string = \"https://api.ipapi.is/\";\n private loader: DataLoader<string, ApiResponse>;\n private readonly key?: string;\n\n public constructor() {\n this.loader = new DataLoader(\n async (ips: readonly string[]): Promise<ApiResponse[]> =>\n await this.batchLoadFn(ips),\n { maxBatchSize: 100 },\n );\n this.key = process.env.IPAPI_IS_KEY;\n }\n\n public async lookup(ip: string): Promise<ApiResponse> {\n return await this.loader.load(ip);\n }\n\n protected async batchLoadFn(ips: readonly string[]): Promise<ApiResponse[]> {\n let data: any = await ky\n .post(this.endpoints, { json: { ips, key: this.key } })\n .json();\n data = R.omit(data, [\"total_elapsed_ms\"]);\n const response: BulkApiResponse = BULK_RESPONSE_SCHEMA.parse(data);\n return ips.map((ip: string): ApiResponse => response[ip]!);\n }\n}\n",
22
+ "import consola from \"consola\";\nimport type { Outbound } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\n\nexport class InferrerEmby extends Inferrer {\n public readonly pattern: RegExp = /emby/i;\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n outbound.emby = this.pattern.test(outbound.name);\n if (outbound.emby)\n consola.success(`${outbound.prettyName} ~ ${this.pattern}`);\n return outbound;\n }\n}\n",
23
+ "import consola from \"consola\";\nimport type { Outbound } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\n\nexport class InferrerInfo extends Inferrer {\n public readonly pattern: RegExp = /Expire|Traffic|剩余|ε₯—ι€εˆ°ζœŸ/iu;\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n outbound.info = this.pattern.test(outbound.name);\n if (outbound.info)\n consola.success(`${outbound.prettyName} ~ ${this.pattern}`);\n return outbound;\n }\n}\n",
24
+ "import type { Outbound } from \"../outbound\";\nimport { Inferrer } from \"./abc\";\nimport { InferrerCountry } from \"./country\";\nimport { InferrerEmby } from \"./emby\";\nimport { InferrerInfo } from \"./info\";\n\nexport class InferrerContainer extends Inferrer {\n public readonly inferrers: Inferrer[];\n\n public constructor(inferrers?: Inferrer[]) {\n super();\n if (!inferrers) {\n inferrers = [\n new InferrerEmby(),\n new InferrerInfo(),\n new InferrerCountry(), // `InferrerCountry` depends on `InferrerEmby` & `InferrerInfo`\n ];\n }\n this.inferrers = inferrers;\n }\n\n public override async infer<T extends Outbound>(outbound: T): Promise<T> {\n for (const inferrer of this.inferrers)\n outbound = await inferrer.infer(outbound);\n return outbound;\n }\n\n public override async inferBulk<T extends Outbound>(\n outbounds: T[],\n ): Promise<T[]> {\n return await Promise.all(\n outbounds.map((outbound: T): Promise<T> => this.infer(outbound)),\n );\n }\n}\n",
25
+ "import fs from \"node:fs/promises\";\nimport YAML from \"yaml\";\nimport type { MihomoOutbound } from \"../formats\";\nimport { Provider } from \"./provider\";\nimport type { ProfileModel, ProviderOptions } from \"./schema\";\nimport { PROFILE_SCHEMA } from \"./schema\";\n\nexport class Profile {\n public providers: Provider[];\n\n static async load(file: string): Promise<Profile> {\n const data: string = await fs.readFile(file, \"utf8\");\n const parsed: any = YAML.parse(data);\n const profile: ProfileModel = PROFILE_SCHEMA.parse(parsed);\n return new Profile(profile.providers);\n }\n\n constructor(providers: readonly ProviderOptions[]) {\n this.providers = providers.map(\n (options: ProviderOptions): Provider => new Provider(options),\n );\n }\n\n async fetchMihomoOutbounds(): Promise<MihomoOutbound[]> {\n const outbounds = await Promise.all(\n this.providers.map((provider) => provider.fetchOutboundsMihomo()),\n );\n return outbounds.flat();\n }\n}\n",
23
26
  "import consola from \"consola\";\nimport ky from \"ky\";\nimport type { Mihomo, MihomoNode } from \"../formats\";\nimport { MihomoOutbound, mihomoParse } from \"../formats\";\nimport { PROVIDER_SCHEMA, type ProviderOptions } from \"./schema\";\nimport { subconvertUrl } from \"./subconvert\";\n\nexport class Provider {\n public readonly name: string;\n public readonly jms?: { url: string };\n public readonly mihomo?: { url: string };\n\n public constructor(options: ProviderOptions) {\n const { name, jms, mihomo } = PROVIDER_SCHEMA.parse(options);\n this.name = name;\n this.jms = jms;\n this.mihomo = mihomo;\n }\n\n public async fetchOutboundsMihomo(): Promise<MihomoOutbound[]> {\n const url: string | URL | undefined = this.getMihomoURL();\n if (!url) return [];\n const headers = new Headers({ \"User-Agent\": \"clash.meta\" });\n const text: string = await ky.get(url, { headers }).text();\n const config: Mihomo = mihomoParse(text);\n return config.proxies!.map(\n (proxy: MihomoNode): MihomoOutbound => new MihomoOutbound(proxy, this),\n );\n }\n\n protected warnFormat(format: string): void {\n consola.warn(`Provider '${this.name}' does not support '${format}'`);\n }\n\n protected getMihomoURL(): string | URL | undefined {\n if (this.mihomo) return this.mihomo.url;\n if (this.jms) return subconvertUrl(this.jms.url, \"clash\");\n this.warnFormat(\"mihomo\");\n return undefined;\n }\n}\n",
24
27
  "import { z } from \"zod\";\n\nexport const PROVIDER_SCHEMA = z.object({\n name: z.string(),\n free: z.boolean().default(false),\n jms: z.object({ url: z.url() }).optional(),\n mihomo: z.object({ url: z.url() }).optional(),\n});\nexport type ProviderOptions = z.input<typeof PROVIDER_SCHEMA>;\n\nexport const PROFILE_SCHEMA = z.object({\n providers: z.array(PROVIDER_SCHEMA),\n});\nexport type ProfileModel = z.infer<typeof PROFILE_SCHEMA>;\n",
25
28
  "import ky from \"ky\";\n\nconst BACKEND: string = process.env.SUBCONVERTER_URL || \"https://url.v1.mk/sub\";\n\nexport function subconvertUrl(url: string, target: string): URL {\n const req = new URL(BACKEND);\n req.searchParams.set(\"url\", url);\n req.searchParams.set(\"target\", target);\n req.searchParams.set(\"list\", \"true\");\n return req;\n}\n\nexport async function subconvert(url: string, target: string): Promise<string> {\n const req: URL = subconvertUrl(url, target);\n return await ky.get(req).text();\n}\n",
26
29
  "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { StricliAutoCompleteContext } from \"@stricli/auto-complete\";\nimport type { CommandContext } from \"@stricli/core\";\n\nexport interface Context extends CommandContext, StricliAutoCompleteContext {\n readonly process: NodeJS.Process;\n}\n\nexport const context: Context = { process, os, fs, path };\n"
27
30
  ],
28
- "mappings": "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",
29
- "debugId": "04FBB758DC99131364756E2164756E21",
31
+ "mappings": "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",
32
+ "debugId": "88F705403D4840DA64756E2164756E21",
30
33
  "names": []
31
34
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@liblaf/sub-store",
3
3
  "description": "TODO",
4
- "version": "0.1.3",
4
+ "version": "0.1.4",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"
@@ -46,6 +46,7 @@
46
46
  "@stricli/core": "^1",
47
47
  "@twemoji/api": "^16",
48
48
  "consola": "^3",
49
+ "dataloader": "^2",
49
50
  "ky": "^1",
50
51
  "remeda": "^2",
51
52
  "world-countries": "^5",