UNPKG

3.08 kBJavaScriptView Raw
1/*!
2 * delete <https://github.com/jonschlinkert/delete>
3 *
4 * Copyright (c) 2014-2017, Jon Schlinkert.
5 * Released under the MIT License.
6 */
7
8'use strict';
9
10var fs = require('fs');
11var path = require('path');
12var each = require('async-each');
13var extend = require('extend-shallow');
14var rimraf = require('rimraf');
15var glob = require('matched');
16
17function del(patterns, options, cb) {
18 if (typeof options === 'function') {
19 cb = options;
20 options = {};
21 }
22
23 if (typeof cb !== 'function') {
24 return del.promise.apply(del, arguments);
25 }
26
27 var opts = extend({cwd: process.cwd()}, options);
28 var deleted = [];
29
30 if (patterns === '' && isCurrentDir(opts.cwd)) {
31 cb(null, deleted);
32 return;
33 }
34
35 glob(patterns, opts, function(err, files) {
36 if (err) {
37 cb(err);
38 return;
39 }
40
41 each(files, function(file, next) {
42 var fp = path.resolve(opts.cwd, file);
43
44 fs.stat(fp, function(err, stat) {
45 if (err) {
46 next();
47 return;
48 }
49
50 try {
51 assertDirectory(fp, opts);
52 } catch (err) {
53 next(err);
54 return;
55 }
56
57 rimraf(fp, function(err) {
58 if (err) return next(err);
59 deleted.push(fp);
60 next();
61 });
62 });
63 }, function(err) {
64 cb(err, deleted.sort());
65 });
66 });
67}
68
69del.sync = function delSync(patterns, options) {
70 var opts = extend({cwd: process.cwd()}, options);
71 var deleted = [];
72
73 if (patterns === '' && isCurrentDir(opts.cwd)) {
74 return [];
75 }
76
77 glob.sync(patterns, opts).forEach(function(file) {
78 var fp = path.resolve(opts.cwd, file);
79 assertDirectory(fp, opts);
80 rimraf.sync(fp);
81 deleted.push(fp);
82 });
83
84 deleted.sort();
85 return deleted;
86};
87
88del.promise = function delPromise(patterns, options) {
89 var opts = extend({cwd: process.cwd()}, options);
90 var deleted = [];
91
92 if (patterns === '' && isCurrentDir(opts.cwd)) {
93 return Promise.resolve(deleted);
94 }
95
96 return glob.promise(patterns, opts)
97 .then(function(files) {
98 files.forEach(function(fp) {
99 del.sync(fp, opts);
100 deleted.push(fp);
101 });
102 return deleted;
103 });
104};
105
106function assertDirectory(fp, options) {
107 if (options && options.force === true) {
108 return;
109 }
110 if (isCurrentDir(fp) === true) {
111 throw new Error('CAUTION! to delete the current working directory "options.force" must be set to true');
112 }
113 if (insideCurrentDir(fp) === false) {
114 throw new Error('CAUTION! to delete files or folders outside the current working directory "options.force" must be set to true');
115 }
116}
117
118function insideCurrentDir(fp) {
119 var cwd = stripSlash(process.cwd());
120 fp = stripSlash(path.normalize(path.resolve(fp)));
121 if (path.sep === '\\') {
122 cwd = cwd.toLowerCase();
123 fp = fp.toLowerCase();
124 }
125 return fp.slice(0, cwd.length) === cwd;
126}
127
128function stripSlash(fp) {
129 if (fp.slice(-1) === '/') {
130 return fp.slice(0, -1);
131 }
132 return fp;
133}
134
135function isCurrentDir(fp) {
136 return process.cwd() === path.resolve(fp);
137}
138
139/**
140 * Expose `del`
141 */
142
143module.exports = del;