UNPKG

2.38 kBJavaScriptView Raw
1/**
2 * @file helper.js
3 * @author clark-t (clarktanglei@163.com)
4 */
5
6const path = require('path')
7const fs = require('fs-extra')
8const glob = require('glob')
9
10function noop () {}
11
12function resolvePath (possiblePaths) {
13 return someAsync(possiblePaths.map(
14 iPath => fs.exists(iPath).then(
15 result => new Promise(
16 (resolve, reject) => (
17 result ? resolve(iPath) : reject(Error('not found.'))
18 )
19 )
20 )
21 ))
22 .catch(noop)
23}
24
25function pify (fn) {
26 return (...args) => new Promise((resolve, reject) => {
27 let callback = (err, result) => {
28 if (err) {
29 reject(err)
30 } else {
31 resolve(result)
32 }
33 }
34
35 fn(...args, callback)
36 })
37}
38
39function globPify (...args) {
40 return pify(glob)(...args)
41}
42
43function someAsync (promises) {
44 return new Promise((resolve, reject) => {
45 let maxLength = promises.length
46 let failCounter = 0
47 let errCallback = err => {
48 if (++failCounter === maxLength) {
49 reject(err)
50 }
51 }
52
53 for (let i = 0; i < maxLength; i++) {
54 promises[i].then(resolve).catch(errCallback)
55 }
56 })
57}
58
59/**
60 * 获取 obj 的子集
61 *
62 * @param {Object} obj obj
63 * @param {Array.<string>} names property names
64 * @return {Object} 子集
65 */
66function objectSubset (obj, names) {
67 let result = {}
68 for (let i = 0; i < names.length; i++) {
69 if (obj[names[i]] !== undefined) {
70 result[names[i]] = obj[names[i]]
71 }
72 }
73 return result
74}
75
76function resolveModule (moduleName, rest) {
77 let possiblePaths = [
78 path.resolve(__dirname, '../../node_modules'),
79 path.resolve(__dirname, '../../../../node_modules')
80 ]
81 .map(p => path.resolve(p, moduleName))
82
83 if (rest) {
84 possiblePaths = possiblePaths.map(p => path.resolve(p, rest))
85 }
86
87 for (let i = 0; i < possiblePaths.length; i++) {
88 if (fs.existsSync(possiblePaths[i])) {
89 return possiblePaths[i]
90 }
91 }
92}
93
94function pathFormat (pathname, shouldRemoveExt = true) {
95 pathname = pathname.replace(/\\/g, '/')
96 if (!shouldRemoveExt) {
97 return pathname
98 }
99
100 return removeExt(pathname)
101}
102
103function removeExt (pathname) {
104 let ext = path.extname(pathname)
105 if (ext === '') {
106 return pathname
107 }
108 return pathname.slice(0, -ext.length)
109}
110
111module.exports = {
112 noop,
113 resolvePath,
114 pify,
115 globPify,
116 someAsync,
117 resolveModule,
118 pathFormat,
119 removeExt,
120 objectSubset
121}