Skip to content

Commit ae02009

Browse files
committed
feat: add ability to disable or enable side effect imports sorting
1 parent 4e0e6d8 commit ae02009

File tree

3 files changed

+421
-5
lines changed

3 files changed

+421
-5
lines changed

docs/content/rules/sort-imports.mdx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,15 @@ Allows you to specify a pattern for identifying internal imports. This is useful
153153

154154
You can use glob patterns to define these internal imports.
155155

156+
### sortSideEffects
157+
158+
<sub>default: `false`</sub>
159+
160+
Specifies whether side effect imports should be sorted. By default, sorting side-effect imports is disabled for security reasons.
161+
162+
- `true` — Sort side effect imports.
163+
- `false` — Do not sort side effect imports.
164+
156165
### newlinesBetween
157166

158167
<sub>default: `'always'`</sub>

rules/sort-imports.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ type Options<T extends string[]> = [
5959
groups: (Group<T>[] | Group<T>)[]
6060
environment: 'node' | 'bun'
6161
internalPattern: string[]
62+
sortSideEffects: boolean
6263
maxLineLength?: number
6364
order: 'desc' | 'asc'
6465
ignoreCase: boolean
@@ -101,6 +102,11 @@ export default createEslintRule<Options<string[]>, MESSAGE_ID>({
101102
},
102103
type: 'array',
103104
},
105+
sortSideEffects: {
106+
description:
107+
'Controls whether side-effect imports should be sorted.',
108+
type: 'boolean',
109+
},
104110
newlinesBetween: {
105111
description:
106112
'Specifies how new lines should be handled between import groups.',
@@ -197,6 +203,7 @@ export default createEslintRule<Options<string[]>, MESSAGE_ID>({
197203
order: 'asc',
198204
ignoreCase: true,
199205
internalPattern: ['~/**'],
206+
sortSideEffects: false,
200207
newlinesBetween: 'always',
201208
maxLineLength: undefined,
202209
groups: [
@@ -230,6 +237,7 @@ export default createEslintRule<Options<string[]>, MESSAGE_ID>({
230237
customGroups: { type: {}, value: {} },
231238
internalPattern: ['~/**'],
232239
newlinesBetween: 'always',
240+
sortSideEffects: false,
233241
type: 'alphabetical',
234242
environment: 'node',
235243
ignoreCase: true,
@@ -524,10 +532,14 @@ export default createEslintRule<Options<string[]>, MESSAGE_ID>({
524532
if (!(groupNum in grouped)) {
525533
grouped[groupNum] = [node]
526534
} else {
527-
grouped[groupNum] = sortNodes(
528-
[...grouped[groupNum], node],
529-
options,
530-
)
535+
if (!options.sortSideEffects && isSideEffectImport(node.node)) {
536+
grouped[groupNum] = [...grouped[groupNum], node]
537+
} else {
538+
grouped[groupNum] = sortNodes(
539+
[...grouped[groupNum], node],
540+
options,
541+
)
542+
}
531543
}
532544
}
533545

@@ -643,7 +655,9 @@ export default createEslintRule<Options<string[]>, MESSAGE_ID>({
643655

644656
if (
645657
!(
646-
isSideEffectImport(left.node) && isSideEffectImport(right.node)
658+
!options.sortSideEffects &&
659+
isSideEffectImport(left.node) &&
660+
isSideEffectImport(right.node)
647661
) &&
648662
!hasContentBetweenNodes(left, right) &&
649663
(leftNum > rightNum ||

0 commit comments

Comments
 (0)