@onereach/get-version-data
Version:
CLI tool to get version data for deploy
65 lines (49 loc) • 2.01 kB
JavaScript
;
const {resolve, dirname} = require('path');
const {readJson, readYaml, checkFileExists} = require('./utils');
module.exports = async function parseYarnLock ({lockFile, subDir}, {devDeps}) {
const lockData = await readYaml(lockFile);
const depsMap = await fetchDepsMap(dirname(lockFile), subDir, devDeps);
const tasks = Object.entries(depsMap).map(async ([name, versionPattern]) => {
// skip portal dependencies
if (versionPattern.startsWith('portal:')) return [name, versionPattern];
// try to resolve version of workspace dependencies
else if (versionPattern.startsWith('workspace:')) {
const version = await fetchWorkspaceDepVersion({name, versionPattern, rootPath: dirname(lockFile), lockData})
if (version) return [name, version];
}
// npm dependencies
else {
const info = lockData[`${name}@npm:${versionPattern}`]
if (info) return [name, info.version];
}
return [name, versionPattern];
})
const depsList = await Promise.all(tasks);
return Object.fromEntries(depsList);
}
async function fetchDepsMap (rootPath, subDir, devDeps) {
const pkg = await readJson(resolve(rootPath, subDir, 'package.json'));
if (!pkg) {
console.warn(`package.json not found in: '${subDir}'`);
return {};
}
return {
...pkg.dependencies,
...devDeps ? pkg.devDependencies : null,
}
}
async function fetchWorkspaceDepVersion ({name, versionPattern, rootPath, lockData}) {
const lockDataList = Object.entries(lockData);
const [, info] = lockDataList.find(([lockName]) => lockName.includes(`${name}@${versionPattern}`)) || [];
if (info?.resolution) {
const [, pkgSubDir] = info.resolution.split('@workspace:')
const pkgPath = resolve(rootPath, pkgSubDir, 'package.json');
if (!checkFileExists(pkgPath)) {
console.warn(`Not found package.json for workspace package '${name}'`);
return versionPattern;
}
const {version} = await readJson(pkgPath);
return version;
}
}