UNPKG

workflow

Version:

Workflow-centric workspace manager

211 lines (180 loc) 5.38 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var shell = _interopDefault(require('shelljs')); var child_process = require('child_process'); var os = _interopDefault(require('os')); var path = require('path'); var prompt = _interopDefault(require('prompt')); require('cross-spawn'); var WorkflowCmd = require('workflow-cmd/cli'); var util = require('util'); var execa = _interopDefault(require('execa')); var createWorkflowHome = require('create-workflow-home'); function args(args) { const parsedArgs = { named: {}, positional: [] }; const argsLength = args.length; for (let i = 2; i < argsLength; i++) { const arg = args[i]; if (arg[0] === '-') { const name = getArgName(arg); if (args[i + 1] === undefined) { parsedArgs.named[name] = true; } else { parsedArgs.named[name] = args[i + 1]; } i++; } else { parsedArgs.positional.push(arg); } } return parsedArgs; } function getArgName(arg) { let sliceIndex; const isWordArg = arg[1] === '-'; if (isWordArg) { if (arg.length === 3) throw new Error(`expected ${arg} to be a word arg`); sliceIndex = 2; } else { sliceIndex = 1; } return arg.slice(sliceIndex, arg.length); } /* eslint-disable import/prefer-default-export */ function which(cmd) { return shell.exec(`which ${cmd}`, { silent: true, async: false }); } /* eslint-env node */ const platform = process.platform; function isRunningI3() { try { child_process.execSync("i3-msg 'exec echo 1'", { stdio: 'ignore' }); return true; } catch (e) { return false; } } function isRunningWmctrl() { return which('wmctrl').code === 0; } const wm = (() => { switch (platform) { case 'win32': case 'darwin': return 'default'; case 'linux': { if (isRunningI3()) { return 'i3'; } else if (isRunningWmctrl()) { return 'wmctrl'; } return 'unknown'; } } return 'unknown'; })(); const dev = process.env.WORKFLOW_DEV_MODE === 'true'; const homedir = process.env.WORKFLOW_HOME; const devhomedir = process.env.WORKFLOW_DEV_HOME; const { config } = args(process.argv).named; let configPath; let baseFolder; (() => { if (dev) { if (devhomedir) { baseFolder = devhomedir; configPath = path.join(devhomedir, 'config.js'); } else { baseFolder = path.join(__dirname, '..', '..', 'workflow-template', 'config.js'); configPath = path.join(baseFolder, 'config.js'); } } else { if (config) { baseFolder = path.dirname(config); configPath = config; } else if (homedir) { baseFolder = homedir; configPath = path.join(baseFolder, 'config.js'); } else { configPath = path.join(os.homedir(), '.workflow', 'config.js'); baseFolder = `${os.homedir()}/.workflow`; } } })(); /* eslint-env node */ function isValidWorkflowHome(path$$1) { try { const { name } = require(path.resolve(path$$1, 'package.json')); if (name === 'workflow-user-home') { return true; } else { throw new Error(`Invalid workflow-home package name: '${name}' expected 'workflow-user-home'`); } } catch (error) { if (error.code !== 'MODULE_NOT_FOUND') { throw error; } } return false; } /* eslint-env node */ (async function cli([node, cmd, ...args]) { if (!dev) { if (!isValidWorkflowHome(baseFolder)) { await initWorkflowHome(baseFolder); } } WorkflowCmd.cli(node, cmd, args); })(process.argv).catch(err => console.error(err.toString())); async function initWorkflowHome(path$$1) { console.log(); console.log('It looks like you are using workflow for the first time.'); console.log(); console.log('Workflow requires a workflow-home directory.'); console.log('The workflow-home directory defaults to ' + path.join(os.homedir(), '.workflow')); console.log('The default location can be overriden by the environment variable WORKFLOW_HOME'); console.log(); if (homedir) { console.log('You have overriden the location to be:', path.resolve(homedir)); console.log(); } if (devhomedir) { console.log('You have overriden the dev location to be:', path.resolve(devhomedir)); console.log(); } if (await promptYesNo('Would you like to initialize a workflow-home directory at: ' + path.resolve(path$$1))) { await createWorkflowHome.createWorkflowHome(path$$1); console.log(); console.log('Running `npm install`'); await execa('npm', ['i'], { stdio: 'inherit', cwd: path$$1 }); console.log(); console.log('workflow was successfully installed. '); console.log(); console.log('Try the example with `workflow Example.js`'); } else { console.log(); console.log('Process aborted and no workflow-home was created.'); console.log('Workflow will not work until you set up a workflow-home folder.'); process.exit(1); } } async function promptYesNo(question) { const schema = { properties: { answer: { type: 'string', pattern: '^[ynYN]$', description: question + ' (y/n)', default: 'y' } } }; prompt.start(); const { answer } = await util.promisify(prompt.get)(schema); return answer === 'y' || answer === 'Y'; }