index.js
 1  module.exports = realpath
 2  realpath.realpath = realpath
 3  realpath.sync = realpathSync
 4  realpath.realpathSync = realpathSync
 5  realpath.monkeypatch = monkeypatch
 6  realpath.unmonkeypatch = unmonkeypatch
 7  
 8  var fs = require('fs')
 9  var origRealpath = fs.realpath
10  var origRealpathSync = fs.realpathSync
11  
12  var version = process.version
13  var ok = /^v[0-5]\./.test(version)
14  var old = require('./old.js')
15  
16  function newError (er) {
17    return er && er.syscall === 'realpath' && (
18      er.code === 'ELOOP' ||
19      er.code === 'ENOMEM' ||
20      er.code === 'ENAMETOOLONG'
21    )
22  }
23  
24  function realpath (p, cache, cb) {
25    if (ok) {
26      return origRealpath(p, cache, cb)
27    }
28  
29    if (typeof cache === 'function') {
30      cb = cache
31      cache = null
32    }
33    origRealpath(p, cache, function (er, result) {
34      if (newError(er)) {
35        old.realpath(p, cache, cb)
36      } else {
37        cb(er, result)
38      }
39    })
40  }
41  
42  function realpathSync (p, cache) {
43    if (ok) {
44      return origRealpathSync(p, cache)
45    }
46  
47    try {
48      return origRealpathSync(p, cache)
49    } catch (er) {
50      if (newError(er)) {
51        return old.realpathSync(p, cache)
52      } else {
53        throw er
54      }
55    }
56  }
57  
58  function monkeypatch () {
59    fs.realpath = realpath
60    fs.realpathSync = realpathSync
61  }
62  
63  function unmonkeypatch () {
64    fs.realpath = origRealpath
65    fs.realpathSync = origRealpathSync
66  }