Skip to content

Instantly share code, notes, and snippets.

@mliq
Forked from JamieMason/npm-exact-versions.js
Created September 26, 2018 20:00
Show Gist options
  • Save mliq/21a309e6566dc6304e14b78a30ed1e68 to your computer and use it in GitHub Desktop.
Save mliq/21a309e6566dc6304e14b78a30ed1e68 to your computer and use it in GitHub Desktop.

Revisions

  1. @JamieMason JamieMason created this gist May 3, 2018.
    36 changes: 36 additions & 0 deletions npm-exact-versions.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,36 @@
    const childProcess = require('child_process');
    const fs = require('fs');
    const path = require('path');
    const glob = require('glob');

    const filePaths = glob
    .sync('package.json')
    .concat(glob.sync('packages/*/package.json'))
    .map(filePath => path.resolve(process.cwd(), filePath));

    const reinstall = (filePath, data, key) => {
    const dependencyVersions = Object.entries(data[key]).map(
    ([name, version]) => `${name}@${version}`
    );
    const options = key === 'dependencies' ? ['--save'] : ['--save', '--save-dev'];
    childProcess.spawnSync('npm', ['install'].concat(options).concat(dependencyVersions), {
    cwd: filePath.replace('/package.json', ''),
    encoding: 'utf-8',
    env: process.env,
    stdio: 'pipe'
    });
    };

    filePaths.forEach(filePath => {
    console.log(filePath);
    const raw = fs.readFileSync(filePath, { encoding: 'utf8' });

    const clone = JSON.parse(raw);
    clone.dependencies && (clone.dependencies = {});
    clone.devDependencies && (clone.devDependencies = {});
    fs.writeFileSync(filePath, JSON.stringify(clone, null, 2), { encoding: 'utf8' });

    const data = JSON.parse(raw);
    data.dependencies && reinstall(filePath, data, 'dependencies');
    data.devDependencies && reinstall(filePath, data, 'devDependencies');
    });