farneman/abstrax

View on GitHub
src/index.js

Summary

Maintainability
A
55 mins
Test Coverage
// @flow

import jQuery from 'jquery';

import template from './micro_template';

const templateDelimiter = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/;

const immutableAssign = (...args) => Object.assign({}, ...args);

const createRequester = (addFor, request) => {
  const requester = function (payload) {
    const preparedPayload = request.dataType === 'json' ? JSON.stringify(payload) : payload;
    const requestWithPayload = immutableAssign(request, {data: preparedPayload});

    if (typeof requestWithPayload.url === 'function') {
      throw new Error('Must supply url keys before calling fulfill');
    }

    return jQuery.ajax(requestWithPayload);
  };

  if (addFor) {
    requester.for = (urlParams) => createRequester(false, immutableAssign(request, {
      url: typeof request.url === 'function' ? request.url(urlParams) : request.url
    }));
  }

  return requester;
};

export default function abstrax(config: Object) {
  const defaultConfig = immutableAssign({
    method: 'GET',
    dataType: 'json',
    contentType: 'application/json; charset=utf-8'
  }, config.defaults);

  const requestCreator = (requests, requestKey) => {
    const request = config.requests[requestKey];

    if (!request.url) {
      return requests;
    }

    requests[requestKey] = createRequester(true, immutableAssign(defaultConfig, request, {
      url: templateDelimiter.test(request.url) ? template(request.url) : request.url
    }));

    return requests;
  };

  return Object.keys(config.requests)
    .reduce(requestCreator, {});
}