Files
ohif-viewer/platform/cli/src/index.js
2025-03-07 13:47:44 +07:00

204 lines
5.4 KiB
JavaScript
Executable File

#!/usr/bin/env node
import { Command } from 'commander';
import inquirer from 'inquirer';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import { getPathQuestions, getRepoQuestions } from './questions.js';
import {
createPackage,
addExtension,
removeExtension,
addMode,
removeMode,
listPlugins,
searchPlugins,
linkExtension,
linkMode,
unlinkExtension,
unlinkMode,
} from './commands/index.js';
import chalk from 'chalk';
const runningDirectory = process.cwd();
const viewerDirectory = path.resolve(runningDirectory, 'platform/app');
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const packageJsonPath = path.join(runningDirectory, 'package.json');
try {
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
if (packageJson.name !== 'ohif-monorepo-root') {
console.log(packageJson);
console.log(chalk.red('ohif-cli must run from the root of the OHIF platform'));
process.exit(1);
}
} catch (error) {
console.log(chalk.red('ohif-cli must run from the root of the OHIF platform'));
process.exit(1);
}
function _createPackage(packageType) {
const pathQuestions = getPathQuestions(packageType);
const repoQuestions = getRepoQuestions(packageType);
let pathAnswers;
const askPathQuestions = () => {
inquirer.prompt(pathQuestions).then(answers => {
pathAnswers = answers;
if (pathAnswers.confirm) {
askRepoQuestions(answers.baseDir, answers.name);
} else {
askPathQuestions();
}
});
};
const askRepoQuestions = () => {
inquirer.prompt(repoQuestions).then(repoAnswers => {
const answers = {
...pathAnswers,
...repoAnswers,
};
const templateDir = path.join(__dirname, `../templates/${packageType}`);
answers.templateDir = templateDir;
answers.targetDir = path.join(answers.baseDir);
answers.packageType = packageType;
createPackage(answers);
});
};
askPathQuestions();
}
// for now ohif-cli is ran through yarn only.
// see ohif-cli.md section # OHIF Command Line Interface for reference.
const program = new Command('yarn run cli');
// Todo: inject with webpack
program
.version('2.0.7')
.description('OHIF CLI')
.configureHelp({ sortOptions: true, sortSubcommands: true })
.showHelpAfterError('(add --help for additional information)');
program
.command('create-extension')
.description('Create a new template Extension')
.action(() => {
_createPackage('extension');
});
program
.command('create-mode')
.description('Create a new template Mode')
.action(() => {
_createPackage('mode');
});
program
.command('add-extension <packageName> [version]')
.description('Adds an OHIF Extension')
.action((packageName, version) => {
// change directory to viewer
process.chdir(viewerDirectory);
addExtension(packageName, version);
});
program
.command('remove-extension <packageName>')
.description('Removes an OHIF Extension')
.action(packageName => {
// change directory to viewer
process.chdir(viewerDirectory);
removeExtension(packageName);
});
program
.command('add-mode <packageName> [version]')
.description('Add an OHIF Mode')
.action((packageName, version) => {
// change directory to viewer
process.chdir(viewerDirectory);
addMode(packageName, version);
});
program
.command('remove-mode <packageName>')
.description('Removes an OHIF Mode')
.action(packageName => {
// change directory to viewer
process.chdir(viewerDirectory);
removeMode(packageName);
});
program
.command('link-extension <packageDir>')
.description('Links a local OHIF Extension to the Viewer to be used for development')
.action(packageDir => {
if (!fs.existsSync(packageDir)) {
console.log(
chalk.red('The Extension directory does not exist, please provide a valid directory')
);
process.exit(1);
}
linkExtension(packageDir, { viewerDirectory });
});
program
.command('unlink-extension <extensionName>')
.description('Unlinks a local OHIF Extension from the Viewer')
.action(extensionName => {
unlinkExtension(extensionName, { viewerDirectory });
console.log(
chalk.green(
`Successfully unlinked Extension ${extensionName} from the Viewer, don't forget to run yarn install --force`
)
);
});
program
.command('link-mode <packageDir>')
.description('Links a local OHIF Mode to the Viewer to be used for development')
.action(packageDir => {
if (!fs.existsSync(packageDir)) {
console.log(chalk.red('The Mode directory does not exist, please provide a valid directory'));
process.exit(1);
}
linkMode(packageDir, { viewerDirectory });
});
program
.command('unlink-mode <modeName>')
.description('Unlinks a local OHIF Mode from the Viewer')
.action(modeName => {
unlinkMode(modeName, { viewerDirectory });
console.log(
chalk.green(
`Successfully unlinked Mode ${modeName} from the Viewer, don't forget to run yarn install --force`
)
);
});
program
.command('list')
.description('List Added Extensions and Modes')
.action(() => {
const configPath = path.resolve(viewerDirectory, './pluginConfig.json');
listPlugins(configPath);
});
program
.command('search')
.option('-v, --verbose', 'Verbose output')
.description('Search NPM for the list of Modes and Extensions')
.action(options => {
searchPlugins(options);
});
program.parse(process.argv);