text: '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);
    });
  }
  