├── .gitignore ├── README.md ├── bin └── treeplus.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | /test/unit/coverage/ 7 | /test/e2e/reports/ 8 | selenium-debug.log 9 | .history 10 | 11 | # Editor directories and files 12 | .idea 13 | .vscode 14 | *.svn 15 | *.suo 16 | *.ntvs* 17 | *.njsproj 18 | *.sln -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > treeplus is a node module for creating and manipulating hierarchical tree structures. 2 | 3 | > 很多时候我们在输出项目结构, 但是我们需要排除一些文件或者只需要文件夹结构,treeplus 就很好的实现了这些。 4 | 5 | # Install 6 | 7 | ```bash 8 | $ npm install treeplus -g 9 | ``` 10 | 11 | # Usage 12 | 13 | ```bash 14 | $ [tp|treeplus] 15 | # or 16 | $ [tp|treeplus] --help 查看帮助 17 | ``` 18 | 19 | # example 20 | 21 | ```bash 22 | $ tp -i node_modules 23 | # 指定参数,排除单个目录 24 | # Returns 25 | 26 | ├──bin 27 | │ └──treeplus.js 28 | ├──package-lock.json 29 | ├──package.json 30 | └──README.md 31 | ``` 32 | 33 | ```bash 34 | # 指定参数,排除多个目录 35 | $ tp -i node_modules bin 36 | 37 | # Returns 38 | 39 | ├──package-lock.json 40 | ├──package.json 41 | └──README.md 42 | ``` 43 | 44 | ```bash 45 | # 指定参数,只打印文件夹 46 | $ tp -d 47 | 48 | # Returns 49 | 50 | ├──bin 51 | ``` 52 | 53 | ```bash 54 | # 指定参数,打印指定的层级,参数大于0 55 | $ tp -l 1 56 | 57 | # Returns 58 | 59 | ├──bin 60 | ``` 61 | 62 | ```bash 63 | # 多参数结合使用 64 | $ tp -d -l 2 -i node_modules 65 | 66 | # Returns 67 | 68 | ├──bin 69 | ``` 70 | 71 | ```bash 72 | $ tp 73 | 74 | # Returns 75 | 76 | ├──bin 77 | │ └──treeplus.js 78 | ├──node_modules 79 | │ ├──.bin 80 | │ │ ├──index.js 81 | │ │ ├──LICENSE 82 | │ │ ├──package.json 83 | │ │ ├──README.md 84 | │ │ └──yargs.js 85 | │ ├──yargs-parser 86 | │ │ ├──lib 87 | │ │ │ └──tokenize-arg-string.js 88 | │ │ ├──CHANGELOG.md 89 | │ │ ├──index.js 90 | │ │ ├──LICENSE.txt 91 | │ │ ├──package.json 92 | │ │ └──README.md 93 | ├──package-lock.json 94 | ├──package.json 95 | └──README.md 96 | ``` 97 | -------------------------------------------------------------------------------- /bin/treeplus.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const argv = require('yargs') 4 | .usage('Usage: tp [options]') 5 | .example('tp -i node_modules', '排除node_modules文件夹') 6 | .alias('i', 'ignore') 7 | .alias('d', 'dir') 8 | .alias('l', 'lev') 9 | .describe('i', '您要排除显示的文件夹') 10 | .describe('d', '只打印文件夹') 11 | .describe('l', '指定打印的层级') 12 | .help('help').argv 13 | const fs = require('fs') 14 | const path = require('path') 15 | const target = path.join(process.cwd()) 16 | 17 | function deep(target, depth, ignore) { 18 | var prefix = new Array(depth + 1).join('│ ') 19 | const dirinfo = fs.readdirSync(target) 20 | var dirs = [] 21 | var files = [] 22 | dirinfo.forEach(info => { 23 | var stats = fs.statSync(path.join(target, info)) 24 | if (stats.isFile()) { 25 | files.push(info) 26 | } else { 27 | dirs.push(info) 28 | } 29 | }) 30 | 31 | if (ignore && ignore.length > 0) { 32 | for (var i = 0; i < ignore.length; i++) { 33 | for (var j = 0; j < dirs.length; j++) { 34 | if (dirs[j] == ignore[i]) { 35 | dirs.splice(j, 1) 36 | j-- 37 | } 38 | } 39 | } 40 | } 41 | 42 | dirs.forEach(dir => { 43 | console.log(`${prefix}├──${dir}`) 44 | // console.log('TCL: argv', argv.l, depth) 45 | if (!argv.l) { 46 | deep(path.join(target, dir), depth + 1) 47 | } else { 48 | if (argv.l > depth + 1) { 49 | deep(path.join(target, dir), depth + 1) 50 | } 51 | } 52 | }) 53 | 54 | var count = files.length - 1 55 | if (!argv.d || !argv.dir) { 56 | files.forEach(file => { 57 | console.log(`${prefix}${count-- ? '├─' : '└─'}─${file}`) 58 | }) 59 | } 60 | } 61 | 62 | if (argv.ignore) { 63 | if (argv.ignore !== true) { 64 | var _ignore = argv._ 65 | _ignore.push(argv.ignore) 66 | deep(target, 0, _ignore) 67 | } else { 68 | deep(target, 0) 69 | } 70 | } else { 71 | deep(target, 0) 72 | } 73 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "treeplus", 3 | "version": "1.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "3.0.0", 9 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 10 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 11 | }, 12 | "camelcase": { 13 | "version": "4.1.0", 14 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", 15 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 16 | }, 17 | "cliui": { 18 | "version": "4.0.0", 19 | "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-4.0.0.tgz", 20 | "integrity": "sha1-dD1GUOBfNtHtJXW1ljjYcyK/u8w=", 21 | "requires": { 22 | "string-width": "^2.1.1", 23 | "strip-ansi": "^4.0.0", 24 | "wrap-ansi": "^2.0.0" 25 | } 26 | }, 27 | "code-point-at": { 28 | "version": "1.1.0", 29 | "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", 30 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 31 | }, 32 | "commander": { 33 | "version": "2.15.0", 34 | "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.15.0.tgz", 35 | "integrity": "sha1-rSojocOwNuOSRpuAEs7GsztMEyI=" 36 | }, 37 | "cross-spawn": { 38 | "version": "5.1.0", 39 | "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", 40 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 41 | "requires": { 42 | "lru-cache": "^4.0.1", 43 | "shebang-command": "^1.2.0", 44 | "which": "^1.2.9" 45 | } 46 | }, 47 | "decamelize": { 48 | "version": "1.2.0", 49 | "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", 50 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 51 | }, 52 | "execa": { 53 | "version": "0.7.0", 54 | "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz", 55 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 56 | "requires": { 57 | "cross-spawn": "^5.0.1", 58 | "get-stream": "^3.0.0", 59 | "is-stream": "^1.1.0", 60 | "npm-run-path": "^2.0.0", 61 | "p-finally": "^1.0.0", 62 | "signal-exit": "^3.0.0", 63 | "strip-eof": "^1.0.0" 64 | } 65 | }, 66 | "find-up": { 67 | "version": "2.1.0", 68 | "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", 69 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 70 | "requires": { 71 | "locate-path": "^2.0.0" 72 | } 73 | }, 74 | "get-caller-file": { 75 | "version": "1.0.2", 76 | "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.2.tgz", 77 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" 78 | }, 79 | "get-stream": { 80 | "version": "3.0.0", 81 | "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", 82 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 83 | }, 84 | "invert-kv": { 85 | "version": "1.0.0", 86 | "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", 87 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 88 | }, 89 | "is-fullwidth-code-point": { 90 | "version": "2.0.0", 91 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 92 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 93 | }, 94 | "is-stream": { 95 | "version": "1.1.0", 96 | "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", 97 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 98 | }, 99 | "isexe": { 100 | "version": "2.0.0", 101 | "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", 102 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 103 | }, 104 | "lcid": { 105 | "version": "1.0.0", 106 | "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", 107 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 108 | "requires": { 109 | "invert-kv": "^1.0.0" 110 | } 111 | }, 112 | "locate-path": { 113 | "version": "2.0.0", 114 | "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", 115 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 116 | "requires": { 117 | "p-locate": "^2.0.0", 118 | "path-exists": "^3.0.0" 119 | } 120 | }, 121 | "lru-cache": { 122 | "version": "4.1.2", 123 | "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.2.tgz", 124 | "integrity": "sha1-RSNLLm4vKzPaElYkxGZJKaAiTD8=", 125 | "requires": { 126 | "pseudomap": "^1.0.2", 127 | "yallist": "^2.1.2" 128 | } 129 | }, 130 | "mem": { 131 | "version": "1.1.0", 132 | "resolved": "http://registry.npm.taobao.org/mem/download/mem-1.1.0.tgz", 133 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", 134 | "requires": { 135 | "mimic-fn": "^1.0.0" 136 | } 137 | }, 138 | "mimic-fn": { 139 | "version": "1.2.0", 140 | "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", 141 | "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=" 142 | }, 143 | "npm-run-path": { 144 | "version": "2.0.2", 145 | "resolved": "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", 146 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 147 | "requires": { 148 | "path-key": "^2.0.0" 149 | } 150 | }, 151 | "number-is-nan": { 152 | "version": "1.0.1", 153 | "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", 154 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 155 | }, 156 | "os-locale": { 157 | "version": "2.1.0", 158 | "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-2.1.0.tgz", 159 | "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", 160 | "requires": { 161 | "execa": "^0.7.0", 162 | "lcid": "^1.0.0", 163 | "mem": "^1.1.0" 164 | } 165 | }, 166 | "p-finally": { 167 | "version": "1.0.0", 168 | "resolved": "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", 169 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 170 | }, 171 | "p-limit": { 172 | "version": "1.2.0", 173 | "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.2.0.tgz", 174 | "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", 175 | "requires": { 176 | "p-try": "^1.0.0" 177 | } 178 | }, 179 | "p-locate": { 180 | "version": "2.0.0", 181 | "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", 182 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 183 | "requires": { 184 | "p-limit": "^1.1.0" 185 | } 186 | }, 187 | "p-try": { 188 | "version": "1.0.0", 189 | "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", 190 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 191 | }, 192 | "path-exists": { 193 | "version": "3.0.0", 194 | "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", 195 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 196 | }, 197 | "path-key": { 198 | "version": "2.0.1", 199 | "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", 200 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 201 | }, 202 | "pseudomap": { 203 | "version": "1.0.2", 204 | "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", 205 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 206 | }, 207 | "require-directory": { 208 | "version": "2.1.1", 209 | "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", 210 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 211 | }, 212 | "require-main-filename": { 213 | "version": "1.0.1", 214 | "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", 215 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 216 | }, 217 | "set-blocking": { 218 | "version": "2.0.0", 219 | "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", 220 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 221 | }, 222 | "shebang-command": { 223 | "version": "1.2.0", 224 | "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", 225 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 226 | "requires": { 227 | "shebang-regex": "^1.0.0" 228 | } 229 | }, 230 | "shebang-regex": { 231 | "version": "1.0.0", 232 | "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", 233 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 234 | }, 235 | "signal-exit": { 236 | "version": "3.0.2", 237 | "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", 238 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 239 | }, 240 | "string-width": { 241 | "version": "2.1.1", 242 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 243 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 244 | "requires": { 245 | "is-fullwidth-code-point": "^2.0.0", 246 | "strip-ansi": "^4.0.0" 247 | } 248 | }, 249 | "strip-ansi": { 250 | "version": "4.0.0", 251 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 252 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 253 | "requires": { 254 | "ansi-regex": "^3.0.0" 255 | } 256 | }, 257 | "strip-eof": { 258 | "version": "1.0.0", 259 | "resolved": "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", 260 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 261 | }, 262 | "which": { 263 | "version": "1.3.0", 264 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.0.tgz", 265 | "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", 266 | "requires": { 267 | "isexe": "^2.0.0" 268 | } 269 | }, 270 | "which-module": { 271 | "version": "2.0.0", 272 | "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", 273 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 274 | }, 275 | "wrap-ansi": { 276 | "version": "2.1.0", 277 | "resolved": "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", 278 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 279 | "requires": { 280 | "string-width": "^1.0.1", 281 | "strip-ansi": "^3.0.1" 282 | }, 283 | "dependencies": { 284 | "ansi-regex": { 285 | "version": "2.1.1", 286 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", 287 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 288 | }, 289 | "is-fullwidth-code-point": { 290 | "version": "1.0.0", 291 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", 292 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 293 | "requires": { 294 | "number-is-nan": "^1.0.0" 295 | } 296 | }, 297 | "string-width": { 298 | "version": "1.0.2", 299 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", 300 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 301 | "requires": { 302 | "code-point-at": "^1.0.0", 303 | "is-fullwidth-code-point": "^1.0.0", 304 | "strip-ansi": "^3.0.0" 305 | } 306 | }, 307 | "strip-ansi": { 308 | "version": "3.0.1", 309 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", 310 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 311 | "requires": { 312 | "ansi-regex": "^2.0.0" 313 | } 314 | } 315 | } 316 | }, 317 | "y18n": { 318 | "version": "3.2.1", 319 | "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", 320 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 321 | }, 322 | "yallist": { 323 | "version": "2.1.2", 324 | "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", 325 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 326 | }, 327 | "yargs": { 328 | "version": "11.0.0", 329 | "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-11.0.0.tgz", 330 | "integrity": "sha1-wFKTEAbF7udGEOX8A1S+39CKIBs=", 331 | "requires": { 332 | "cliui": "^4.0.0", 333 | "decamelize": "^1.1.1", 334 | "find-up": "^2.1.0", 335 | "get-caller-file": "^1.0.1", 336 | "os-locale": "^2.0.0", 337 | "require-directory": "^2.1.1", 338 | "require-main-filename": "^1.0.1", 339 | "set-blocking": "^2.0.0", 340 | "string-width": "^2.0.0", 341 | "which-module": "^2.0.0", 342 | "y18n": "^3.2.1", 343 | "yargs-parser": "^9.0.2" 344 | } 345 | }, 346 | "yargs-parser": { 347 | "version": "9.0.2", 348 | "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-9.0.2.tgz", 349 | "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", 350 | "requires": { 351 | "camelcase": "^4.1.0" 352 | } 353 | } 354 | } 355 | } 356 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "treeplus", 3 | "version": "1.1.3", 4 | "description": "treeplus is a node module for creating and manipulating hierarchical tree structures.", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git@github.com:artiely/treeplus.git" 11 | }, 12 | "bin": { 13 | "treeplus": "bin/treeplus.js", 14 | "tp": "bin/treeplus.js" 15 | }, 16 | "engines": { 17 | "node": ">= 0.10" 18 | }, 19 | "readmeFilename": "README.md", 20 | "keywords": [ 21 | "tree", 22 | "treeplus", 23 | "tree structures", 24 | "文件树", 25 | "文件树", 26 | "树目录", 27 | "目录树", 28 | "文件结构", 29 | "项目结构" 30 | ], 31 | "author": "artiely", 32 | "license": "ISC", 33 | "dependencies": { 34 | "commander": "^2.15.0", 35 | "yargs": "^11.0.0" 36 | } 37 | } 38 | --------------------------------------------------------------------------------