diff --git a/.husky/pre-commit b/.husky/pre-commit index b4da9a05779d..372362317175 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -yarn format +yarn lint-staged diff --git a/docs/yarn.lock b/docs/yarn.lock index a0726729186d..e45e906f9190 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -261,11 +261,11 @@ __metadata: linkType: hard "minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" + version: 3.1.3 + resolution: "minimatch@npm:3.1.3" dependencies: brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + checksum: 10c0/c1ffce4be47e88df013f66f55176c25a93fdd8ad15735309cf1782f0433a02f363cee298f8763ceaaaf85e70ff7f30dc84a1a8d00a6fb6ca72032e5b51f9b89c languageName: node linkType: hard diff --git a/package.json b/package.json index 3f98325c94cd..d0144cb5b2eb 100644 --- a/package.json +++ b/package.json @@ -115,6 +115,9 @@ "typescript-eslint": "^8.28.0", "vitest": "^4.0.16" }, + "lint-staged": { + "**/*.{js,ts,mjs,mts,cjs,cts,json,css}": "biome format --write --no-errors-on-unmatched" + }, "packageManager": "yarn@4.10.3", "volta": { "node": "24.13.0", diff --git a/packages/utils/src/internals/sitemap.ts b/packages/utils/src/internals/sitemap.ts index 522ef709ea05..757abdb4c9a5 100644 --- a/packages/utils/src/internals/sitemap.ts +++ b/packages/utils/src/internals/sitemap.ts @@ -459,6 +459,8 @@ export async function* discoverValidSitemaps( const { proxyUrl } = options; const { gotScraping } = await import('got-scraping'); const sitemapUrls = new Set(); + // Keep each probe bounded so discovery cannot stall indefinitely on a single request. + const DISCOVERY_REQUEST_TIMEOUT_MILLIS = 20_000; const addSitemapUrl = (url: string): string | undefined => { const sizeBefore = sitemapUrls.size; @@ -472,12 +474,37 @@ export async function* discoverValidSitemaps( return undefined; }; - const urlExists = (url: string) => - gotScraping({ - proxyUrl, + const runWithTimeout = async ( + promise: Promise, + timeoutMillis: number, + timeoutMessage: string, + ): Promise => { + let timeout: ReturnType | undefined; + const timeoutPromise = new Promise((_, reject) => { + timeout = setTimeout(() => reject(new Error(timeoutMessage)), timeoutMillis); + }); + + try { + return await Promise.race([promise, timeoutPromise]); + } finally { + if (timeout !== undefined) { + clearTimeout(timeout); + } + } + }; + + const urlExists = async (url: string) => { + const response = await gotScraping({ url, method: 'HEAD', - }).then((response) => response.statusCode >= 200 && response.statusCode < 400); + proxyUrl, + timeout: { + request: DISCOVERY_REQUEST_TIMEOUT_MILLIS, + }, + }); + + return response.statusCode >= 200 && response.statusCode < 400; + }; const discoverSitemapsForDomainUrls = async function* (hostname: string, domainUrls: string[]) { if (!hostname) { @@ -485,8 +512,11 @@ export async function* discoverValidSitemaps( } try { - const robotsFile = await RobotsFile.find(domainUrls[0], proxyUrl); - + const robotsFile = await runWithTimeout( + RobotsFile.find(domainUrls[0], proxyUrl), + DISCOVERY_REQUEST_TIMEOUT_MILLIS, + `Fetching robots.txt timed out for ${hostname}`, + ); for (const sitemapUrl of robotsFile.getSitemaps()) { if (addSitemapUrl(sitemapUrl)) { yield sitemapUrl; @@ -507,10 +537,18 @@ export async function* discoverValidSitemaps( const possibleSitemapPathnames = ['/sitemap.xml', '/sitemap.txt', '/sitemap_index.xml']; for (const pathname of possibleSitemapPathnames) { firstUrl.pathname = pathname; - if (await urlExists(firstUrl.toString())) { - if (addSitemapUrl(firstUrl.toString())) { - yield firstUrl.toString(); + const candidateSitemapUrl = firstUrl.toString(); + + try { + if (await urlExists(candidateSitemapUrl)) { + if (addSitemapUrl(candidateSitemapUrl)) { + yield candidateSitemapUrl; + } } + } catch (err) { + log.debug(`Failed to check sitemap candidate ${candidateSitemapUrl} for ${hostname}`, { + error: err, + }); } } } diff --git a/website/yarn.lock b/website/yarn.lock index 696a4661e806..11bfb118563a 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -5897,14 +5897,14 @@ __metadata: linkType: hard "ajv@npm:^6.12.4, ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" + version: 6.14.0 + resolution: "ajv@npm:6.14.0" dependencies: fast-deep-equal: "npm:^3.1.1" fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + checksum: 10c0/a2bc39b0555dc9802c899f86990eb8eed6e366cddbf65be43d5aa7e4f3c4e1a199d5460fd7ca4fb3d864000dbbc049253b72faa83b3b30e641ca52cb29a68c22 languageName: node linkType: hard @@ -6405,9 +6405,9 @@ __metadata: linkType: hard "bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": - version: 4.12.2 - resolution: "bn.js@npm:4.12.2" - checksum: 10c0/09a249faa416a9a1ce68b5f5ec8bbca87fe54e5dd4ef8b1cc8a4969147b80035592bddcb1e9cc814c3ba79e573503d5c5178664b722b509fb36d93620dba9b57 + version: 4.12.3 + resolution: "bn.js@npm:4.12.3" + checksum: 10c0/53b6a4db8a583abd2522eacd480fece26fe6c4d8d35d03e5e11e15cb0873a3044eb4e3d1f9fef56f47eb008219e99ba5b620c26f57db49a687c6ab2cf848d50b languageName: node linkType: hard @@ -12183,8 +12183,8 @@ __metadata: linkType: hard "markdown-it@npm:^14.1.0": - version: 14.1.0 - resolution: "markdown-it@npm:14.1.0" + version: 14.1.1 + resolution: "markdown-it@npm:14.1.1" dependencies: argparse: "npm:^2.0.1" entities: "npm:^4.4.0" @@ -12194,7 +12194,7 @@ __metadata: uc.micro: "npm:^2.1.0" bin: markdown-it: bin/markdown-it.mjs - checksum: 10c0/9a6bb444181d2db7016a4173ae56a95a62c84d4cbfb6916a399b11d3e6581bf1cc2e4e1d07a2f022ae72c25f56db90fbe1e529fca16fbf9541659dc53480d4b4 + checksum: 10c0/c67f2a4c8069a307c78d8c15104bbcb15a2c6b17f4c904364ca218ec2eccf76a397eba1ea05f5ac5de72c4b67fcf115d422d22df0bfb86a09b663f55b9478d4f languageName: node linkType: hard @@ -17117,15 +17117,15 @@ __metadata: linkType: hard "tar@npm:^7.5.2": - version: 7.5.7 - resolution: "tar@npm:7.5.7" + version: 7.5.9 + resolution: "tar@npm:7.5.9" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/51f261afc437e1112c3e7919478d6176ea83f7f7727864d8c2cce10f0b03a631d1911644a567348c3063c45abdae39718ba97abb073d22aa3538b9a53ae1e31c + checksum: 10c0/e870beb1b2477135ca2abe86b2d18f7b35d0a4e3a37bbc523d3b8f7adca268dfab543f26528a431d569897f8c53a7cac745cdfbc4411c2f89aeeacc652b81b0a languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 8d8728b416a1..b8f03d28443e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2747,156 +2747,177 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.53.2" +"@rollup/rollup-android-arm-eabi@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.59.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-android-arm64@npm:4.53.2" +"@rollup/rollup-android-arm64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-android-arm64@npm:4.59.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.53.2" +"@rollup/rollup-darwin-arm64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.59.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.53.2" +"@rollup/rollup-darwin-x64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.59.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.53.2" +"@rollup/rollup-freebsd-arm64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.59.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-freebsd-x64@npm:4.53.2" +"@rollup/rollup-freebsd-x64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.59.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.59.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.53.2" +"@rollup/rollup-linux-arm-musleabihf@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.59.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.53.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.59.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.53.2" +"@rollup/rollup-linux-arm64-musl@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.59.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loong64-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.53.2" +"@rollup/rollup-linux-loong64-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.59.0" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.53.2" +"@rollup/rollup-linux-loong64-musl@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.59.0" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.59.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.53.2" +"@rollup/rollup-linux-ppc64-musl@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.59.0" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.59.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.53.2" +"@rollup/rollup-linux-riscv64-musl@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.59.0" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.53.2" +"@rollup/rollup-linux-s390x-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.59.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.53.2" +"@rollup/rollup-linux-x64-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.59.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.53.2" +"@rollup/rollup-linux-x64-musl@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.59.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-openharmony-arm64@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.53.2" +"@rollup/rollup-openbsd-x64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-openbsd-x64@npm:4.59.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.59.0" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.53.2" +"@rollup/rollup-win32-arm64-msvc@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.59.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.53.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.59.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-gnu@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.53.2" +"@rollup/rollup-win32-x64-gnu@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.59.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.53.2": - version: 4.53.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.53.2" +"@rollup/rollup-win32-x64-msvc@npm:4.59.0": + version: 4.59.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.59.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4565,9 +4586,9 @@ __metadata: linkType: hard "basic-ftp@npm:^5.0.2": - version: 5.0.5 - resolution: "basic-ftp@npm:5.0.5" - checksum: 10c0/be983a3997749856da87b839ffce6b8ed6c7dbf91ea991d5c980d8add275f9f2926c19f80217ac3e7f353815be879371d636407ca72b038cea8cab30e53928a6 + version: 5.2.0 + resolution: "basic-ftp@npm:5.2.0" + checksum: 10c0/a0f85c01deae0723021f9bf4a7be29378186fa8bba41e74ea11832fe74c187ce90c3599c3cc5ec936581cfd150020e79f4a9ed0ee9fb20b2308e69b045f3a059 languageName: node linkType: hard @@ -12856,31 +12877,34 @@ __metadata: linkType: hard "rollup@npm:^4.43.0": - version: 4.53.2 - resolution: "rollup@npm:4.53.2" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.53.2" - "@rollup/rollup-android-arm64": "npm:4.53.2" - "@rollup/rollup-darwin-arm64": "npm:4.53.2" - "@rollup/rollup-darwin-x64": "npm:4.53.2" - "@rollup/rollup-freebsd-arm64": "npm:4.53.2" - "@rollup/rollup-freebsd-x64": "npm:4.53.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.53.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.53.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.53.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.53.2" - "@rollup/rollup-linux-loong64-gnu": "npm:4.53.2" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.53.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.53.2" - "@rollup/rollup-linux-riscv64-musl": "npm:4.53.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.53.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.53.2" - "@rollup/rollup-linux-x64-musl": "npm:4.53.2" - "@rollup/rollup-openharmony-arm64": "npm:4.53.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.53.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.53.2" - "@rollup/rollup-win32-x64-gnu": "npm:4.53.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.53.2" + version: 4.59.0 + resolution: "rollup@npm:4.59.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.59.0" + "@rollup/rollup-android-arm64": "npm:4.59.0" + "@rollup/rollup-darwin-arm64": "npm:4.59.0" + "@rollup/rollup-darwin-x64": "npm:4.59.0" + "@rollup/rollup-freebsd-arm64": "npm:4.59.0" + "@rollup/rollup-freebsd-x64": "npm:4.59.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.59.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.59.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.59.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.59.0" + "@rollup/rollup-linux-loong64-gnu": "npm:4.59.0" + "@rollup/rollup-linux-loong64-musl": "npm:4.59.0" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.59.0" + "@rollup/rollup-linux-ppc64-musl": "npm:4.59.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.59.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.59.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.59.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.59.0" + "@rollup/rollup-linux-x64-musl": "npm:4.59.0" + "@rollup/rollup-openbsd-x64": "npm:4.59.0" + "@rollup/rollup-openharmony-arm64": "npm:4.59.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.59.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.59.0" + "@rollup/rollup-win32-x64-gnu": "npm:4.59.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.59.0" "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -12906,8 +12930,12 @@ __metadata: optional: true "@rollup/rollup-linux-loong64-gnu": optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true "@rollup/rollup-linux-ppc64-gnu": optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true "@rollup/rollup-linux-riscv64-musl": @@ -12918,6 +12946,8 @@ __metadata: optional: true "@rollup/rollup-linux-x64-musl": optional: true + "@rollup/rollup-openbsd-x64": + optional: true "@rollup/rollup-openharmony-arm64": optional: true "@rollup/rollup-win32-arm64-msvc": @@ -12932,7 +12962,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/427216da71c1ce7fefb0bef75f94c301afd858ac27e35898e098c2da5977325fa54c2edda867caf9675c8abfa8d8d94efa99c482fa04f5cd91f3a740112d4f4f + checksum: 10c0/f38742da34cfee5e899302615fa157aa77cb6a2a1495e5e3ce4cc9c540d3262e235bbe60caa31562bbfe492b01fdb3e7a8c43c39d842d3293bcf843123b766fc languageName: node linkType: hard