diff --git a/cli.js b/cli.js index a7bbc3a..9493e13 100755 --- a/cli.js +++ b/cli.js @@ -15,6 +15,7 @@ const readPkg = require('read-pkg'); const Conf = require('conf'); const { default: PQueue } = require('p-queue'); const updateNotifier = require('update-notifier'); +const hasYarn = require('has-yarn'); const cli = meow(` Usage @@ -67,6 +68,34 @@ if (['link', 'connect', 'reset'].includes(cmd)) { } } +let packageManager; + +if (hasYarn(cwd)) { + packageManager = { + add: modules => execa('yarn', ['add', ...modules]), + addDev: modules => execa('yarn', ['add', '--dev', ...modules]), + pack: (packFile, depPath) => + execa('yarn', ['pack', '--filename', packFile], { cwd: depPath }) + }; +} else { + packageManager = { + add: modules => execa('npm', ['install', ...modules]), + addDev: modules => execa('npm', ['install', '--save-dev', ...modules]), + pack: async (packFile, depPath) => { + const parsedPath = path.parse(packFile); + const filename = parsedPath.base; + // The filename npm creates doesn't have a timestamp + const packName = filename.substring(0, filename.lastIndexOf('-')) + '.tgz'; + const cacheDir = parsedPath.dir; + + await execa('npm', ['pack', depPath], { cwd: cacheDir }); + fs.renameSync( + path.join(cacheDir, packName), + path.join(cacheDir, filename)); + } + }; +} + switch (cmd) { case 'link': link(); @@ -205,13 +234,13 @@ async function reset() { if (normal.length > 0) { spinner.start(`Resetting normal dependencies: ${normal.join(' ')}`); - await execa('yarn', ['add', ...normal]); + await packageManager.add(normal); spinner.succeed(); } if (dev.length > 0) { spinner.start(`Resetting dev dependencies: ${dev.join(' ')}`); - await execa('yarn', ['add', ...dev, '--dev']); + await packageManager.addDev(dev); spinner.succeed(); } spinner.start('Cleaning up'); @@ -230,7 +259,7 @@ async function packInstall(configs = []) { const name = `./.connect-deps-cache/${config.name}-${config.version}-${Date.now()}.tgz`; const packFile = path.join(cwd, name); - await execa('yarn', ['pack', '--filename', packFile], { cwd: config.path }); + await packageManager.pack(packFile, config.path); if (config.snapshot.type === 'dev') { dev.push(`file:${packFile}`); } else { @@ -241,12 +270,12 @@ async function packInstall(configs = []) { if (normal.length > 0) { spinner.start(`Installing dependencies: ${normal.join(' ')}`); - await execa('yarn', ['add', ...normal]); + await packageManager.add(normal); spinner.succeed(); } if (dev.length > 0) { spinner.start(`Installing dev dependencies: ${dev.join(' ')}`); - await execa('yarn', ['add', '--dev', ...dev]); + await packageManager.addDev(dev); spinner.succeed(); } } diff --git a/package.json b/package.json index 89c6e8a..8d98ca7 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "conf": "^5.0.0", "del": "^5.0.0", "execa": "^2.0.3", + "has-yarn": "^2.1.0", "meow": "^5.0.0", "ora": "^3.4.0", "p-debounce": "^2.1.0",