UNPKG

@webos-tools/cli

Version:

Command Line Interface for development webOS application and service

211 lines (184 loc) 6.6 kB
#!/usr/bin/env node /* * Copyright (c) 2020-2024 LG Electronics Inc. * * SPDX-License-Identifier: Apache-2.0 */ const async = require('async'), nopt = require('nopt'), log = require('npmlog'), path = require('path'), commonTools = require('./../lib/base/common-tools'); const version = commonTools.version, cliControl = commonTools.cliControl, help = commonTools.help, appdata = commonTools.appdata, errHndl = commonTools.errMsg; const processName = path.basename(process.argv[1]).replace(/.js/, ''); process.on('uncaughtException', function(err) { log.error('uncaughtException', err.toString()); log.verbose('uncaughtException', err.stack); cliControl.end(-1); }); if (process.argv.length === 2) { process.argv.splice(2, 0, '--help'); } const knownOpts = { // generic options "help": Boolean, "version": Boolean, "level": ['silly', 'verbose', 'info', 'http', 'warn', 'error'], // command-specific options "profile": [String, null], "profile-details": Boolean }; const shortHands = { // generic aliases "h": ["--help"], "V": ["--version"], "v": ["--level", "verbose"], "p": ["--profile"], "c": ["--profile-details"] }; const argv = nopt(knownOpts, shortHands, process.argv, 2 /* drop 'node' & 'ares-*.js'*/); log.heading = processName; log.level = argv.level || 'warn'; log.verbose("argv", argv); /** * For consistent of "$command -v", argv is used. * By nopt, argv is parsed and set key-value in argv object. * If -v or --level option is input with command, it is set key-value in argv. * After it is deleted, If remained key is only one in argv object * (If any other are remained, it's mean another options is input) * and there is no remaining after parsing the input command by nopt * (If any other are remained, it's mean another parameters ares input), * each command of webOS CLI print help message with log message. */ if (argv.level) { delete argv.level; if (argv.argv.remain.length === 0 && (Object.keys(argv)).length === 1) { argv.help = true; } } const options = { profile: argv.profile }; const configFiles = { "ose": "files/conf-base/profile/config-ose.json", "tv": "files/conf-base/profile/config-tv.json", "apollo": "files/conf-base/profile/config-apollo.json", "signage":"files/conf-base/profile/config-signage.json" }; const envFiles = { "ose": "files/conf-base/env/sdk-ose.json", "tv": "files/conf-base/env/sdk-tv.json", "apollo": "files/conf-base/env/sdk-apollo.json", "signage": "files/conf-base/env/sdk-signage.json" }; const templateFiles = { "ose": "files/conf-base/template-conf/ose-templates.json", "tv": "files/conf-base/template-conf/tv-sdk-templates.json", "apollo": "files/conf-base/template-conf/apollo-sdk-templates.json", "signage": "files/conf-base/template-conf/signage-sdk-templates.json" }; const queryPaths = { "common": "files/conf-base/query/", "signage": "files/conf-base/query/signage" }; const keyFiles = { "signage" : "files/conf-base/key/pubkey-signage.pem" }; let op; if (argv.version) { version.showVersionAndExit(); } else if (argv.help) { help.display(processName, appdata.getConfig(true).profile); cliControl.end(); } else if (argv['profile-details']) { op = curConfig; } else { op = config; } if (op) { version.checkNodeVersion(function(err) { if (err) return finish(err); async.series([ op.bind(this) ],finish); }); } function config() { log.info("config()", "options:", options); if (!Object.prototype.hasOwnProperty.call(configFiles, options.profile)) { if (options.profile === 'true') { return finish(errHndl.getErrMsg("EMPTY_VALUE", "profile")); } return finish(errHndl.getErrMsg("INVALID_VALUE", "profile", options.profile)); } let queryPath = queryPaths.common; if(options.profile === 'signage'){ queryPath = queryPaths.signage; } appdata.setQuery(path.join(__dirname, '..', queryPath), function(err, status) { if (typeof status === 'undefined') return finish(errHndl.getErrMsg("INVALID_VALUE", "query configuration")); }); const templateData = require(path.join(__dirname, '..', templateFiles[options.profile])); appdata.setTemplate(templateData, function(err, status) { if (typeof status === 'undefined') return finish(errHndl.getErrMsg("INVALID_VALUE", "template configuration")); }); const envData = require(path.join(__dirname, '..', envFiles[options.profile])); appdata.setEnv(envData, function(err, status) { if (typeof status === 'undefined') return finish(errHndl.getErrMsg("INVALID_VALUE", "env configuration")); }); let keyFile = ""; if (keyFiles[options.profile]) { keyFile = path.join(__dirname, '..', keyFiles[options.profile]); } appdata.setKey(keyFile, function(err) { if (err) return finish(errHndl.getErrMsg("INVALID_VALUE", "key configuration")); }); const configData = require(path.join(__dirname, '..', configFiles[options.profile])); appdata.setConfig(configData, function(err, status) { if (typeof status === 'undefined') { return finish(errHndl.getErrMsg("INVALID_VALUE", "configuration")); } finish(err, {msg: "profile and config data is changed to " + status.profile}); }); } function curConfig() { const curConfigData = appdata.getConfig(true); if (typeof curConfigData.profile === 'undefined') { return finish(errHndl.getErrMsg("INVALID_VALUE", "profile details")); } else if (curConfigData.profile.trim() === "") { return finish(errHndl.getErrMsg("EMPTY_PROFILE")); } finish(null, {msg: "Current profile set to " + curConfigData.profile}); } function finish(err, value) { log.info("finish()"); if (err) { // handle err from getErrMsg() if (Array.isArray(err) && err.length > 0) { for (const index in err) { log.error(err[index].heading, err[index].message); } log.verbose(err[0].stack); } else { // handle general err (string & object) log.error(err.toString()); log.verbose(err.stack); } cliControl.end(-1); } else { log.verbose("finish()", "value:", value); if (value && value.msg) { console.log(value.msg); } cliControl.end(); } }