Skip to content

Commit 38b4c9a

Browse files
committed
fix(imports): Always add relative imports to the other sort group
Fixes #62
1 parent fa8de6e commit 38b4c9a

File tree

4 files changed

+126
-3
lines changed

4 files changed

+126
-3
lines changed

src/__tests__/exports.spec.ts

+59-2
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,29 @@ createRuleTester().run("sort/exports", rule, {
9898
},
9999
],
100100
},
101+
{
102+
name: "Ignores relative paths when detecting depedencies",
103+
code: dedent`
104+
const mark = ''
105+
106+
export default React
107+
export { depA } from 'dependency-a'
108+
export { depB } from 'dependency-b'
109+
export { relB } from '../../relative-from-node-modules.js'
110+
export { relA } from './a'
111+
export { mark }
112+
`.trim(),
113+
options: [
114+
{
115+
groups: [
116+
{ type: "default", order: 10 },
117+
{ type: "sourceless", order: 50 },
118+
{ type: "dependency", order: 30 },
119+
{ type: "other", order: 40 },
120+
],
121+
},
122+
],
123+
},
101124
],
102125
invalid: [
103126
{
@@ -291,7 +314,7 @@ createRuleTester().run("sort/exports", rule, {
291314
export * from 'a'
292315
export { b } from 'b'
293316
export { mark }
294-
`.trim(),
317+
`.trim(),
295318
options: [
296319
{
297320
groups: [
@@ -305,6 +328,40 @@ createRuleTester().run("sort/exports", rule, {
305328
],
306329
errors: [{ messageId: "unsorted" }],
307330
},
331+
{
332+
name: "Ignores relative paths when detecting depedencies",
333+
code: dedent`
334+
const mark = ''
335+
336+
export { depB } from 'dependency-b'
337+
export { mark }
338+
export default React
339+
export { relB } from '../../relative-from-node-modules.js'
340+
export { relA } from './a'
341+
export { depA } from 'dependency-a'
342+
`.trim(),
343+
output: dedent`
344+
const mark = ''
345+
346+
export default React
347+
export { depA } from 'dependency-a'
348+
export { depB } from 'dependency-b'
349+
export { relB } from '../../relative-from-node-modules.js'
350+
export { relA } from './a'
351+
export { mark }
352+
`.trim(),
353+
options: [
354+
{
355+
groups: [
356+
{ type: "default", order: 10 },
357+
{ type: "sourceless", order: 50 },
358+
{ type: "dependency", order: 30 },
359+
{ type: "other", order: 40 },
360+
],
361+
},
362+
],
363+
errors: [{ messageId: "unsorted" }],
364+
},
308365
],
309366
})
310367

@@ -456,7 +513,7 @@ createRuleTester({
456513
export type { A } from 'dependency-a'
457514
export { mark }
458515
export default React
459-
`.trim(),
516+
`.trim(),
460517
options: [
461518
{
462519
groups: [

src/__tests__/imports.spec.ts

+57
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,29 @@ createRuleTester().run("sort/imports", rule, {
106106
},
107107
],
108108
},
109+
{
110+
name: "Ignores relative paths when detecting depedencies",
111+
code: dedent`
112+
import 'index.css'
113+
import 'side-effect'
114+
import a from "dependency-b"
115+
import b from "dependency-c"
116+
import d from "b.jpg"
117+
import c from "../../relative-from-node-modules.js"
118+
import h from "../b"
119+
import i from "./b"
120+
`,
121+
options: [
122+
{
123+
groups: [
124+
{ type: "side-effect", order: 10 },
125+
{ regex: "\\.(png|jpg)$", order: 30 },
126+
{ type: "dependency", order: 20 },
127+
{ type: "other", order: 40 },
128+
],
129+
},
130+
],
131+
},
109132

110133
// Separator
111134
{
@@ -1111,5 +1134,39 @@ createRuleTester({
11111134
},
11121135
],
11131136
},
1137+
{
1138+
name: "Ignores relative paths when detecting depedencies",
1139+
code: dedent`
1140+
import 'index.css'
1141+
import c from "../../relative-from-node-modules.js"
1142+
import b from "dependency-c"
1143+
import d from "b.jpg"
1144+
import 'side-effect'
1145+
import h from "../b"
1146+
import a from "dependency-b"
1147+
import i from "./b"
1148+
`,
1149+
errors: [{ messageId: "unsorted" }],
1150+
output: dedent`
1151+
import 'index.css'
1152+
import 'side-effect'
1153+
import a from "dependency-b"
1154+
import b from "dependency-c"
1155+
import d from "b.jpg"
1156+
import c from "../../relative-from-node-modules.js"
1157+
import h from "../b"
1158+
import i from "./b"
1159+
`,
1160+
options: [
1161+
{
1162+
groups: [
1163+
{ type: "side-effect", order: 10 },
1164+
{ regex: "\\.(png|jpg)$", order: 30 },
1165+
{ type: "dependency", order: 20 },
1166+
{ type: "other", order: 40 },
1167+
],
1168+
},
1169+
],
1170+
},
11141171
],
11151172
})

src/resolver.ts

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ import resolve from "isomorphic-resolve"
33
const resolveCache = new Map<string, boolean>()
44

55
export function isResolved(source: string) {
6+
// Ignore relative imports to prevent false positives where a path is
7+
// resolvable from the node_modules directory and elsewhere in the project.
8+
if (source.startsWith(".")) {
9+
return false
10+
}
11+
612
if (globalThis.resolver) {
713
return globalThis.resolver(source)
814
}

src/test-utils.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import { RuleTester } from "eslint"
33
import { it, describe } from "vitest"
44

55
globalThis.resolver = (source) => {
6-
return source.startsWith("dependency-")
6+
return (
7+
source.startsWith("dependency-") ||
8+
source === "../../relative-from-node-modules.js"
9+
)
710
}
811

912
export function createValidCodeVariants(

0 commit comments

Comments
 (0)