UNPKG

@onereach/get-version-data

Version:
65 lines (49 loc) 2.01 kB
'use strict'; 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; } }