Actualizacion maquina principal
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / @mrmlnc / readdir-enhanced / lib / stat.js
diff --git a/.config/coc/extensions/node_modules/coc-prettier/node_modules/@mrmlnc/readdir-enhanced/lib/stat.js b/.config/coc/extensions/node_modules/coc-prettier/node_modules/@mrmlnc/readdir-enhanced/lib/stat.js
new file mode 100644 (file)
index 0000000..e338693
--- /dev/null
@@ -0,0 +1,74 @@
+'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);
+  });
+}