e-ucm/rage-analytics-games

View on GitHub
bin/setup.js

Summary

Maintainability
A
2 hrs
Test Coverage
#!/usr/bin/env node
'use strict';

/**
 * This file is used to generate 'config.js' (used during execution 'npm start') and
 * 'config-test.js' (used while testing 'npm test') files.
 *
 * In order to create the files, needs some predefined values stored in 'config-values.js'.
 * For more information about these values, checkout 'config-values.js'.
 *
 * config.js is generated using the 'defaultValues' from 'config-values.js'.
 * config-test.js is generated using the 'testValues' from 'config-values.js'.
 * *
 * Usage:
 *
 *      'npm run setup' - Generates the files asking the user for the values and suggesting the default values from 'config-values.js'.
 *      'npm run fast-setup' - Generates the files directly using the values from 'config-values.js'.
 *
 */

var Fs = require('fs');
var Path = require('path');
var Async = require('async');
var Promptly = require('promptly');
var Handlebars = require('handlebars');

var configTemplatePath = Path.resolve(__dirname, '../config-example.js');
var configTestPath = Path.resolve(__dirname, '../config-test.js');
var configPath = Path.resolve(__dirname, '../config.js');

var configValue = require(Path.resolve(__dirname, '../config-values.js'));
var defaultValues = configValue.defaultValues;
var testValues = configValue.testValues;


if (process.env.NODE_ENV === 'test') {

    var options = {
        encoding: 'utf-8'
    };
    var source = Fs.readFileSync(configTemplatePath, options);
    var configTemplate = Handlebars.compile(source);
    Fs.writeFileSync(configPath, configTemplate(defaultValues));
    Fs.writeFileSync(configTestPath, configTemplate(testValues));
    console.log('Setup complete.');
    process.exit(0);

} else {
    Async.auto({

        projectName: function (done) {

            var promptOptions = {
                default: defaultValues.projectName || 'Rage Analytics Games'
            };

            Promptly.prompt('Project name: (' + promptOptions.default + ')', promptOptions, done);
        },
        companyName: ['projectName', function (done) {

            var promptOptions = {
                default: defaultValues.companyName || 'e-UCM Research Group'
            };

            Promptly.prompt('Company name: (' + promptOptions.default + ')', promptOptions, done);
        }],
        secretKey: ['companyName', function (done) {

            var promptOptions = {
                default: defaultValues.secretKey || 'testkey'
            };

            Promptly.prompt('Secret key: (' + promptOptions.default + ')', promptOptions, done);
        }],
        port: ['secretKey', function (done) {

            var promptOptions = {
                default: defaultValues.port || 3450
            };

            Promptly.prompt('API root path: (' + promptOptions.default + ')', promptOptions, done);
        }],
        createConfig: ['port', function (done, results) {

            var fsOptions = {
                encoding: 'utf-8'
            };

            Fs.readFile(configTemplatePath, fsOptions, function (err, src) {

                if (err) {
                    console.error('Failed to read config-example template.');
                    return done(err);
                }

                for (var result in results) {
                    if (results.hasOwnProperty(result)) {
                        defaultValues[result] = results[result];
                    }
                }

                var configTemplate = Handlebars.compile(src);
                Fs.writeFile(configPath, configTemplate(defaultValues), function (err) {
                    if (err) {
                        console.error('Failed to write config.js file.');
                        return done(err);
                    }
                    Fs.writeFile(configTestPath, configTemplate(testValues), done);
                });
            });
        }]
    }, function (err) {

        if (err) {
            console.error('Setup failed.');
            console.error(err);
            return process.exit(1);
        }

        console.log('Setup complete.');
        process.exit(0);
    });
}