@openapi-qraft/react 2.0.0-next.11 → 2.0.0-next.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/lib/responseUtils.cjs +5 -8
- package/dist/cjs/lib/responseUtils.cjs.map +1 -1
- package/dist/esm/lib/responseUtils.js +5 -8
- package/dist/esm/lib/responseUtils.js.map +1 -1
- package/dist/types/lib/responseUtils.d.ts.map +1 -1
- package/package.json +5 -6
- package/src/lib/responseUtils.ts +8 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @openapi-qraft/react
|
|
2
2
|
|
|
3
|
+
## 2.0.0-next.13
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @openapi-qraft/tanstack-query-react-types@2.0.0-next.13
|
|
8
|
+
|
|
9
|
+
## 2.0.0-next.12
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- a50253a: Responses with the `text/plain` content type are now always processed as plain text, without attempting to fallback to `JSON.parse`.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- @openapi-qraft/tanstack-query-react-types@2.0.0-next.12
|
|
18
|
+
|
|
3
19
|
## 2.0.0-next.11
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -11,14 +11,15 @@
|
|
|
11
11
|
error: {},
|
|
12
12
|
response
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
const contentType = response.headers.get('Content-Type')?.toLowerCase();
|
|
15
|
+
const isJsonResponse = contentType?.includes('/json') || contentType?.includes('+json');
|
|
16
|
+
if (isJsonResponse) {
|
|
15
17
|
// clone response before parsing every time to allow multiple reads
|
|
16
18
|
const jsonResponse = response.clone().json();
|
|
17
19
|
return resolveResponse(response, response.ok ? jsonResponse : Promise.reject(await jsonResponse));
|
|
18
20
|
}
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
return resolveResponse(response, response.ok ? jsonResponse : Promise.reject(await jsonResponse));
|
|
21
|
+
const textResponse = response.clone().text();
|
|
22
|
+
return resolveResponse(response, response.ok ? textResponse : Promise.reject(await textResponse));
|
|
22
23
|
}
|
|
23
24
|
function resolveResponse(responseToReturn, responsePromise) {
|
|
24
25
|
if (!responsePromise) return Promise.reject({
|
|
@@ -34,10 +35,6 @@ function resolveResponse(responseToReturn, responsePromise) {
|
|
|
34
35
|
response: responseToReturn
|
|
35
36
|
}));
|
|
36
37
|
}
|
|
37
|
-
function isJsonResponse(response) {
|
|
38
|
-
const contentType = response.headers.get('Content-Type')?.toLowerCase();
|
|
39
|
-
return contentType?.includes('/json') || contentType?.includes('+json');
|
|
40
|
-
}
|
|
41
38
|
|
|
42
39
|
exports.processResponse = processResponse;
|
|
43
40
|
exports.resolveResponse = resolveResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responseUtils.cjs","sources":["../../../src/lib/responseUtils.ts"],"sourcesContent":["import type { RequestFnResponse } from '@openapi-qraft/tanstack-query-react-types';\n\n/**\n * Processes the response from the server.\n * @beta\n */\nexport async function processResponse<TData, TError>(\n response: Response\n): Promise<RequestFnResponse<TData, TError>> {\n if (response.status === 204 || response.headers.get('Content-Length') === '0')\n return (\n response.ok ? { data: {}, response } : { error: {}, response }\n ) as RequestFnResponse<TData, TError>;\n\n
|
|
1
|
+
{"version":3,"file":"responseUtils.cjs","sources":["../../../src/lib/responseUtils.ts"],"sourcesContent":["import type { RequestFnResponse } from '@openapi-qraft/tanstack-query-react-types';\n\n/**\n * Processes the response from the server.\n * @beta\n */\nexport async function processResponse<TData, TError>(\n response: Response\n): Promise<RequestFnResponse<TData, TError>> {\n if (response.status === 204 || response.headers.get('Content-Length') === '0')\n return (\n response.ok ? { data: {}, response } : { error: {}, response }\n ) as RequestFnResponse<TData, TError>;\n\n const contentType = response.headers.get('Content-Type')?.toLowerCase();\n\n const isJsonResponse =\n contentType?.includes('/json') || contentType?.includes('+json');\n\n if (isJsonResponse) {\n // clone response before parsing every time to allow multiple reads\n const jsonResponse = response.clone().json();\n return resolveResponse(\n response,\n response.ok ? jsonResponse : Promise.reject(await jsonResponse)\n );\n }\n\n const textResponse = response.clone().text() as Promise<TData>;\n\n return resolveResponse(\n response,\n response.ok ? textResponse : Promise.reject(await textResponse)\n );\n}\n\n/**\n * Resolves the response from the server.\n * @beta\n */\nexport function resolveResponse<TData, TError>(\n error: Error\n): Promise<RequestFnResponse<TData, TError>>;\nexport function resolveResponse<TData, TError>(\n responseToReturn: Response,\n responsePromise: Promise<TData>\n): Promise<RequestFnResponse<TData, TError>>;\nexport function resolveResponse<TData, TError>(\n responseToReturn: Response | Error,\n responsePromise?: Promise<TData>\n): Promise<RequestFnResponse<TData, TError>> {\n if (!responsePromise)\n return Promise.reject({\n error: responseToReturn,\n response: undefined,\n data: undefined,\n });\n\n return responsePromise\n .then(\n (data) =>\n ({ data, response: responseToReturn }) as RequestFnResponse<\n TData,\n TError\n >\n )\n .catch(\n (error) =>\n ({ error, response: responseToReturn }) as RequestFnResponse<\n TData,\n TError\n >\n );\n}\n"],"names":["processResponse","response","status","headers","get","ok","data","error","contentType","toLowerCase","isJsonResponse","includes","jsonResponse","clone","json","resolveResponse","Promise","reject","textResponse","text","responseToReturn","responsePromise","undefined","then","catch"],"mappings":";;AAEA;;;IAIO,eAAeA,eAAAA,CACpBC,QAAkB,EAAA;AAElB,IAAA,IAAIA,QAASC,CAAAA,MAAM,KAAK,GAAA,IAAOD,SAASE,OAAO,CAACC,GAAG,CAAC,gBAAsB,CAAA,KAAA,GAAA,EACxE,OACEH,QAAAA,CAASI,EAAE,GAAG;AAAEC,QAAAA,IAAAA,EAAM,EAAC;AAAGL,QAAAA,QAAAA;KAAa,GAAA;AAAEM,QAAAA,KAAAA,EAAO,EAAC;AAAGN,QAAAA,QAAAA;AAAS,KAAA,CAAA;AAGjE,IAAA,MAAMO,cAAcP,QAASE,CAAAA,OAAO,CAACC,GAAG,CAAC,cAAiBK,CAAAA,EAAAA,WAAAA,EAAAA,CAAAA;AAE1D,IAAA,MAAMC,cACJF,GAAAA,WAAAA,EAAaG,QAAS,CAAA,OAAA,CAAA,IAAYH,aAAaG,QAAS,CAAA,OAAA,CAAA,CAAA;AAE1D,IAAA,IAAID,cAAgB,EAAA;;AAElB,QAAA,MAAME,YAAeX,GAAAA,QAAAA,CAASY,KAAK,EAAA,CAAGC,IAAI,EAAA,CAAA;QAC1C,OAAOC,eAAAA,CACLd,UACAA,QAASI,CAAAA,EAAE,GAAGO,YAAeI,GAAAA,OAAAA,CAAQC,MAAM,CAAC,MAAML,YAAAA,CAAAA,CAAAA,CAAAA;AAEtD,KAAA;AAEA,IAAA,MAAMM,YAAejB,GAAAA,QAAAA,CAASY,KAAK,EAAA,CAAGM,IAAI,EAAA,CAAA;IAE1C,OAAOJ,eAAAA,CACLd,UACAA,QAASI,CAAAA,EAAE,GAAGa,YAAeF,GAAAA,OAAAA,CAAQC,MAAM,CAAC,MAAMC,YAAAA,CAAAA,CAAAA,CAAAA;AAEtD,CAAA;AAaO,SAASH,eAAAA,CACdK,gBAAkC,EAClCC,eAAgC,EAAA;AAEhC,IAAA,IAAI,CAACA,eAAAA,EACH,OAAOL,OAAAA,CAAQC,MAAM,CAAC;QACpBV,KAAOa,EAAAA,gBAAAA;QACPnB,QAAUqB,EAAAA,SAAAA;QACVhB,IAAMgB,EAAAA,SAAAA;AACR,KAAA,CAAA,CAAA;AAEF,IAAA,OAAOD,eACJE,CAAAA,IAAI,CACH,CAACjB,QACE;AAAEA,YAAAA,IAAAA;YAAML,QAAUmB,EAAAA,gBAAAA;AAAiB,SAAA,CAKvCI,CAAAA,CAAAA,KAAK,CACJ,CAACjB,SACE;AAAEA,YAAAA,KAAAA;YAAON,QAAUmB,EAAAA,gBAAAA;SAAiB,CAAA,CAAA,CAAA;AAK7C;;;;;"}
|
|
@@ -9,14 +9,15 @@
|
|
|
9
9
|
error: {},
|
|
10
10
|
response
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
const contentType = response.headers.get('Content-Type')?.toLowerCase();
|
|
13
|
+
const isJsonResponse = contentType?.includes('/json') || contentType?.includes('+json');
|
|
14
|
+
if (isJsonResponse) {
|
|
13
15
|
// clone response before parsing every time to allow multiple reads
|
|
14
16
|
const jsonResponse = response.clone().json();
|
|
15
17
|
return resolveResponse(response, response.ok ? jsonResponse : Promise.reject(await jsonResponse));
|
|
16
18
|
}
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
return resolveResponse(response, response.ok ? jsonResponse : Promise.reject(await jsonResponse));
|
|
19
|
+
const textResponse = response.clone().text();
|
|
20
|
+
return resolveResponse(response, response.ok ? textResponse : Promise.reject(await textResponse));
|
|
20
21
|
}
|
|
21
22
|
function resolveResponse(responseToReturn, responsePromise) {
|
|
22
23
|
if (!responsePromise) return Promise.reject({
|
|
@@ -32,10 +33,6 @@ function resolveResponse(responseToReturn, responsePromise) {
|
|
|
32
33
|
response: responseToReturn
|
|
33
34
|
}));
|
|
34
35
|
}
|
|
35
|
-
function isJsonResponse(response) {
|
|
36
|
-
const contentType = response.headers.get('Content-Type')?.toLowerCase();
|
|
37
|
-
return contentType?.includes('/json') || contentType?.includes('+json');
|
|
38
|
-
}
|
|
39
36
|
|
|
40
37
|
export { processResponse, resolveResponse };
|
|
41
38
|
//# sourceMappingURL=responseUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responseUtils.js","sources":["../../../src/lib/responseUtils.ts"],"sourcesContent":["import type { RequestFnResponse } from '@openapi-qraft/tanstack-query-react-types';\n\n/**\n * Processes the response from the server.\n * @beta\n */\nexport async function processResponse<TData, TError>(\n response: Response\n): Promise<RequestFnResponse<TData, TError>> {\n if (response.status === 204 || response.headers.get('Content-Length') === '0')\n return (\n response.ok ? { data: {}, response } : { error: {}, response }\n ) as RequestFnResponse<TData, TError>;\n\n
|
|
1
|
+
{"version":3,"file":"responseUtils.js","sources":["../../../src/lib/responseUtils.ts"],"sourcesContent":["import type { RequestFnResponse } from '@openapi-qraft/tanstack-query-react-types';\n\n/**\n * Processes the response from the server.\n * @beta\n */\nexport async function processResponse<TData, TError>(\n response: Response\n): Promise<RequestFnResponse<TData, TError>> {\n if (response.status === 204 || response.headers.get('Content-Length') === '0')\n return (\n response.ok ? { data: {}, response } : { error: {}, response }\n ) as RequestFnResponse<TData, TError>;\n\n const contentType = response.headers.get('Content-Type')?.toLowerCase();\n\n const isJsonResponse =\n contentType?.includes('/json') || contentType?.includes('+json');\n\n if (isJsonResponse) {\n // clone response before parsing every time to allow multiple reads\n const jsonResponse = response.clone().json();\n return resolveResponse(\n response,\n response.ok ? jsonResponse : Promise.reject(await jsonResponse)\n );\n }\n\n const textResponse = response.clone().text() as Promise<TData>;\n\n return resolveResponse(\n response,\n response.ok ? textResponse : Promise.reject(await textResponse)\n );\n}\n\n/**\n * Resolves the response from the server.\n * @beta\n */\nexport function resolveResponse<TData, TError>(\n error: Error\n): Promise<RequestFnResponse<TData, TError>>;\nexport function resolveResponse<TData, TError>(\n responseToReturn: Response,\n responsePromise: Promise<TData>\n): Promise<RequestFnResponse<TData, TError>>;\nexport function resolveResponse<TData, TError>(\n responseToReturn: Response | Error,\n responsePromise?: Promise<TData>\n): Promise<RequestFnResponse<TData, TError>> {\n if (!responsePromise)\n return Promise.reject({\n error: responseToReturn,\n response: undefined,\n data: undefined,\n });\n\n return responsePromise\n .then(\n (data) =>\n ({ data, response: responseToReturn }) as RequestFnResponse<\n TData,\n TError\n >\n )\n .catch(\n (error) =>\n ({ error, response: responseToReturn }) as RequestFnResponse<\n TData,\n TError\n >\n );\n}\n"],"names":["processResponse","response","status","headers","get","ok","data","error","contentType","toLowerCase","isJsonResponse","includes","jsonResponse","clone","json","resolveResponse","Promise","reject","textResponse","text","responseToReturn","responsePromise","undefined","then","catch"],"mappings":"AAEA;;;IAIO,eAAeA,eAAAA,CACpBC,QAAkB,EAAA;AAElB,IAAA,IAAIA,QAASC,CAAAA,MAAM,KAAK,GAAA,IAAOD,SAASE,OAAO,CAACC,GAAG,CAAC,gBAAsB,CAAA,KAAA,GAAA,EACxE,OACEH,QAAAA,CAASI,EAAE,GAAG;AAAEC,QAAAA,IAAAA,EAAM,EAAC;AAAGL,QAAAA,QAAAA;KAAa,GAAA;AAAEM,QAAAA,KAAAA,EAAO,EAAC;AAAGN,QAAAA,QAAAA;AAAS,KAAA,CAAA;AAGjE,IAAA,MAAMO,cAAcP,QAASE,CAAAA,OAAO,CAACC,GAAG,CAAC,cAAiBK,CAAAA,EAAAA,WAAAA,EAAAA,CAAAA;AAE1D,IAAA,MAAMC,cACJF,GAAAA,WAAAA,EAAaG,QAAS,CAAA,OAAA,CAAA,IAAYH,aAAaG,QAAS,CAAA,OAAA,CAAA,CAAA;AAE1D,IAAA,IAAID,cAAgB,EAAA;;AAElB,QAAA,MAAME,YAAeX,GAAAA,QAAAA,CAASY,KAAK,EAAA,CAAGC,IAAI,EAAA,CAAA;QAC1C,OAAOC,eAAAA,CACLd,UACAA,QAASI,CAAAA,EAAE,GAAGO,YAAeI,GAAAA,OAAAA,CAAQC,MAAM,CAAC,MAAML,YAAAA,CAAAA,CAAAA,CAAAA;AAEtD,KAAA;AAEA,IAAA,MAAMM,YAAejB,GAAAA,QAAAA,CAASY,KAAK,EAAA,CAAGM,IAAI,EAAA,CAAA;IAE1C,OAAOJ,eAAAA,CACLd,UACAA,QAASI,CAAAA,EAAE,GAAGa,YAAeF,GAAAA,OAAAA,CAAQC,MAAM,CAAC,MAAMC,YAAAA,CAAAA,CAAAA,CAAAA;AAEtD,CAAA;AAaO,SAASH,eAAAA,CACdK,gBAAkC,EAClCC,eAAgC,EAAA;AAEhC,IAAA,IAAI,CAACA,eAAAA,EACH,OAAOL,OAAAA,CAAQC,MAAM,CAAC;QACpBV,KAAOa,EAAAA,gBAAAA;QACPnB,QAAUqB,EAAAA,SAAAA;QACVhB,IAAMgB,EAAAA,SAAAA;AACR,KAAA,CAAA,CAAA;AAEF,IAAA,OAAOD,eACJE,CAAAA,IAAI,CACH,CAACjB,QACE;AAAEA,YAAAA,IAAAA;YAAML,QAAUmB,EAAAA,gBAAAA;AAAiB,SAAA,CAKvCI,CAAAA,CAAAA,KAAK,CACJ,CAACjB,SACE;AAAEA,YAAAA,KAAAA;YAAON,QAAUmB,EAAAA,gBAAAA;SAAiB,CAAA,CAAA,CAAA;AAK7C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responseUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/responseUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EACjD,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"responseUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/responseUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EACjD,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CA0B3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAC3C,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAC3C,gBAAgB,EAAE,QAAQ,EAC1B,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,GAC9B,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openapi-qraft/react",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.13",
|
|
4
4
|
"description": "OpenAPI client for React, providing type-safe requests and dynamic TanStack Query React Hooks via a modular, Proxy-based architecture.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "NODE_ENV=production rollup --config rollup.config.mjs && tsc --project tsconfig.build.json --emitDeclarationOnly",
|
|
@@ -11,19 +11,18 @@
|
|
|
11
11
|
"lint": "eslint",
|
|
12
12
|
"clean": "rimraf dist/",
|
|
13
13
|
"codegen": "openapi-qraft --plugin tanstack-query-react --plugin openapi-typescript ../test-fixtures/openapi.json -rm -o src/tests/fixtures/api --openapi-types-file-name openapi.ts --explicit-import-extensions --filter-services '/approval_policies/**,/entities/**,/files/**,!/internal/**' --operation-predefined-parameters '/approval_policies/{approval_policy_id}/**:header.x-monite-entity-id' '/entities/{entity_id}/documents:header.x-monite-version' --operation-name-modifier '/files/list:[a-zA-Z]+List ==> findAll' && yarn _prettify-api",
|
|
14
|
-
"codegen2": "openapi-qraft --plugin tanstack-query-react --plugin openapi-typescript http://localhost:3000/api/doc -rm -o src/tests/fixtures/api --openapi-types-file-name openapi.ts --explicit-import-extensions && yarn _prettify-api",
|
|
15
14
|
"_prettify-api": "prettier --write src/tests/fixtures/api/**/*.ts"
|
|
16
15
|
},
|
|
17
16
|
"sideEffects": false,
|
|
18
17
|
"dependencies": {
|
|
19
|
-
"@openapi-qraft/tanstack-query-react-types": "2.0.0-next.
|
|
18
|
+
"@openapi-qraft/tanstack-query-react-types": "2.0.0-next.13"
|
|
20
19
|
},
|
|
21
20
|
"devDependencies": {
|
|
22
|
-
"@openapi-qraft/cli": "2.0.0-next.
|
|
21
|
+
"@openapi-qraft/cli": "2.0.0-next.13",
|
|
23
22
|
"@openapi-qraft/eslint-config": "1.0.0",
|
|
24
|
-
"@openapi-qraft/openapi-typescript-plugin": "^1.2.0-next.
|
|
23
|
+
"@openapi-qraft/openapi-typescript-plugin": "^1.2.0-next.13",
|
|
25
24
|
"@openapi-qraft/rollup-config": "1.1.0-next.0",
|
|
26
|
-
"@openapi-qraft/tanstack-query-react-plugin": "2.0.0-next.
|
|
25
|
+
"@openapi-qraft/tanstack-query-react-plugin": "2.0.0-next.13",
|
|
27
26
|
"@openapi-qraft/test-fixtures": "1.0.0",
|
|
28
27
|
"@tanstack/react-query": "^5.56.2",
|
|
29
28
|
"@testing-library/jest-dom": "^5.17.0",
|
package/src/lib/responseUtils.ts
CHANGED
|
@@ -12,7 +12,12 @@ export async function processResponse<TData, TError>(
|
|
|
12
12
|
response.ok ? { data: {}, response } : { error: {}, response }
|
|
13
13
|
) as RequestFnResponse<TData, TError>;
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const contentType = response.headers.get('Content-Type')?.toLowerCase();
|
|
16
|
+
|
|
17
|
+
const isJsonResponse =
|
|
18
|
+
contentType?.includes('/json') || contentType?.includes('+json');
|
|
19
|
+
|
|
20
|
+
if (isJsonResponse) {
|
|
16
21
|
// clone response before parsing every time to allow multiple reads
|
|
17
22
|
const jsonResponse = response.clone().json();
|
|
18
23
|
return resolveResponse(
|
|
@@ -21,14 +26,11 @@ export async function processResponse<TData, TError>(
|
|
|
21
26
|
);
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
const
|
|
25
|
-
// attempt to parse JSON for successful responses, otherwise fail
|
|
26
|
-
response.clone().text().then(JSON.parse).then(resolve, reject)
|
|
27
|
-
);
|
|
29
|
+
const textResponse = response.clone().text() as Promise<TData>;
|
|
28
30
|
|
|
29
31
|
return resolveResponse(
|
|
30
32
|
response,
|
|
31
|
-
response.ok ?
|
|
33
|
+
response.ok ? textResponse : Promise.reject(await textResponse)
|
|
32
34
|
);
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -70,8 +72,3 @@ export function resolveResponse<TData, TError>(
|
|
|
70
72
|
>
|
|
71
73
|
);
|
|
72
74
|
}
|
|
73
|
-
|
|
74
|
-
function isJsonResponse(response: Response) {
|
|
75
|
-
const contentType = response.headers.get('Content-Type')?.toLowerCase();
|
|
76
|
-
return contentType?.includes('/json') || contentType?.includes('+json');
|
|
77
|
-
}
|