Skip to content

Commit 622b17e

Browse files
committed
fix(prefer-import-tag): handle other cases of comments before structures early in the document; fixes #1549
1 parent 9e92718 commit 622b17e

File tree

3 files changed

+87
-8
lines changed

3 files changed

+87
-8
lines changed

docs/rules/prefer-import-tag.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,19 @@ let foo;
302302
/** @type {import('foo')} */
303303
let foo;
304304
// Message: Inline `import()` found; prefer `@import`
305+
306+
/** @type {import('foo').bar} */
307+
let foo;
308+
// Message: Inline `import()` found; prefer `@import`
309+
310+
/** @type {import('foo').bar} */
311+
let foo;
312+
// "jsdoc/prefer-import-tag": ["error"|"warn", {"outputType":"named-import"}]
313+
// Message: Inline `import()` found; prefer `@import`
314+
315+
/** @type {import('foo').default} */
316+
let foo;
317+
// Message: Inline `import()` found; prefer `@import`
305318
````
306319

307320

src/rules/preferImportTag.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,15 @@ export default iterateJsdoc(({
386386
enableFixer ? (fixer) => {
387387
getFixer(element.value, [])();
388388

389-
const programNode = sourceCode.getNodeByRangeIndex(0);
389+
const programNode = sourceCode.ast;
390+
const commentNodes = sourceCode.getCommentsBefore(programNode);
391+
390392
return fixer.insertTextBefore(
391-
/** @type {import('estree').Program} */ (programNode),
392-
`/** @import ${element.value} from '${element.value}'; */`,
393+
// @ts-expect-error Ok
394+
commentNodes[0] ?? programNode,
395+
`/** @import ${element.value} from '${element.value}'; */${
396+
commentNodes[0] ? '\n' + indent : ''
397+
}`,
393398
);
394399
} : null,
395400
);
@@ -411,12 +416,18 @@ export default iterateJsdoc(({
411416
)();
412417
}
413418

414-
const programNode = sourceCode.getNodeByRangeIndex(0);
419+
const programNode = sourceCode.ast;
420+
const commentNodes = sourceCode.getCommentsBefore(programNode);
415421
return fixer.insertTextBefore(
416-
/** @type {import('estree').Program} */ (programNode),
422+
// @ts-expect-error Ok
423+
commentNodes[0] ?? programNode,
417424
outputType === 'namespaced-import' ?
418-
`/** @import * as ${element.value} from '${element.value}'; */` :
419-
`/** @import { ${pathSegments.at(-1)} } from '${element.value}'; */`,
425+
`/** @import * as ${element.value} from '${element.value}'; */${
426+
commentNodes[0] ? '\n' + indent : ''
427+
}` :
428+
`/** @import { ${pathSegments.at(-1)} } from '${element.value}'; */${
429+
commentNodes[0] ? '\n' + indent : ''
430+
}`,
420431
);
421432
} : null,
422433
);

test/rules/assertions/preferImportTag.js

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@ export default {
234234
*/
235235
`,
236236
},
237-
238237
{
239238
code: `
240239
/**
@@ -851,6 +850,62 @@ let foo;
851850
let foo;
852851
`,
853852
},
853+
{
854+
code: `
855+
/** @type {import('foo').bar} */
856+
let foo;
857+
`,
858+
errors: [
859+
{
860+
line: 2,
861+
message: 'Inline `import()` found; prefer `@import`',
862+
},
863+
],
864+
output: `
865+
/** @import * as foo from 'foo'; */
866+
/** @type {foo.bar} */
867+
let foo;
868+
`,
869+
},
870+
{
871+
code: `
872+
/** @type {import('foo').bar} */
873+
let foo;
874+
`,
875+
errors: [
876+
{
877+
line: 2,
878+
message: 'Inline `import()` found; prefer `@import`',
879+
},
880+
],
881+
options: [
882+
{
883+
outputType: 'named-import',
884+
},
885+
],
886+
output: `
887+
/** @import { bar } from 'foo'; */
888+
/** @type {bar} */
889+
let foo;
890+
`,
891+
},
892+
{
893+
code: `
894+
/** @type {import('foo').default} */
895+
let foo;
896+
`,
897+
errors: [
898+
{
899+
line: 2,
900+
message: 'Inline `import()` found; prefer `@import`',
901+
},
902+
],
903+
output: `
904+
/** @import foo from 'foo'; */
905+
/** @type {foo} */
906+
let foo;
907+
`,
908+
},
854909
],
855910
valid: [
856911
{

0 commit comments

Comments
 (0)