You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.4 KiB
32 lines
1.4 KiB
'use strict' |
|
|
|
var glob = require('glob') |
|
var path = require('path') |
|
|
|
function trueCasePathSync(fsPath) { |
|
|
|
// Normalize the path so as to resolve . and .. components. |
|
// !! As of Node v4.1.1, a path starting with ../ is NOT resolved relative |
|
// !! to the current dir, and glob.sync() below then fails. |
|
// !! When in doubt, resolve with fs.realPathSync() *beforehand*. |
|
var fsPathNormalized = path.normalize(fsPath) |
|
|
|
// OSX: HFS+ stores filenames in NFD (decomposed normal form) Unicode format, |
|
// so we must ensure that the input path is in that format first. |
|
if (process.platform === 'darwin') fsPathNormalized = fsPathNormalized.normalize('NFD') |
|
|
|
// !! Windows: Curiously, the drive component mustn't be part of a glob, |
|
// !! otherwise glob.sync() will invariably match nothing. |
|
// !! Thus, we remove the drive component and instead pass it in as the 'cwd' |
|
// !! (working dir.) property below. |
|
var pathRoot = path.parse(fsPathNormalized).root |
|
var noDrivePath = fsPathNormalized.slice(Math.max(pathRoot.length - 1, 0)) |
|
|
|
// Perform case-insensitive globbing (on Windows, relative to the drive / |
|
// network share) and return the 1st match, if any. |
|
// Fortunately, glob() with nocase case-corrects the input even if it is |
|
// a *literal* path. |
|
return glob.sync(noDrivePath, { nocase: true, cwd: pathRoot })[0] |
|
} |
|
|
|
module.exports = trueCasePathSync
|
|
|