From f58befd7bb8b7667477bc9e760087628178f90ad Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Wed, 24 Feb 2016 08:50:04 -0500 Subject: [PATCH] ES6-ify --- spec/CLI.spec.js | 32 ++++++++++++++++--- src/cli/cli-definitions.js | 16 ++++++++-- src/cli/parse-server.js | 29 ++++++++--------- src/cli/utils/commander.js | 65 ++++++++++++++++++++------------------ 4 files changed, 89 insertions(+), 53 deletions(-) diff --git a/spec/CLI.spec.js b/spec/CLI.spec.js index 08ea2a05..6d85b476 100644 --- a/spec/CLI.spec.js +++ b/spec/CLI.spec.js @@ -1,4 +1,4 @@ -var commander = require("../src/cli/utils/commander"); +var commander = require("../src/cli/utils/commander").default; var definitions = { "arg0": "PROGRAM_ARG_0", @@ -9,10 +9,17 @@ var definitions = { "arg2": { env: "PROGRAM_ARG_2", action: function(value) { - return parseInt(value); + var value = parseInt(value); + if (!Number.isInteger(value)) { + throw "port is invalid"; + } + return value; } }, - "arg3": {} + "arg3": {}, + "arg4": { + default: "arg4Value" + } } describe("commander additions", () => { @@ -23,6 +30,7 @@ describe("commander additions", () => { delete commander.arg1; delete commander.arg2; delete commander.arg3; + delete commander.arg4; done(); }) @@ -33,6 +41,7 @@ describe("commander additions", () => { expect(commander.arg1).toEqual("arg1Value"); expect(commander.arg2).toEqual(2); expect(commander.arg3).toEqual("some"); + expect(commander.arg4).toEqual("arg4Value"); done(); }); @@ -46,12 +55,13 @@ describe("commander additions", () => { expect(commander.arg0).toEqual("arg0ENVValue"); expect(commander.arg1).toEqual("arg1ENVValue"); expect(commander.arg2).toEqual(3); + expect(commander.arg4).toEqual("arg4Value"); done(); }); it("should load properly use args over env", (done) => { commander.loadDefinitions(definitions); - commander.parse(["node","./CLI.spec.js","--arg0", "arg0Value"], { + commander.parse(["node","./CLI.spec.js","--arg0", "arg0Value", "--arg4", "anotherArg4"], { "PROGRAM_ARG_0": "arg0ENVValue", "PROGRAM_ARG_1": "arg1ENVValue", "PROGRAM_ARG_2": "4", @@ -59,7 +69,19 @@ describe("commander additions", () => { expect(commander.arg0).toEqual("arg0Value"); expect(commander.arg1).toEqual("arg1ENVValue"); expect(commander.arg2).toEqual(4); + expect(commander.arg4).toEqual("anotherArg4"); done(); }); -}) \ No newline at end of file + it("should fail in action as port is invalid", (done) => { + commander.loadDefinitions(definitions); + expect(()=> { + commander.parse(["node","./CLI.spec.js","--arg0", "arg0Value"], { + "PROGRAM_ARG_0": "arg0ENVValue", + "PROGRAM_ARG_1": "arg1ENVValue", + "PROGRAM_ARG_2": "hello", + }); + }).toThrow("port is invalid"); + done(); + }); +}); \ No newline at end of file diff --git a/src/cli/cli-definitions.js b/src/cli/cli-definitions.js index 6c2c42f3..6632d4ee 100644 --- a/src/cli/cli-definitions.js +++ b/src/cli/cli-definitions.js @@ -1,4 +1,4 @@ -module.exports = { +export default { "appId": { env: "PARSE_SERVER_APPLICATION_ID", help: "Your Parse Application ID", @@ -11,9 +11,21 @@ module.exports = { }, "serverURL": { env: "PARSE_SERVER_URL", - help: "URL to your parse server with http:// or https://", + help: "URL to your parse server with http:// or https://.", required: true }, + "port": { + port: "PORT", + help: "The port to run the ParseServer. defaults to 1337.", + default: 1337, + action: function(opt) { + opt = parseInt(opt); + if (!Number.isInteger(opt)) { + throw new Error("The port is invalid"); + } + return opt; + } + }, "databaseURI": { env: "PARSE_SERVER_DATABASE_URI", help: "The full URI to your mongodb database" diff --git a/src/cli/parse-server.js b/src/cli/parse-server.js index 1d5fb7b1..26c23ac8 100755 --- a/src/cli/parse-server.js +++ b/src/cli/parse-server.js @@ -1,9 +1,9 @@ -var path = require("path"); -var express = require('express'); -var ParseServer = require("../index").ParseServer; -var definitions = require('./cli-definitions'); -var program = require('./utils/commander'); -var colors = require('colors'); +import path from 'path'; +import express from 'express'; +import ParseServer from '../index'; +import definitions from './cli-definitions'; +import program from './utils/commander'; +import colors from 'colors'; program.loadDefinitions(definitions); @@ -34,10 +34,8 @@ program.on('--help', function(){ program.parse(process.argv, process.env); -var options = {}; - if (program.args.length > 0 ) { - var jsonPath = program.args[0]; + let jsonPath = program.args[0]; jsonPath = path.resolve(jsonPath); options = require(jsonPath); console.log(`Configuation loaded from ${jsonPath}`) @@ -51,27 +49,26 @@ if (!program.appId || !program.masterKey || !program.serverURL) { process.exit(1); } -var options = Object.keys(definitions).reduce(function (options, key) { +let options = Object.keys(definitions).reduce(function (options, key) { if (program[key]) { options[key] = program[key]; } return options; }, options); -var app = express(); -var api = new ParseServer(options); +const app = express(); +const api = new ParseServer(options); app.use(options.mountPath, api); -var port = process.env.PORT || 1337; -app.listen(port, function() { +app.listen(options.port, function() { for (let key in options) { - var value = options[key]; + let value = options[key]; if (key == "masterKey") { value = "***REDACTED***"; } console.log(`${key}: ${value}`); } console.log(''); - console.log('parse-server running on http://localhost:'+ port + options.mountPath); + console.log('parse-server running on http://localhost:'+ optins.port + options.mountPath); }); diff --git a/src/cli/utils/commander.js b/src/cli/utils/commander.js index 7fb68107..bd6446ec 100644 --- a/src/cli/utils/commander.js +++ b/src/cli/utils/commander.js @@ -1,11 +1,13 @@ -var program = require('commander'); +import { Command } from 'commander'; -var _definitions; -var _reverseDefinitions; -var _defaults; -program.loadDefinitions = function(definitions) { +let _definitions; +let _reverseDefinitions; +let _defaults; + +Command.prototype.loadDefinitions = function(definitions) { _definitions = definitions; - Object.keys(definitions).reduce(function(program, opt){ + + Object.keys(definitions).reduce((program, opt) => { if (typeof definitions[opt] == "object") { const additionalOptions = definitions[opt]; if (additionalOptions.required === true) { @@ -14,15 +16,17 @@ program.loadDefinitions = function(definitions) { return program.option(`--${opt} [${opt}]`, additionalOptions.help, additionalOptions.action); } } - return program.option(`--${opt} [${opt}]`) - }, program); - _defaults = Object.keys(definitions).reduce(function(defs, opt) { + return program.option(`--${opt} [${opt}]`); + }, this); + + _defaults = Object.keys(definitions).reduce((defs, opt) => { if(_definitions[opt].default) { defs[opt] = _definitions[opt].default; } return defs; }, {}); - _reverseDefinitions = Object.keys(definitions).reduce(function(object, key){ + + _reverseDefinitions = Object.keys(definitions).reduce((object, key) => { let value = definitions[key]; if (typeof value == "object") { value = value.env; @@ -34,21 +38,21 @@ program.loadDefinitions = function(definitions) { }, {}); /* istanbul ignore next */ - program.on('--help', function(){ + this.on('--help', function(){ console.log(' Configure From Environment:'); console.log(''); - Object.keys(_reverseDefinitions).forEach(function(key){ + Object.keys(_reverseDefinitions).forEach((key) => { console.log(` $ ${key}='${_reverseDefinitions[key]}'`); }); console.log(''); }); } -var envParser = function(env = {}) { - return Object.keys(_reverseDefinitions).reduce(function(options, key){ +function parseEnvironment(env = {}) { + return Object.keys(_reverseDefinitions).reduce((options, key) => { if (env[key]) { const originalKey = _reverseDefinitions[key]; - let action = function(option) {return option;} + let action = (option) => (option); if (typeof _definitions[originalKey] === "object") { action = _definitions[originalKey].action || action; } @@ -58,23 +62,24 @@ var envParser = function(env = {}) { }, {}); } -program._parse = program.parse; +Command.prototype.setValuesIfNeeded = function(options) { + Object.keys(options).forEach((key) => { + if (!this[key]) { + this[key] = options[key]; + } + }); +} -program.parse = function(args, env) { - program._parse(args); +Command.prototype._parse = Command.prototype.parse; + +Command.prototype.parse = function(args, env) { + this._parse(args); // Parse the environment first - var envOptions = envParser(env); + const envOptions = parseEnvironment(env); + // Load the env if not passed from command line - Object.keys(envOptions).forEach(function(key){ - if (!program[key]) { - program[key] = envOptions[key]; - } - }); - Object.keys(_defaults).forEach(function(key){ - if (!program[key]) { - program[key] = _defaults[key]; - } - }); + this.setValuesIfNeeded(envOptions); + this.setValuesIfNeeded(_defaults); } -module.exports = program; +export default new Command();