| 'use strict'; | 
|   | 
| const call = require('./call'); | 
|   | 
| module.exports = stat; | 
|   | 
| /** | 
|  * Retrieves the {@link fs.Stats} for the given path. If the path is a symbolic link, | 
|  * then the Stats of the symlink's target are returned instead.  If the symlink is broken, | 
|  * then the Stats of the symlink itself are returned. | 
|  * | 
|  * @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module | 
|  * @param {string} path - The path to return stats for | 
|  * @param {function} callback | 
|  */ | 
| function stat (fs, path, callback) { | 
|   let isSymLink = false; | 
|   | 
|   call.safe(fs.lstat, path, (err, lstats) => { | 
|     if (err) { | 
|       // fs.lstat threw an eror | 
|       return callback(err); | 
|     } | 
|   | 
|     try { | 
|       isSymLink = lstats.isSymbolicLink(); | 
|     } | 
|     catch (err2) { | 
|       // lstats.isSymbolicLink() threw an error | 
|       // (probably because fs.lstat returned an invalid result) | 
|       return callback(err2); | 
|     } | 
|   | 
|     if (isSymLink) { | 
|       // Try to resolve the symlink | 
|       symlinkStat(fs, path, lstats, callback); | 
|     } | 
|     else { | 
|       // It's not a symlink, so return the stats as-is | 
|       callback(null, lstats); | 
|     } | 
|   }); | 
| } | 
|   | 
| /** | 
|  * Retrieves the {@link fs.Stats} for the target of the given symlink. | 
|  * If the symlink is broken, then the Stats of the symlink itself are returned. | 
|  * | 
|  * @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module | 
|  * @param {string} path - The path of the symlink to return stats for | 
|  * @param {object} lstats - The stats of the symlink | 
|  * @param {function} callback | 
|  */ | 
| function symlinkStat (fs, path, lstats, callback) { | 
|   call.safe(fs.stat, path, (err, stats) => { | 
|     if (err) { | 
|       // The symlink is broken, so return the stats for the link itself | 
|       return callback(null, lstats); | 
|     } | 
|   | 
|     try { | 
|       // Return the stats for the resolved symlink target, | 
|       // and override the `isSymbolicLink` method to indicate that it's a symlink | 
|       stats.isSymbolicLink = () => true; | 
|     } | 
|     catch (err2) { | 
|       // Setting stats.isSymbolicLink threw an error | 
|       // (probably because fs.stat returned an invalid result) | 
|       return callback(err2); | 
|     } | 
|   | 
|     callback(null, stats); | 
|   }); | 
| } |