UNPKG

integreat-adapter-json

Version:
90 lines 3.09 kB
import { isErrorStatus } from './utils/is.js'; import { setErrorOnAction } from './utils/action.js'; function normalizeJson(data) { if (typeof data === 'string') { return data === '' ? null : JSON.parse(data); } else { return data; } } function serializeJSON(data) { if (data !== null && data !== undefined) { return JSON.stringify(data); } else { return data; } } const setActionData = (action, payloadData, responseData) => ({ ...action, payload: { ...action.payload, ...(payloadData === undefined ? {} : { data: payloadData }), }, ...(action.response && { response: { ...action.response, ...(responseData === undefined ? {} : { data: responseData }), }, }), }); const removeContentType = (headers) => Object.fromEntries(Object.entries(headers).filter(([key]) => key.toLowerCase() !== 'content-type')); function setContentType(defaultType, headers = {}) { const contentKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type'); const contentType = (typeof contentKey === 'string' && headers[contentKey]) || defaultType; return { ...removeContentType(headers), 'Content-Type': contentType }; } const setJSONHeaders = (action) => ({ ...action, payload: action.payload.data ? { ...action.payload, headers: setContentType('application/json', action.payload.headers), } : action.payload, response: action.response?.data ? { ...action.response, headers: setContentType('application/json', action.response?.headers), } : action.response, }); const wrapResponseData = (action) => ({ ...action, response: { ...action.response, data: { $value: action.response?.data } }, }); const adapter = { prepareOptions({ includeHeaders = true }, _serviceId) { return { includeHeaders }; }, async normalize(action, _options) { let payloadData, responseData; try { payloadData = normalizeJson(action.payload.data); } catch { return setErrorOnAction(action, 'Payload data was not valid JSON', 'badrequest'); } try { responseData = normalizeJson(action.response?.data); } catch { if (!isErrorStatus(action.response?.status)) { return setErrorOnAction(action, 'Response data was not valid JSON', 'badresponse'); } else { return wrapResponseData(action); } } return setActionData(action, payloadData, responseData); }, async serialize(action, { includeHeaders = true }) { const payloadData = serializeJSON(action.payload.data); const responseData = serializeJSON(action.response?.data); const ret = setActionData(action, payloadData, responseData); return includeHeaders ? setJSONHeaders(ret) : ret; }, }; export default adapter; //# sourceMappingURL=index.js.map