diff --git a/packages/config/maintenance/importConfig.ts b/packages/config/maintenance/importConfig.ts index 0254b228f7ef..ee3e5d2c5052 100644 --- a/packages/config/maintenance/importConfig.ts +++ b/packages/config/maintenance/importConfig.ts @@ -182,56 +182,56 @@ function updateNumberOrDefault( /** Retrieves the list of database IDs from the OpenSmartHouse DB */ async function fetchIDsOH(): Promise { - const { got } = await import("got"); - const data = (await got.get(ohUrlIDs).json()) as any; + const { default: ky } = await import("ky"); + const data = (await ky.get(ohUrlIDs).json()) as any; return data.devices.map((d: any) => d.id); } /** Retrieves the definition for a specific device from the OpenSmartHouse DB */ async function fetchDeviceOH(id: number): Promise { - const { got } = await import("got"); - const source = (await got.get(ohUrlDevice(id)).json()) as any; + const { default: ky } = await import("ky"); + const source = (await ky.get(ohUrlDevice(id)).json()) as any; return stringify(source, "\t"); } /** Retrieves the definition for a specific device from the Z-Wave Alliance DB */ async function fetchDeviceZWA(id: number): Promise { - const { got } = await import("got"); - const source = (await got.get(zwaUrlDevice(id)).json()) as any; + const { default: ky } = await import("ky"); + const source = (await ky.get(zwaUrlDevice(id)).json()) as any; return stringify(source, "\t"); } /** Downloads ozw master archive and store it on `tmpDir` */ async function downloadOZWConfig(): Promise { console.log("downloading ozw archive..."); - const { got } = await import("got"); + const { default: ky } = await import("ky"); // create tmp directory if missing await fs.mkdir(ozwTempDir, { recursive: true }); // this will return a stream in `data` that we pipe into write stream // to store the file in `tmpDir` - const data = got.stream.get(ozwTarUrl); - return new Promise(async (resolve, reject) => { + let fileHandle: fs.FileHandle | undefined; + try { + // Create a stream to write the file const fileDest = path.join(ozwTempDir, ozwTarName); - const handle = await fs.open(fileDest, "w"); - const stream = handle.createWriteStream(); - data.pipe(stream); - let hasError = false; - stream.on("error", (err) => { - hasError = true; - stream.close(); - reject(err); + fileHandle = await fs.open(fileDest, "w"); + const writable = new WritableStream({ + async write(chunk) { + await fileHandle!.write(chunk); + }, }); - stream.on("close", () => { - if (!hasError) { - resolve(fileDest); - console.log("ozw archive stored in temporary directory"); - } - }); - }); + // And pipe the response into the stream + const response = await ky.get(ozwTarUrl); + await response.body?.pipeTo(writable); + + console.log("ozw archive stored in temporary directory"); + return fileDest; + } finally { + await fileHandle?.close(); + } } /** Extract `config` folder from ozw archive in `tmpDir` */ @@ -1701,7 +1701,7 @@ async function retrieveZWADeviceIds( highestDeviceOnly: boolean = true, manufacturer: number[] = [-1], ): Promise { - const { got } = await import("got"); + const { default: ky } = await import("ky"); const deviceIdsSet = new Set(); for (const manu of manufacturer) { @@ -1709,7 +1709,7 @@ async function retrieveZWADeviceIds( // Page 1 let currentUrl = `https://products.z-wavealliance.org/search/DoAdvancedSearch?productName=&productIdentifier=&productDescription=&category=-1&brand=${manu}®ionId=-1&order=&page=${page}`; - const firstPage = await got.get(currentUrl).text(); + const firstPage = await ky.get(currentUrl).text(); for (const i of firstPage.match(/(?<=productId=).*?(?=[\&\"])/g)!) { deviceIdsSet.add(i); } @@ -1730,7 +1730,7 @@ async function retrieveZWADeviceIds( ); currentUrl = `https://products.z-wavealliance.org/search/DoAdvancedSearch?productName=&productIdentifier=&productDescription=&category=-1&brand=${manu}®ionId=-1&order=&page=${page}`; - const nextPage = await got.get(currentUrl).text(); + const nextPage = await ky.get(currentUrl).text(); const nextPageIds = nextPage.match( /(?<=productId=).*?(?=[\&\"])/g, )!; @@ -1814,8 +1814,8 @@ async function downloadDevicesOH(IDs?: number[]): Promise { async function downloadManufacturersOH(): Promise { process.stdout.write("Fetching manufacturers..."); - const { got } = await import("got"); - const data = await got.get(ohUrlManufacturers).json(); + const { default: ky } = await import("ky"); + const data = await ky.get(ohUrlManufacturers).json(); // Delete the last line process.stdout.write("\r\x1b[K"); diff --git a/packages/config/package.json b/packages/config/package.json index 2fd7ed3f596f..ca89954af55b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -82,8 +82,8 @@ "comment-json": "^4.2.5", "del-cli": "^6.0.0", "es-main": "^1.3.0", - "got": "^13.0.0", "js-levenshtein": "^1.1.6", + "ky": "^1.7.2", "peggy": "^3.0.2", "proxyquire": "^2.1.3", "sinon": "^19.0.2", diff --git a/packages/zwave-js/package.json b/packages/zwave-js/package.json index 6daab6362130..210162076a90 100644 --- a/packages/zwave-js/package.json +++ b/packages/zwave-js/package.json @@ -110,7 +110,7 @@ "alcalzone-shared": "^5.0.0", "ansi-colors": "^4.1.3", "execa": "^5.1.1", - "got": "^13.0.0", + "ky": "^1.7.2", "mdns-server": "^1.0.11", "p-queue": "^8.0.1", "proper-lockfile": "^4.1.2", diff --git a/packages/zwave-js/src/lib/controller/FirmwareUpdateService.ts b/packages/zwave-js/src/lib/controller/FirmwareUpdateService.ts index 9140b81f5239..aef2d76c597e 100644 --- a/packages/zwave-js/src/lib/controller/FirmwareUpdateService.ts +++ b/packages/zwave-js/src/lib/controller/FirmwareUpdateService.ts @@ -8,7 +8,7 @@ import { guessFirmwareFileFormat, } from "@zwave-js/core"; import { Bytes, formatId } from "@zwave-js/shared"; -import type { Headers, OptionsOfTextResponseBody } from "got"; +import type { Options as KyOptions } from "ky"; import type PQueue from "p-queue"; import type { FirmwareUpdateDeviceID, @@ -57,17 +57,14 @@ function cleanCache() { } } -async function cachedGot(config: OptionsOfTextResponseBody): Promise { - // Replaces got's built-in cache functionality because it uses Keyv internally - // which apparently has some issues: https://github.com/zwave-js/node-zwave-js/issues/5404 - +async function cachedRequest(url: string, config: KyOptions): Promise { const hash = Bytes.view( await digest( "sha-256", Bytes.from(JSON.stringify(config.json)), ), ).toString("hex"); - const cacheKey = `${config.method}:${config.url!.toString()}:${hash}`; + const cacheKey = `${config.method}:${url}:${hash}`; // Return cached requests if they are not stale yet if (requestCache.has(cacheKey)) { @@ -77,13 +74,15 @@ async function cachedGot(config: OptionsOfTextResponseBody): Promise { } } - const { got } = await import("got"); - const response = await got(config); - const responseJson = JSON.parse(response.body) as T; + const { default: ky } = await import("ky"); + const response = await ky(url, config); + const responseJson = await response.json(); // Check if we can cache the response - if (response.statusCode === 200 && response.headers["cache-control"]) { - const cacheControl = response.headers["cache-control"]; + if (response.status === 200 && response.headers.has("cache-control")) { + const cacheControl = response.headers.get("cache-control")!; + const age = response.headers.get("age"); + const date = response.headers.get("date"); let maxAge: number | undefined; const maxAgeMatch = cacheControl.match(/max-age=(\d+)/); @@ -93,10 +92,10 @@ async function cachedGot(config: OptionsOfTextResponseBody): Promise { if (maxAge) { let currentAge: number; - if (response.headers.age) { - currentAge = parseInt(response.headers.age, 10); - } else if (response.headers.date) { - currentAge = (Date.now() - Date.parse(response.headers.date)) + if (age) { + currentAge = parseInt(age, 10); + } else if (date) { + currentAge = (Date.now() - Date.parse(date)) / 1000; } else { currentAge = 0; @@ -173,12 +172,12 @@ export async function getAvailableFirmwareUpdates( deviceId: FirmwareUpdateDeviceID, options: GetAvailableFirmwareUpdateOptions, ): Promise { - const headers: Headers = { + const headers = new Headers({ "User-Agent": options.userAgent, "Content-Type": "application/json", - }; + }); if (options.apiKey) { - headers["X-API-Key"] = options.apiKey; + headers.set("X-API-Key", options.apiKey); } const body: Record = { @@ -195,9 +194,9 @@ export async function getAvailableFirmwareUpdates( // Prereleases and/or RF region-specific updates are only available in v3 const apiVersion = options.includePrereleases || !!rfRegion ? "v3" : "v1"; - const config: OptionsOfTextResponseBody = { + const url = `${serviceURL()}/api/${apiVersion}/updates`; + const config: KyOptions = { method: "POST", - url: `${serviceURL()}/api/${apiVersion}/updates`, json: body, // Consider re-enabling this instead of using cachedGot() // At the moment, the built-in caching has some issues though, so we stick @@ -216,7 +215,7 @@ export async function getAvailableFirmwareUpdates( } // Weird types... const result = ( - await requestQueue.add(() => cachedGot(config)) + await requestQueue.add(() => cachedRequest(url, config)) ) as FirmwareUpdateServiceResponse[]; // Remember the device ID in the response, so we can use it later @@ -242,14 +241,13 @@ export async function downloadFirmwareUpdate( // TODO: Make request abort-able (requires AbortController, Node 14.17+ / Node 16) // Download the firmware file - const { got } = await import("got"); - const downloadResponse = await got.get(file.url, { - timeout: { request: DOWNLOAD_TIMEOUT }, - responseType: "buffer", + const { default: ky } = await import("ky"); + const downloadResponse = await ky.get(file.url, { + timeout: DOWNLOAD_TIMEOUT, // TODO: figure out how to do maxContentLength: MAX_FIRMWARE_SIZE, }); - const rawData = downloadResponse.body; + const rawData = new Uint8Array(await downloadResponse.arrayBuffer()); const requestedPathname = new URL(file.url).pathname; // The response may be redirected, so the filename information may be different @@ -263,12 +261,15 @@ export async function downloadFirmwareUpdate( // Infer the file type from the content-disposition header or the filename let filename: string; + const contentDisposition = downloadResponse.headers.get( + "content-disposition", + ); if ( - downloadResponse.headers["content-disposition"]?.startsWith( + contentDisposition?.startsWith( "attachment; filename=", ) ) { - filename = downloadResponse.headers["content-disposition"] + filename = contentDisposition .split("filename=")[1] .replace(/^"/, "") .replace(/[";]$/, ""); diff --git a/packages/zwave-js/src/lib/driver/UpdateConfig.ts b/packages/zwave-js/src/lib/driver/UpdateConfig.ts index 8de169b6c944..3f29be0102a2 100644 --- a/packages/zwave-js/src/lib/driver/UpdateConfig.ts +++ b/packages/zwave-js/src/lib/driver/UpdateConfig.ts @@ -18,11 +18,11 @@ import semverMaxSatisfying from "semver/ranges/max-satisfying.js"; export async function checkForConfigUpdates( currentVersion: string, ): Promise { - const { got } = await import("got"); + const { default: ky } = await import("ky"); let registry: Record; try { - registry = await got + registry = await ky .get("https://registry.npmjs.org/@zwave-js/config") .json(); } catch { @@ -66,11 +66,11 @@ export async function installConfigUpdate( cacheDir: string; }, ): Promise { - const { got } = await import("got"); + const { default: ky } = await import("ky"); let registryInfo: any; try { - registryInfo = await got + registryInfo = await ky .get(`https://registry.npmjs.org/@zwave-js/config/${newVersion}`) .json(); } catch { @@ -137,16 +137,17 @@ export async function installConfigUpdate( // Download the package tarball into the temporary directory const tarFilename = path.join(tmpDir, "zjs-config-update.tgz"); + let fileHandle: fs.FileHandle | undefined; try { - const handle = await fs.open(tarFilename, "w"); - const fstream = handle.createWriteStream({ autoClose: true }); - const response = got.stream.get(url); - response.pipe(fstream); - - await new Promise((resolve, reject) => { - response.on("error", reject); - response.on("end", resolve); + fileHandle = await fs.open(tarFilename, "w"); + const writable = new WritableStream({ + async write(chunk) { + await fileHandle!.write(chunk); + }, }); + + const response = await ky.get(url); + await response.body?.pipeTo(writable); } catch (e) { await freeLock(); throw new ZWaveError( @@ -157,6 +158,8 @@ export async function installConfigUpdate( }`, ZWaveErrorCodes.Config_Update_InstallFailed, ); + } finally { + await fileHandle?.close(); } // This should not be necessary in Docker. Leaving it here anyways in case diff --git a/packages/zwave-js/src/lib/telemetry/deviceConfig.ts b/packages/zwave-js/src/lib/telemetry/deviceConfig.ts index 7db979b9ee45..1930c822e31f 100644 --- a/packages/zwave-js/src/lib/telemetry/deviceConfig.ts +++ b/packages/zwave-js/src/lib/telemetry/deviceConfig.ts @@ -31,9 +31,9 @@ export async function reportMissingDeviceConfig( // // If we tried to report this file earlier, we can skip the report // if (missingDeviceConfigCache.has(configFingerprint)) return; // // Otherwise ask our device DB if it exists - // const { got } = await import("got"); + // const { default: ky } = await import("ky"); // try { - // const data = await got + // const data = await ky // .get( // `https://devices.zwave-js.io/public_api/getdeviceinfo/${configFingerprint.replace( // /:/g, diff --git a/packages/zwave-js/src/lib/telemetry/statistics.ts b/packages/zwave-js/src/lib/telemetry/statistics.ts index 0d3376e5e977..3cb77ea19385 100644 --- a/packages/zwave-js/src/lib/telemetry/statistics.ts +++ b/packages/zwave-js/src/lib/telemetry/statistics.ts @@ -52,10 +52,10 @@ export async function compileStatistics( export async function sendStatistics( statistics: Record, ): Promise { - const { got } = await import("got"); + const { default: ky } = await import("ky"); try { - const data = await got + const data = await ky .post(statisticsUrl, { json: { data: [statistics] }, headers: { "x-api-token": apiToken }, diff --git a/yarn.lock b/yarn.lock index bb13517afcd8..63cb52eb89f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1967,13 +1967,6 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^5.2.0": - version: 5.4.1 - resolution: "@sindresorhus/is@npm:5.4.1" - checksum: 10/575eb0792f5f57546b2e50be03901cc0b3018480f75dea59c7c7c9f0d582fc12e8d364f76463984bd8965d0eb277d41de69e71324265453f7f6321578fd41331 - languageName: node - linkType: hard - "@sindresorhus/merge-streams@npm:^2.1.0": version: 2.3.0 resolution: "@sindresorhus/merge-streams@npm:2.3.0" @@ -2017,15 +2010,6 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^5.0.1": - version: 5.0.1 - resolution: "@szmarczak/http-timer@npm:5.0.1" - dependencies: - defer-to-connect: "npm:^2.0.1" - checksum: 10/fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 - languageName: node - linkType: hard - "@tootallnate/once@npm:1": version: 1.1.2 resolution: "@tootallnate/once@npm:1.1.2" @@ -2110,13 +2094,6 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:^4.0.1": - version: 4.0.1 - resolution: "@types/http-cache-semantics@npm:4.0.1" - checksum: 10/d059bf8a15d5163cc60da51ba00d17620507f968d0b792cd55f62043016344a5f0e1aa94fa411089d41114035fcd0ea656f968bda7eabb6663a97787e3445a1c - languageName: node - linkType: hard - "@types/js-levenshtein@npm:^1.1.3": version: 1.1.3 resolution: "@types/js-levenshtein@npm:1.1.3" @@ -2578,10 +2555,10 @@ __metadata: comment-json: "npm:^4.2.5" del-cli: "npm:^6.0.0" es-main: "npm:^1.3.0" - got: "npm:^13.0.0" js-levenshtein: "npm:^1.1.6" json-logic-js: "npm:^2.0.5" json5: "npm:^2.2.3" + ky: "npm:^1.7.2" peggy: "npm:^3.0.2" proxyquire: "npm:^2.1.3" semver: "npm:^7.6.3" @@ -3460,28 +3437,6 @@ __metadata: languageName: node linkType: hard -"cacheable-lookup@npm:^7.0.0": - version: 7.0.0 - resolution: "cacheable-lookup@npm:7.0.0" - checksum: 10/69ea78cd9f16ad38120372e71ba98b64acecd95bbcbcdad811f857dc192bad81ace021f8def012ce19178583db8d46afd1a00b3e8c88527e978e049edbc23252 - languageName: node - linkType: hard - -"cacheable-request@npm:^10.2.8": - version: 10.2.12 - resolution: "cacheable-request@npm:10.2.12" - dependencies: - "@types/http-cache-semantics": "npm:^4.0.1" - get-stream: "npm:^6.0.1" - http-cache-semantics: "npm:^4.1.1" - keyv: "npm:^4.5.2" - mimic-response: "npm:^4.0.0" - normalize-url: "npm:^8.0.0" - responselike: "npm:^3.0.0" - checksum: 10/abc1541f80e0995a52cfc6197ad12d2a910363c7342815a88f1606b767d81d5ccb43b8f1ba5a16180f3bf939b28f9b07dff22d346572d343f50a908813118e0b - languageName: node - linkType: hard - "cachedir@npm:2.2.0": version: 2.2.0 resolution: "cachedir@npm:2.2.0" @@ -4235,15 +4190,6 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: "npm:^3.1.0" - checksum: 10/d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - "dedent@npm:0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -4274,13 +4220,6 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.1": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 10/8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - "del-cli@npm:^6.0.0": version: 6.0.0 resolution: "del-cli@npm:6.0.0" @@ -5399,13 +5338,6 @@ __metadata: languageName: node linkType: hard -"form-data-encoder@npm:^2.1.2": - version: 2.1.4 - resolution: "form-data-encoder@npm:2.1.4" - checksum: 10/3778e7db3c21457296e6fdbc4200642a6c01e8be9297256e845ee275f9ddaecb5f49bfb0364690ad216898c114ec59bf85f01ec823a70670b8067273415d62f6 - languageName: node - linkType: hard - "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -5541,7 +5473,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": +"get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: 10/781266d29725f35c59f1d214aedc92b0ae855800a980800e2923b3fbc4e56b3cb6e462c42e09a1cf1a00c64e056a78fa407cbe06c7c92b7e5cd49b4b85c2a497 @@ -5759,25 +5691,6 @@ __metadata: languageName: node linkType: hard -"got@npm:^13.0.0": - version: 13.0.0 - resolution: "got@npm:13.0.0" - dependencies: - "@sindresorhus/is": "npm:^5.2.0" - "@szmarczak/http-timer": "npm:^5.0.1" - cacheable-lookup: "npm:^7.0.0" - cacheable-request: "npm:^10.2.8" - decompress-response: "npm:^6.0.0" - form-data-encoder: "npm:^2.1.2" - get-stream: "npm:^6.0.1" - http2-wrapper: "npm:^2.1.10" - lowercase-keys: "npm:^3.0.0" - p-cancelable: "npm:^3.0.0" - responselike: "npm:^3.0.0" - checksum: 10/35ac9fe37daca3d0a4f90305d8e64626268ef5a42584f5bcb42eea3cb9bbeb691cf9041d5ea72133a7295d1291684789a3148ff89a95f3d3ce3d0ebb6fb2f680 - languageName: node - linkType: hard - "graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.2.10": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -5882,7 +5795,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.1.0": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 10/362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f @@ -5900,16 +5813,6 @@ __metadata: languageName: node linkType: hard -"http2-wrapper@npm:^2.1.10": - version: 2.1.11 - resolution: "http2-wrapper@npm:2.1.11" - dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.2.0" - checksum: 10/1a20cd10c00e243bf80044ece608e4b8fae81ee8e31ffe2c4a82d3730b458eca7283032f59c81bc136d1e8b4ab9fe60dcd30d42319e7e91d9bdeb9eaa0fd35e8 - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "https-proxy-agent@npm:5.0.0" @@ -6537,15 +6440,6 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.2": - version: 4.5.2 - resolution: "keyv@npm:4.5.2" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10/fbe6068cb46cfbf37b46f4a80e484a5e9c48c9a1eb09d9cb89382db6e12b801b60f07268ec8d7fa8d49f1f1e77badc5820c3135d478022df42691890a4c37038 - languageName: node - linkType: hard - "keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -6569,6 +6463,13 @@ __metadata: languageName: node linkType: hard +"ky@npm:^1.7.2": + version: 1.7.2 + resolution: "ky@npm:1.7.2" + checksum: 10/d1102fe05e5d2263c5b484bc00b387a5310667aaeec4ebc4f4c3f9369b1d2e62cc19409d50aa21b45127e3ddb8be42d76fb54239799b0aebc9806c7ecb35c696 + languageName: node + linkType: hard + "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -6828,13 +6729,6 @@ __metadata: languageName: node linkType: hard -"lowercase-keys@npm:^3.0.0": - version: 3.0.0 - resolution: "lowercase-keys@npm:3.0.0" - checksum: 10/67a3f81409af969bc0c4ca0e76cd7d16adb1e25aa1c197229587eaf8671275c8c067cd421795dbca4c81be0098e4c426a086a05e30de8a9c587b7a13c0c7ccc5 - languageName: node - linkType: hard - "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -7014,20 +6908,6 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 10/7e719047612411fe071332a7498cf0448bbe43c485c0d780046c76633a771b223ff49bd00267be122cedebb897037fdb527df72335d0d0f74724604ca70b37ad - languageName: node - linkType: hard - -"mimic-response@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-response@npm:4.0.0" - checksum: 10/33b804cc961efe206efdb1fca6a22540decdcfce6c14eb5c0c50e5ae9022267ab22ce8f5568b1f7247ba67500fe20d523d81e0e9f009b321ccd9d472e78d1850 - languageName: node - linkType: hard - "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -7350,13 +7230,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^8.0.0": - version: 8.0.0 - resolution: "normalize-url@npm:8.0.0" - checksum: 10/4347d6ee39d9e1e7138c9e7c0b459c1e07304d9cd7c62d92c1ca01ed1f0c5397b292079fe7cfa953f469722ae150eec82e14b97e2175af39ede0b58f99ef8cac - languageName: node - linkType: hard - "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -7507,13 +7380,6 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^3.0.0": - version: 3.0.0 - resolution: "p-cancelable@npm:3.0.0" - checksum: 10/a5eab7cf5ac5de83222a014eccdbfde65ecfb22005ee9bc242041f0b4441e07fac7629432c82f48868aa0f8413fe0df6c6067c16f76bf9217cd8dc651923c93d - languageName: node - linkType: hard - "p-event@npm:^5.0.1": version: 5.0.1 resolution: "p-event@npm:5.0.1" @@ -7967,13 +7833,6 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: 10/a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed - languageName: node - linkType: hard - "read-pkg-up@npm:^7.0.1": version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" @@ -8101,13 +7960,6 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.2.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: 10/744e87888f0b6fa0b256ab454ca0b9c0b80808715e2ef1f3672773665c92a941f6181194e30ccae4a8cd0adbe0d955d3f133102636d2ee0cca0119fec0bc9aec - languageName: node - linkType: hard - "resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": version: 1.0.1 resolution: "resolve-dir@npm:1.0.1" @@ -8272,15 +8124,6 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^3.0.0": - version: 3.0.0 - resolution: "responselike@npm:3.0.0" - dependencies: - lowercase-keys: "npm:^3.0.0" - checksum: 10/e0cc9be30df4f415d6d83cdede3c5c887cd4a73e7cc1708bcaab1d50a28d15acb68460ac5b02bcc55a42f3d493729c8856427dcf6e57e6e128ad05cba4cfb95e - languageName: node - linkType: hard - "restore-cursor@npm:^2.0.0": version: 2.0.0 resolution: "restore-cursor@npm:2.0.0" @@ -10076,7 +9919,7 @@ __metadata: ansi-colors: "npm:^4.1.3" del-cli: "npm:^6.0.0" execa: "npm:^5.1.1" - got: "npm:^13.0.0" + ky: "npm:^1.7.2" mdns-server: "npm:^1.0.11" mockdate: "npm:^3.0.5" p-queue: "npm:^8.0.1"