forked from parse-community/parse-server
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcommander.js
More file actions
140 lines (127 loc) · 3.79 KB
/
Copy pathcommander.js
File metadata and controls
140 lines (127 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* eslint-disable no-console */
import { Command } from 'commander';
import path from 'path';
import Deprecator from '../../Deprecator/Deprecator';
let _definitions;
let _reverseDefinitions;
let _defaults;
Command.prototype.loadDefinitions = function (definitions) {
_definitions = definitions;
Object.keys(definitions).reduce((program, opt) => {
if (typeof definitions[opt] == 'object') {
const additionalOptions = definitions[opt];
if (additionalOptions.required === true) {
return program.option(
`--${opt} <${opt}>`,
additionalOptions.help,
additionalOptions.action
);
} else {
return program.option(
`--${opt} [${opt}]`,
additionalOptions.help,
additionalOptions.action
);
}
}
return program.option(`--${opt} [${opt}]`);
}, this);
_reverseDefinitions = Object.keys(definitions).reduce((object, key) => {
let value = definitions[key];
if (typeof value == 'object') {
value = value.env;
}
if (value) {
object[value] = key;
}
return object;
}, {});
_defaults = Object.keys(definitions).reduce((defs, opt) => {
if (_definitions[opt].default !== undefined) {
defs[opt] = _definitions[opt].default;
}
return defs;
}, {});
/* istanbul ignore next */
this.on('--help', function () {
console.log(' Configure From Environment:');
console.log('');
Object.keys(_reverseDefinitions).forEach(key => {
console.log(` $ ${key}='${_reverseDefinitions[key]}'`);
});
console.log('');
});
};
function parseEnvironment(env = {}) {
return Object.keys(_reverseDefinitions).reduce((options, key) => {
if (env[key]) {
const originalKey = _reverseDefinitions[key];
let action = option => option;
if (typeof _definitions[originalKey] === 'object') {
action = _definitions[originalKey].action || action;
}
options[_reverseDefinitions[key]] = action(env[key]);
}
return options;
}, {});
}
function parseConfigFile(program) {
let options = {};
if (program.args.length > 0) {
let jsonPath = program.args[0];
jsonPath = path.resolve(jsonPath);
const jsonConfig = require(jsonPath);
if (jsonConfig.apps) {
if (jsonConfig.apps.length > 1) {
throw 'Multiple apps are not supported';
}
options = jsonConfig.apps[0];
} else {
options = jsonConfig;
}
Object.keys(options).forEach(key => {
const value = options[key];
if (!_definitions[key]) {
throw `error: unknown option ${key}`;
}
const action = _definitions[key].action;
if (action) {
options[key] = action(value);
}
});
console.log(`Configuration loaded from ${jsonPath}`);
}
return options;
}
Command.prototype.setValuesIfNeeded = function (options) {
Object.keys(options).forEach(key => {
if (!Object.prototype.hasOwnProperty.call(this, key)) {
this[key] = options[key];
}
});
};
Command.prototype._parse = Command.prototype.parse;
Command.prototype.parse = function (args, env) {
this._parse(args);
// Parse the environment first
const envOptions = parseEnvironment(env);
const fromFile = parseConfigFile(this);
// Load the env if not passed from command line
this.setValuesIfNeeded(envOptions);
// Load from file to override
this.setValuesIfNeeded(fromFile);
// Scan for deprecated Parse Server options
Deprecator.scanParseServerOptions(this);
// Last set the defaults
this.setValuesIfNeeded(_defaults);
};
Command.prototype.getOptions = function () {
return Object.keys(_definitions).reduce((options, key) => {
if (typeof this[key] !== 'undefined') {
options[key] = this[key];
}
return options;
}, {});
};
export default new Command();
/* eslint-enable no-console */