diff --git a/packages/sdk/server-node/.eslintrc.cjs b/packages/sdk/server-node/.eslintrc.cjs new file mode 100644 index 000000000..5f7339ab0 --- /dev/null +++ b/packages/sdk/server-node/.eslintrc.cjs @@ -0,0 +1,10 @@ +module.exports = { + overrides: [ + { + files: ['contract-tests/**/*.ts'], + parserOptions: { + project: './contract-tests/tsconfig.json', + }, + }, + ], +}; diff --git a/packages/sdk/server-node/contract-tests/package.json b/packages/sdk/server-node/contract-tests/package.json index 061721a5b..44cbe1bed 100644 --- a/packages/sdk/server-node/contract-tests/package.json +++ b/packages/sdk/server-node/contract-tests/package.json @@ -15,8 +15,7 @@ "@launchdarkly/js-contract-test-utils": "workspace:^", "@launchdarkly/node-server-sdk": "workspace:^", "body-parser": "^1.19.0", - "express": "^4.17.1", - "got": "14.4.7" + "express": "^4.17.1" }, "devDependencies": { "@types/body-parser": "^1.19.2", diff --git a/packages/sdk/server-node/contract-tests/src/BigSegmentTestStore.ts b/packages/sdk/server-node/contract-tests/src/BigSegmentTestStore.ts index 7e31dc049..b89850983 100644 --- a/packages/sdk/server-node/contract-tests/src/BigSegmentTestStore.ts +++ b/packages/sdk/server-node/contract-tests/src/BigSegmentTestStore.ts @@ -1,5 +1,3 @@ -import got from 'got'; - interface BigSegmentMetadata { lastUpToDate?: number; } @@ -20,19 +18,24 @@ export default class BigSegmentTestStore { } async getMetadata(): Promise { - const data = await got.get(`${this._callbackUri}/getMetadata`, { retry: { limit: 0 } }).json(); + const response = await fetch(`${this._callbackUri}/getMetadata`); + if (!response.ok) { + throw new Error(`getMetadata request failed with status ${response.status}`); + } + const data = await response.json(); return data as BigSegmentMetadata; } async getUserMembership(contextHash: string): Promise | undefined> { - const data = await got - .post(`${this._callbackUri}/getMembership`, { - retry: { limit: 0 }, - json: { - contextHash, - }, - }) - .json(); + const response = await fetch(`${this._callbackUri}/getMembership`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ contextHash }), + }); + if (!response.ok) { + throw new Error(`getUserMembership request failed with status ${response.status}`); + } + const data = await response.json(); return (data as BigSegmentMembership)?.values; } diff --git a/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts b/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts index 2b9938053..c23852dae 100644 --- a/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts +++ b/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts @@ -1,5 +1,3 @@ -import got from 'got'; - import { CommandParams, CreateInstanceParams, @@ -184,11 +182,11 @@ function getExecution(order: string) { } } -function makeMigrationPostOptions(payload: any) { +function makeMigrationPostOptions(payload: any): RequestInit { if (payload) { - return { body: payload }; + return { method: 'POST', body: payload }; } - return {}; + return { method: 'POST' }; } function contextOrUser( @@ -342,44 +340,56 @@ export async function newSdkClientEntity(options: CreateInstanceParams): Promise check: migrationOperation.trackConsistency ? (a, b) => a === b : undefined, readNew: async (payload) => { try { - const res = await got.post( + const res = await fetch( migrationOperation.newEndpoint, makeMigrationPostOptions(payload), ); - return LDMigrationSuccess(res.body); + if (!res.ok) { + throw new Error(`HTTP ${res.status}`); + } + return LDMigrationSuccess(await res.text()); } catch (err: any) { return LDMigrationError(err.message); } }, writeNew: async (payload) => { try { - const res = await got.post( + const res = await fetch( migrationOperation.newEndpoint, makeMigrationPostOptions(payload), ); - return LDMigrationSuccess(res.body); + if (!res.ok) { + throw new Error(`HTTP ${res.status}`); + } + return LDMigrationSuccess(await res.text()); } catch (err: any) { return LDMigrationError(err.message); } }, readOld: async (payload) => { try { - const res = await got.post( + const res = await fetch( migrationOperation.oldEndpoint, makeMigrationPostOptions(payload), ); - return LDMigrationSuccess(res.body); + if (!res.ok) { + throw new Error(`HTTP ${res.status}`); + } + return LDMigrationSuccess(await res.text()); } catch (err: any) { return LDMigrationError(err.message); } }, writeOld: async (payload) => { try { - const res = await got.post( + const res = await fetch( migrationOperation.oldEndpoint, makeMigrationPostOptions(payload), ); - return LDMigrationSuccess(res.body); + if (!res.ok) { + throw new Error(`HTTP ${res.status}`); + } + return LDMigrationSuccess(await res.text()); } catch (err: any) { return LDMigrationError(err.message); } @@ -423,14 +433,11 @@ export async function newSdkClientEntity(options: CreateInstanceParams): Promise const eventName = 'update'; const handler = (eventParams: { key: string }) => { - got - .post(p.callbackUri, { - json: { - listenerId: p.listenerId, - flagKey: eventParams.key, - }, - }) - .catch(() => {}); + fetch(p.callbackUri, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ listenerId: p.listenerId, flagKey: eventParams.key }), + }).catch(() => {}); }; const existing = listeners.get(p.listenerId); diff --git a/packages/sdk/server-node/tsconfig.eslint.json b/packages/sdk/server-node/tsconfig.eslint.json index 56c9b3830..dffb69a8d 100644 --- a/packages/sdk/server-node/tsconfig.eslint.json +++ b/packages/sdk/server-node/tsconfig.eslint.json @@ -1,5 +1,5 @@ { "extends": "./tsconfig.json", - "include": ["/**/*.ts"], - "exclude": ["node_modules"] + "include": ["**/*.ts"], + "exclude": ["node_modules", "dist", "contract-tests"] } diff --git a/packages/tooling/contract-test-utils/package.json b/packages/tooling/contract-test-utils/package.json index 6f07b0115..b44022169 100644 --- a/packages/tooling/contract-test-utils/package.json +++ b/packages/tooling/contract-test-utils/package.json @@ -40,8 +40,7 @@ }, "peerDependencies": { "@launchdarkly/js-client-sdk-common": "workspace:^", - "@launchdarkly/js-server-sdk-common": "workspace:^", - "got": "14.4.7" + "@launchdarkly/js-server-sdk-common": "workspace:^" }, "peerDependenciesMeta": { "@launchdarkly/js-client-sdk-common": { @@ -49,14 +48,12 @@ }, "@launchdarkly/js-server-sdk-common": { "optional": true - }, - "got": { - "optional": true } }, "devDependencies": { + "@launchdarkly/js-client-sdk-common": "workspace:^", + "@launchdarkly/js-server-sdk-common": "workspace:^", "@types/node": "^18.11.9", - "got": "14.4.7", "typescript": "^4.9.0" } } diff --git a/packages/tooling/contract-test-utils/src/server-side/TestHook.ts b/packages/tooling/contract-test-utils/src/server-side/TestHook.ts index 37348117a..8d3161b7d 100644 --- a/packages/tooling/contract-test-utils/src/server-side/TestHook.ts +++ b/packages/tooling/contract-test-utils/src/server-side/TestHook.ts @@ -1,11 +1,14 @@ -import got from 'got'; import { integrations, LDEvaluationDetail } from '@launchdarkly/js-server-sdk-common'; import { BaseTestHook } from '../shared/BaseTestHook.js'; export default class TestHook extends BaseTestHook implements integrations.Hook { protected async _safePost(body: unknown): Promise { try { - await got.post(this._endpoint, { json: body }); + await fetch(this._endpoint, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); } catch { // The test could move on before the post, so we are ignoring // failed posts. diff --git a/packages/tooling/contract-test-utils/tsconfig.server.json b/packages/tooling/contract-test-utils/tsconfig.server.json index fb3066bda..2039e745e 100644 --- a/packages/tooling/contract-test-utils/tsconfig.server.json +++ b/packages/tooling/contract-test-utils/tsconfig.server.json @@ -1,13 +1,5 @@ { "extends": "./tsconfig.json", - "compilerOptions": { - // 'got' is a devDependency; this path alias is needed because TypeScript's - // 'node' moduleResolution does not follow exports maps for ESM-only packages. - "baseUrl": ".", - "paths": { - "got": ["../../../node_modules/got/dist/source"] - } - }, "include": ["src/**/*"], "exclude": ["dist", "node_modules", "src/client.ts", "src/client-side/**"] }