integreat-adapter-json
Version:
JSON adapter for Integreat
90 lines • 3.09 kB
JavaScript
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