piral-cli
Version:
The standard CLI for creating and building a Piral instance or a Pilet.
127 lines (106 loc) • 3.37 kB
text/typescript
import { resolve, join } from 'path';
import { LogLevels, NpmClientType } from '../types';
import {
readJson,
checkExistingDirectory,
installNpmDependencies,
setLogLevel,
progress,
fail,
log,
logDone,
updateExistingJson,
checkExists,
repositoryUrl,
findSpecificVersion,
determineNpmClient,
ensure,
} from '../common';
export interface UpgradePiralOptions {
/**
* The version of Piral to upgrade to.
*/
version?: string;
/**
* The target Piral instance for upgrading. This is the root
* directory of the app shell, i.e., where the package.json is
* stored.
*/
target?: string;
/**
* Sets the log level to use (1-5).
*/
logLevel?: LogLevels;
/**
* Defines if the dependencies should be installed, too.
* If the option is disabled, only the package.json is
* modified, but nothing is installed yet.
*/
install?: boolean;
/**
* Defines the used npm client. By default, "npm" is used
* if no other client is autodetected. The autodetection
* works against Lerna, pnpm, and Yarn.
*/
npmClient?: NpmClientType;
}
export const upgradePiralDefaults: UpgradePiralOptions = {
version: 'latest',
target: '.',
logLevel: LogLevels.info,
install: true,
npmClient: undefined,
};
function updateDependencies(deps: Record<string, string>, version: string) {
if (deps) {
for (const name of Object.keys(deps)) {
try {
const data = require(`${name}/package.json`);
const packageRepoUrl = data?.repository?.url;
if (packageRepoUrl === repositoryUrl) {
deps[name] = version;
}
} catch {
log('packageNotInstalled_0023', name);
}
}
}
}
export async function upgradePiral(baseDir = process.cwd(), options: UpgradePiralOptions = {}) {
const {
version = upgradePiralDefaults.version,
target = upgradePiralDefaults.target,
logLevel = upgradePiralDefaults.logLevel,
install = upgradePiralDefaults.install,
npmClient: defaultNpmClient = upgradePiralDefaults.npmClient,
} = options;
ensure('baseDir', baseDir, 'string');
ensure('target', target, 'string');
const fullBase = resolve(process.cwd(), baseDir);
const root = resolve(fullBase, target);
setLogLevel(logLevel);
const valid = await checkExistingDirectory(root);
const exists = await checkExists(join(root, 'package.json'));
if (!valid || !exists) {
fail('packageJsonNotFound_0020');
}
const npmClient = await determineNpmClient(root, defaultNpmClient);
progress(`Checking provided version ...`);
const realVersion = await findSpecificVersion('piral-cli', version);
if (!realVersion) {
fail('packageVersionInvalid_0024', version);
}
log('generalDebug_0003', `Found real version: "${version}".`);
const pckg = await readJson(root, 'package.json');
log('generalDebug_0003', `Updating all dependencies ...`);
progress(`Reading installed packages ...`);
updateDependencies(pckg.devDependencies, realVersion);
updateDependencies(pckg.dependencies, realVersion);
log('generalDebug_0003', `Patching the package.json ...`);
await updateExistingJson(root, 'package.json', pckg);
if (install) {
progress(`Updating the npm packages to %s ...`, version);
await installNpmDependencies(npmClient, root);
}
logDone('Piral instance upgraded successfully!');
}