'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