Skip to content

Instantly share code, notes, and snippets.

@Gerst20051
Last active March 12, 2021 04:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Gerst20051/f9a77abfe06ab4b8e95876fed9a8af6b to your computer and use it in GitHub Desktop.
Save Gerst20051/f9a77abfe06ab4b8e95876fed9a8af6b to your computer and use it in GitHub Desktop.
Use NPM Lock Versions
#!/usr/bin/env node
// COMMAND: ./use_npm_lock_versions.js ~/path/to/your/repo
const fs = require('fs');
const os = require('os');
function init() {
const directory = parseDirectory(process.argv.slice(2)[0]);
const [packageJson, newlineCharacter] = loadPackageJson(directory);
const packageLockJson = loadPackageLockJson(directory);
const updatedPackageJson = updateVersions(packageJson, packageLockJson);
savePackageJson(directory, updatedPackageJson, newlineCharacter);
}
function parseDirectory(dir) {
return dir.replace('~', os.homedir);
}
function loadPackageJson(dir) {
const fileContents = fs.readFileSync(`${dir}/package.json`, 'utf8');
const newlineCharacter = detectNewlineAtEof(fileContents);
return [ JSON.parse(fileContents), newlineCharacter ];
}
function loadPackageLockJson(dir) {
return JSON.parse(fs.readFileSync(`${dir}/package-lock.json`, 'utf8'));
}
function savePackageJson(dir, json, newline) {
const output = JSON.stringify(json, null, 2);
fs.writeFileSync(`${dir}/package.json`, newline ? `${output}${newline}` : output);
}
function updateVersions(packageJson, packageLockJson) {
const updatedPackageJson = {
...packageJson,
};
if (updatedPackageJson.devDependencies) {
updatedPackageJson.devDependencies = updateDependencies(
updatedPackageJson.devDependencies, packageLockJson
);
}
if (updatedPackageJson.dependencies) {
updatedPackageJson.dependencies = updateDependencies(
updatedPackageJson.dependencies, packageLockJson
);
}
return updatedPackageJson;
}
function updateDependencies(deps, packageLockJson) {
const updatedDeps = {
...deps,
};
Object.keys(deps).forEach(dep => {
updatedDeps[dep] = getPackageLockVersion(dep, updatedDeps[dep], packageLockJson);
});
return updatedDeps;
}
function getPackageLockVersion(dep, currentVersion, packageLockJson) {
const isCurrentVersionExact = isVersionExact(currentVersion);
const updatedVersion = packageLockJson.dependencies[dep].version;
if (isCurrentVersionExact) {
return updatedVersion;
}
if (updatedVersion === currentVersion.slice(1)) {
return currentVersion;
}
return `~${updatedVersion}`;
}
function isVersionExact(version) {
return /^\d/.test(version);
}
function detectNewlineAtEof(str) {
const matches = str.match(/\r?\n$/);
return matches ? matches[0] : null;
}
init();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment