Skip to content

Commit 1f3f270

Browse files
committed
feat(oxlint-config): named-import-order newlines
1 parent 4144844 commit 1f3f270

8 files changed

Lines changed: 68 additions & 17 deletions

File tree

packages/oxlint-config/src/plugin/named-import-order.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,21 +131,28 @@ function hasInnerComments(sourceCode, range) {
131131
&& comment.range[1] < range[1])
132132
}
133133

134+
function shouldBeMultiline(sourceCode, range, items) {
135+
return items.length > 1
136+
&& !sourceCode.text.slice(range[0], range[1]).includes('\n')
137+
}
138+
134139
function getFixedText(node, items, options, sourceCode, range) {
135140
const text = sourceCode.text
136141
const content = text.slice(range[0], range[1])
137142
const sortedSpecifiers = [...items]
138143
.sort(compareItems)
139144
.map(({ specifier }) => sourceCode.getText(specifier))
140145

141-
if (!content.includes('\n')) {
146+
if (!content.includes('\n') && items.length < 2) {
142147
return ` ${sortedSpecifiers.join(', ')} `
143148
}
144149

145150
const linebreak = getLinebreak(text)
146151
const firstSpecifier = items[0].specifier
147-
const indent = getLineIndent(text, firstSpecifier.range[0])
148152
const closingIndent = getLineIndent(text, node.range[0])
153+
const indent = content.includes('\n')
154+
? getLineIndent(text, firstSpecifier.range[0])
155+
: `${closingIndent} `
149156

150157
return `${linebreak}${indent}${sortedSpecifiers.join(`,${linebreak}${indent}`)}${linebreak}${closingIndent}`
151158
}
@@ -203,13 +210,18 @@ export default {
203210
}
204211

205212
const unorderedPair = getFirstUnorderedPair(items)
213+
const sourceCode = context.sourceCode
214+
const range = getBracesRange(node, items, sourceCode)
215+
const invalidMultiline = range && shouldBeMultiline(
216+
sourceCode,
217+
range,
218+
items
219+
)
206220

207-
if (!unorderedPair) {
221+
if (!unorderedPair && !invalidMultiline) {
208222
return
209223
}
210224

211-
const sourceCode = context.sourceCode
212-
const range = getBracesRange(node, items, sourceCode)
213225
const fix = range && !hasInnerComments(sourceCode, range)
214226
? fixer => fixer.replaceTextRange(
215227
range,
@@ -219,11 +231,16 @@ export default {
219231
const [
220232
previousItem,
221233
item
222-
] = unorderedPair
234+
] = unorderedPair ?? [
235+
items[0],
236+
items[1]
237+
]
223238

224239
context.report({
225240
node: item.specifier,
226-
message: getMessage(previousItem, item),
241+
message: unorderedPair
242+
? getMessage(previousItem, item)
243+
: 'Expected named imports to be multiline.',
227244
fix
228245
})
229246
}

packages/oxlint/src/index.spec.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { describe, it, expect } from 'vitest'
1+
import {
2+
describe,
3+
it,
4+
expect
5+
} from 'vitest'
26
import { defineConfig } from './index.js'
37

48
describe('oxlint', () => {

packages/project-files/src/api.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { dirname, join } from 'path'
1+
import {
2+
dirname,
3+
join
4+
} from 'path'
25
import { Octokit } from '@octokit/rest'
36
import { writeFile } from './fs.js'
47

packages/project-files/src/bin.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#!/usr/bin/env node
22
import { fileURLToPath } from 'url'
3-
import { dirname, join } from 'path'
3+
import {
4+
dirname,
5+
join
6+
} from 'path'
47
import {
58
readFile,
69
writeFile,

packages/project-files/src/parse.spec.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
import { describe, it, expect } from 'vitest'
2-
import { parseFilesList, parseSourcesList } from './parse.js'
1+
import {
2+
describe,
3+
it,
4+
expect
5+
} from 'vitest'
6+
import {
7+
parseFilesList,
8+
parseSourcesList
9+
} from './parse.js'
310

411
describe('project-files', () => {
512
describe('parse', () => {

packages/scripts/src/utils/args.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { read, argv } from 'argue-cli'
1+
import {
2+
read,
3+
argv
4+
} from 'argue-cli'
25

36
const pnpm7 = 7
47

packages/scripts/src/utils/args.spec.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
import { describe, it, expect } from 'vitest'
1+
import {
2+
describe,
3+
it,
4+
expect
5+
} from 'vitest'
26
import { setArgs } from 'argue-cli'
3-
import { detectPackageManager, getRunArgs, readScripts } from './args.js'
7+
import {
8+
detectPackageManager,
9+
getRunArgs,
10+
readScripts
11+
} from './args.js'
412

513
describe('scripts', () => {
614
describe('utils', () => {

packages/scripts/src/utils/files.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
import { resolve, dirname } from 'path'
2-
import { constants, promises } from 'fs'
1+
import {
2+
resolve,
3+
dirname
4+
} from 'path'
5+
import {
6+
constants,
7+
promises
8+
} from 'fs'
39

410
const { access, readFile } = promises
511

0 commit comments

Comments
 (0)