Codibre/anypm

View on GitHub
src/lib/install.ts

Summary

Maintainability
A
35 mins
Test Coverage
A
92%
import { getTypes } from './get-types';
import { getCommand } from './get-command';
import { manageLocks } from './manage-locks';
import { prepareManager } from './prepare-manager';
import { mountNpmCommand } from './mount-npm-command';
import { BaseOptions, prepareOptions } from './prepare-options';
import { properHoist } from './proper-hoist';

interface InstallOptions extends BaseOptions {
    saveDev: boolean;
    global?: boolean;
}

const ARG0 = 'install';

export async function* install(
    packages: string[],
    informedOptions: InstallOptions,
) {
    const options = prepareOptions(informedOptions);
    const { hasCommand, command } = await getCommand();
    yield* prepareManager(hasCommand, packages.length === 0);
    const hasPackages = packages.length > 0;
    if (options.global) {
        packages.unshift('-g');
    }
    packages.unshift(properHoist);

    yield mountNpmCommand(command, ARG0, packages, options.saveDev);

    if (hasPackages) {
        const types = await getTypes(packages);

        if (types.length > 0) {
            if (options.global) {
                packages.unshift('-g');
            }
            types.unshift(properHoist);
            yield mountNpmCommand(command, ARG0, types, true);
        }
    }

    yield* manageLocks(hasCommand, options);
}