Last active
March 12, 2021 04:56
-
-
Save Gerst20051/f9a77abfe06ab4b8e95876fed9a8af6b to your computer and use it in GitHub Desktop.
Use NPM Lock Versions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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