1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | const path = require('path')
|
7 | const fs = require('fs-extra')
|
8 | const glob = require('glob')
|
9 |
|
10 | function noop () {}
|
11 |
|
12 | function 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 |
|
25 | function 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 |
|
39 | function globPify (...args) {
|
40 | return pify(glob)(...args)
|
41 | }
|
42 |
|
43 | function 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 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | function 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 |
|
76 | function 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 |
|
94 | function pathFormat (pathname, shouldRemoveExt = true) {
|
95 | pathname = pathname.replace(/\\/g, '/')
|
96 | if (!shouldRemoveExt) {
|
97 | return pathname
|
98 | }
|
99 |
|
100 | return removeExt(pathname)
|
101 | }
|
102 |
|
103 | function removeExt (pathname) {
|
104 | let ext = path.extname(pathname)
|
105 | if (ext === '') {
|
106 | return pathname
|
107 | }
|
108 | return pathname.slice(0, -ext.length)
|
109 | }
|
110 |
|
111 | module.exports = {
|
112 | noop,
|
113 | resolvePath,
|
114 | pify,
|
115 | globPify,
|
116 | someAsync,
|
117 | resolveModule,
|
118 | pathFormat,
|
119 | removeExt,
|
120 | objectSubset
|
121 | }
|