From 9488fc633eaa138bb58a5e99ca0eb1505814ecf3 Mon Sep 17 00:00:00 2001 From: Fathy Boundjadj Date: Sun, 18 Mar 2018 04:13:41 +0100 Subject: [PATCH] Fix scoped modules (#1013) --- src/Resolver.js | 14 +++++++++-- .../node_modules/@scope/pkg/foo/bar.js | 0 .../resolver/node_modules/@scope/pkg/index.js | 0 .../node_modules/@scope/pkg/package.json | 3 +++ test/resolver.js | 24 +++++++++++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 test/integration/resolver/node_modules/@scope/pkg/foo/bar.js create mode 100644 test/integration/resolver/node_modules/@scope/pkg/index.js create mode 100644 test/integration/resolver/node_modules/@scope/pkg/package.json diff --git a/src/Resolver.js b/src/Resolver.js index de124c709a6..1da3574567f 100644 --- a/src/Resolver.js +++ b/src/Resolver.js @@ -130,7 +130,7 @@ class Resolver { return {path: builtins[filename]}; } - let parts = filename.split(path.sep); + let parts = this.getModuleParts(filename); let root = path.parse(dir).root; while (dir !== root) { @@ -298,7 +298,7 @@ class Resolver { alias = aliases[filename]; if (alias == null) { // If it didn't match, try only the module name. - let parts = filename.split(path.sep); + let parts = this.getModuleParts(filename); alias = aliases[parts[0]]; if (typeof alias === 'string') { // Append the filename back onto the aliased module. @@ -346,6 +346,16 @@ class Resolver { let pkg = await this.findPackage(dir); return this.resolveAliases(filename, pkg); } + + getModuleParts(name) { + let parts = path.normalize(name).split(path.sep); + if (parts[0].charAt(0) === '@') { + // Scoped module (e.g. @scope/module). Merge the first two parts back together. + parts.splice(0, 2, `${parts[0]}/${parts[1]}`); + } + + return parts; + } } module.exports = Resolver; diff --git a/test/integration/resolver/node_modules/@scope/pkg/foo/bar.js b/test/integration/resolver/node_modules/@scope/pkg/foo/bar.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/integration/resolver/node_modules/@scope/pkg/index.js b/test/integration/resolver/node_modules/@scope/pkg/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/integration/resolver/node_modules/@scope/pkg/package.json b/test/integration/resolver/node_modules/@scope/pkg/package.json new file mode 100644 index 00000000000..6c00c77a65f --- /dev/null +++ b/test/integration/resolver/node_modules/@scope/pkg/package.json @@ -0,0 +1,3 @@ +{ + "name": "scope-pkg" +} diff --git a/test/resolver.js b/test/resolver.js index 389a20ffdd6..6cf13ca405c 100644 --- a/test/resolver.js +++ b/test/resolver.js @@ -198,6 +198,30 @@ describe('resolver', function() { ); assert.equal(resolved.pkg.name, 'foo'); }); + + it('should resolve a scoped module', async function() { + let resolved = await resolver.resolve( + '@scope/pkg', + path.join(rootDir, 'foo.js') + ); + assert.equal( + resolved.path, + path.resolve(rootDir, 'node_modules/@scope/pkg/index.js') + ); + assert.equal(resolved.pkg.name, 'scope-pkg'); + }); + + it('should resolve a file inside a scoped module', async function() { + let resolved = await resolver.resolve( + '@scope/pkg/foo/bar', + path.join(rootDir, 'foo.js') + ); + assert.equal( + resolved.path, + path.resolve(rootDir, 'node_modules/@scope/pkg/foo/bar.js') + ); + assert.equal(resolved.pkg.name, 'scope-pkg'); + }); }); describe('aliases', function() {