Feat: use Cisco Top 1M Domain for validation

This commit is contained in:
SukkaW 2025-04-30 18:40:49 +08:00
parent c2cc6d72ac
commit 07725d6c00
3 changed files with 312 additions and 19 deletions

View File

@ -1,18 +1,21 @@
import { processLine } from './lib/process-line';
import { fastNormalizeDomain } from './lib/normalize-domain';
import { HostnameSmolTrie } from './lib/trie';
// import { Readable } from 'stream';
import { parse } from 'csv-parse/sync';
import yauzl from 'yauzl-promise';
import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
import path from 'node:path';
import { OUTPUT_SURGE_DIR } from './constants/dir';
import { createRetrieKeywordFilter as createKeywordFilter } from 'foxts/retrie';
import { $$fetch } from './lib/fetch-retry';
import runAgainstSourceFile from './lib/run-against-source-file';
import { nullthrow } from 'foxts/guard';
import { Buffer } from 'node:buffer';
export async function parseGfwList() {
const { parse: csvParser } = await import('csv-parse');
const whiteSet = new Set<string>();
const trie = new HostnameSmolTrie();
const gfwListTrie = new HostnameSmolTrie();
const excludeGfwList = createKeywordFilter([
'.*',
@ -44,42 +47,71 @@ export async function parseGfwList() {
continue;
}
if (line.startsWith('||')) {
trie.add('.' + line.slice(2));
gfwListTrie.add('.' + line.slice(2));
continue;
}
if (line.startsWith('|')) {
trie.add(line.slice(1));
gfwListTrie.add(line.slice(1));
continue;
}
if (line.startsWith('.')) {
trie.add(line);
gfwListTrie.add(line);
continue;
}
const d = fastNormalizeDomain(line);
if (d) {
trie.add(d);
gfwListTrie.add(d);
continue;
}
}
for await (const l of await fetchRemoteTextByLine('https://raw.githubusercontent.com/Loyalsoldier/cn-blocked-domain/release/domains.txt', true)) {
trie.add(l);
gfwListTrie.add(l);
}
for await (const l of await fetchRemoteTextByLine('https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt', true)) {
trie.add(l);
gfwListTrie.add(l);
}
const topDomainsRes = await (await $$fetch('https://downloads.majestic.com/majestic_million.csv', {
const topDomainTrie = new HostnameSmolTrie();
const csvParse = csvParser({ columns: false, skip_empty_lines: true });
const topDomainsZipBody = await (await $$fetch('https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m.csv.zip', {
headers: {
accept: '*/*',
'user-agent': 'curl/8.12.1'
}
})).text();
const topDomains = parse(topDomainsRes);
})).arrayBuffer();
let entry: yauzl.Entry | null = null;
for await (const e of await yauzl.fromBuffer(Buffer.from(topDomainsZipBody))) {
if (e.filename === 'top-1m.csv') {
entry = e;
break;
}
}
const { promise, resolve, reject } = Promise.withResolvers<HostnameSmolTrie>();
const readable = await nullthrow(entry, 'top-1m.csv entry not found').openReadStream();
const parser = readable.pipe(csvParse);
parser.on('readable', () => {
let record;
while ((record = parser.read()) !== null) {
topDomainTrie.add(record[1]);
}
});
parser.on('end', () => {
resolve(topDomainTrie);
});
parser.on('error', (err) => {
reject(err);
});
await promise;
const keywordSet = new Set<string>();
const callback = (domain: string, includeAllSubdomain: boolean) => {
trie.whitelist(domain, includeAllSubdomain);
gfwListTrie.whitelist(domain, includeAllSubdomain);
};
await Promise.all([
@ -94,24 +126,24 @@ export async function parseGfwList() {
runAgainstSourceFile(path.resolve(OUTPUT_SURGE_DIR, 'domainset/cdn.conf'), callback, 'domainset')
]);
whiteSet.forEach(domain => trie.whitelist(domain));
whiteSet.forEach(domain => gfwListTrie.whitelist(domain));
const kwfilter = createKeywordFilter([...keywordSet]);
const missingTop10000Gfwed = new Set<string>();
for await (const [domain] of topDomains) {
if (trie.has(domain) && !kwfilter(domain)) {
topDomainTrie.dump((domain) => {
if (gfwListTrie.has(domain) && !kwfilter(domain)) {
missingTop10000Gfwed.add(domain);
}
}
});
console.log(missingTop10000Gfwed.size, '');
console.log(Array.from(missingTop10000Gfwed).join('\n'));
return [
whiteSet,
trie,
gfwListTrie,
missingTop10000Gfwed
] as const;
}

View File

@ -45,7 +45,8 @@
"why-is-node-running": "^3.2.2",
"worktank": "^2.7.3",
"xbits": "^0.2.0",
"yaml": "^2.7.1"
"yaml": "^2.7.1",
"yauzl-promise": "^4.0.0"
},
"devDependencies": {
"@eslint-sukka/node": "^6.18.2",
@ -59,6 +60,7 @@
"@types/node": "^22.15.2",
"@types/punycode": "^2.1.4",
"@types/tar-fs": "^2.0.4",
"@types/yauzl-promise": "^4.0.1",
"eslint": "^9.25.1",
"eslint-config-sukka": "^6.18.2",
"eslint-formatter-sukka": "^6.18.2",

259
pnpm-lock.yaml generated
View File

@ -94,6 +94,9 @@ importers:
yaml:
specifier: ^2.7.1
version: 2.7.1
yauzl-promise:
specifier: ^4.0.0
version: 4.0.0
devDependencies:
'@eslint-sukka/node':
specifier: ^6.18.2
@ -128,6 +131,9 @@ importers:
'@types/tar-fs':
specifier: ^2.0.4
version: 2.0.4
'@types/yauzl-promise':
specifier: ^4.0.1
version: 4.0.1
eslint:
specifier: ^9.25.1
version: 9.25.1
@ -163,6 +169,10 @@ packages:
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
'@babel/runtime@7.27.0':
resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
engines: {node: '>=6.9.0'}
'@dual-bundle/import-meta-resolve@4.1.0':
resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==}
@ -292,6 +302,93 @@ packages:
'@napi-rs/wasm-runtime@0.2.8':
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
'@node-rs/crc32-android-arm-eabi@1.10.6':
resolution: {integrity: sha512-vZAMuJXm3TpWPOkkhxdrofWDv+Q+I2oO7ucLRbXyAPmXFNDhHtBxbO1rk9Qzz+M3eep8ieS4/+jCL1Q0zacNMQ==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
'@node-rs/crc32-android-arm64@1.10.6':
resolution: {integrity: sha512-Vl/JbjCinCw/H9gEpZveWCMjxjcEChDcDBM8S4hKay5yyoRCUHJPuKr4sjVDBeOm+1nwU3oOm6Ca8dyblwp4/w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
'@node-rs/crc32-darwin-arm64@1.10.6':
resolution: {integrity: sha512-kARYANp5GnmsQiViA5Qu74weYQ3phOHSYQf0G+U5wB3NB5JmBHnZcOc46Ig21tTypWtdv7u63TaltJQE41noyg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@node-rs/crc32-darwin-x64@1.10.6':
resolution: {integrity: sha512-Q99bevJVMfLTISpkpKBlXgtPUItrvTWKFyiqoKH5IvscZmLV++NH4V13Pa17GTBmv9n18OwzgQY4/SRq6PQNVA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@node-rs/crc32-freebsd-x64@1.10.6':
resolution: {integrity: sha512-66hpawbNjrgnS9EDMErta/lpaqOMrL6a6ee+nlI2viduVOmRZWm9Rg9XdGTK/+c4bQLdtC6jOd+Kp4EyGRYkAg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
'@node-rs/crc32-linux-arm-gnueabihf@1.10.6':
resolution: {integrity: sha512-E8Z0WChH7X6ankbVm8J/Yym19Cq3otx6l4NFPS6JW/cWdjv7iw+Sps2huSug+TBprjbcEA+s4TvEwfDI1KScjg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@node-rs/crc32-linux-arm64-gnu@1.10.6':
resolution: {integrity: sha512-LmWcfDbqAvypX0bQjQVPmQGazh4dLiVklkgHxpV4P0TcQ1DT86H/SWpMBMs/ncF8DGuCQ05cNyMv1iddUDugoQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@node-rs/crc32-linux-arm64-musl@1.10.6':
resolution: {integrity: sha512-k8ra/bmg0hwRrIEE8JL1p32WfaN9gDlUUpQRWsbxd1WhjqvXea7kKO6K4DwVxyxlPhBS9Gkb5Urq7Y4mXANzaw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@node-rs/crc32-linux-x64-gnu@1.10.6':
resolution: {integrity: sha512-IfjtqcuFK7JrSZ9mlAFhb83xgium30PguvRjIMI45C3FJwu18bnLk1oR619IYb/zetQT82MObgmqfKOtgemEKw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@node-rs/crc32-linux-x64-musl@1.10.6':
resolution: {integrity: sha512-LbFYsA5M9pNunOweSt6uhxenYQF94v3bHDAQRPTQ3rnjn+mK6IC7YTAYoBjvoJP8lVzcvk9hRj8wp4Jyh6Y80g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@node-rs/crc32-wasm32-wasi@1.10.6':
resolution: {integrity: sha512-KaejdLgHMPsRaxnM+OG9L9XdWL2TabNx80HLdsCOoX9BVhEkfh39OeahBo8lBmidylKbLGMQoGfIKDjq0YMStw==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
'@node-rs/crc32-win32-arm64-msvc@1.10.6':
resolution: {integrity: sha512-x50AXiSxn5Ccn+dCjLf1T7ZpdBiV1Sp5aC+H2ijhJO4alwznvXgWbopPRVhbp2nj0i+Gb6kkDUEyU+508KAdGQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@node-rs/crc32-win32-ia32-msvc@1.10.6':
resolution: {integrity: sha512-DpDxQLaErJF9l36aghe1Mx+cOnYLKYo6qVPqPL9ukJ5rAGLtCdU0C+Zoi3gs9ySm8zmbFgazq/LvmsZYU42aBw==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
'@node-rs/crc32-win32-x64-msvc@1.10.6':
resolution: {integrity: sha512-5B1vXosIIBw1m2Rcnw62IIfH7W9s9f7H7Ma0rRuhT8HR4Xh8QCgw6NJSI2S2MCngsGktYnAhyUvs81b7efTyQw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@node-rs/crc32@1.10.6':
resolution: {integrity: sha512-+llXfqt+UzgoDzT9of5vPQPGqTAVCohU74I9zIBkNo5TH6s2P31DFJOGsJQKN207f0GHnYv5pV3wh3BCY/un/A==}
engines: {node: '>= 10'}
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -542,6 +639,9 @@ packages:
'@types/yargs@17.0.33':
resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
'@types/yauzl-promise@4.0.1':
resolution: {integrity: sha512-qYEC3rJwqiJpdQ9b+bPNeuSY0c3JUM8vIuDy08qfuVN7xHm3ZDsHn2kGphUIB0ruEXrPGNXZ64nMUcu4fDjViQ==}
'@typescript-eslint/eslint-plugin@8.29.1':
resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -899,6 +999,14 @@ packages:
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
@ -937,6 +1045,14 @@ packages:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
engines: {node: '>=10.13.0'}
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
@ -1230,6 +1346,14 @@ packages:
resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
engines: {node: '>=18'}
globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@ -1244,6 +1368,9 @@ packages:
resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==}
engines: {node: '>=8'}
has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
hash-wasm@4.12.0:
resolution: {integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==}
@ -1299,6 +1426,10 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
is-it-type@5.1.2:
resolution: {integrity: sha512-q/gOZQTNYABAxaXWnBKZjTFH4yACvWEFtgVOj+LbgxYIgAJG1xVmUZOsECSrZPIemYUQvaQWVilSFVbh4Eyt8A==}
engines: {node: '>=12'}
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@ -1443,6 +1574,10 @@ packages:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@ -1546,6 +1681,9 @@ packages:
resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
regexp-ast-analysis@0.7.1:
resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@ -1614,6 +1752,10 @@ packages:
simple-get@4.0.1:
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
simple-invariant@2.0.1:
resolution: {integrity: sha512-1sbhsxqI+I2tqlmjbz99GXNmZtr6tKIyEgGGnJw/MKGblalqk/XoOYYFJlBzTKZCxx8kLaD3FD5s9BEEjx5Pyg==}
engines: {node: '>=10'}
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
@ -1834,6 +1976,10 @@ packages:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
yauzl-promise@4.0.0:
resolution: {integrity: sha512-/HCXpyHXJQQHvFq9noqrjfa/WpQC2XYs3vI7tBiAi4QiIU1knvYhZGaO1QPjwIVMdqflxbmwgMXtYeaRiAE0CA==}
engines: {node: '>=16'}
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
@ -1848,6 +1994,10 @@ snapshots:
'@babel/helper-validator-identifier@7.25.9': {}
'@babel/runtime@7.27.0':
dependencies:
regenerator-runtime: 0.14.1
'@dual-bundle/import-meta-resolve@4.1.0': {}
'@emnapi/core@1.3.1':
@ -2021,6 +2171,67 @@ snapshots:
'@tybys/wasm-util': 0.9.0
optional: true
'@node-rs/crc32-android-arm-eabi@1.10.6':
optional: true
'@node-rs/crc32-android-arm64@1.10.6':
optional: true
'@node-rs/crc32-darwin-arm64@1.10.6':
optional: true
'@node-rs/crc32-darwin-x64@1.10.6':
optional: true
'@node-rs/crc32-freebsd-x64@1.10.6':
optional: true
'@node-rs/crc32-linux-arm-gnueabihf@1.10.6':
optional: true
'@node-rs/crc32-linux-arm64-gnu@1.10.6':
optional: true
'@node-rs/crc32-linux-arm64-musl@1.10.6':
optional: true
'@node-rs/crc32-linux-x64-gnu@1.10.6':
optional: true
'@node-rs/crc32-linux-x64-musl@1.10.6':
optional: true
'@node-rs/crc32-wasm32-wasi@1.10.6':
dependencies:
'@napi-rs/wasm-runtime': 0.2.8
optional: true
'@node-rs/crc32-win32-arm64-msvc@1.10.6':
optional: true
'@node-rs/crc32-win32-ia32-msvc@1.10.6':
optional: true
'@node-rs/crc32-win32-x64-msvc@1.10.6':
optional: true
'@node-rs/crc32@1.10.6':
optionalDependencies:
'@node-rs/crc32-android-arm-eabi': 1.10.6
'@node-rs/crc32-android-arm64': 1.10.6
'@node-rs/crc32-darwin-arm64': 1.10.6
'@node-rs/crc32-darwin-x64': 1.10.6
'@node-rs/crc32-freebsd-x64': 1.10.6
'@node-rs/crc32-linux-arm-gnueabihf': 1.10.6
'@node-rs/crc32-linux-arm64-gnu': 1.10.6
'@node-rs/crc32-linux-arm64-musl': 1.10.6
'@node-rs/crc32-linux-x64-gnu': 1.10.6
'@node-rs/crc32-linux-x64-musl': 1.10.6
'@node-rs/crc32-wasm32-wasi': 1.10.6
'@node-rs/crc32-win32-arm64-msvc': 1.10.6
'@node-rs/crc32-win32-ia32-msvc': 1.10.6
'@node-rs/crc32-win32-x64-msvc': 1.10.6
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@ -2233,6 +2444,10 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
'@types/yauzl-promise@4.0.1':
dependencies:
'@types/node': 22.15.2
'@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)':
dependencies:
'@eslint-community/regexpp': 4.12.1
@ -2589,6 +2804,18 @@ snapshots:
deep-is@0.1.4: {}
define-data-property@1.1.4:
dependencies:
es-define-property: 1.0.1
es-errors: 1.3.0
gopd: 1.2.0
define-properties@1.2.1:
dependencies:
define-data-property: 1.1.4
has-property-descriptors: 1.0.2
object-keys: 1.1.1
defu@6.1.4: {}
detect-libc@2.0.3: {}
@ -2618,6 +2845,10 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.2.1
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
escalade@3.2.0: {}
escape-string-regexp@2.0.0: {}
@ -2981,6 +3212,13 @@ snapshots:
globals@15.14.0: {}
globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
gopd: 1.2.0
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
graphemer@1.4.0: {}
@ -2989,6 +3227,10 @@ snapshots:
has-own-prop@2.0.0: {}
has-property-descriptors@1.0.2:
dependencies:
es-define-property: 1.0.1
hash-wasm@4.12.0: {}
hasown@2.0.2:
@ -3032,6 +3274,11 @@ snapshots:
dependencies:
is-extglob: 2.1.1
is-it-type@5.1.2:
dependencies:
'@babel/runtime': 7.27.0
globalthis: 1.0.4
is-number@7.0.0: {}
is-plain-obj@2.1.0: {}
@ -3192,6 +3439,8 @@ snapshots:
normalize-path@3.0.0: {}
object-keys@1.1.1: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
@ -3313,6 +3562,8 @@ snapshots:
dependencies:
'@eslint-community/regexpp': 4.12.1
regenerator-runtime@0.14.1: {}
regexp-ast-analysis@0.7.1:
dependencies:
'@eslint-community/regexpp': 4.12.1
@ -3370,6 +3621,8 @@ snapshots:
once: 1.4.0
simple-concat: 1.0.1
simple-invariant@2.0.1: {}
slash@3.0.0: {}
source-map-support@0.5.21:
@ -3614,4 +3867,10 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
yauzl-promise@4.0.0:
dependencies:
'@node-rs/crc32': 1.10.6
is-it-type: 5.1.2
simple-invariant: 2.0.1
yocto-queue@0.1.0: {}