import axios, { AxiosResponseTransformer } from 'axios'; const dateISO = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[.,]\d+)?(?:[+-]\d{2}:\d{2}|Z)?$/i; const dateISOMilliseconds = /[.,](\d+)/i; const dateNet = /\/Date\((-?\d+)(?:-\d+)?\)\//i; function dateFromString(date: string) { if (dateISO.test(date)) { const ms = dateISOMilliseconds.exec(date); const fixedValue = date.replace(dateISOMilliseconds, ''); const result = new Date(fixedValue); if (ms !== null) { let millisecond = parseInt(ms[1].substring(0, 3), 10); millisecond = isNaN(millisecond) ? 0 : millisecond; result.setMilliseconds(millisecond); } return result; } const parsedDate = dateNet.exec(date); if (parsedDate !== null) { return new Date(parseInt(parsedDate[1], 10)); } return date; } function transformDates(obj: any): any { if (typeof obj === 'string') { return dateFromString(obj); } if (obj === null || typeof obj !== 'object' || obj instanceof Blob) { return obj; } if (Array.isArray(obj)) { return obj.map(transformDates); } const keys = Object.keys(obj); if (!keys.length) { return obj; } return keys.reduce( (result, key) => { result[key] = transformDates(result[key]); return result; }, { ...obj } ); } export const initAjaxHandlersParseDates = () => { const transformer: AxiosResponseTransformer = data => transformDates(data); if (axios.defaults.transformResponse === undefined) { axios.defaults.transformResponse = [transformer]; } else if (Array.isArray(axios.defaults.transformResponse)) { axios.defaults.transformResponse.push(transformer); } else { axios.defaults.transformResponse = [axios.defaults.transformResponse, transformer]; } };