UNPKG

@atlaskit/eslint-plugin-design-system

Version:

The essential plugin for use with the Atlassian Design System.

42 lines (41 loc) 1.61 kB
/* eslint-disable @repo/internal/react/require-jsdoc */ import { insertImportSpecifier, isNodeOfType } from 'eslint-codemod-utils'; export const 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(node, specifiers, fixer) { /** * `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. */ const uniqueSpecifiers = specifiers.filter(specifier => { return !this.containsNamedSpecifier(node, specifier); }); if (uniqueSpecifiers.length === 0) { return; } return fixer.replaceText(node, `${insertImportSpecifier(node, uniqueSpecifiers.join(', '))};\n`); }, containsNamedSpecifier(node, name) { return node.specifiers.some(specifier => { if (!isNodeOfType(specifier, 'ImportSpecifier')) { return false; } return specifier.imported.type === 'Identifier' && specifier.imported.name === name; }); } };