mirror of https://github.com/lukechilds/node.git
Browse Source
The `p < nmLen` condition will fail when a module's name is end with `node_modules` like `foo_node_modules`. The old logic will miss the `foo_node_modules/node_modules` in node_modules paths. TL;TR, a module named like `foo_node_modules` can't require any module in the node_modules folder. Fixes: https://github.com/nodejs/node/issues/6679 PR-URL: https://github.com/nodejs/node/pull/6670 Reviewed-By: Evan Lucas <evanlucas@me.com>v6.x
hefangshi
9 years ago
committed by
cjihrig
2 changed files with 119 additions and 19 deletions
@ -1,20 +1,105 @@ |
|||
'use strict'; |
|||
var common = require('../common'); |
|||
var assert = require('assert'); |
|||
|
|||
var module = require('module'); |
|||
const common = require('../common'); |
|||
const assert = require('assert'); |
|||
const _module = require('module'); |
|||
|
|||
var file, delimiter, paths; |
|||
const cases = { |
|||
'WIN': [{ |
|||
file: 'C:\\Users\\hefangshi\\AppData\\Roaming\ |
|||
\\npm\\node_modules\\npm\\node_modules\\minimatch', |
|||
expect: [ |
|||
'C:\\Users\\hefangshi\\AppData\\Roaming\ |
|||
\\npm\\node_modules\\npm\\node_modules\\minimatch\\node_modules', |
|||
'C:\\Users\\hefangshi\\AppData\\Roaming\ |
|||
\\npm\\node_modules\\npm\\node_modules', |
|||
'C:\\Users\\hefangshi\\AppData\\Roaming\\npm\\node_modules', |
|||
'C:\\Users\\hefangshi\\AppData\\Roaming\\node_modules', |
|||
'C:\\Users\\hefangshi\\AppData\\node_modules', |
|||
'C:\\Users\\hefangshi\\node_modules', |
|||
'C:\\Users\\node_modules', |
|||
'C:\\node_modules' |
|||
] |
|||
}, { |
|||
file: 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo', |
|||
expect: [ |
|||
'C:\\Users\\Rocko Artischocko\\node_stuff\\foo\\node_modules', |
|||
'C:\\Users\\Rocko Artischocko\\node_stuff\\node_modules', |
|||
'C:\\Users\\Rocko Artischocko\\node_modules', |
|||
'C:\\Users\\node_modules', |
|||
'C:\\node_modules' |
|||
] |
|||
}, { |
|||
file: 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo_node_modules', |
|||
expect: [ |
|||
'C:\\Users\\Rocko \ |
|||
Artischocko\\node_stuff\\foo_node_modules\\node_modules', |
|||
'C:\\Users\\Rocko Artischocko\\node_stuff\\node_modules', |
|||
'C:\\Users\\Rocko Artischocko\\node_modules', |
|||
'C:\\Users\\node_modules', |
|||
'C:\\node_modules' |
|||
] |
|||
}, { |
|||
file: 'C:\\node_modules', |
|||
expect: [ |
|||
'C:\\node_modules' |
|||
] |
|||
}, { |
|||
file: 'C:\\', |
|||
expect: [ |
|||
'C:\\node_modules' |
|||
] |
|||
}], |
|||
'POSIX': [{ |
|||
file: '/usr/lib/node_modules/npm/node_modules/\ |
|||
node-gyp/node_modules/glob/node_modules/minimatch', |
|||
expect: [ |
|||
'/usr/lib/node_modules/npm/node_modules/\ |
|||
node-gyp/node_modules/glob/node_modules/minimatch/node_modules', |
|||
'/usr/lib/node_modules/npm/node_modules/\ |
|||
node-gyp/node_modules/glob/node_modules', |
|||
'/usr/lib/node_modules/npm/node_modules/node-gyp/node_modules', |
|||
'/usr/lib/node_modules/npm/node_modules', |
|||
'/usr/lib/node_modules', |
|||
'/usr/node_modules', |
|||
'/node_modules' |
|||
] |
|||
}, { |
|||
file: '/usr/test/lib/node_modules/npm/foo', |
|||
expect: [ |
|||
'/usr/test/lib/node_modules/npm/foo/node_modules', |
|||
'/usr/test/lib/node_modules/npm/node_modules', |
|||
'/usr/test/lib/node_modules', |
|||
'/usr/test/node_modules', |
|||
'/usr/node_modules', |
|||
'/node_modules' |
|||
] |
|||
}, { |
|||
file: '/usr/test/lib/node_modules/npm/foo_node_modules', |
|||
expect: [ |
|||
'/usr/test/lib/node_modules/npm/foo_node_modules/node_modules', |
|||
'/usr/test/lib/node_modules/npm/node_modules', |
|||
'/usr/test/lib/node_modules', |
|||
'/usr/test/node_modules', |
|||
'/usr/node_modules', |
|||
'/node_modules' |
|||
] |
|||
}, { |
|||
file: '/node_modules', |
|||
expect: [ |
|||
'/node_modules' |
|||
] |
|||
}, { |
|||
file: '/', |
|||
expect: [ |
|||
'/node_modules' |
|||
] |
|||
}] |
|||
}; |
|||
|
|||
if (common.isWindows) { |
|||
file = 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo'; |
|||
delimiter = '\\'; |
|||
} else { |
|||
file = '/usr/test/lib/node_modules/npm/foo'; |
|||
delimiter = '/'; |
|||
} |
|||
|
|||
paths = module._nodeModulePaths(file); |
|||
|
|||
assert.ok(paths.indexOf(file + delimiter + 'node_modules') !== -1); |
|||
assert.ok(Array.isArray(paths)); |
|||
const platformCases = common.isWindows ? cases.WIN : cases.POSIX; |
|||
platformCases.forEach((c) => { |
|||
const paths = _module._nodeModulePaths(c.file); |
|||
assert.deepStrictEqual(c.expect, paths, 'case ' + c.file + |
|||
' failed, actual paths is ' + JSON.stringify(paths)); |
|||
}); |
|||
|
Loading…
Reference in new issue