@puls-atlas/cli
Version:
The Puls Atlas CLI tool for managing Atlas projects
69 lines • 2.31 kB
JavaScript
import chalk from 'chalk';
import inquirer from 'inquirer';
import { execSync } from './shell.js';
import { logger } from './logger.js';
const getConfirmationMessage = action => `Continue ${action} the latest ${chalk.yellow('Composer dependencies')}`;
const confirmComposerAction = async (action, options = {}, dependencies = {}) => {
const {
promptImpl = inquirer.prompt
} = dependencies;
if (options.allYes === true) {
return true;
}
const {
isConfirmed
} = await promptImpl([{
type: 'confirm',
name: 'isConfirmed',
default: true,
message: getConfirmationMessage(action)
}]);
return isConfirmed;
};
const runComposerCommand = (action, options = {}, dependencies = {}) => {
const {
execSyncImpl = execSync
} = dependencies;
const commandOptions = {
cwd: options.cwd,
dryRun: options.dryRun === true,
ignorePlatformReqs: options.force === true,
log: options.log === true
};
try {
return execSyncImpl(`composer ${action}`, commandOptions);
} catch (error) {
const workingDirectory = options.cwd ?? process.cwd();
const renderedCommand = ['composer', action, commandOptions.dryRun ? '--dry-run' : null, commandOptions.ignorePlatformReqs ? '--ignore-platform-reqs' : null].filter(Boolean).join(' ');
throw new Error(`${renderedCommand} failed in ${workingDirectory}. ${error.message}`);
}
};
const manageComposerDependencies = async (action, options = {}, dependencies = {}) => {
const {
execSyncImpl = execSync,
loggerImpl = logger,
promptImpl = inquirer.prompt
} = dependencies;
const isConfirmed = await confirmComposerAction(action, options, {
promptImpl
});
if (!isConfirmed) {
loggerImpl.info(`Composer ${action} cancelled.`);
return;
}
loggerImpl.info(`Simulating composer ${action}...`);
runComposerCommand(action, {
...options,
dryRun: true
}, {
execSyncImpl
});
runComposerCommand(action, {
...options,
log: true
}, {
execSyncImpl
});
};
export const installComposerDependencies = async (options = {}, dependencies = {}) => manageComposerDependencies('install', options, dependencies);
export const updateComposerDependencies = async (options = {}, dependencies = {}) => manageComposerDependencies('update', options, dependencies);