Reputation: 6848
I'm working on a project in which the package.json file is missing. The developer has pushed the package-lock.json file without the package.json file.
How can I create a clean package.json from the package-lock.json file in case it is at all possible?
Upvotes: 1
Views: 5559
Reputation: 53
Slightly improved version of improved version for newer versions of NPM:
const fs = require('fs');
const packageLock = require('./package-lock.json');
const package = require('./package.json');
const packageJsonNew = package;
// Refactor above code into a function
const updateDependencies = (dependencies, newDependencies) => {
Object.keys(dependencies).forEach(dep => {
try {
console.log("✅ node_modules/" + dep + ": " + packageLock.packages["node_modules/" + dep].version);
newDependencies[dep] = packageLock.packages["node_modules/" + dep].version;
} catch (error) {
console.log("❌ node_modules/" + dep + ": " + error);
}
});
}
updateDependencies(package.dependencies, packageJsonNew.dependencies);
updateDependencies(package.devDependencies, packageJsonNew.devDependencies);
fs.writeFileSync('./package-new.json', JSON.stringify(packageJsonNew, null, 2));
Upvotes: 0
Reputation: 31
Slightly improved version of accepted answer script. Will pull locked versions out of the package-lock.
const fs = require('fs');
const packageLock = require('./package-lock.json');
const package = require('./package.json');
package.dependencies = Object.keys(package.dependencies)
.reduce((deps, dep) => Object.assign(deps, { [dep]: packageLock.dependencies[dep].version }), {});
package.devDependencies = Object.keys(package.devDependencies)
.reduce((deps, dep) => Object.assign(deps, { [dep]: packageLock.dependencies[dep].version }), {});
fs.writeFileSync('./package-new.json', JSON.stringify(package, null, 2));
Upvotes: 1
Reputation: 701
Simply run npm init
and it will pull all of the current dependencies from package-lock.json
if you already have node_modules/
generated. If not, run npm ci
to generate the node modules from the package-lock.json
and then run npm init
to generate the package.json
file.
Upvotes: 6
Reputation: 222379
It's not possible to generate full package.json
from package-lock.json
because the latter doesn't contain all necessary data. It contains only a list of dependencies with specific versions without original semvers. Production and development dependencies are mixed up along with nested dependencies.
Fresh package.json
could be generated, then augmented with these dependencies with something like:
const fs = require('fs');
const packageLock = require('./package-lock.json');
const package = require('./package.json');
package.dependencies = Object.entries(packageLock.dependencies)
.reduce((deps, [dep, { version }]) => Object.assign(deps, { [dep]: version }), {});
fs.writeFileSync('./package-new.json', JSON.stringify(package, null, 2));
Nested dependencies could be filtered out by checking requires
key, but this can affect project's own dependencies.
Upvotes: 6