diff --git a/lib/bin/cli.js b/lib/bin/cli.js index 1360bac38..58fb57273 100644 --- a/lib/bin/cli.js +++ b/lib/bin/cli.js @@ -23,21 +23,20 @@ const withPassword = (f) => { prompt.get([{ name: 'password', hidden: true, replace: '*' }], (_, { password }) => f(password)); }; -// command line nonsense (i'm not a huge fan of this library). -const cli = require('cli'); -const cliArgs = { - email: [ 'u', 'For user create and set password commands, supplies the email.', 'email' ] -}; -const cliCommands = [ 'user-create', 'user-promote', 'user-set-password' ]; -cli.parse(cliArgs, cliCommands); - -// map commands to tasks. -cli.main((args, options) => { - if (cli.command === 'user-create') - withPassword((password) => run(createUser(options.email, password))); - else if (cli.command === 'user-promote') - run(promoteUser(options.email)); - else if (cli.command === 'user-set-password') - withPassword((password) => run(setUserPassword(options.email, password))); -}); +const { Command } = require('commander'); +const program = new Command('node lib/bin/cli.js'); + +const email = () => program.opts().email; + +program.requiredOption('-u, --email '); + +program.command('user-create') + .action(() => withPassword((password) => run(createUser(email(), password)))); + +program.command('user-promote') + .action(() => run(promoteUser(email()))); + +program.command('user-set-password') + .action(() => withPassword((password) => run(setUserPassword(email(), password)))); +program.parse(); diff --git a/lib/bin/create-docker-databases.js b/lib/bin/create-docker-databases.js index 7fde3a52e..b191e8073 100644 --- a/lib/bin/create-docker-databases.js +++ b/lib/bin/create-docker-databases.js @@ -11,18 +11,19 @@ // be run in a Docker environment in which the POSTGRES_PASSWORD environment // variable is set to 'odktest'. -const cli = require('cli'); const knex = require('knex'); +const { program } = require('commander'); const connect = (database) => knex({ client: 'pg', connection: { host: 'localhost', user: 'postgres', password: 'odktest', database } }); -cli.parse({ - log: ['l', 'Print all db statements to log.', 'bool'] -}); -cli.main(async (_, { log }) => { +program.option('-l', 'Print all db statements to log.'); +program.parse(); +const { log } = program.opts(); + +(async () => { const dbmain = connect('postgres'); await dbmain.raw("create user jubilant with password 'jubilant';"); await Promise.all(['jubilant', 'jubilant_test'].map(async (database) => { @@ -41,4 +42,4 @@ cli.main(async (_, { log }) => { } dbmain.destroy(); -}); +})(); diff --git a/lib/bin/purge-forms.js b/lib/bin/purge-forms.js index f31ba129f..33aa77d76 100644 --- a/lib/bin/purge-forms.js +++ b/lib/bin/purge-forms.js @@ -13,14 +13,13 @@ const { run } = require('../task/task'); const { purgeForms } = require('../task/purge'); -const cli = require('cli'); -const cliArgs = { - force: [ 'f', 'Force any soft-deleted form to be purged right away.', 'bool', false ], - formId: [ 'i', 'Purge a specific form based on its id.', 'int' ], - projectId: [ 'p', 'Restrict purging to a specific project.', 'int' ], -}; -cli.parse(cliArgs); +const { program } = require('commander'); +program.option('-f', 'Force any soft-deleted form to be purged right away.'); +program.option('-i ', 'Purge a specific form based on its id.', parseInt); +program.option('-p ', 'Restrict purging to a specific project.', parseInt); +program.parse(); -cli.main((args, options) => - run(purgeForms(options.force, options.formId, options.projectId) - .then((count) => `Forms purged: ${count}`))); +const options = program.opts(); + +run(purgeForms(options.force, options.formId, options.projectId) + .then((count) => `Forms purged: ${count}`)); diff --git a/lib/bin/run-analytics.js b/lib/bin/run-analytics.js index 65472cea1..76db70f74 100644 --- a/lib/bin/run-analytics.js +++ b/lib/bin/run-analytics.js @@ -14,12 +14,10 @@ const { run } = require('../task/task'); const { runAnalytics } = require('../task/analytics'); -const cli = require('cli'); -const cliArgs = { - force: [ 'f', 'Force analytics to be sent (if configured) even if not scheduled yet.', 'bool' ] -}; -cli.parse(cliArgs); +const { program } = require('commander'); +program.option('-f', 'Force analytics to be sent (if configured) even if not scheduled yet.'); +program.parse(); -cli.main((args, options) => { - run(runAnalytics(options.force)); -}); +const options = program.opts(); + +run(runAnalytics(options.force)); diff --git a/package-lock.json b/package-lock.json index b9bcb02f9..ef2f3ca80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,8 +12,8 @@ "archiver": "~5", "bcrypt": "~5", "body-parser": "~1.20", - "cli": "~1", "cloneable-readable": "~2", + "commander": "^10.0.1", "config": "~1.31", "csv-parse": "~4", "csv-stringify": "~5", @@ -2153,18 +2153,6 @@ "node": ">=6" } }, - "node_modules/cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", - "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "engines": { - "node": ">=0.2.5" - } - }, "node_modules/cli-tableau": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", @@ -2269,11 +2257,11 @@ } }, "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { - "node": ">= 6" + "node": ">=14" } }, "node_modules/commondir": { @@ -3362,14 +3350,6 @@ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -5645,6 +5625,14 @@ } } }, + "node_modules/knex/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/knex/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -11900,15 +11888,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, "cli-tableau": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", @@ -11994,9 +11973,9 @@ } }, "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" }, "commondir": { "version": "1.0.1", @@ -12845,11 +12824,6 @@ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -14545,6 +14519,11 @@ "v8flags": "^3.2.0" }, "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", diff --git a/package.json b/package.json index 54aea22bd..819de14be 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "archiver": "~5", "bcrypt": "~5", "body-parser": "~1.20", - "cli": "~1", "cloneable-readable": "~2", + "commander": "^10.0.1", "config": "~1.31", "csv-parse": "~4", "csv-stringify": "~5",