@atlaskit/eslint-plugin-design-system
Version:
The essential plugin for use with the Atlassian Design System.
43 lines (42 loc) • 1.72 kB
JavaScript
/* eslint-disable @repo/internal/react/require-jsdoc */
import { insertImportSpecifier, isNodeOfType } from 'eslint-codemod-utils';
export var Import = {
/**
* Note: fixes can't overlap, which means this will fail:
* ```
* const importNode = Root.findImportByModule('@atlaskit/primitives')
* Import.insertNamedSpecifier(importNode, 'Box')
* Import.insertNamedSpecifier(importNode, 'xcss')
* ```
*
* For this reason `insertNamedSpecifiers` accepts a `specifiers` array, so you can group all inserts together.
*/
insertNamedSpecifiers: function insertNamedSpecifiers(node, specifiers, fixer) {
var _this = this;
/**
* `insertImportSpecifier()` has the unfortunate implementation detail of naively adding duplicate specifiers.
* e.g. calling
* `insertImportSpecifier(importDecl, 'xcss')`
* on
* `import { Inline, xcss } from '@atlaskit/primitives'`
* will result in:
* `import { Inline, xcss, xcss } from '@atlaskit/primitives'`.
* So, we need to filter out specifiers that are already imported.
*/
var uniqueSpecifiers = specifiers.filter(function (specifier) {
return !_this.containsNamedSpecifier(node, specifier);
});
if (uniqueSpecifiers.length === 0) {
return;
}
return fixer.replaceText(node, "".concat(insertImportSpecifier(node, uniqueSpecifiers.join(', ')), ";\n"));
},
containsNamedSpecifier: function containsNamedSpecifier(node, name) {
return node.specifiers.some(function (specifier) {
if (!isNodeOfType(specifier, 'ImportSpecifier')) {
return false;
}
return specifier.imported.type === 'Identifier' && specifier.imported.name === name;
});
}
};