index.js
1 'use strict'; 2 const path = require('path'); 3 const resolveCwd = require('resolve-cwd'); 4 const pkgDir = require('pkg-dir'); 5 6 module.exports = filename => { 7 const globalDir = pkgDir.sync(path.dirname(filename)); 8 const relativePath = path.relative(globalDir, filename); 9 const pkg = require(path.join(globalDir, 'package.json')); 10 const localFile = resolveCwd.silent(path.join(pkg.name, relativePath)); 11 const localNodeModules = path.join(process.cwd(), 'node_modules'); 12 13 const filenameInLocalNodeModules = !path.relative(localNodeModules, filename).startsWith('..') && 14 // On Windows, if `localNodeModules` and `filename` are on different partitions, `path.relative()` returns the value of `filename`, resulting in `filenameInLocalNodeModules` incorrectly becoming `true`. 15 path.parse(localNodeModules).root === path.parse(filename).root; 16 17 // Use `path.relative()` to detect local package installation, 18 // because __filename's case is inconsistent on Windows 19 // Can use `===` when targeting Node.js 8 20 // See https://github.com/nodejs/node/issues/6624 21 return !filenameInLocalNodeModules && localFile && path.relative(localFile, filename) !== '' && require(localFile); 22 };