You need to sign in or sign up before continuing.
request.js 1.21 KB
import qs from 'qs'

export const parseMockUrl = (input) => {
  const raw = String(input || '')
  const queryString = raw.includes('?') ? raw.slice(raw.indexOf('?') + 1) : ''
  const query = qs.parse(queryString)

  return {
    raw,
    action: String(query.a || ''),
    type: String(query.t || ''),
    query,
  }
}

export const normalizeMockData = (data, headers = {}) => {
  if (!data) return {}

  if (typeof data === 'string') {
    const contentType = String(headers?.['content-type'] || headers?.['Content-Type'] || '')
    if (contentType.includes('application/x-www-form-urlencoded')) {
      return qs.parse(data)
    }

    try {
      return JSON.parse(data)
    } catch (error) {
      return { raw: data }
    }
  }

  if (typeof data === 'object') {
    return data
  }

  return { raw: data }
}

export const createMockRequestContext = ({ url, method = 'GET', data, params, headers }) => {
  const urlParts = parseMockUrl(url)

  return {
    url: String(url || ''),
    method: String(method || 'GET').toUpperCase(),
    action: urlParts.action,
    type: urlParts.type,
    requestData: normalizeMockData(data, headers),
    requestParams: {
      ...(urlParts.query || {}),
      ...(params || {}),
    },
  }
}