Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/request / src / deps / fromOneRequestToSerialized.ts
Size: Mime:
/**
 * @file @todo rewrite and split this file elsewhere
 * ^ this is here because we are doing this for logging & tests
 */
import { isFunction, isMap } from 'exotic'
import { URL } from 'url'
import {
  Params,
  OneRequest,
  OneRequestStore,
  OneRequestAsSerializedDebug,
} from '../typings'
import { config } from '../config'
import { setParamsOnSearchParams, serializeBody } from '../adapters/fetch'
import { encodeBody } from '../deps/encodeBody'
import { fromParamsToStringified } from '../deps/fromParamsToStringified'
import { fromHeadersToSerialized } from './fromHeadersToSerialized'
import { cloneURL } from './cloneURL'

// @todo need to test POST
export function fromBodyToSerialized(body: Body) {
  // @todo
}

export { cloneURL } from './cloneURL'
export { fromHeadersToSerialized } from './fromHeadersToSerialized'

export function fromParamsToSerializedUrlParams(
  params: Params,
  request: OneRequest | OneRequestStore | { store: OneRequestStore }
): URL {
  const stringifiedParams = fromParamsToStringified(params)
  const requestStore = isMap(request) ? request : request.store
  const url = cloneURL(requestStore.get('urlObj'))

  setParamsOnSearchParams(stringifiedParams, url)
  return url
}

// @todo typings with the Url stuff
// @todo for more accurate output, need to use URLSearchParams
export function fromParamsToSerialized(
  params: Params,
  request: OneRequest | OneRequestStore | { store: OneRequestStore }
) {
  const url = fromParamsToSerializedUrlParams(params, request)
  const serializedParams = {}
  url.searchParams.forEach((value: string | any, key: string) => {
    serializedParams[key] = value
  })
  return serializedParams
}

export const toValue = (request: OneRequest, constantHeader: unknown) => {
  if (isFunction(constantHeader)) {
    return constantHeader(request.store)
  } else {
    return constantHeader
  }
}

/**
 * @todo may want to clone
 */
export function fromOneRequestToSerialized(
  request: OneRequest
): OneRequestAsSerializedDebug {
  const headers = request.store.get('headers')
  const params = request.store.get('params')
  const url = request.store.get('url')
  // const urlObj = request.store.get('urlObj')
  // const baseUrl = request.store.get('baseUrl')
  // const path = request.store.get('path')
  const body = request.store.get('body')
  const method = request.store.get('method')
  const named = request.store.get('named')
  const jwt = request.store.get('jwt')
  const debug = request.store.get('debug')

  // have to see how jest serializes functions
  const tapResponse = request.store.get('tapResponse')
  const tapParams = request.store.get('tapParams')

  /**
   * @todo move this whole merging separately
   * @todo @invalid THIS IS OVERRIDING THE HEADERS WITH CONSTANT HEADERS!
   */
  const mergedHeaders = fromHeadersToSerialized(headers)
  const constantHeaders = config.get('constantHeaders')
  Object.keys(constantHeaders)
    // .filter(key => mergedHeaders[key] !== undefined)
    .forEach(key => {
      const constantHeader = constantHeaders[key]
      mergedHeaders[key] = toValue(request, constantHeader)
    })

  // @todo add same dynamic fn thing to params...
  const mergedParams = fromParamsToSerialized(params, request)
  const constantParams = config.get('constantParams')
  Object.assign(mergedParams, constantParams)

  const { href } = fromParamsToSerializedUrlParams(mergedParams, request)

  const asSerialized = {
    // headers,
    // mergedHeaders,
    // mergedParams,
    // params,
    params: mergedParams,
    headers: mergedHeaders,

    url,
    href,

    // urlObj,
    // baseUrl,
    // path,
    body,
    method,
    named,
    jwt,
    debug,
  }

  // @note - for snapshots
  Object.keys(asSerialized).forEach(key => {
    if (asSerialized[key] === undefined) {
      delete asSerialized[key]
    }
  })

  return asSerialized
  // const asAutoFixed = autofix(asSerialized)
  // return asAutoFixed
}