47 lines
1.3 KiB
JavaScript
47 lines
1.3 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
function getDirectoryComponents (path, sep) {
|
||
|
var components = path.split(sep)
|
||
|
|
||
|
// Remove any trailing separators and the base component.
|
||
|
var last = ''
|
||
|
while (last === '') {
|
||
|
last = components.pop()
|
||
|
}
|
||
|
|
||
|
return components
|
||
|
}
|
||
|
|
||
|
module.exports = function commonPathPrefix (paths, sep) {
|
||
|
if (!sep) {
|
||
|
var m = /(\/|\\)/.exec(paths[0])
|
||
|
// The first path did not contain any directory components. Bail now.
|
||
|
if (!m) return ''
|
||
|
sep = m[0]
|
||
|
}
|
||
|
|
||
|
// Object to hold prefix strings formed of the directory components of each
|
||
|
// path. The value for each prefix string is the number of times that prefix
|
||
|
// occurred in the `paths` array.
|
||
|
var prefixes = Object.create(null)
|
||
|
for (var i = 0; i < paths.length; i++) {
|
||
|
var dirComponents = getDirectoryComponents(paths[i], sep)
|
||
|
var prefix = ''
|
||
|
for (var j = 0; j < dirComponents.length; j++) {
|
||
|
prefix += dirComponents[j] + sep
|
||
|
prefixes[prefix] = (prefixes[prefix] || 0) + 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Find the prefixes that occurred for each path and sort them by length
|
||
|
// (longest first).
|
||
|
var common = Object.keys(prefixes).filter(function (prefix) {
|
||
|
return prefixes[prefix] === paths.length
|
||
|
}).sort(function (a, b) {
|
||
|
return b.length - a.length
|
||
|
})
|
||
|
|
||
|
// Return the longest common path prefix, or the empty string.
|
||
|
return common[0] || ''
|
||
|
}
|