diff --git a/package.json b/package.json index 906cf8fa46..bfb70de07d 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "homepage": "https://github.com/benmosher/eslint-plugin-import", "devDependencies": { "@eslint/import-test-order-redirect-scoped": "file:./tests/files/order-redirect-scoped", + "@test-scope/some-module": "file:./tests/files/symlinked-module", "@typescript-eslint/parser": "1.10.3-alpha.13", "babel-cli": "^6.26.0", "babel-core": "^6.26.3", diff --git a/tests/files/symlinked-module/index.js b/tests/files/symlinked-module/index.js new file mode 100644 index 0000000000..b1c6ea436a --- /dev/null +++ b/tests/files/symlinked-module/index.js @@ -0,0 +1 @@ +export default {} diff --git a/tests/files/symlinked-module/package.json b/tests/files/symlinked-module/package.json new file mode 100644 index 0000000000..722be5c3c4 --- /dev/null +++ b/tests/files/symlinked-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "@test-scope/some-module", + "version": "1.0.0", + "private": true +} diff --git a/tests/src/core/importType.js b/tests/src/core/importType.js index f1e951cc47..b3343083c5 100644 --- a/tests/src/core/importType.js +++ b/tests/src/core/importType.js @@ -3,7 +3,7 @@ import * as path from 'path' import importType from 'core/importType' -import { testContext } from '../utils' +import { testContext, testFilePath } from '../utils' describe('importType(name)', function () { const context = testContext() @@ -145,4 +145,92 @@ describe('importType(name)', function () { const foldersContext = testContext({ 'import/external-module-folders': ['node_modules'] }) expect(importType('resolve', foldersContext)).to.equal('external') }) + + it("should return 'external' for a scoped symlinked module", function() { + const foldersContext = testContext({ + 'import/resolver': 'node', + 'import/external-module-folders': ['node_modules'], + }) + expect(importType('@test-scope/some-module', foldersContext)).to.equal('external') + }) + + // We're using Webpack resolver here since it resolves all symlinks, which means that + // directory path will not contain node_modules/ but will point to the + // actual directory inside 'files' instead + it("should return 'external' for a scoped module from a symlinked directory which name " + + "is contained in 'external-module-folders' (webpack resolver)", function() { + const foldersContext = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['symlinked-module'], + }) + expect(importType('@test-scope/some-module', foldersContext)).to.equal('external') + }) + + it("should return 'internal' for a scoped module from a symlinked directory which incomplete " + + "name is contained in 'external-module-folders' (webpack resolver)", function() { + const foldersContext_1 = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['symlinked-mod'], + }) + expect(importType('@test-scope/some-module', foldersContext_1)).to.equal('internal') + + const foldersContext_2 = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['linked-module'], + }) + expect(importType('@test-scope/some-module', foldersContext_1)).to.equal('internal') + }) + + it("should return 'external' for a scoped module from a symlinked directory which partial path " + + "is contained in 'external-module-folders' (webpack resolver)", function() { + const foldersContext = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['files/symlinked-module'], + }) + expect(importType('@test-scope/some-module', foldersContext)).to.equal('external') + }) + + it("should return 'internal' for a scoped module from a symlinked directory which partial path " + + "w/ incomplete segment is contained in 'external-module-folders' " + + "(webpack resolver)", function() { + const foldersContext_1 = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['files/symlinked-mod'], + }) + expect(importType('@test-scope/some-module', foldersContext_1)).to.equal('internal') + + const foldersContext_2 = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['les/symlinked-module'], + }) + expect(importType('@test-scope/some-module', foldersContext_2)).to.equal('internal') + }) + + it("should return 'external' for a scoped module from a symlinked directory which partial path " + + "ending w/ slash is contained in 'external-module-folders' (webpack resolver)", function() { + const foldersContext = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['files/symlinked-module/'], + }) + expect(importType('@test-scope/some-module', foldersContext)).to.equal('external') + }) + + it("should return 'internal' for a scoped module from a symlinked directory when " + + "'external-module-folders' contains an absolute path resembling directory's relative " + + "path (webpack resolver)", function() { + const foldersContext = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': ['/files/symlinked-module'], + }) + expect(importType('@test-scope/some-module', foldersContext)).to.equal('internal') + }) + + it("should return 'external' for a scoped module from a symlinked directory which absolute " + + "path is contained in 'external-module-folders' (webpack resolver)", function() { + const foldersContext = testContext({ + 'import/resolver': 'webpack', + 'import/external-module-folders': [testFilePath('symlinked-module')], + }) + expect(importType('@test-scope/some-module', foldersContext)).to.equal('external') + }) }) diff --git a/tests/src/rules/order.js b/tests/src/rules/order.js index 8ba8b9f1eb..29ecc28e2d 100644 --- a/tests/src/rules/order.js +++ b/tests/src/rules/order.js @@ -298,7 +298,55 @@ ruleTester.run('order', rule, { ], }], }), + // Monorepo setup, using Webpack resolver, workspace folder name in external-module-folders + test({ + code: ` + import _ from 'lodash'; + import m from '@test-scope/some-module'; + + import bar from './bar'; + `, + options: [{ + 'newlines-between': 'always', + }], + settings: { + 'import/resolver': 'webpack', + 'import/external-module-folders': ['node_modules', 'symlinked-module'], + }, + }), + // Monorepo setup, using Webpack resolver, partial workspace folder path + // in external-module-folders + test({ + code: ` + import _ from 'lodash'; + import m from '@test-scope/some-module'; + + import bar from './bar'; + `, + options: [{ + 'newlines-between': 'always', + }], + settings: { + 'import/resolver': 'webpack', + 'import/external-module-folders': ['node_modules', 'files/symlinked-module'], + }, + }), + // Monorepo setup, using Node resolver (doesn't resolve symlinks) + test({ + code: ` + import _ from 'lodash'; + import m from '@test-scope/some-module'; + import bar from './bar'; + `, + options: [{ + 'newlines-between': 'always', + }], + settings: { + 'import/resolver': 'node', + 'import/external-module-folders': ['node_modules', 'files/symlinked-module'], + }, + }), // Option: newlines-between: 'always' test({ code: `