Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added pnpm package manager + refactored package managers #1022

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 0 additions & 13 deletions src/getInstallArgs.ts

This file was deleted.

20 changes: 0 additions & 20 deletions src/getInstallCmd.ts

This file was deleted.

95 changes: 95 additions & 0 deletions src/getPackageManager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import execa from 'execa';
import { existsSync } from 'fs';

export type InstallArgsMaker = (packages: string[]) => string[];

export interface PackageManager {
name: string;
install: string;
build: string;
start: string;
test: string;
lockFiles: string[];
getInstallArgs: InstallArgsMaker;
installed: boolean;
checkIsInstalled: () => Promise<any> | void;
}

export const packageManagers: { [key: string]: PackageManager } = {
yarn: {
name: 'yarn',
install: 'yarn install',
build: 'yarn build',
start: 'yarn start',
test: 'yarn test',
lockFiles: ['yarn.lock'],
getInstallArgs: packages => ['add', ...packages, '--dev'],
installed: false,
checkIsInstalled: () => execa('yarnpkg', ['--version']),
},
pnpm: {
name: 'pnpm',
install: 'pnpm i',
build: 'pnpm run build',
start: 'pnpm run start',
test: 'pnpm test',
lockFiles: ['pnpm-lock.yaml'],
getInstallArgs: packages => ['i', ...packages, '--save-dev'],
installed: false,
checkIsInstalled: () => execa('pnpm', ['--version']),
},
npm: {
name: 'npm',
install: 'npm install',
build: 'npm run build',
start: 'npm run start',
test: 'npm test',
lockFiles: ['npm-shrinkwrap.json'],
getInstallArgs: packages => ['install', ...packages, '--save-dev'],
installed: true,
checkIsInstalled: () => {},
},
};

let packageManager: PackageManager;

export type PackageManagerName = keyof typeof packageManagers;

export default async function getPackageManager(): Promise<PackageManager> {
if (packageManager) {
return packageManager;
}

// Test which package managers are installed
for (let pmName in packageManagers)
try {
await packageManagers[pmName].checkIsInstalled();
packageManagers[pmName].installed = true;
} catch (e) {}

// If a lock file exists in project, then we can't use any other package manager than that
for (let pmName in packageManagers)
for (let lockFileName of packageManagers[pmName].lockFiles) {
try {
if (existsSync(lockFileName))
return (packageManager = packageManagers[pmName]);
} catch (e) {}
}

// If user specified package_manager with 'npm config set package_manager xxx' - use it
try {
const pmName = (await execa('npm', ['config', 'get', 'package_manager']))
.stdout;
if (packageManagers[pmName as any]) {
return (packageManager = packageManagers[pmName as any]);
}
} catch (e) {}

// Else pick the first one installed
for (let pmName in packageManagers)
if (packageManagers[pmName].installed)
return (packageManager = packageManagers[pmName]);

// Else pick npm
return (packageManager = packageManagers.npm);
}
7 changes: 3 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ import {
getNodeEngineRequirement,
} from './utils';
import { concatAllArray } from 'jpjs';
import getInstallCmd from './getInstallCmd';
import getInstallArgs from './getInstallArgs';
import getPackageManager from './getPackageManager';
import { Input, Select } from 'enquirer';
import {
PackageJson,
Expand Down Expand Up @@ -240,8 +239,8 @@ prog

const installSpinner = ora(Messages.installing(deps.sort())).start();
try {
const cmd = await getInstallCmd();
await execa(cmd, getInstallArgs(cmd, deps));
const pm = await getPackageManager();
await execa(pm.name, pm.getInstallArgs(deps));
installSpinner.succeed('Installed dependencies');
console.log(await Messages.start(pkg));
} catch (error) {
Expand Down
11 changes: 2 additions & 9 deletions src/messages.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import chalk from 'chalk';
import getInstallCmd from './getInstallCmd';
import getPackageManager from './getPackageManager';
import * as Output from './output';

// This was copied from Razzle. Lots of unused stuff.
Expand Down Expand Up @@ -61,14 +61,7 @@ Creating ${chalk.bold(chalk.green(projectName))}...
};

export const start = async function(projectName: string) {
const cmd = await getInstallCmd();

const commands = {
install: cmd === 'npm' ? 'npm install' : 'yarn install',
build: cmd === 'npm' ? 'npm run build' : 'yarn build',
start: cmd === 'npm' ? 'npm run start' : 'yarn start',
test: cmd === 'npm' ? 'npm test' : 'yarn test',
};
const commands = await getPackageManager();

return `
${chalk.green('Awesome!')} You're now ready to start coding.
Expand Down