workflow
Version:
Workflow-centric workspace manager
211 lines (180 loc) • 5.38 kB
JavaScript
;
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';
}