Blame view

node_modules/true-case-path/index.js 1.35 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  '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