'use strict' module.exports = restEndpoint const _ = require('lodash') const urlTemplate = require('url-template') const addQueryParameters = require('./add-query-parameters') const extractUrlVariableNames = require('./extract-url-variable-names') const DEFAULTS = module.exports.DEFAULTS = require('./defaults') const NON_PARAMETERS = [ 'request', 'baseUrl' ] function restEndpoint (options) { options = _.defaultsDeep({}, options, DEFAULTS) let method = options.method let baseUrl = options.baseUrl let url = options.url let body = options.body let headers = options.headers let remainingOptions = _.omit(options, ['method', 'baseUrl', 'url', 'headers']) method = method.toLowerCase() headers = _.mapKeys(headers, (value, key) => key.toLowerCase()) // replace :varname with {varname} to make it RFC 6570 compatible url = url.replace(/:(\w+)/g, '{+$1}') // extract variable names from URL to calculate remaining variables later const urlVariableNames = extractUrlVariableNames(url) url = urlTemplate.parse(url).expand(remainingOptions) if (!/^http/.test(url)) { url = (baseUrl) + url } const requestOptions = remainingOptions.request remainingOptions = _.omit(remainingOptions, _.intersection(Object.keys(options), urlVariableNames).concat(NON_PARAMETERS)) if (method === 'get' || method === 'head') { url = addQueryParameters(url, remainingOptions) } else { if ('input' in remainingOptions) { body = remainingOptions.input } else { body = Object.keys(remainingOptions).length ? remainingOptions : undefined } } return Object.assign(requestOptions, { method, url, headers, body }) }