Skip to content

Commit

Permalink
[Fix] no-cycle: Accept import typeof, like import type
Browse files Browse the repository at this point in the history
Fixes #2607.
  • Loading branch information
gnprice committed Nov 30, 2022
1 parent f4f305b commit 0c1d0b9
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 4 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Expand Up @@ -25,6 +25,7 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
- [`order`]: require with member expression could not be fixed if alphabetize.order was used ([#2490], thanks [@msvab])
- [`order`]: leave more space in rankings for consecutive path groups ([#2506], thanks [@Pearce-Ropion])
- [`no-cycle`]: add ExportNamedDeclaration statements to dependencies ([#2511], thanks [@BenoitZugmeyer])
- [`no-cycle`]: accept Flow `typeof` imports, just like `type` ([#2608], thanks [@gnprice])
- [`dynamic-import-chunkname`]: prevent false report on a valid webpack magic comment ([#2330], thanks [@mhmadhamster])
- [`export`]: do not error on TS export overloads ([#1590], thanks [@ljharb])
- [`no-unresolved`], [`extensions`]: ignore type only exports ([#2436], thanks [@Lukas-Kullmann])
Expand Down Expand Up @@ -1024,6 +1025,7 @@ for info on changes for earlier releases.

[`memo-parser`]: ./memo-parser/README.md

[#2608]: https://github.com/import-js/eslint-plugin-import/pull/2608
[#2605]: https://github.com/import-js/eslint-plugin-import/pull/2605
[#2598]: https://github.com/import-js/eslint-plugin-import/pull/2598
[#2589]: https://github.com/import-js/eslint-plugin-import/pull/2589
Expand Down Expand Up @@ -1624,6 +1626,7 @@ for info on changes for earlier releases.
[@gavriguy]: https://github.com/gavriguy
[@georeith]: https://github.com/georeith
[@giodamelio]: https://github.com/giodamelio
[@gnprice]: https://github.com/gnprice
[@golergka]: https://github.com/golergka
[@golopot]: https://github.com/golopot
[@GoodForOneFare]: https://github.com/GoodForOneFare
Expand Down
10 changes: 6 additions & 4 deletions src/ExportMap.js
Expand Up @@ -502,8 +502,8 @@ ExportMap.parse = function (path, content, context) {
}

function captureDependencyWithSpecifiers(n) {
// import type { Foo } (TS and Flow)
const declarationIsType = n.importKind === 'type';
// import type { Foo } (TS and Flow); import typeof { Foo } (Flow)
const declarationIsType = n.importKind === 'type' || n.importKind === 'typeof';
// import './foo' or import {} from './foo' (both 0 specifiers) is a side effect and
// shouldn't be considered to be just importing types
let specifiersOnlyImportingTypes = n.specifiers.length > 0;
Expand All @@ -515,8 +515,10 @@ ExportMap.parse = function (path, content, context) {
importedSpecifiers.add(specifier.type);
}

// import { type Foo } (Flow)
specifiersOnlyImportingTypes = specifiersOnlyImportingTypes && specifier.importKind === 'type';
// import { type Foo } (Flow); import { typeof Foo } (Flow)
specifiersOnlyImportingTypes =
specifiersOnlyImportingTypes
&& (specifier.importKind === 'type' || specifier.importKind === 'typeof');
});
captureDependency(n, declarationIsType || specifiersOnlyImportingTypes, importedSpecifiers);
}
Expand Down
4 changes: 4 additions & 0 deletions tests/files/cycles/flow-typeof.js
@@ -0,0 +1,4 @@
// @flow
import typeof Foo from './depth-zero';
import { typeof Bar } from './depth-zero';
import typeof { Bar } from './depth-zero';
4 changes: 4 additions & 0 deletions tests/src/rules/no-cycle.js
Expand Up @@ -111,6 +111,10 @@ ruleTester.run('no-cycle', rule, {
code: 'import { bar } from "./flow-types-only-importing-multiple-types"',
parser: parsers.BABEL_OLD,
}),
test({
code: 'import { bar } from "./flow-typeof"',
parser: parsers.BABEL_OLD,
}),
),

invalid: [].concat(
Expand Down

0 comments on commit 0c1d0b9

Please sign in to comment.