From 039a0b0e7f86e5afe02bf3f84ad172008187605b Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 4 Nov 2022 15:49:28 +0800 Subject: [PATCH] fix: ky adaptor --- pnpm-lock.yaml | 17 ++++++++ src/__tests__/adaptors/ky.spec.ts | 3 +- src/adaptors/ky-universal.ts | 72 +++++++++++++++++++++++++++++++ src/adaptors/ky.ts | 6 +-- src/package.json | 1 + 5 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 src/adaptors/ky-universal.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 673a9d88..5a81cfeb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,7 @@ importers: isomorphic-unfetch: 3.1.0 jsdom: 20.0.1 ky: 0.31.4 + ky-universal: ^0.11.0 lodash: 4.17.21 node-fetch: 3.2.10 rollup: 2.79.1 @@ -108,6 +109,7 @@ importers: isomorphic-unfetch: 3.1.0 jsdom: 20.0.1 ky: 0.31.4 + ky-universal: 0.11.0_ky@0.31.4 lodash: 4.17.21 node-fetch: 3.2.10 rollup: 2.79.1 @@ -2943,6 +2945,21 @@ packages: graceful-fs: 4.2.10 dev: true + /ky-universal/0.11.0_ky@0.31.4: + resolution: {integrity: sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==} + engines: {node: '>=14.16'} + peerDependencies: + ky: '>=0.31.4' + web-streams-polyfill: '>=3.2.1' + peerDependenciesMeta: + web-streams-polyfill: + optional: true + dependencies: + abort-controller: 3.0.0 + ky: 0.31.4 + node-fetch: 3.2.10 + dev: true + /ky/0.31.4: resolution: {integrity: sha512-OFuAD3riwhAfHK3J4FrhlujFRpm0ELBEfDHZfFpw89OTozQt3NLF39lNblUO5udj5vSkyaBKnLai/rFCzBfISQ==} engines: {node: '>=14.16'} diff --git a/src/__tests__/adaptors/ky.spec.ts b/src/__tests__/adaptors/ky.spec.ts index 8713fd5a..524015da 100644 --- a/src/__tests__/adaptors/ky.spec.ts +++ b/src/__tests__/adaptors/ky.spec.ts @@ -1,9 +1,10 @@ import '../helpers/global-fetch' -import { defaultKyAdaptor } from '~/adaptors/ky' +import { createDefaultKyAdaptor } from '~/adaptors/ky' import { testAdaptor } from '../helpers/adaptor-test' describe('test ky adaptor', () => { + const defaultKyAdaptor = createDefaultKyAdaptor() testAdaptor(defaultKyAdaptor) }) diff --git a/src/adaptors/ky-universal.ts b/src/adaptors/ky-universal.ts new file mode 100644 index 00000000..2c2bc417 --- /dev/null +++ b/src/adaptors/ky-universal.ts @@ -0,0 +1,72 @@ +import type { Options, ResponsePromise } from 'ky' +import ky from 'ky-universal' +import type { KyInstance } from 'ky/distribution/types/ky' + +import type { IRequestAdapter } from '~/interfaces/adapter' + +// TODO post data not only json, +const getDataFromKyResponse = async (response: ResponsePromise) => { + const res = await response + + const isJsonType = res.headers + .get('content-type') + ?.includes('application/json') + const json = isJsonType ? await res.clone().json() : null + + const result: Awaited & { + data: any + } = { + ...res, + data: json ?? (await res.clone().text()), + } + return result +} + +export const createKyAdaptor = (ky: KyInstance) => { + const adaptor: IRequestAdapter = + Object.preventExtensions({ + get default() { + return ky + }, + + responseWrapper: {} as any as ResponsePromise, + get(url, options) { + return getDataFromKyResponse(ky.get(url, options)) + }, + post(url, options) { + const data = options.data + delete options.data + const kyOptions: Options = { + ...options, + json: data, + } + + return getDataFromKyResponse(ky.post(url, kyOptions)) + }, + put(url, options) { + const data = options.data + delete options.data + const kyOptions: Options = { + ...options, + json: data, + } + return getDataFromKyResponse(ky.put(url, kyOptions)) + }, + + patch(url, options) { + const data = options.data + delete options.data + const kyOptions: Options = { + ...options, + json: data, + } + return getDataFromKyResponse(ky.patch(url, kyOptions)) + }, + delete(url, options) { + return getDataFromKyResponse(ky.delete(url, options)) + }, + }) + return adaptor +} + +export const createDefaultKyAdaptor = () => createKyAdaptor(ky.create({})) diff --git a/src/adaptors/ky.ts b/src/adaptors/ky.ts index d4b03f85..82b6a529 100644 --- a/src/adaptors/ky.ts +++ b/src/adaptors/ky.ts @@ -4,8 +4,6 @@ import type { KyInstance } from 'ky/distribution/types/ky' import type { IRequestAdapter } from '~/interfaces/adapter' -// eslint-disable-next-line spaced-comment -const $http: KyInstance = /*#__PURE__*/ ky.create({}) // TODO post data not only json, const getDataFromKyResponse = async (response: ResponsePromise) => { const res = await response @@ -71,6 +69,4 @@ export const createKyAdaptor = (ky: KyInstance) => { return adaptor } -export const defaultKyAdaptor = createKyAdaptor($http) - -export default defaultKyAdaptor +export const createDefaultKyAdaptor = () => createKyAdaptor(ky.create({})) diff --git a/src/package.json b/src/package.json index 631d39e2..7015ff17 100644 --- a/src/package.json +++ b/src/package.json @@ -109,6 +109,7 @@ "isomorphic-unfetch": "3.1.0", "jsdom": "20.0.1", "ky": "0.31.4", + "ky-universal": "^0.11.0", "lodash": "4.17.21", "node-fetch": "3.2.10", "rollup": "2.79.1",