From d0c5c6fd5c8c8944eb90c2a7482f8b49488b2c65 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 9 Oct 2023 12:51:47 -0500 Subject: [PATCH] feat: add no-drafts-import rule --- docs/rules/no-drafts-import.md | 23 +++++++++++ src/rules/__tests__/no-drafts-import.test.js | 41 ++++++++++++++++++++ src/rules/no-drafts-import.js | 38 ++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 docs/rules/no-drafts-import.md create mode 100644 src/rules/__tests__/no-drafts-import.test.js create mode 100644 src/rules/no-drafts-import.js diff --git a/docs/rules/no-drafts-import.md b/docs/rules/no-drafts-import.md new file mode 100644 index 00000000..6d463fc3 --- /dev/null +++ b/docs/rules/no-drafts-import.md @@ -0,0 +1,23 @@ +# Disallow use of the drafts endpoint in primer/react (no-drafts-import) + +🔧 The `--fix` option on the [ESLint CLI](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. + +The `/drafts` endpoint in `@primer/react` has been deprecated in favor of +`@primer/react/experimental`. + +## Rule details + +This rule disallows the use of importing from `@primer/react/drafts` as +`@primer/react/experimental` is now the preferred entrypoint. + +👎 Examples of **incorrect** code for this rule: + +```tsx +import {UnderlineNav} from '@primer/react/drafts' +``` + +👍 Examples of **correct** code for this rule: + +```tsx +import {UnderlineNav} from '@primer/react/experimental' +``` diff --git a/src/rules/__tests__/no-drafts-import.test.js b/src/rules/__tests__/no-drafts-import.test.js new file mode 100644 index 00000000..9cbc6eb5 --- /dev/null +++ b/src/rules/__tests__/no-drafts-import.test.js @@ -0,0 +1,41 @@ +'use strict' + +const rule = require('../no-drafts-import') +const {RuleTester} = require('eslint') + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + ecmaFeatures: { + jsx: true + } + } +}) + +ruleTester.run('no-drafts-import', rule, { + valid: [ + `import {UnderlineNav} from '@primer/react/experimental'`, + `import {TreeView, UnderlineNav} from '@primer/react/experimental'` + ], + invalid: [ + { + code: `import {UnderlineNav} from '@primer/react/drafts'`, + output: `import {UnderlineNav} from '@primer/react/experimental'`, + errors: [ + { + messageId: 'entrypoint-error' + } + ] + }, + { + code: `import {TreeView, UnderlineNav} from '@primer/react/drafts'`, + output: `import {TreeView, UnderlineNav} from '@primer/react/experimental'`, + errors: [ + { + messageId: 'entrypoint-error' + } + ] + } + ] +}) diff --git a/src/rules/no-drafts-import.js b/src/rules/no-drafts-import.js new file mode 100644 index 00000000..931ed206 --- /dev/null +++ b/src/rules/no-drafts-import.js @@ -0,0 +1,38 @@ +'use strict' + +/** + * @type {import('eslint').Rule.RuleModule} + */ +module.exports = { + meta: { + docs: { + description: '', + url: require('../url')(module) + }, + type: 'suggestion', + hasSuggestions: true, + fixable: true, + schema: [], + messages: { + 'entrypoint-error': 'The drafts entrypoint is deprecated. Use the experimental entrypoint instead.' + } + }, + create(context) { + return { + ImportDeclaration(node) { + const source = node.source.value + if (source !== '@primer/react/drafts') { + return + } + + context.report({ + node, + messageId: 'entrypoint-error', + fix(fixer) { + return fixer.replaceText(node.source, `'@primer/react/experimental'`) + } + }) + } + } + } +}