Skip to content

Commit 72ab8ef

Browse files
committed
[Tests] add tests for monorepo setup w/ webpack and scoped modules (import-js#1597)
1 parent f61c208 commit 72ab8ef

File tree

5 files changed

+144
-1
lines changed

5 files changed

+144
-1
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"homepage": "https://github.com/benmosher/eslint-plugin-import",
5151
"devDependencies": {
5252
"@eslint/import-test-order-redirect-scoped": "file:./tests/files/order-redirect-scoped",
53+
"@test-scope/some-module": "file:./tests/files/symlinked-module",
5354
"@typescript-eslint/parser": "1.10.3-alpha.13",
5455
"babel-cli": "^6.26.0",
5556
"babel-core": "^6.26.3",

tests/files/symlinked-module/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "@test-scope/some-module",
3+
"version": "1.0.0",
4+
"private": true
5+
}

tests/src/core/importType.js

+89-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as path from 'path'
33

44
import importType from 'core/importType'
55

6-
import { testContext } from '../utils'
6+
import { testContext, testFilePath } from '../utils'
77

88
describe('importType(name)', function () {
99
const context = testContext()
@@ -145,4 +145,92 @@ describe('importType(name)', function () {
145145
const foldersContext = testContext({ 'import/external-module-folders': ['node_modules'] })
146146
expect(importType('resolve', foldersContext)).to.equal('external')
147147
})
148+
149+
it("should return 'external' for a scoped symlinked module", function() {
150+
const foldersContext = testContext({
151+
'import/resolver': 'node',
152+
'import/external-module-folders': ['node_modules'],
153+
})
154+
expect(importType('@test-scope/some-module', foldersContext)).to.equal('external')
155+
})
156+
157+
// We're using Webpack resolver here since it resolves all symlinks, which means that
158+
// directory path will not contain node_modules/<package-name> but will point to the
159+
// actual directory inside 'files' instead
160+
it("should return 'external' for a scoped module from a symlinked directory which name " +
161+
"is contained in 'external-module-folders' (webpack resolver)", function() {
162+
const foldersContext = testContext({
163+
'import/resolver': 'webpack',
164+
'import/external-module-folders': ['symlinked-module'],
165+
})
166+
expect(importType('@test-scope/some-module', foldersContext)).to.equal('external')
167+
})
168+
169+
it("should return 'internal' for a scoped module from a symlinked directory which incomplete " +
170+
"name is contained in 'external-module-folders' (webpack resolver)", function() {
171+
const foldersContext_1 = testContext({
172+
'import/resolver': 'webpack',
173+
'import/external-module-folders': ['symlinked-mod'],
174+
})
175+
expect(importType('@test-scope/some-module', foldersContext_1)).to.equal('internal')
176+
177+
const foldersContext_2 = testContext({
178+
'import/resolver': 'webpack',
179+
'import/external-module-folders': ['linked-module'],
180+
})
181+
expect(importType('@test-scope/some-module', foldersContext_1)).to.equal('internal')
182+
})
183+
184+
it("should return 'external' for a scoped module from a symlinked directory which partial path " +
185+
"is contained in 'external-module-folders' (webpack resolver)", function() {
186+
const foldersContext = testContext({
187+
'import/resolver': 'webpack',
188+
'import/external-module-folders': ['files/symlinked-module'],
189+
})
190+
expect(importType('@test-scope/some-module', foldersContext)).to.equal('external')
191+
})
192+
193+
it("should return 'internal' for a scoped module from a symlinked directory which partial path " +
194+
"w/ incomplete segment is contained in 'external-module-folders' " +
195+
"(webpack resolver)", function() {
196+
const foldersContext_1 = testContext({
197+
'import/resolver': 'webpack',
198+
'import/external-module-folders': ['files/symlinked-mod'],
199+
})
200+
expect(importType('@test-scope/some-module', foldersContext_1)).to.equal('internal')
201+
202+
const foldersContext_2 = testContext({
203+
'import/resolver': 'webpack',
204+
'import/external-module-folders': ['les/symlinked-module'],
205+
})
206+
expect(importType('@test-scope/some-module', foldersContext_2)).to.equal('internal')
207+
})
208+
209+
it("should return 'external' for a scoped module from a symlinked directory which partial path " +
210+
"ending w/ slash is contained in 'external-module-folders' (webpack resolver)", function() {
211+
const foldersContext = testContext({
212+
'import/resolver': 'webpack',
213+
'import/external-module-folders': ['files/symlinked-module/'],
214+
})
215+
expect(importType('@test-scope/some-module', foldersContext)).to.equal('external')
216+
})
217+
218+
it("should return 'internal' for a scoped module from a symlinked directory when " +
219+
"'external-module-folders' contains an absolute path resembling directory's relative " +
220+
"path (webpack resolver)", function() {
221+
const foldersContext = testContext({
222+
'import/resolver': 'webpack',
223+
'import/external-module-folders': ['/files/symlinked-module'],
224+
})
225+
expect(importType('@test-scope/some-module', foldersContext)).to.equal('internal')
226+
})
227+
228+
it("should return 'external' for a scoped module from a symlinked directory which absolute " +
229+
"path is contained in 'external-module-folders' (webpack resolver)", function() {
230+
const foldersContext = testContext({
231+
'import/resolver': 'webpack',
232+
'import/external-module-folders': [testFilePath('symlinked-module')],
233+
})
234+
expect(importType('@test-scope/some-module', foldersContext)).to.equal('external')
235+
})
148236
})

tests/src/rules/order.js

+48
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,55 @@ ruleTester.run('order', rule, {
298298
],
299299
}],
300300
}),
301+
// Monorepo setup, using Webpack resolver, workspace folder name in external-module-folders
302+
test({
303+
code: `
304+
import _ from 'lodash';
305+
import m from '@test-scope/some-module';
306+
307+
import bar from './bar';
308+
`,
309+
options: [{
310+
'newlines-between': 'always',
311+
}],
312+
settings: {
313+
'import/resolver': 'webpack',
314+
'import/external-module-folders': ['node_modules', 'symlinked-module'],
315+
},
316+
}),
317+
// Monorepo setup, using Webpack resolver, partial workspace folder path
318+
// in external-module-folders
319+
test({
320+
code: `
321+
import _ from 'lodash';
322+
import m from '@test-scope/some-module';
323+
324+
import bar from './bar';
325+
`,
326+
options: [{
327+
'newlines-between': 'always',
328+
}],
329+
settings: {
330+
'import/resolver': 'webpack',
331+
'import/external-module-folders': ['node_modules', 'files/symlinked-module'],
332+
},
333+
}),
334+
// Monorepo setup, using Node resolver (doesn't resolve symlinks)
335+
test({
336+
code: `
337+
import _ from 'lodash';
338+
import m from '@test-scope/some-module';
301339
340+
import bar from './bar';
341+
`,
342+
options: [{
343+
'newlines-between': 'always',
344+
}],
345+
settings: {
346+
'import/resolver': 'node',
347+
'import/external-module-folders': ['node_modules', 'files/symlinked-module'],
348+
},
349+
}),
302350
// Option: newlines-between: 'always'
303351
test({
304352
code: `

0 commit comments

Comments
 (0)