aboutsummaryrefslogtreecommitdiff
path: root/node_modules/shelljs/src/test.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/shelljs/src/test.js')
-rw-r--r--node_modules/shelljs/src/test.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/node_modules/shelljs/src/test.js b/node_modules/shelljs/src/test.js
new file mode 100644
index 000000000..d3d9c07a0
--- /dev/null
+++ b/node_modules/shelljs/src/test.js
@@ -0,0 +1,84 @@
+var common = require('./common');
+var fs = require('fs');
+
+common.register('test', _test, {
+ cmdOptions: {
+ 'b': 'block',
+ 'c': 'character',
+ 'd': 'directory',
+ 'e': 'exists',
+ 'f': 'file',
+ 'L': 'link',
+ 'p': 'pipe',
+ 'S': 'socket',
+ },
+ wrapOutput: false,
+ allowGlobbing: false,
+});
+
+
+//@
+//@ ### test(expression)
+//@ Available expression primaries:
+//@
+//@ + `'-b', 'path'`: true if path is a block device
+//@ + `'-c', 'path'`: true if path is a character device
+//@ + `'-d', 'path'`: true if path is a directory
+//@ + `'-e', 'path'`: true if path exists
+//@ + `'-f', 'path'`: true if path is a regular file
+//@ + `'-L', 'path'`: true if path is a symbolic link
+//@ + `'-p', 'path'`: true if path is a pipe (FIFO)
+//@ + `'-S', 'path'`: true if path is a socket
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ if (test('-d', path)) { /* do something with dir */ };
+//@ if (!test('-f', path)) continue; // skip if it's a regular file
+//@ ```
+//@
+//@ Evaluates expression using the available primaries and returns corresponding value.
+function _test(options, path) {
+ if (!path) common.error('no path given');
+
+ var canInterpret = false;
+ Object.keys(options).forEach(function (key) {
+ if (options[key] === true) {
+ canInterpret = true;
+ }
+ });
+
+ if (!canInterpret) common.error('could not interpret expression');
+
+ if (options.link) {
+ try {
+ return fs.lstatSync(path).isSymbolicLink();
+ } catch (e) {
+ return false;
+ }
+ }
+
+ if (!fs.existsSync(path)) return false;
+
+ if (options.exists) return true;
+
+ var stats = fs.statSync(path);
+
+ if (options.block) return stats.isBlockDevice();
+
+ if (options.character) return stats.isCharacterDevice();
+
+ if (options.directory) return stats.isDirectory();
+
+ if (options.file) return stats.isFile();
+
+ /* istanbul ignore next */
+ if (options.pipe) return stats.isFIFO();
+
+ /* istanbul ignore next */
+ if (options.socket) return stats.isSocket();
+
+ /* istanbul ignore next */
+ return false; // fallback
+} // test
+module.exports = _test;