rung-tools/rung-cli

View on GitHub
src/readme.js

Summary

Maintainability
A
0 mins
Test Coverage
import fs from 'fs';
import path from 'path';
import { all, promisify } from 'bluebird';
import { compile } from 'handlebars';
import {
    keys,
    merge,
    replace,
    values,
    zipWith
} from 'ramda';
import { version as rungCliVersion } from '../package';
import { getProperties } from './vm';
import { readFile, compileSources } from './run';
import { getTypeName } from './types';
import { compileES6 } from './compiler';
import { emitSuccess } from './input';

const createFile = promisify(fs.writeFile);

/**
 * Returns the source Handlebars template as string
 *
 * @return {Promise}
 */
function getHandlebarsTemplate() {
    return readFile(path.join(__dirname, '../templates/readme.hb'), 'utf-8')
        .then(compile);
}

/**
 * Converts an object to an array containing a list of { name, version }
 *
 * @param {Object} dependencies
 * @return {Array}
 */
function dependenciesToArray(dependencies) {
    return zipWith((name, version) => ({ name, version }),
        keys(dependencies),
        values(dependencies));
}

/**
 * Converts an object to an array containing a list of { name, type, description }
 *
 * @param {Object} parameters
 * @return {Array}
 */
function parametersToArray(parameters) {
    return zipWith(
        (name, { type, description }) => ({
            name,
            type: getTypeName(type),
            description }),
        keys(parameters),
        values(parameters));
}

/**
 * Generates a full README in Markdown with documentation about input parameters
 * and the business rules of the app
 *
 * @return {Promise}
 */
export default function readme() {
    return readFile('package.json', 'utf-8')
        .then(JSON.parse)
        .then(({ name, version, author, dependencies }) =>
            all([{
                rungCliVersion,
                name,
                version,
                author,
                escapedName: replace(/-/g, '--', name),
                dependencies: dependenciesToArray(dependencies) },
            compileSources()
                .spread((source, modules) =>
                    getProperties({ name: 'pre-compile', source: compileES6(source) }, {}, modules))]))
        .spread((partialContext, result) => merge(partialContext, {
            parameters: parametersToArray(result.params),
            description: result.description,
            title: result.title
        }))
        .then(context => all([context, getHandlebarsTemplate()]))
        .spread((context, generateReadme) => generateReadme(context))
        .then(createFile('README.md', _))
        .tap(~emitSuccess('generated README.md'));
}