Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
#!/usr/bin/env node
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
// When installing files rewritten to the Nix store with npm
|
|
// npm writes the symlinks relative to the build directory.
|
|
//
|
|
// This makes relocating node_modules tricky when refering to the store.
|
|
// This script walks node_modules and canonicalizes symlinks.
|
|
|
|
async function canonicalize(storePrefix, root) {
|
|
console.log(storePrefix, root)
|
|
const entries = await fs.promises.readdir(root);
|
|
const paths = entries.map((entry) => path.join(root, entry));
|
|
|
|
const stats = await Promise.all(
|
|
paths.map(async (path) => {
|
|
return {
|
|
path: path,
|
|
stat: await fs.promises.lstat(path),
|
|
};
|
|
})
|
|
);
|
|
|
|
const symlinks = stats.filter((stat) => stat.stat.isSymbolicLink());
|
|
const dirs = stats.filter((stat) => stat.stat.isDirectory());
|
|
|
|
// Canonicalize symlinks to their real path
|
|
await Promise.all(
|
|
symlinks.map(async (stat) => {
|
|
const target = await fs.promises.realpath(stat.path);
|
|
if (target.startsWith(storePrefix)) {
|
|
await fs.promises.unlink(stat.path);
|
|
await fs.promises.symlink(target, stat.path);
|
|
}
|
|
})
|
|
);
|
|
|
|
// Recurse into directories
|
|
await Promise.all(dirs.map((dir) => canonicalize(storePrefix, dir.path)));
|
|
}
|
|
|
|
async function main() {
|
|
const args = process.argv.slice(2);
|
|
const storePrefix = args[0];
|
|
|
|
if (fs.existsSync("node_modules")) {
|
|
await canonicalize(storePrefix, "node_modules");
|
|
}
|
|
}
|
|
|
|
main();
|