caa 10.0.0 → 10.0.2

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/index.d.ts CHANGED
@@ -15,3 +15,4 @@ type CaaRecord = {
15
15
  export declare function caa(name: string, opts?: CaaOpts): Promise<CaaRecord[]>;
16
16
  export declare function caaMatches(name: string, ca: string, opts?: CaaOpts): Promise<boolean>;
17
17
  export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAKA,KAAK,OAAO,GAAG;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB,CAAC;AAwCF,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAmEF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA0BhF;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB/F"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { getServers } from "node:dns";
2
2
  import { promisify } from "node:util";
3
3
  import dnsSocket from "dns-socket";
4
- import tlds from "tlds";
4
+ const tlds = /* @__PURE__ */ JSON.parse('["aaa","aarp","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","ads","adult","ae","aeg","aero","aetna","af","afl","africa","ag","agakhan","agency","ai","aig","airbus","airforce","airtel","akdn","al","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","amazon","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","cash","casino","cat","catering","catholic","cba","cbn","cbre","cc","cd","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cool","coop","corsica","country","coupon","coupons","courses","cpa","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","et","eu","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontier","ftr","fujitsu","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","jaguar","java","jcb","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerryproperties","kfh","kg","kh","ki","kia","kids","kim","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","lamborghini","lamer","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","link","live","living","lk","llc","llp","loan","loans","locker","locus","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","luxe","luxury","lv","ly","ma","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","music","mv","mw","mx","my","mz","na","nab","nagoya","name","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","office","okinawa","olayan","olayangroup","ollo","om","omega","one","ong","onl","online","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","racing","radio","re","read","realestate","realtor","realty","recipes","red","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","ril","rio","rip","ro","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scot","sd","se","search","seat","secure","security","seek","select","sener","services","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shell","shia","shiksha","shoes","shop","shopping","shouji","show","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","spa","space","sport","spot","sr","srl","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiss","sx","sy","sydney","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","vermögensberater","vermögensberatung","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","viva","vivo","vlaanderen","vn","vodka","volvo","vote","voting","voto","voyage","vu","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xihuan","xin","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw","ελ","ευ","бг","бел","дети","ею","католик","ком","мкд","мон","москва","онлайн","орг","рус","рф","сайт","срб","укр","қаз","հայ","ישראל","קום","ابوظبي","ارامكو","الاردن","البحرين","الجزائر","السعودية","العليان","المغرب","امارات","ایران","بارت","بازار","بيتك","بھارت","تونس","سودان","سورية","شبكة","عراق","عرب","عمان","فلسطين","قطر","كاثوليك","كوم","مصر","مليسيا","موريتانيا","موقع","همراه","پاکستان","ڀارت","कॉम","नेट","भारत","भारतम्","भारोत","संगठन","বাংলা","ভারত","ভাৰত","ਭਾਰਤ","ભારત","ଭାରତ","இந்தியா","இலங்கை","சிங்கப்பூர்","భారత్","ಭಾರತ","ഭാരതം","ලංකා","คอม","ไทย","ລາວ","გე","みんな","アマゾン","クラウド","グーグル","コム","ストア","セール","ファッション","ポイント","世界","中信","中国","中國","中文网","亚马逊","企业","佛山","信息","健康","八卦","公司","公益","台湾","台灣","商城","商店","商标","嘉里","嘉里大酒店","在线","大拿","天主教","娱乐","家電","广东","微博","慈善","我爱你","手机","招聘","政务","政府","新加坡","新闻","时尚","書籍","机构","淡马锡","游戏","澳門","点看","移动","组织机构","网址","网店","网站","网络","联通","谷歌","购物","通販","集团","電訊盈科","飞利浦","食品","餐厅","香格里拉","香港","닷넷","닷컴","삼성","한국"]');
5
5
  const defaults = {
6
6
  ignoreTLDs: false,
7
7
  recursions: 50,
@@ -13,7 +13,7 @@ const defaults = {
13
13
  };
14
14
  const tldSet = new Set(tlds);
15
15
  const isTLD = (name) => tldSet.has(name);
16
- const isWildcard = (name) => /\*/.test(name);
16
+ const isWildcard = (name) => name.includes("*");
17
17
  const parent = (name) => name.split(".").splice(1).join(".");
18
18
  function selectServer(servers, retries, tries) {
19
19
  return servers[(tries - retries) % servers.length];
@@ -23,54 +23,45 @@ function normalizeName(name = "") {
23
23
  return name.endsWith(".") && name.length > 1 ? name.substring(0, name.length - 1) : name;
24
24
  }
25
25
  const resolve = async ({ name, query, servers, port, recursions, retries, tries, ignoreTLDs }) => {
26
- var _a, _b, _c, _d, _e;
27
26
  name = normalizeName(name);
28
- if (!name)
29
- return [];
30
- if (ignoreTLDs && isTLD(name))
31
- return [];
32
- if (recursions <= 0 || retries <= 0)
33
- return [];
27
+ if (!name) return [];
28
+ if (ignoreTLDs && isTLD(name)) return [];
29
+ if (recursions <= 0 || retries <= 0) return [];
34
30
  name = name.replace(/^\*\./, "");
35
31
  let res;
36
32
  try {
37
33
  res = await query({ questions: [{ name, type: "CAA" }] }, port, selectServer(servers, retries, tries));
38
34
  } catch {
39
- if (retries <= 0)
40
- return [];
35
+ if (retries <= 0) return [];
41
36
  retries -= 1;
42
37
  return await resolve({ name, query, servers, port, recursions, retries, tries, ignoreTLDs });
43
38
  }
44
39
  if (!res || !res.answers && !["NXDOMAIN", "NOERROR"].includes(res.rcode)) {
45
- if (retries <= 0)
46
- return [];
40
+ if (retries <= 0) return [];
47
41
  retries -= 1;
48
42
  return await resolve({ name, query, servers, port, recursions, retries, tries, ignoreTLDs });
49
43
  }
50
44
  const records = {};
51
- if ((_a = res == null ? void 0 : res.answers) == null ? void 0 : _a.length) {
45
+ if (res?.answers?.length) {
52
46
  for (const { name: name2, type, data } of res.answers || {}) {
53
- if (!name2 || !type || !data)
54
- continue;
55
- if (!records[type])
56
- records[type] = [];
47
+ if (!name2 || !type || !data) continue;
48
+ if (!records[type]) records[type] = [];
57
49
  records[type].push({ name: name2, data });
58
50
  }
59
51
  }
60
- if ((_b = records.CAA) == null ? void 0 : _b.length) {
52
+ if (records.CAA?.length) {
61
53
  const caas = records.CAA.filter((record) => record.name === name).map((record) => record.data);
62
- if (caas.length)
63
- return caas;
54
+ if (caas.length) return caas;
64
55
  }
65
56
  let alias;
66
- if ((_c = records.CNAME) == null ? void 0 : _c.length) {
57
+ if (records.CNAME?.length) {
67
58
  const dest = records.CNAME.find((record) => record.name === name);
68
59
  alias = dest.data;
69
- } else if ((_d = records.DNAME) == null ? void 0 : _d.length) {
60
+ } else if (records.DNAME?.length) {
70
61
  const dest = records.DNAME.find((record) => record.name === name);
71
62
  alias = name.replace(dest.name, dest.data);
72
63
  }
73
- if (alias && ((_e = records.CAA) == null ? void 0 : _e.length)) {
64
+ if (alias && records.CAA?.length) {
74
65
  return records.CAA.filter((record) => record.name === alias && record.data).map((record) => record.data);
75
66
  }
76
67
  if (!isTLD(name)) {
@@ -84,7 +75,7 @@ async function caa(name, opts = {}) {
84
75
  name = normalizeName(name);
85
76
  if (!opts.servers) {
86
77
  const systemServers = getServers();
87
- opts.servers = (systemServers == null ? void 0 : systemServers.length) ? systemServers : defaults.servers;
78
+ opts.servers = systemServers?.length ? systemServers : defaults.servers;
88
79
  }
89
80
  opts = { ...defaults, ...opts };
90
81
  const socket = opts.dnsSocket || dnsSocket();
@@ -99,21 +90,18 @@ async function caa(name, opts = {}) {
99
90
  tries: opts.retries,
100
91
  ignoreTLDs: opts.ignoreTLDs
101
92
  });
102
- if (!opts.dnsSocket)
103
- socket.destroy();
93
+ if (!opts.dnsSocket) socket.destroy();
104
94
  return caa2 || [];
105
95
  }
106
96
  async function caaMatches(name, ca, opts = {}) {
107
97
  name = normalizeName(name);
108
98
  ca = normalizeName(ca);
109
99
  const caas = await caa(name, opts);
110
- if (!caas.length)
111
- return true;
112
- const issueNames = caas.filter((caa2) => (caa2 == null ? void 0 : caa2.tag) === "issue").map((name2) => normalizeName(name2.value.split(";")[0].trim()));
113
- const issueWildNames = caas.filter((caa2) => (caa2 == null ? void 0 : caa2.tag) === "issuewild").map((name2) => normalizeName(name2.value.split(";")[0].trim()));
100
+ if (!caas.length) return true;
101
+ const issueNames = caas.filter((caa2) => caa2?.tag === "issue").map((name2) => normalizeName(name2.value.split(";")[0].trim()));
102
+ const issueWildNames = caas.filter((caa2) => caa2?.tag === "issuewild").map((name2) => normalizeName(name2.value.split(";")[0].trim()));
114
103
  const names = isWildcard(name) ? issueWildNames.length ? issueWildNames : issueNames : issueNames;
115
- if (names.includes(";"))
116
- return false;
104
+ if (names.includes(";")) return false;
117
105
  return !names.length || names.includes(ca);
118
106
  }
119
107
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "caa",
3
- "version": "10.0.0",
3
+ "version": "10.0.2",
4
4
  "description": "rfc6844-conform CAA record lookup and validation",
5
5
  "author": "silverwind <me@silverwind.io>",
6
6
  "repository": "silverwind/caa",
@@ -17,20 +17,21 @@
17
17
  "node": ">=18"
18
18
  },
19
19
  "dependencies": {
20
- "dns-socket": "^4.2.2",
21
- "tlds": "^1.252.0"
20
+ "dns-socket": "^4.2.2"
22
21
  },
23
22
  "devDependencies": {
24
- "@types/node": "20.12.12",
25
- "eslint": "8.57.0",
26
- "eslint-config-silverwind": "85.1.3",
27
- "eslint-config-silverwind-typescript": "3.2.5",
28
- "typescript-config-silverwind": "4.3.1",
29
- "updates": "16.1.1",
30
- "versions": "12.0.2",
31
- "vite": "5.2.11",
32
- "vite-plugin-dts": "3.9.1",
33
- "vitest": "1.6.0",
34
- "vitest-config-silverwind": "9.0.6"
23
+ "@types/node": "24.4.0",
24
+ "eslint": "9.35.0",
25
+ "eslint-config-silverwind": "103.0.4",
26
+ "eslint-config-silverwind-typescript": "9.2.2",
27
+ "tlds": "1.260.0",
28
+ "typescript-config-silverwind": "10.0.1",
29
+ "updates": "16.7.2",
30
+ "versions": "13.1.1",
31
+ "vite": "7.1.5",
32
+ "vite-config-silverwind": "5.5.0",
33
+ "vite-plugin-dts": "4.5.4",
34
+ "vitest": "3.2.4",
35
+ "vitest-config-silverwind": "10.2.0"
35
36
  }
36
37
  }