@onereach/get-version-data
Version:
CLI tool to get version data for deploy
58 lines (45 loc) • 1.67 kB
JavaScript
;
const {readJson} = require('./utils');
module.exports = async function parseNpmLock ({lockFile, subDir}, {devDeps}) {
const lockData = await readJson(lockFile);
const pkgData = lockData.packages?.[subDir];
const deps = {
...pkgData?.dependencies,
...devDeps ? pkgData?.devDependencies : null,
};
if (Object.keys(deps).length === 0) return {};
return getDepsVersions(deps, lockData, subDir);
}
function getDepsVersions (deps, lockData, subDir) {
return Object.fromEntries(
Object.entries(deps)
.map(([name, version]) => {
if (version.startsWith('workspace:')) {
const workspaceName = version.split(':')[1];
const workspaceData = lockData.workspaces.find(w => w.name === workspaceName);
return [name, workspaceData.version];
}
else if (version.startsWith('file:')) {
// skip file dependencies
return [name, version];
}
else {
const pkgData = lockData.packages?.[`${subDir}/node_modules/${name}`]
|| lockData.packages?.[`node_modules/${name}`]
if (!pkgData) {
console.warn(`Package ${name} not found in lock file`);
return [name, version];
}
if (pkgData.version) {
return [name, pkgData.version];
}
if (pkgData.link) {
const resolvedPackage = lockData.packages?.[pkgData.resolved];
return [name, resolvedPackage?.version || pkgData.resolved];
}
console.warn(`Package ${name} has no version or link in lock file`);
return [name, version];
}
})
);
}