axios.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // eslint-disable-next-line no-restricted-imports
  2. import axios from 'axios';
  3. import dayjs from 'dayjs';
  4. import qs from 'qs';
  5. // eslint-disable-next-line no-restricted-imports
  6. export * from 'axios';
  7. const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(Z|[+-]\d{2}:\d{2})$/;
  8. export function convertDateStringsToDates(data: any): any {
  9. if (typeof data !== 'object' || data === null) {
  10. if (typeof data === 'string' && isoDateRegex.test(data)) {
  11. return new Date(data);
  12. }
  13. return data;
  14. }
  15. if (Array.isArray(data)) {
  16. return data.map(item => convertDateStringsToDates(item));
  17. }
  18. for (const key of Object.keys(data)) {
  19. const value = data[key];
  20. if (typeof value === 'string' && isoDateRegex.test(value)) {
  21. data[key] = new Date(value);
  22. }
  23. else if (typeof value === 'object' && value !== null) {
  24. data[key] = convertDateStringsToDates(value);
  25. }
  26. }
  27. return data;
  28. }
  29. // Determine the base array of transformers
  30. let baseTransformers = axios.defaults.transformResponse;
  31. if (baseTransformers == null) {
  32. baseTransformers = [];
  33. }
  34. else if (!Array.isArray(baseTransformers)) {
  35. // If it's a single transformer function, wrap it in an array
  36. baseTransformers = [baseTransformers];
  37. }
  38. const customAxios = axios.create({
  39. headers: {
  40. 'X-Requested-With': 'XMLHttpRequest',
  41. 'Content-Type': 'application/json',
  42. },
  43. transformResponse: baseTransformers.concat(
  44. (data) => {
  45. return convertDateStringsToDates(data);
  46. },
  47. ),
  48. });
  49. // serialize Date config: https://github.com/axios/axios/issues/1548#issuecomment-548306666
  50. customAxios.interceptors.request.use((config) => {
  51. config.paramsSerializer = params => qs.stringify(params, { serializeDate: (date: Date) => dayjs(date).format('YYYY-MM-DDTHH:mm:ssZ') });
  52. return config;
  53. });
  54. export default customAxios;