UNPKG

4.39 kBJavaScriptView Raw
1var fs = require('graceful-fs')
2var path = require('path')
3var _ = require('lodash')
4var useragent = require('useragent')
5var Promise = require('bluebird')
6var mm = require('minimatch')
7
8exports.browserFullNameToShort = function (fullName) {
9 var agent = useragent.parse(fullName)
10 var isKnown = agent.family !== 'Other' && agent.os.family !== 'Other'
11 return isKnown ? agent.toAgent() + ' (' + agent.os + ')' : fullName
12}
13
14exports.isDefined = function (value) {
15 return !_.isUndefined(value)
16}
17var parser = function (pattern, out) {
18 if (pattern.length === 0) return out
19 var p = /^(\[[^\]]*\]|[*+@?]\((.+?)\))/g
20 var matches = p.exec(pattern)
21 if (!matches) {
22 var c = pattern[0]
23 var t = 'word'
24 if (c === '*') {
25 t = 'star'
26 } else if (c === '?') {
27 t = 'optional'
28 }
29 out[t]++
30 return parser(pattern.substring(1), out)
31 }
32 if (matches[2] !== undefined) {
33 out.ext_glob++
34 parser(matches[2], out)
35 return parser(pattern.substring(matches[0].length), out)
36 }
37 out.range++
38 return parser(pattern.substring(matches[0].length), out)
39}
40
41var gsParser = function (pattern, out) {
42 if (pattern === '**') {
43 out.glob_star++
44 return out
45 }
46 return parser(pattern, out)
47}
48
49var compareWeightObject = function (w1, w2) {
50 return exports.mmComparePatternWeights(
51 [w1.glob_star, w1.star, w1.ext_glob, w1.range, w1.optional],
52 [w2.glob_star, w2.star, w2.ext_glob, w2.range, w2.optional]
53 )
54}
55
56exports.mmPatternWeight = function (pattern) {
57 var m = new mm.Minimatch(pattern)
58 if (!m.globParts) return [0, 0, 0, 0, 0, 0]
59 var result = m.globParts.reduce(function (prev, p) {
60 var r = p.reduce(function (prev, p) {
61 return gsParser(p, prev)
62 }, {glob_star: 0, ext_glob: 0, word: 0, star: 0, optional: 0, range: 0})
63 if (prev === undefined) return r
64 return compareWeightObject(r, prev) > 0 ? r : prev
65 }, undefined)
66 result.glob_sets = m.set.length
67 return [result.glob_sets, result.glob_star, result.star, result.ext_glob, result.range, result.optional]
68}
69
70exports.mmComparePatternWeights = function (weight1, weight2) {
71 var n1, n2, diff
72 n1 = weight1[0]
73 n2 = weight2[0]
74 diff = n1 - n2
75 if (diff !== 0) return diff / Math.abs(diff)
76 return weight1.length > 1 ? exports.mmComparePatternWeights(weight1.slice(1), weight2.slice(1)) : 0
77}
78
79exports.isFunction = _.isFunction
80exports.isString = _.isString
81exports.isObject = _.isObject
82exports.isArray = _.isArray
83exports.isNumber = _.isNumber
84
85var ABS_URL = /^https?:\/\//
86exports.isUrlAbsolute = function (url) {
87 return ABS_URL.test(url)
88}
89
90exports.camelToSnake = function (camelCase) {
91 return camelCase.replace(/[A-Z]/g, function (match, pos) {
92 return (pos > 0 ? '_' : '') + match.toLowerCase()
93 })
94}
95
96exports.ucFirst = function (word) {
97 return word.charAt(0).toUpperCase() + word.substr(1)
98}
99
100exports.dashToCamel = function (dash) {
101 var words = dash.split('-')
102 return words.shift() + words.map(exports.ucFirst).join('')
103}
104
105exports.arrayRemove = function (collection, item) {
106 var idx = collection.indexOf(item)
107
108 if (idx !== -1) {
109 collection.splice(idx, 1)
110 return true
111 }
112
113 return false
114}
115
116exports.merge = function () {
117 var args = Array.prototype.slice.call(arguments, 0)
118 args.unshift({})
119 return _.merge.apply({}, args)
120}
121
122exports.formatTimeInterval = function (time) {
123 var mins = Math.floor(time / 60000)
124 var secs = (time - mins * 60000) / 1000
125 var str = secs + (secs === 1 ? ' sec' : ' secs')
126
127 if (mins) {
128 str = mins + (mins === 1 ? ' min ' : ' mins ') + str
129 }
130
131 return str
132}
133
134var replaceWinPath = function (path) {
135 return _.isString(path) ? path.replace(/\\/g, '/') : path
136}
137
138exports.normalizeWinPath = process.platform === 'win32' ? replaceWinPath : _.identity
139
140exports.mkdirIfNotExists = function mkdir (directory, done) {
141 // TODO(vojta): handle if it's a file
142 /* eslint-disable handle-callback-err */
143 fs.stat(directory, function (err, stat) {
144 if (stat && stat.isDirectory()) {
145 done()
146 } else {
147 mkdir(path.dirname(directory), function () {
148 fs.mkdir(directory, done)
149 })
150 }
151 })
152 /* eslint-enable handle-callback-err */
153}
154
155exports.defer = function () {
156 var resolve
157 var reject
158 var promise = new Promise(function () {
159 resolve = arguments[0]
160 reject = arguments[1]
161 })
162
163 return {
164 resolve: resolve,
165 reject: reject,
166 promise: promise
167 }
168}