File Explorer

/proc/4/root/var/lang/lib/node_modules/npm/node_modules/bin-links/lib

This explorer reads the filesystem of the server it runs on, so /workspace/user isn't present here. Browsing and the terminal still work against this server's own disk from /.

link-gently.js2.7 KB · 97 lines
// if the thing isn't there, skip it// if there's a non-symlink there already, eexist// if there's a symlink already, pointing somewhere else, eexist// if there's a symlink already, pointing into our pkg, remove it first// then create the symlink const { resolve, dirname, sep } = require('path')const { lstat, mkdir, readlink, rm, symlink } = require('fs/promises')const { log } = require('proc-log')const throwSignificant = er => {  if (er.code === 'ENOENT') {    return  }  if (er.code === 'EACCES') {    log.warn('error adding file', er.message)    return  }  throw er} const rmOpts = {  recursive: true,  force: true,} // even in --force mode, we never create a link over a link we've// already created.  you can have multiple packages in a tree trying// to contend for the same bin, or the same manpage listed multiple times,// which creates a race condition and nondeterminism.const seen = new Set() const SKIP = Symbol('skip - missing or already installed')const CLOBBER = Symbol('clobber - ours or in forceful mode') const linkGently = async ({ path, to, from, absFrom, force }) => {  if (seen.has(to)) {    return false  }  seen.add(to)   // if the script or manpage isn't there, just ignore it.  // this arguably *should* be an install error of some sort,  // or at least a warning, but npm has always behaved this  // way in the past, so it'd be a breaking change  return Promise.all([    lstat(absFrom).catch(throwSignificant),    lstat(to).catch(throwSignificant),  ]).then(([stFrom, stTo]) => {    // not present in package, skip it    if (!stFrom) {      return SKIP    }     // exists! maybe clobber if we can    if (stTo) {      if (!stTo.isSymbolicLink()) {        return force && rm(to, rmOpts).then(() => CLOBBER)      }       return readlink(to).then(target => {        if (target === from) {          return SKIP        } // skip it, already set up like we want it.         target = resolve(dirname(to), target)        if (target === path || target.startsWith(path + sep) || force) {          return rm(to, rmOpts).then(() => CLOBBER)        }        // neither skip nor clobber        return false      })    } else {      // doesn't exist, dir might not either      return mkdir(dirname(to), { recursive: true })    }  })    .then(skipOrClobber => {      if (skipOrClobber === SKIP) {        return false      }      return symlink(from, to, 'file').catch(er => {        if (skipOrClobber === CLOBBER || force) {          return rm(to, rmOpts).then(() => symlink(from, to, 'file'))        }        throw er      }).then(() => true)    })} const resetSeen = () => {  for (const p of seen) {    seen.delete(p)  }} module.exports = Object.assign(linkGently, { resetSeen })