Last active
September 10, 2023 17:39
-
-
Save jcable/8ee152e3f5a05a47b286029e9e654984 to your computer and use it in GitHub Desktop.
Functions to discover the dependencies from a hoisted lock file for use in an npm pack context
This file contains hidden or 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
async function filesFromTarball(pkg, logger, omitDependencies) { | |
const all = await decompress(`${pkg.name.replace('/', '-').replace(/^@/, '')}-${pkg.version}.tgz`); | |
logger.log(`Extracted compiled package from ${pkg.name}-${pkg.version}.tgz`); | |
let wanted = all; | |
if (omitDependencies) { | |
wanted = all.filter((f) => !f.path.startsWith('package/node_modules')); | |
} | |
const files = wanted.map(({ data, path }) => ({ data, path: path.replace(/^package\//, '') })); | |
logger.log(`Got ${files.length} local files`); | |
return files; | |
} | |
function walkLockFile(packages, tree) { | |
if (!packages) { | |
return []; | |
} | |
const r = packages.map((k) => { | |
const { requires, dependencies } = tree?.[k] || {}; | |
const p = []; | |
if (dependencies) { | |
p.push(...walkLockFile(Object.keys(dependencies), dependencies)); | |
} | |
if (requires) { | |
p.push(...walkLockFile(Object.keys(requires), tree)); | |
} | |
return p; | |
}); | |
return [...packages, ...r].flat(); | |
} | |
function dependenciesFromLockfile(workspace, lockfile) { | |
const lock = JSON.parse(fs.readFileSync(lockfile)); | |
const all = Object.keys(lock.packages).map((k) => { | |
if (k.endsWith(workspace)) { | |
const node = lock.packages[k]; | |
if (!node.dev) { | |
if (node.bundleDependencies) { | |
return walkLockFile(node.bundleDependencies, lock.dependencies); | |
} if (node.dependencies) { | |
return walkLockFile(Object.keys(node.dependencies), lock.dependencies); | |
} | |
return []; | |
} | |
} | |
return []; | |
}).flat().filter((v) => v); | |
return [...new Set(all)]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment