├── .editorconfig ├── .github ├── funding.yml └── workflows │ └── ci.yml ├── .gitignore ├── .travis.yml ├── eliminate.png ├── example.js ├── license ├── package-lock.json ├── package.json ├── readme.md ├── src ├── bin.js └── index.js └── test ├── eliminate.js └── helpers └── index.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_size = 2 6 | indent_style = tab 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.{json,yml,md}] 13 | indent_style = space 14 | -------------------------------------------------------------------------------- /.github/funding.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: terkelg 4 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: push 4 | 5 | jobs: 6 | test: 7 | name: Node.js v${{ matrix.nodejs }} (${{ matrix.os }}) 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | nodejs: [10, 12] 12 | os: [ubuntu-latest] 13 | steps: 14 | - uses: actions/checkout@v1 15 | with: 16 | fetch-depth: 1 17 | 18 | - uses: actions/setup-node@v1 19 | with: 20 | node-version: ${{ matrix.nodejs }} 21 | 22 | - name: Install 23 | run: | 24 | npm install 25 | npm install -g nyc 26 | 27 | - name: Test w/ Coverage 28 | run: npx nyc npm test 29 | 30 | - name: Report 31 | if: matrix.nodejs >= 12 32 | run: | 33 | npx nyc report --reporter=text-lcov > coverage.lcov 34 | bash <(curl -s https://codecov.io/bash) 35 | env: 36 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 8 4 | -------------------------------------------------------------------------------- /eliminate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/terkelg/eliminate/7fac2fd4d93b5976abfc035d2cfe3c5bb1b21f52/eliminate.png -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | const del = require('./src'); 2 | const mkdirp = require('./test/helpers'); 3 | 4 | (async function() { 5 | mkdirp('A/B/C.js'); 6 | await del('A'); 7 | console.log('Done!'); 8 | })(); 9 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Terkel Gjervig Nielsen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eliminate", 3 | "version": "1.1.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "2.1.1", 9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 10 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 11 | "dev": true 12 | }, 13 | "ansi-styles": { 14 | "version": "2.2.1", 15 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 16 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 17 | "dev": true 18 | }, 19 | "balanced-match": { 20 | "version": "1.0.0", 21 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 22 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 23 | "dev": true 24 | }, 25 | "brace-expansion": { 26 | "version": "1.1.11", 27 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 28 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 29 | "dev": true, 30 | "requires": { 31 | "balanced-match": "^1.0.0", 32 | "concat-map": "0.0.1" 33 | } 34 | }, 35 | "buffer-shims": { 36 | "version": "1.0.0", 37 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 38 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", 39 | "dev": true 40 | }, 41 | "chalk": { 42 | "version": "1.1.3", 43 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 44 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 45 | "dev": true, 46 | "requires": { 47 | "ansi-styles": "^2.2.1", 48 | "escape-string-regexp": "^1.0.2", 49 | "has-ansi": "^2.0.0", 50 | "strip-ansi": "^3.0.0", 51 | "supports-color": "^2.0.0" 52 | } 53 | }, 54 | "concat-map": { 55 | "version": "0.0.1", 56 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 57 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 58 | "dev": true 59 | }, 60 | "core-util-is": { 61 | "version": "1.0.2", 62 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 63 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 64 | "dev": true 65 | }, 66 | "deep-equal": { 67 | "version": "1.1.1", 68 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", 69 | "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", 70 | "dev": true, 71 | "requires": { 72 | "is-arguments": "^1.0.4", 73 | "is-date-object": "^1.0.1", 74 | "is-regex": "^1.0.4", 75 | "object-is": "^1.0.1", 76 | "object-keys": "^1.1.1", 77 | "regexp.prototype.flags": "^1.2.0" 78 | } 79 | }, 80 | "define-properties": { 81 | "version": "1.1.3", 82 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 83 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 84 | "dev": true, 85 | "requires": { 86 | "object-keys": "^1.0.12" 87 | } 88 | }, 89 | "defined": { 90 | "version": "1.0.0", 91 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 92 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 93 | "dev": true 94 | }, 95 | "dotignore": { 96 | "version": "0.1.2", 97 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 98 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 99 | "dev": true, 100 | "requires": { 101 | "minimatch": "^3.0.4" 102 | } 103 | }, 104 | "duplexer": { 105 | "version": "0.1.1", 106 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 107 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 108 | "dev": true 109 | }, 110 | "es-abstract": { 111 | "version": "1.17.4", 112 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 113 | "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 114 | "dev": true, 115 | "requires": { 116 | "es-to-primitive": "^1.2.1", 117 | "function-bind": "^1.1.1", 118 | "has": "^1.0.3", 119 | "has-symbols": "^1.0.1", 120 | "is-callable": "^1.1.5", 121 | "is-regex": "^1.0.5", 122 | "object-inspect": "^1.7.0", 123 | "object-keys": "^1.1.1", 124 | "object.assign": "^4.1.0", 125 | "string.prototype.trimleft": "^2.1.1", 126 | "string.prototype.trimright": "^2.1.1" 127 | } 128 | }, 129 | "es-to-primitive": { 130 | "version": "1.2.1", 131 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 132 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 133 | "dev": true, 134 | "requires": { 135 | "is-callable": "^1.1.4", 136 | "is-date-object": "^1.0.1", 137 | "is-symbol": "^1.0.2" 138 | } 139 | }, 140 | "escape-string-regexp": { 141 | "version": "1.0.5", 142 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 143 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 144 | "dev": true 145 | }, 146 | "figures": { 147 | "version": "1.7.0", 148 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 149 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 150 | "dev": true, 151 | "requires": { 152 | "escape-string-regexp": "^1.0.5", 153 | "object-assign": "^4.1.0" 154 | } 155 | }, 156 | "for-each": { 157 | "version": "0.3.3", 158 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 159 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 160 | "dev": true, 161 | "requires": { 162 | "is-callable": "^1.1.3" 163 | } 164 | }, 165 | "fs.realpath": { 166 | "version": "1.0.0", 167 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 168 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 169 | "dev": true 170 | }, 171 | "function-bind": { 172 | "version": "1.1.1", 173 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 174 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 175 | "dev": true 176 | }, 177 | "glob": { 178 | "version": "7.1.6", 179 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 180 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 181 | "dev": true, 182 | "requires": { 183 | "fs.realpath": "^1.0.0", 184 | "inflight": "^1.0.4", 185 | "inherits": "2", 186 | "minimatch": "^3.0.4", 187 | "once": "^1.3.0", 188 | "path-is-absolute": "^1.0.0" 189 | } 190 | }, 191 | "has": { 192 | "version": "1.0.3", 193 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 194 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 195 | "dev": true, 196 | "requires": { 197 | "function-bind": "^1.1.1" 198 | } 199 | }, 200 | "has-ansi": { 201 | "version": "2.0.0", 202 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 203 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 204 | "dev": true, 205 | "requires": { 206 | "ansi-regex": "^2.0.0" 207 | } 208 | }, 209 | "has-symbols": { 210 | "version": "1.0.1", 211 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 212 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 213 | "dev": true 214 | }, 215 | "inflight": { 216 | "version": "1.0.6", 217 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 218 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 219 | "dev": true, 220 | "requires": { 221 | "once": "^1.3.0", 222 | "wrappy": "1" 223 | } 224 | }, 225 | "inherits": { 226 | "version": "2.0.4", 227 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 228 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 229 | "dev": true 230 | }, 231 | "is-arguments": { 232 | "version": "1.0.4", 233 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 234 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 235 | "dev": true 236 | }, 237 | "is-callable": { 238 | "version": "1.1.5", 239 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 240 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 241 | "dev": true 242 | }, 243 | "is-date-object": { 244 | "version": "1.0.2", 245 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 246 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 247 | "dev": true 248 | }, 249 | "is-finite": { 250 | "version": "1.1.0", 251 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", 252 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", 253 | "dev": true 254 | }, 255 | "is-regex": { 256 | "version": "1.0.5", 257 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 258 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 259 | "dev": true, 260 | "requires": { 261 | "has": "^1.0.3" 262 | } 263 | }, 264 | "is-symbol": { 265 | "version": "1.0.3", 266 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 267 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 268 | "dev": true, 269 | "requires": { 270 | "has-symbols": "^1.0.1" 271 | } 272 | }, 273 | "isarray": { 274 | "version": "1.0.0", 275 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 276 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 277 | "dev": true 278 | }, 279 | "lodash": { 280 | "version": "4.17.15", 281 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 282 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 283 | "dev": true 284 | }, 285 | "minimatch": { 286 | "version": "3.0.4", 287 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 288 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 289 | "dev": true, 290 | "requires": { 291 | "brace-expansion": "^1.1.7" 292 | } 293 | }, 294 | "minimist": { 295 | "version": "1.2.5", 296 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 297 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 298 | "dev": true 299 | }, 300 | "object-assign": { 301 | "version": "4.1.1", 302 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 303 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 304 | "dev": true 305 | }, 306 | "object-inspect": { 307 | "version": "1.7.0", 308 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 309 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 310 | "dev": true 311 | }, 312 | "object-is": { 313 | "version": "1.0.2", 314 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", 315 | "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", 316 | "dev": true 317 | }, 318 | "object-keys": { 319 | "version": "1.1.1", 320 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 321 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 322 | "dev": true 323 | }, 324 | "object.assign": { 325 | "version": "4.1.0", 326 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 327 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 328 | "dev": true, 329 | "requires": { 330 | "define-properties": "^1.1.2", 331 | "function-bind": "^1.1.1", 332 | "has-symbols": "^1.0.0", 333 | "object-keys": "^1.0.11" 334 | } 335 | }, 336 | "once": { 337 | "version": "1.4.0", 338 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 339 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 340 | "dev": true, 341 | "requires": { 342 | "wrappy": "1" 343 | } 344 | }, 345 | "parse-ms": { 346 | "version": "1.0.1", 347 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 348 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 349 | "dev": true 350 | }, 351 | "path-is-absolute": { 352 | "version": "1.0.1", 353 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 354 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 355 | "dev": true 356 | }, 357 | "path-parse": { 358 | "version": "1.0.6", 359 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 360 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 361 | "dev": true 362 | }, 363 | "plur": { 364 | "version": "1.0.0", 365 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 366 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 367 | "dev": true 368 | }, 369 | "pretty-ms": { 370 | "version": "2.1.0", 371 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 372 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 373 | "dev": true, 374 | "requires": { 375 | "is-finite": "^1.0.1", 376 | "parse-ms": "^1.0.0", 377 | "plur": "^1.0.0" 378 | } 379 | }, 380 | "process-nextick-args": { 381 | "version": "1.0.7", 382 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 383 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 384 | "dev": true 385 | }, 386 | "re-emitter": { 387 | "version": "1.1.3", 388 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", 389 | "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", 390 | "dev": true 391 | }, 392 | "readable-stream": { 393 | "version": "2.2.9", 394 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", 395 | "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", 396 | "dev": true, 397 | "requires": { 398 | "buffer-shims": "~1.0.0", 399 | "core-util-is": "~1.0.0", 400 | "inherits": "~2.0.1", 401 | "isarray": "~1.0.0", 402 | "process-nextick-args": "~1.0.6", 403 | "string_decoder": "~1.0.0", 404 | "util-deprecate": "~1.0.1" 405 | } 406 | }, 407 | "regexp.prototype.flags": { 408 | "version": "1.3.0", 409 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 410 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 411 | "dev": true, 412 | "requires": { 413 | "define-properties": "^1.1.3", 414 | "es-abstract": "^1.17.0-next.1" 415 | } 416 | }, 417 | "repeat-string": { 418 | "version": "1.6.1", 419 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 420 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 421 | "dev": true 422 | }, 423 | "resolve": { 424 | "version": "1.15.1", 425 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 426 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 427 | "dev": true, 428 | "requires": { 429 | "path-parse": "^1.0.6" 430 | } 431 | }, 432 | "resumer": { 433 | "version": "0.0.0", 434 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 435 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 436 | "dev": true, 437 | "requires": { 438 | "through": "~2.3.4" 439 | } 440 | }, 441 | "safe-buffer": { 442 | "version": "5.1.2", 443 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 444 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 445 | "dev": true 446 | }, 447 | "split": { 448 | "version": "1.0.0", 449 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", 450 | "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", 451 | "dev": true, 452 | "requires": { 453 | "through": "2" 454 | } 455 | }, 456 | "string.prototype.trim": { 457 | "version": "1.2.1", 458 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", 459 | "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", 460 | "dev": true, 461 | "requires": { 462 | "define-properties": "^1.1.3", 463 | "es-abstract": "^1.17.0-next.1", 464 | "function-bind": "^1.1.1" 465 | } 466 | }, 467 | "string.prototype.trimleft": { 468 | "version": "2.1.1", 469 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 470 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 471 | "dev": true, 472 | "requires": { 473 | "define-properties": "^1.1.3", 474 | "function-bind": "^1.1.1" 475 | } 476 | }, 477 | "string.prototype.trimright": { 478 | "version": "2.1.1", 479 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 480 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 481 | "dev": true, 482 | "requires": { 483 | "define-properties": "^1.1.3", 484 | "function-bind": "^1.1.1" 485 | } 486 | }, 487 | "string_decoder": { 488 | "version": "1.0.3", 489 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 490 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 491 | "dev": true, 492 | "requires": { 493 | "safe-buffer": "~5.1.0" 494 | } 495 | }, 496 | "strip-ansi": { 497 | "version": "3.0.1", 498 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 499 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 500 | "dev": true, 501 | "requires": { 502 | "ansi-regex": "^2.0.0" 503 | } 504 | }, 505 | "supports-color": { 506 | "version": "2.0.0", 507 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 508 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 509 | "dev": true 510 | }, 511 | "tap-out": { 512 | "version": "2.1.0", 513 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", 514 | "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", 515 | "dev": true, 516 | "requires": { 517 | "re-emitter": "1.1.3", 518 | "readable-stream": "2.2.9", 519 | "split": "1.0.0", 520 | "trim": "0.0.1" 521 | } 522 | }, 523 | "tap-spec": { 524 | "version": "5.0.0", 525 | "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", 526 | "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", 527 | "dev": true, 528 | "requires": { 529 | "chalk": "^1.0.0", 530 | "duplexer": "^0.1.1", 531 | "figures": "^1.4.0", 532 | "lodash": "^4.17.10", 533 | "pretty-ms": "^2.1.0", 534 | "repeat-string": "^1.5.2", 535 | "tap-out": "^2.1.0", 536 | "through2": "^2.0.0" 537 | } 538 | }, 539 | "tape": { 540 | "version": "4.13.2", 541 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.2.tgz", 542 | "integrity": "sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ==", 543 | "dev": true, 544 | "requires": { 545 | "deep-equal": "~1.1.1", 546 | "defined": "~1.0.0", 547 | "dotignore": "~0.1.2", 548 | "for-each": "~0.3.3", 549 | "function-bind": "~1.1.1", 550 | "glob": "~7.1.6", 551 | "has": "~1.0.3", 552 | "inherits": "~2.0.4", 553 | "is-regex": "~1.0.5", 554 | "minimist": "~1.2.0", 555 | "object-inspect": "~1.7.0", 556 | "resolve": "~1.15.1", 557 | "resumer": "~0.0.0", 558 | "string.prototype.trim": "~1.2.1", 559 | "through": "~2.3.8" 560 | } 561 | }, 562 | "through": { 563 | "version": "2.3.8", 564 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 565 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 566 | "dev": true 567 | }, 568 | "through2": { 569 | "version": "2.0.5", 570 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 571 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 572 | "dev": true, 573 | "requires": { 574 | "readable-stream": "~2.3.6", 575 | "xtend": "~4.0.1" 576 | }, 577 | "dependencies": { 578 | "process-nextick-args": { 579 | "version": "2.0.1", 580 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 581 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 582 | "dev": true 583 | }, 584 | "readable-stream": { 585 | "version": "2.3.7", 586 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 587 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 588 | "dev": true, 589 | "requires": { 590 | "core-util-is": "~1.0.0", 591 | "inherits": "~2.0.3", 592 | "isarray": "~1.0.0", 593 | "process-nextick-args": "~2.0.0", 594 | "safe-buffer": "~5.1.1", 595 | "string_decoder": "~1.1.1", 596 | "util-deprecate": "~1.0.1" 597 | } 598 | }, 599 | "string_decoder": { 600 | "version": "1.1.1", 601 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 602 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 603 | "dev": true, 604 | "requires": { 605 | "safe-buffer": "~5.1.0" 606 | } 607 | } 608 | } 609 | }, 610 | "trim": { 611 | "version": "0.0.1", 612 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 613 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", 614 | "dev": true 615 | }, 616 | "util-deprecate": { 617 | "version": "1.0.2", 618 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 619 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 620 | "dev": true 621 | }, 622 | "wrappy": { 623 | "version": "1.0.2", 624 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 625 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 626 | "dev": true 627 | }, 628 | "xtend": { 629 | "version": "4.0.2", 630 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 631 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 632 | "dev": true 633 | } 634 | } 635 | } 636 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eliminate", 3 | "version": "1.1.2", 4 | "repository": "terkelg/eliminate", 5 | "description": "Delete files and directories", 6 | "main": "src/index.js", 7 | "bin": "src/bin.js", 8 | "license": "MIT", 9 | "author": { 10 | "name": "Terkel Gjervig", 11 | "email": "terkel@terkel.com", 12 | "url": "https://terkel.com" 13 | }, 14 | "engines": { 15 | "node": ">= 8" 16 | }, 17 | "scripts": { 18 | "test": "tape test/*.js | tap-spec" 19 | }, 20 | "files": [ 21 | "src" 22 | ], 23 | "keywords": [ 24 | "io", 25 | "del", 26 | "rmdir", 27 | "remove", 28 | "delete", 29 | "abolish", 30 | "destroy", 31 | "eliminate", 32 | "filesystem" 33 | ], 34 | "devDependencies": { 35 | "tap-spec": "^5.0.0", 36 | "tape": "^4.13.2" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |
2 | eliminate 3 |
4 | 5 |

eliminate

6 | 7 |
8 | 9 | version 10 | 11 | 12 | travis 13 | 14 | 15 | downloads 16 | 17 |
18 | 19 |
Delete files and directories without all the bullshit.
20 | 21 |
22 | 23 | 24 | ## Installation 25 | 26 | ``` 27 | npm install eliminate --save 28 | ``` 29 | 30 | > **OBS**: This package uses async/await and requires Node.js 7.6 31 | 32 | 33 | ## Usage 34 | 35 | ```js 36 | const del = require('eliminate'); 37 | 38 | // ... 39 | 40 | await del('path/or/file/to/delete.js'); 41 | ``` 42 | 43 | ## API 44 | 45 | 46 | ### eliminate(path) 47 | 48 | Type: `Promise` 49 | 50 | Deletes the directory or file. 51 | If the filepath is a non-empty directory, everything in it will be deleted recursively. 52 | 53 | #### path 54 | 55 | Type: `String` 56 | 57 | The file or directory path to delete. 58 | 59 | 60 | ## CLI 61 | 62 | ``` 63 | $ npm install --global eliminate 64 | ``` 65 | 66 | ``` 67 | $ eliminate path/to/file.js 68 | 69 | $ eliminate path/to/dir 70 | ``` 71 | 72 | 73 | ## License 74 | 75 | MIT © [Terkel Gjervig](https://terkel.com) 76 | -------------------------------------------------------------------------------- /src/bin.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const del = require('./'); 3 | 4 | const help = ` 5 | Examples 6 | $ eliminate [path] 7 | $ eliminate path/to/file.md 8 | $ eliminate path/to/directory 9 | `; 10 | 11 | let args = process.argv.slice(2); 12 | 13 | if (args.includes('--help') || args.includes('-h')) { 14 | console.log(help); 15 | process.exit(); 16 | } 17 | 18 | if (args[0]) { 19 | del(args[0]) 20 | .then(() => process.exit()) 21 | .catch(() => console.log(`Could not eliminate '${args[0]}'`)) 22 | } else { 23 | console.log('No path provided'); 24 | process.exit(); 25 | } 26 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const { join } = require('path'); 3 | const { promisify } = require('util'); 4 | 5 | const lstat = promisify(fs.lstat); 6 | const unlink = promisify(fs.unlink); 7 | const readdir = promisify(fs.readdir); 8 | const rmdir = promisify(fs.rmdir); 9 | 10 | /** 11 | * Delete directory or file 12 | * @param {String} dir The path/file to delete 13 | */ 14 | async function eliminate(dir) { 15 | const stat = await lstat(dir); 16 | if (!stat.isDirectory()) { 17 | await unlink(dir); 18 | return; 19 | } 20 | const files = await readdir(dir); 21 | for (const file of files) { 22 | const path = join(dir, file); 23 | if (fs.existsSync(path)) { 24 | await eliminate(path); 25 | } else { 26 | await unlink(path); 27 | } 28 | } 29 | await rmdir(dir); 30 | } 31 | 32 | module.exports = eliminate; 33 | -------------------------------------------------------------------------------- /test/eliminate.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const fs = require('fs'); 3 | const { join } = require('path'); 4 | const eliminate = require('../'); 5 | const mkdirp = require('./helpers'); 6 | 7 | const DIR = join('test', 'fixtures'); 8 | 9 | test('standard', async t => { 10 | t.plan(2); 11 | 12 | mkdirp(DIR); 13 | const A = join(DIR, 'a.js'); 14 | 15 | fs.writeFileSync(A); 16 | 17 | t.equal(typeof eliminate, 'function', 'consturctor is a typeof function'); 18 | t.equal(typeof await eliminate(A), 'undefined', 'returns undefined'); 19 | }); 20 | 21 | test('eliminate directories', async t => { 22 | t.plan(4); 23 | 24 | const A = join(DIR, 'a'); 25 | mkdirp(A); 26 | 27 | const B = join(DIR, 'b'); 28 | mkdirp(B); 29 | 30 | const B1 = join(B, 'b1'); 31 | mkdirp(B1); 32 | 33 | const B2 = join(B, 'b2'); 34 | mkdirp(B2); 35 | 36 | await eliminate(A); 37 | t.equal(fs.existsSync(A), false, 'delete dir a'); 38 | 39 | await eliminate(B2); 40 | t.equal(fs.existsSync(B2), false, 'delete dir b2 in b'); 41 | t.equal(fs.existsSync(B), true, 'do not delete b itself'); 42 | 43 | await eliminate(B); 44 | t.equal(fs.existsSync(B), false, 'delete dir b and in it'); 45 | }); 46 | 47 | test('eliminate files', async t => { 48 | t.plan(3); 49 | 50 | const A = join(DIR, 'a.js'); 51 | fs.writeFileSync(A); 52 | 53 | const B = join(DIR, 'b.js'); 54 | fs.writeFileSync(B); 55 | 56 | await eliminate(A); 57 | t.equal(fs.existsSync(A), false, 'delete file a'); 58 | t.equal(fs.existsSync(B), true, 'keep file b'); 59 | 60 | await eliminate(B); 61 | t.equal(fs.existsSync(A), false, 'delete file b'); 62 | }); 63 | -------------------------------------------------------------------------------- /test/helpers/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs'); 3 | 4 | function mkdirp(dir) { 5 | const parent = path.dirname(dir); 6 | if (parent === dir) return; 7 | 8 | mkdirp(parent); 9 | 10 | try { 11 | fs.mkdirSync(dir); 12 | } catch (err) { 13 | if (err.code !== 'EEXIST') throw err; 14 | } 15 | } 16 | 17 | module.exports = mkdirp; 18 | --------------------------------------------------------------------------------