Skip to content

Commit eb04624

Browse files
authored
feat(rules): add no-deprecated-entrypoints rule (#129)
* feat(rules): add no-deprecated-entrypoints rule * docs: update rule docs * chore: add changeset
1 parent f1f4384 commit eb04624

File tree

5 files changed

+96
-0
lines changed

5 files changed

+96
-0
lines changed

.changeset/big-bananas-teach.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'eslint-plugin-primer-react': minor
3+
---
4+
5+
Add no-deprecated-entrypoints rule to lint against deprecated import usage in @primer/react
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# No Deprecated Entrypoints
2+
3+
## Rule Details
4+
5+
This rule enforces the usage of non-deprecated entrypoints from `@primer/react`.
6+
7+
👎 Examples of **incorrect** code for this rule
8+
9+
```jsx
10+
import {DataTable} from '@primer/react/drafts'
11+
12+
function ExampleComponent() {
13+
return <DataTable>{/* ... */}</DataTable>
14+
}
15+
```
16+
17+
👍 Examples of **correct** code for this rule:
18+
19+
```jsx
20+
import {ExampleComponent} from '@primer/react/experimental'
21+
22+
function ExampleComponent() {
23+
return <DataTable>{/* ... */}</DataTable>
24+
}
25+
```

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module.exports = {
22
rules: {
33
'direct-slot-children': require('./rules/direct-slot-children'),
44
'no-deprecated-colors': require('./rules/no-deprecated-colors'),
5+
'no-deprecated-entrypoints': require('./rules/no-deprecated-entrypoints'),
56
'no-system-props': require('./rules/no-system-props'),
67
'a11y-tooltip-interactive-trigger': require('./rules/a11y-tooltip-interactive-trigger'),
78
'new-color-css-vars': require('./rules/new-color-css-vars'),
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict'
2+
3+
const {RuleTester} = require('eslint')
4+
const rule = require('../no-deprecated-entrypoints')
5+
6+
const ruleTester = new RuleTester({
7+
parserOptions: {
8+
ecmaVersion: 'latest',
9+
sourceType: 'module',
10+
ecmaFeatures: {
11+
jsx: true,
12+
},
13+
},
14+
})
15+
16+
ruleTester.run('no-deprecated-entrypoints', rule, {
17+
valid: [`import {Box} from '@primer/react';`],
18+
invalid: [
19+
{
20+
code: `import {DataTable} from '@primer/react/drafts';`,
21+
output: `import {DataTable} from '@primer/react/experimental';`,
22+
errors: [
23+
{
24+
message:
25+
'The drafts entrypoint is deprecated and will be removed in the next major release. Use the experimental entrypoint instead',
26+
},
27+
],
28+
},
29+
],
30+
})
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'use strict'
2+
3+
const url = require('../url')
4+
5+
/**
6+
* @type {import('eslint').Rule.RuleModule}
7+
*/
8+
module.exports = {
9+
meta: {
10+
type: 'problem',
11+
docs: {
12+
description: 'Avoid using deprecated entrypoints from @primer/react',
13+
recommended: true,
14+
url: url(module),
15+
},
16+
fixable: true,
17+
schema: [],
18+
},
19+
create(context) {
20+
return {
21+
ImportDeclaration(node) {
22+
if (node.source.value === '@primer/react/drafts') {
23+
context.report({
24+
node,
25+
message:
26+
'The drafts entrypoint is deprecated and will be removed in the next major release. Use the experimental entrypoint instead',
27+
fix(fixer) {
28+
return fixer.replaceText(node.source, `'@primer/react/experimental'`)
29+
},
30+
})
31+
}
32+
},
33+
}
34+
},
35+
}

0 commit comments

Comments
 (0)