Skip to content

Commit 6d70d8a

Browse files
authored
fix: config options like --port or --config are ignored (#2113)
1 parent 728d114 commit 6d70d8a

File tree

2 files changed

+73
-22
lines changed

2 files changed

+73
-22
lines changed

Parse-Dashboard/index.js

+23-22
Original file line numberDiff line numberDiff line change
@@ -33,40 +33,41 @@ program.option('--createUser', 'helper tool to allow you to generate secure user
3333
program.option('--createMFA', 'helper tool to allow you to generate multi-factor authentication secrets.');
3434

3535
program.parse(process.argv);
36+
const options = program.opts();
3637

37-
for (const key in program) {
38+
for (const key in options) {
3839
const func = CLIHelper[key];
3940
if (func && typeof func === 'function') {
4041
func();
4142
return;
4243
}
4344
}
4445

45-
const host = program.host || process.env.HOST || '0.0.0.0';
46-
const port = program.port || process.env.PORT || 4040;
47-
const mountPath = program.mountPath || process.env.MOUNT_PATH || '/';
48-
const allowInsecureHTTP = program.allowInsecureHTTP || process.env.PARSE_DASHBOARD_ALLOW_INSECURE_HTTP;
49-
const cookieSessionSecret = program.cookieSessionSecret || process.env.PARSE_DASHBOARD_COOKIE_SESSION_SECRET;
50-
const trustProxy = program.trustProxy || process.env.PARSE_DASHBOARD_TRUST_PROXY;
51-
const dev = program.dev;
46+
const host = options.host || process.env.HOST || '0.0.0.0';
47+
const port = options.port || process.env.PORT || 4040;
48+
const mountPath = options.mountPath || process.env.MOUNT_PATH || '/';
49+
const allowInsecureHTTP = options.allowInsecureHTTP || process.env.PARSE_DASHBOARD_ALLOW_INSECURE_HTTP;
50+
const cookieSessionSecret = options.cookieSessionSecret || process.env.PARSE_DASHBOARD_COOKIE_SESSION_SECRET;
51+
const trustProxy = options.trustProxy || process.env.PARSE_DASHBOARD_TRUST_PROXY;
52+
const dev = options.dev;
5253

5354
if (trustProxy && allowInsecureHTTP) {
5455
console.log('Set only trustProxy *or* allowInsecureHTTP, not both. Only one is needed to handle being behind a proxy.');
5556
process.exit(-1);
5657
}
5758

58-
let explicitConfigFileProvided = !!program.config;
59+
let explicitConfigFileProvided = !!options.config;
5960
let configFile = null;
6061
let configFromCLI = null;
61-
let configServerURL = program.serverURL || process.env.PARSE_DASHBOARD_SERVER_URL;
62-
let configGraphQLServerURL = program.graphQLServerURL || process.env.PARSE_DASHBOARD_GRAPHQL_SERVER_URL;
63-
let configMasterKey = program.masterKey || process.env.PARSE_DASHBOARD_MASTER_KEY;
64-
let configAppId = program.appId || process.env.PARSE_DASHBOARD_APP_ID;
65-
let configAppName = program.appName || process.env.PARSE_DASHBOARD_APP_NAME;
66-
let configUserId = program.userId || process.env.PARSE_DASHBOARD_USER_ID;
67-
let configUserPassword = program.userPassword || process.env.PARSE_DASHBOARD_USER_PASSWORD;
68-
let configSSLKey = program.sslKey || process.env.PARSE_DASHBOARD_SSL_KEY;
69-
let configSSLCert = program.sslCert || process.env.PARSE_DASHBOARD_SSL_CERT;
62+
let configServerURL = options.serverURL || process.env.PARSE_DASHBOARD_SERVER_URL;
63+
let configGraphQLServerURL = options.graphQLServerURL || process.env.PARSE_DASHBOARD_GRAPHQL_SERVER_URL;
64+
let configMasterKey = options.masterKey || process.env.PARSE_DASHBOARD_MASTER_KEY;
65+
let configAppId = options.appId || process.env.PARSE_DASHBOARD_APP_ID;
66+
let configAppName = options.appName || process.env.PARSE_DASHBOARD_APP_NAME;
67+
let configUserId = options.userId || process.env.PARSE_DASHBOARD_USER_ID;
68+
let configUserPassword = options.userPassword || process.env.PARSE_DASHBOARD_USER_PASSWORD;
69+
let configSSLKey = options.sslKey || process.env.PARSE_DASHBOARD_SSL_KEY;
70+
let configSSLCert = options.sslCert || process.env.PARSE_DASHBOARD_SSL_CERT;
7071

7172
function handleSIGs(server) {
7273
const signals = {
@@ -86,7 +87,7 @@ function handleSIGs(server) {
8687
});
8788
}
8889

89-
if (!program.config && !process.env.PARSE_DASHBOARD_CONFIG) {
90+
if (!options.config && !process.env.PARSE_DASHBOARD_CONFIG) {
9091
if (configServerURL && configMasterKey && configAppId) {
9192
configFromCLI = {
9293
data: {
@@ -114,13 +115,13 @@ if (!program.config && !process.env.PARSE_DASHBOARD_CONFIG) {
114115
} else if (!configServerURL && !configMasterKey && !configAppName) {
115116
configFile = path.join(__dirname, 'parse-dashboard-config.json');
116117
}
117-
} else if (!program.config && process.env.PARSE_DASHBOARD_CONFIG) {
118+
} else if (!options.config && process.env.PARSE_DASHBOARD_CONFIG) {
118119
configFromCLI = {
119120
data: JSON.parse(process.env.PARSE_DASHBOARD_CONFIG)
120121
};
121122
} else {
122-
configFile = program.config;
123-
if (program.appId || program.serverURL || program.masterKey || program.appName || program.graphQLServerURL) {
123+
configFile = options.config;
124+
if (options.appId || options.serverURL || options.masterKey || options.appName || options.graphQLServerURL) {
124125
console.log('You must provide either a config file or other CLI options (appName, appId, masterKey, serverURL, and graphQLServerURL); not both.');
125126
process.exit(3);
126127
}

src/lib/tests/e2e/dashboard.e2e.test.js

+50
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
jest.disableAutomock();
1010

1111
const express = require('express');
12+
const path = require('path');
13+
const spawn = require('child_process').spawn;
1214
const ParseDashboard = require('../../../../Parse-Dashboard/app');
1315
const puppeteer = require('puppeteer');
1416

@@ -46,3 +48,51 @@ describe('dashboard e2e', () => {
4648
server.close();
4749
});
4850
});
51+
52+
53+
describe('Config options', () => {
54+
it('should start with port option', async () => {
55+
const result = await startParseDashboardAndGetOutput(['--port', '4041']);
56+
expect(result).toContain('The dashboard is now available at http://0.0.0.0:4041/');
57+
});
58+
59+
it('should reject to start if config and other options are combined', async () => {
60+
const args = [
61+
'--appId',
62+
'--serverURL',
63+
'--masterKey',
64+
'--appName',
65+
'--graphQLServerURL'
66+
];
67+
68+
for (const arg of args) {
69+
const result = await startParseDashboardAndGetOutput(['--config', 'helloworld', arg, 'helloworld']);
70+
expect(result).toContain('You must provide either a config file or other CLI options (appName, appId, masterKey, serverURL, and graphQLServerURL); not both.');
71+
}
72+
});
73+
});
74+
75+
function startParseDashboardAndGetOutput(args) {
76+
const timeoutInMs = 1000;
77+
return new Promise((resolve) => {
78+
const indexFilePath = path.resolve('./Parse-Dashboard/index.js');
79+
const child = spawn('node', [indexFilePath, ...args], { cwd: '.', timeout: timeoutInMs });
80+
setTimeout(() => { child.kill(); }, timeoutInMs); // node.js 12 hack (spawn timeout option is not supported.)
81+
82+
let output = '';
83+
child.on('error', () => { resolve(output); });
84+
child.on('close', () => { resolve(output); });
85+
86+
if (child.stdout) {
87+
child.stdout.on('data', data => {
88+
output += `STDOUT: ${data}\n`;
89+
});
90+
}
91+
92+
if (child.stderr) {
93+
child.stderr.on('data', data => {
94+
output += `STDERROR: ${data}\n`;
95+
});
96+
}
97+
});
98+
}

0 commit comments

Comments
 (0)