1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-26 13:48:33 +02:00

refactor: migrate from make-fetch-happen to ky and use ky natively (#10134)

Migrate from make-fetch-happen to ky

## Summary:

- Replaced all usages of make-fetch-happen with
[ky](https://github.com/sindresorhus/ky) for HTTP requests.
- Upgraded nock to v14 so it's capable of mocking native fetch
implementation
- Removed the make-fetch-happen dependency
- Ensured all fetch logic is compatible with ky API.

## Why:

- ky provides a modern, lightweight, and promise-based HTTP client with
a simpler API.
- Reduces dependencies and simplifies codebase.

## Testing:

We'll do testing in sandbox environment of the modified functionality
(which is not much) and we also rely on automated testing.

---------

Co-authored-by: Simon Hornby <simon@getunleash.io>
This commit is contained in:
Gastón Fournier 2025-06-13 15:30:47 +02:00 committed by GitHub
parent c13ab85b1c
commit 6afb9f8796
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 87 additions and 199 deletions

View File

@ -102,11 +102,11 @@
"json-schema-to-ts": "2.12.0",
"json2csv": "^5.0.7",
"knex": "^3.1.0",
"ky": "^1.8.1",
"lodash.get": "^4.4.2",
"lodash.groupby": "^4.6.0",
"lodash.sortby": "^4.7.0",
"log4js": "^6.0.0",
"make-fetch-happen": "^14.0.0",
"memoizee": "^0.4.17",
"mime": "^4.0.4",
"murmurhash3js": "^3.0.1",
@ -148,7 +148,6 @@
"@types/js-yaml": "4.0.9",
"@types/lodash.groupby": "4.6.9",
"@types/lodash.isequal": "^4.5.8",
"@types/make-fetch-happen": "10.0.4",
"@types/memoizee": "0.4.11",
"@types/mime": "4.0.0",
"@types/murmurhash3js": "^3.0.7",
@ -174,7 +173,7 @@
"fetch-mock": "^12.0.0",
"husky": "^9.0.11",
"lint-staged": "15.4.3",
"nock": "13.5.6",
"nock": "^14.0.5",
"openapi-enforcer": "1.23.0",
"proxyquire": "2.1.3",
"source-map-support": "0.5.21",

View File

@ -55,8 +55,12 @@ test('Supports custom number of retries', async () => {
const res = await addon.fetchRetry(
url,
{
onRetry: () => {
retries = retries + 1;
hooks: {
beforeRetry: [
() => {
retries = retries + 1;
},
],
},
},
2,

View File

@ -1,4 +1,4 @@
import fetch from 'make-fetch-happen';
import ky from 'ky';
import { addonDefinitionSchema } from './addon-schema.js';
import type { Logger } from '../logger.js';
import type { IAddonConfig, IAddonDefinition } from '../types/model.js';
@ -60,13 +60,9 @@ export default abstract class Addon {
options: any = {},
retries: number = 1,
): Promise<Response> {
// biome-ignore lint/suspicious/noImplicitAnyLet: Due to calling upstream, it's not easy knowing the real type here
let res;
try {
res = await fetch(url, {
retry: {
retries,
},
const res = await ky(url, {
retry: retries,
...options,
});
return res;
@ -78,12 +74,10 @@ export default abstract class Addon {
} status code ${e.code}`,
e,
);
res = { status: e.code, ok: false };
return { status: e.code, ok: false } as Response;
}
return res;
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
abstract handleEvent(
event: IEvent,
parameters: any,

View File

@ -36,7 +36,6 @@ export default class SlackAddon extends Addon {
this.flagResolver = args.flagResolver;
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
async handleEvent(
event: IEvent,
parameters: ISlackAddonParameters,
@ -79,7 +78,7 @@ export default class SlackAddon extends Addon {
const requests = slackChannels.map((channel) => {
const body = {
username,
icon_emoji: emojiIcon, // eslint-disable-line camelcase
icon_emoji: emojiIcon,
text,
channel: `#${channel}`,
attachments: [

View File

@ -1,4 +1,4 @@
import fetch from 'make-fetch-happen';
import ky from 'ky';
import type { IUnleashStores } from '../types/stores.js';
import type { IUnleashConfig } from '../types/option.js';
import version from '../util/version.js';
@ -143,9 +143,8 @@ export default class VersionService {
versionPayload.featureInfo = await telemetryDataProvider();
}
if (this.versionCheckUrl) {
const res = await fetch(this.versionCheckUrl, {
method: 'POST',
body: JSON.stringify(versionPayload),
const res = await ky.post(this.versionCheckUrl, {
json: versionPayload,
headers: { 'Content-Type': 'application/json' },
});
if (res.ok) {

View File

@ -1,7 +1,7 @@
import fs from 'fs';
import { rewriteHTML } from './rewriteHTML.js';
import path from 'path';
import fetch from 'make-fetch-happen';
import ky from 'ky';
import type { IUnleashConfig } from '../types/index.js';
export async function loadIndexHTML(
@ -14,7 +14,7 @@ export async function loadIndexHTML(
let indexHTML: string;
if (cdnPrefix) {
const res = await fetch(`${cdnPrefix}/index.html`);
const res = await ky.get(`${cdnPrefix}/index.html`);
indexHTML = await res.text();
} else {
indexHTML = fs

245
yarn.lock
View File

@ -890,6 +890,20 @@ __metadata:
languageName: node
linkType: hard
"@mswjs/interceptors@npm:^0.38.7":
version: 0.38.7
resolution: "@mswjs/interceptors@npm:0.38.7"
dependencies:
"@open-draft/deferred-promise": "npm:^2.2.0"
"@open-draft/logger": "npm:^0.3.0"
"@open-draft/until": "npm:^2.0.0"
is-node-process: "npm:^1.2.0"
outvariant: "npm:^1.4.3"
strict-event-emitter: "npm:^0.5.1"
checksum: 10c0/89b0065921ce5c68656ef472e3beca8e9dee473c556facc5ff2a8c2da1f45f901a66ae5ff2a1e7c32d6fc8e677f75d2cd793d22ca4451a17d256e8771a77b589
languageName: node
linkType: hard
"@noble/hashes@npm:^1.1.5":
version: 1.8.0
resolution: "@noble/hashes@npm:1.8.0"
@ -937,19 +951,6 @@ __metadata:
languageName: node
linkType: hard
"@npmcli/agent@npm:^3.0.0":
version: 3.0.0
resolution: "@npmcli/agent@npm:3.0.0"
dependencies:
agent-base: "npm:^7.1.0"
http-proxy-agent: "npm:^7.0.0"
https-proxy-agent: "npm:^7.0.1"
lru-cache: "npm:^10.0.1"
socks-proxy-agent: "npm:^8.0.3"
checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271
languageName: node
linkType: hard
"@npmcli/fs@npm:^3.1.0":
version: 3.1.0
resolution: "@npmcli/fs@npm:3.1.0"
@ -959,12 +960,27 @@ __metadata:
languageName: node
linkType: hard
"@npmcli/fs@npm:^4.0.0":
version: 4.0.0
resolution: "@npmcli/fs@npm:4.0.0"
"@open-draft/deferred-promise@npm:^2.2.0":
version: 2.2.0
resolution: "@open-draft/deferred-promise@npm:2.2.0"
checksum: 10c0/eafc1b1d0fc8edb5e1c753c5e0f3293410b40dde2f92688211a54806d4136887051f39b98c1950370be258483deac9dfd17cf8b96557553765198ef2547e4549
languageName: node
linkType: hard
"@open-draft/logger@npm:^0.3.0":
version: 0.3.0
resolution: "@open-draft/logger@npm:0.3.0"
dependencies:
semver: "npm:^7.3.5"
checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5
is-node-process: "npm:^1.2.0"
outvariant: "npm:^1.4.0"
checksum: 10c0/90010647b22e9693c16258f4f9adb034824d1771d3baa313057b9a37797f571181005bc50415a934eaf7c891d90ff71dcd7a9d5048b0b6bb438f31bef2c7c5c1
languageName: node
linkType: hard
"@open-draft/until@npm:^2.0.0":
version: 2.1.0
resolution: "@open-draft/until@npm:2.1.0"
checksum: 10c0/61d3f99718dd86bb393fee2d7a785f961dcaf12f2055f0c693b27f4d0cd5f7a03d498a6d9289773b117590d794a43cd129366fd8e99222e4832f67b1653d54cf
languageName: node
linkType: hard
@ -1521,17 +1537,6 @@ __metadata:
languageName: node
linkType: hard
"@types/make-fetch-happen@npm:10.0.4":
version: 10.0.4
resolution: "@types/make-fetch-happen@npm:10.0.4"
dependencies:
"@types/node-fetch": "npm:*"
"@types/retry": "npm:*"
"@types/ssri": "npm:*"
checksum: 10c0/e1932ddd00bf240b64408613c7a8d47d18ce32a4063f3f3bdc06e90777aa52defe4cdf50c551f816fb91d3234489f650992a437501702af3872617fbfcf8b528
languageName: node
linkType: hard
"@types/memoizee@npm:0.4.11":
version: 0.4.11
resolution: "@types/memoizee@npm:0.4.11"
@ -1583,16 +1588,6 @@ __metadata:
languageName: node
linkType: hard
"@types/node-fetch@npm:*":
version: 2.6.2
resolution: "@types/node-fetch@npm:2.6.2"
dependencies:
"@types/node": "npm:*"
form-data: "npm:^3.0.0"
checksum: 10c0/bd2ce7621905f9d80cd2fbe003d32a8d304f4aa53c12eb01a498255a1fc570d82216cff9a7ed38ff32570c78e46c924a8e23187a011ecfcfec4c530c7bdecdbb
languageName: node
linkType: hard
"@types/node@npm:*":
version: 20.11.17
resolution: "@types/node@npm:20.11.17"
@ -1668,13 +1663,6 @@ __metadata:
languageName: node
linkType: hard
"@types/retry@npm:*":
version: 0.12.2
resolution: "@types/retry@npm:0.12.2"
checksum: 10c0/07481551a988cc90b423351919928b9ddcd14e3f5591cac3ab950851bb20646e55a10e89141b38bc3093d2056d4df73700b22ff2612976ac86a6367862381884
languageName: node
linkType: hard
"@types/retry@npm:0.12.0":
version: 0.12.0
resolution: "@types/retry@npm:0.12.0"
@ -1706,15 +1694,6 @@ __metadata:
languageName: node
linkType: hard
"@types/ssri@npm:*":
version: 7.1.1
resolution: "@types/ssri@npm:7.1.1"
dependencies:
"@types/node": "npm:*"
checksum: 10c0/2e02a8026a60618c68b5a90e0798bd814c0a2ef6ada7910e43cd0f754c0d8d14c12322e905be4d16b1155c67dd9d64b28c93f3f5711c1dc284886a3141ec959a
languageName: node
linkType: hard
"@types/stoppable@npm:1.1.3":
version: 1.1.3
resolution: "@types/stoppable@npm:1.1.3"
@ -2350,26 +2329,6 @@ __metadata:
languageName: node
linkType: hard
"cacache@npm:^19.0.1":
version: 19.0.1
resolution: "cacache@npm:19.0.1"
dependencies:
"@npmcli/fs": "npm:^4.0.0"
fs-minipass: "npm:^3.0.0"
glob: "npm:^10.2.2"
lru-cache: "npm:^10.0.1"
minipass: "npm:^7.0.3"
minipass-collect: "npm:^2.0.1"
minipass-flush: "npm:^1.0.5"
minipass-pipeline: "npm:^1.2.4"
p-map: "npm:^7.0.2"
ssri: "npm:^12.0.0"
tar: "npm:^7.4.3"
unique-filename: "npm:^4.0.0"
checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c
languageName: node
linkType: hard
"call-bind@npm:^1.0.7":
version: 1.0.7
resolution: "call-bind@npm:1.0.7"
@ -3943,17 +3902,6 @@ __metadata:
languageName: node
linkType: hard
"form-data@npm:^3.0.0":
version: 3.0.1
resolution: "form-data@npm:3.0.1"
dependencies:
asynckit: "npm:^0.4.0"
combined-stream: "npm:^1.0.8"
mime-types: "npm:^2.1.12"
checksum: 10c0/1ccc3ae064a080a799923f754d49fcebdd90515a8924f0f54de557540b50e7f1fe48ba5f2bd0435a5664aa2d49729107e6aaf2155a9abf52339474c5638b4485
languageName: node
linkType: hard
"form-data@npm:^4.0.0":
version: 4.0.0
resolution: "form-data@npm:4.0.0"
@ -4661,6 +4609,13 @@ __metadata:
languageName: node
linkType: hard
"is-node-process@npm:^1.2.0":
version: 1.2.0
resolution: "is-node-process@npm:1.2.0"
checksum: 10c0/5b24fda6776d00e42431d7bcd86bce81cb0b6cabeb944142fe7b077a54ada2e155066ad06dbe790abdb397884bdc3151e04a9707b8cd185099efbc79780573ed
languageName: node
linkType: hard
"is-number@npm:^7.0.0":
version: 7.0.0
resolution: "is-number@npm:7.0.0"
@ -5116,6 +5071,13 @@ __metadata:
languageName: node
linkType: hard
"ky@npm:^1.8.1":
version: 1.8.1
resolution: "ky@npm:1.8.1"
checksum: 10c0/48ab4b348dd7d8c6aa0f82df76fa32e99ade3c5513d50f58b0db5b945146deb6d8c18b2a61a0655b08385efa04b3bf1ed4098fff0329e3bd6c670c8a88668d9f
languageName: node
linkType: hard
"launchdarkly-eventsource@npm:2.0.3":
version: 2.0.3
resolution: "launchdarkly-eventsource@npm:2.0.3"
@ -5407,25 +5369,6 @@ __metadata:
languageName: node
linkType: hard
"make-fetch-happen@npm:^14.0.0":
version: 14.0.3
resolution: "make-fetch-happen@npm:14.0.3"
dependencies:
"@npmcli/agent": "npm:^3.0.0"
cacache: "npm:^19.0.1"
http-cache-semantics: "npm:^4.1.1"
minipass: "npm:^7.0.2"
minipass-fetch: "npm:^4.0.0"
minipass-flush: "npm:^1.0.5"
minipass-pipeline: "npm:^1.2.4"
negotiator: "npm:^1.0.0"
proc-log: "npm:^5.0.0"
promise-retry: "npm:^2.0.1"
ssri: "npm:^12.0.0"
checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0
languageName: node
linkType: hard
"map-obj@npm:^1.0.0":
version: 1.0.1
resolution: "map-obj@npm:1.0.1"
@ -5670,21 +5613,6 @@ __metadata:
languageName: node
linkType: hard
"minipass-fetch@npm:^4.0.0":
version: 4.0.1
resolution: "minipass-fetch@npm:4.0.1"
dependencies:
encoding: "npm:^0.1.13"
minipass: "npm:^7.0.3"
minipass-sized: "npm:^1.0.3"
minizlib: "npm:^3.0.1"
dependenciesMeta:
encoding:
optional: true
checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c
languageName: node
linkType: hard
"minipass-flush@npm:^1.0.5":
version: 1.0.5
resolution: "minipass-flush@npm:1.0.5"
@ -5905,13 +5833,6 @@ __metadata:
languageName: node
linkType: hard
"negotiator@npm:^1.0.0":
version: 1.0.0
resolution: "negotiator@npm:1.0.0"
checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b
languageName: node
linkType: hard
"negotiator@npm:~0.6.4":
version: 0.6.4
resolution: "negotiator@npm:0.6.4"
@ -5926,14 +5847,14 @@ __metadata:
languageName: node
linkType: hard
"nock@npm:13.5.6":
version: 13.5.6
resolution: "nock@npm:13.5.6"
"nock@npm:^14.0.5":
version: 14.0.5
resolution: "nock@npm:14.0.5"
dependencies:
debug: "npm:^4.1.0"
"@mswjs/interceptors": "npm:^0.38.7"
json-stringify-safe: "npm:^5.0.1"
propagate: "npm:^2.0.0"
checksum: 10c0/94249a294176a6e521bbb763c214de4aa6b6ab63dff1e299aaaf455886a465d38906891d7f24570d94a43b1e376c239c54d89ff7697124bc57ef188006acc25e
checksum: 10c0/3221abf0bbd84243b4d151abecdecffb22eba896e3a9c7e711b9bd1adc32f2273eb1c3c36f340e53d1c229ea99362364f418dd23017e11416c54e09b1babf219
languageName: node
linkType: hard
@ -6123,6 +6044,13 @@ __metadata:
languageName: node
linkType: hard
"outvariant@npm:^1.4.0, outvariant@npm:^1.4.3":
version: 1.4.3
resolution: "outvariant@npm:1.4.3"
checksum: 10c0/5976ca7740349cb8c71bd3382e2a762b1aeca6f33dc984d9d896acdf3c61f78c3afcf1bfe9cc633a7b3c4b295ec94d292048f83ea2b2594fae4496656eba992c
languageName: node
linkType: hard
"owasp-password-strength-test@npm:^1.3.0":
version: 1.3.0
resolution: "owasp-password-strength-test@npm:1.3.0"
@ -6191,13 +6119,6 @@ __metadata:
languageName: node
linkType: hard
"p-map@npm:^7.0.2":
version: 7.0.3
resolution: "p-map@npm:7.0.3"
checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c
languageName: node
linkType: hard
"p-queue@npm:^6":
version: 6.6.2
resolution: "p-queue@npm:6.6.2"
@ -6644,13 +6565,6 @@ __metadata:
languageName: node
linkType: hard
"proc-log@npm:^5.0.0":
version: 5.0.0
resolution: "proc-log@npm:5.0.0"
checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3
languageName: node
linkType: hard
"process-nextick-args@npm:~2.0.0":
version: 2.0.1
resolution: "process-nextick-args@npm:2.0.1"
@ -7647,15 +7561,6 @@ __metadata:
languageName: node
linkType: hard
"ssri@npm:^12.0.0":
version: 12.0.0
resolution: "ssri@npm:12.0.0"
dependencies:
minipass: "npm:^7.0.3"
checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d
languageName: node
linkType: hard
"stackback@npm:0.0.2":
version: 0.0.2
resolution: "stackback@npm:0.0.2"
@ -7704,6 +7609,13 @@ __metadata:
languageName: node
linkType: hard
"strict-event-emitter@npm:^0.5.1":
version: 0.5.1
resolution: "strict-event-emitter@npm:0.5.1"
checksum: 10c0/f5228a6e6b6393c57f52f62e673cfe3be3294b35d6f7842fc24b172ae0a6e6c209fa83241d0e433fc267c503bc2f4ffdbe41a9990ff8ffd5ac425ec0489417f7
languageName: node
linkType: hard
"string-argv@npm:^0.3.1":
version: 0.3.1
resolution: "string-argv@npm:0.3.1"
@ -8310,15 +8222,6 @@ __metadata:
languageName: node
linkType: hard
"unique-filename@npm:^4.0.0":
version: 4.0.0
resolution: "unique-filename@npm:4.0.0"
dependencies:
unique-slug: "npm:^5.0.0"
checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc
languageName: node
linkType: hard
"unique-slug@npm:^4.0.0":
version: 4.0.0
resolution: "unique-slug@npm:4.0.0"
@ -8328,15 +8231,6 @@ __metadata:
languageName: node
linkType: hard
"unique-slug@npm:^5.0.0":
version: 5.0.0
resolution: "unique-slug@npm:5.0.0"
dependencies:
imurmurhash: "npm:^0.1.4"
checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293
languageName: node
linkType: hard
"universalify@npm:^0.1.0":
version: 0.1.2
resolution: "universalify@npm:0.1.2"
@ -8387,7 +8281,6 @@ __metadata:
"@types/js-yaml": "npm:4.0.9"
"@types/lodash.groupby": "npm:4.6.9"
"@types/lodash.isequal": "npm:^4.5.8"
"@types/make-fetch-happen": "npm:10.0.4"
"@types/memoizee": "npm:0.4.11"
"@types/mime": "npm:4.0.0"
"@types/murmurhash3js": "npm:^3.0.7"
@ -8445,17 +8338,17 @@ __metadata:
json-schema-to-ts: "npm:2.12.0"
json2csv: "npm:^5.0.7"
knex: "npm:^3.1.0"
ky: "npm:^1.8.1"
lint-staged: "npm:15.4.3"
lodash.get: "npm:^4.4.2"
lodash.groupby: "npm:^4.6.0"
lodash.sortby: "npm:^4.7.0"
log4js: "npm:^6.0.0"
make-fetch-happen: "npm:^14.0.0"
memoizee: "npm:^0.4.17"
mime: "npm:^4.0.4"
murmurhash3js: "npm:^3.0.1"
mustache: "npm:^4.1.0"
nock: "npm:13.5.6"
nock: "npm:^14.0.5"
nodemailer: "npm:^6.9.9"
normalize-url: "npm:^6.1.0"
openapi-enforcer: "npm:1.23.0"