text: 'use strict'
  
  
  const Q = require('q')
  const _ = require('lodash')
  const conventionalChangelog = require('./conventional-changelog')
  const parserOpts = require('./parser-opts')
  const recommendedBumpOpts = require('./conventional-recommended-bump')
  const writerOpts = require('./writer-opts')
  
  module.exports = function (parameter) {
    // parameter passed can be either a config object or a callback function
    if (_.isFunction(parameter)) {
      // parameter is a callback object
      const config = {}
      // FIXME: use presetOpts(config) for callback
      Q.all([
        conventionalChangelog(config),
        parserOpts(config),
        recommendedBumpOpts(config),
        writerOpts(config)
      ]).spread((conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts) => {
        parameter(null, { gitRawCommitsOpts: { noMerges: null }, conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts })
      })
    } else {
      const config = parameter || {}
      return presetOpts(config)
    }
  }
  
  function presetOpts (config) {
    return Q.all([
      conventionalChangelog(config),
      parserOpts(config),
      recommendedBumpOpts(config),
      writerOpts(config)
    ]).spread((conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts) => {
      return { conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts }
    })
  }
  