UNPKG

1.72 kBJavaScriptView Raw
1'use strict'
2
3const debug = require('debug')('elint:walker')
4const co = require('co')
5const path = require('path')
6const isGitHooks = require('../utils/is-git-hooks')
7const { getBaseDir } = require('../env')
8const { defaultIgnore } = require('../config')
9const { getFileTree, fillFileTree } = require('./filetree')
10const local = require('./local')
11const stage = require('./stage')
12
13/**
14 * 文件遍历
15 *
16 * @param {Array<string>} patterns 匹配模式
17 * @param {object} [options] 配置
18 * @returns {Promise<object>} file tree
19 */
20function walker (patterns, options = {}) {
21 debug(`input glob patterns: ${patterns}`)
22 debug('input options: %o', options)
23
24 const fileTree = getFileTree()
25 const noIgnore = typeof options.noIgnore === 'boolean'
26 ? options.noIgnore
27 : false // 默认不禁用 ignore 规则
28
29 if (!patterns || (Array.isArray(patterns) && !patterns.length)) {
30 return Promise.resolve(fileTree)
31 }
32
33 return co(function * () {
34 const isGit = yield isGitHooks()
35
36 debug(`run in git hooks: ${isGit}`)
37
38 /**
39 * 根据运行环境执行不同的文件遍历策略
40 */
41 let fileList
42 let ignorePatterns = []
43
44 if (!noIgnore) {
45 debug('ignore rules: %j', defaultIgnore)
46 ignorePatterns = defaultIgnore
47 }
48
49 if (isGit) {
50 fileList = yield stage(patterns, ignorePatterns)
51 } else {
52 fileList = yield local(patterns, ignorePatterns)
53 }
54
55 // 转为绝对路径
56 const baseDir = getBaseDir()
57 fileList = fileList.map(p => {
58 return path.join(baseDir, p)
59 })
60
61 fillFileTree(fileTree, fileList)
62
63 debug('fileList: %o', fileList)
64 debug('fileTree: %o', fileTree)
65
66 return fileTree
67 })
68}
69
70module.exports = walker