Skip to content

Instantly share code, notes, and snippets.

@jcable
Last active September 10, 2023 17:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcable/8ee152e3f5a05a47b286029e9e654984 to your computer and use it in GitHub Desktop.
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
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