Skip to content

Commit c420e4e

Browse files
committed
Enhance no-renderer-packages rule documentation and implementation
- Updated the documentation for the `no-renderer-packages` rule to include specific framework package suggestions based on the renderer being used. - Refactored the rule's implementation to utilize a mapping of renderer packages to their corresponding framework packages, improving clarity and maintainability. - Added additional framework-specific package links in the documentation for better guidance.
1 parent e17a2fe commit c420e4e

File tree

2 files changed

+51
-52
lines changed

2 files changed

+51
-52
lines changed

docs/rules/no-renderer-packages.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,20 @@
1010

1111
This rule prevents importing Storybook renderer packages directly in stories. Instead, you should use framework-specific packages that are designed for your build tool (e.g., Vite, webpack).
1212

13+
The rule will suggest appropriate framework packages based on which renderer you're trying to use:
14+
15+
- For `@storybook/html`: Use `@storybook/html-vite` or `@storybook/html-webpack5`
16+
- For `@storybook/preact`: Use `@storybook/preact-vite` or `@storybook/preact-webpack5`
17+
- For `@storybook/react`: Use `@storybook/nextjs`, `@storybook/react-vite`, `@storybook/react-webpack5`, `@storybook/react-native-web-vite`, or `@storybook/experimental-nextjs-vite`
18+
- For `@storybook/server`: Use `@storybook/server-webpack5`
19+
- For `@storybook/svelte`: Use `@storybook/svelte-vite`, `@storybook/svelte-webpack5`, or `@storybook/sveltekit`
20+
- For `@storybook/vue3`: Use `@storybook/vue3-vite` or `@storybook/vue3-webpack5`
21+
- For `@storybook/web-components`: Use `@storybook/web-components-vite` or `@storybook/web-components-webpack5`
22+
1323
Examples of **incorrect** code for this rule:
1424

1525
```js
26+
// Don't import renderer packages directly
1627
import { something } from '@storybook/react'
1728
import { something } from '@storybook/vue3'
1829
import { something } from '@storybook/web-components'
@@ -21,14 +32,16 @@ import { something } from '@storybook/web-components'
2132
Examples of **correct** code for this rule:
2233

2334
```js
24-
import { something } from '@storybook/react-vite'
25-
import { something } from '@storybook/vue3-webpack5'
26-
import { something } from '@storybook/web-components-vite'
35+
// Do use the appropriate framework package for your build tool
36+
import { something } from '@storybook/react-vite' // For Vite
37+
import { something } from '@storybook/vue3-webpack5' // For Webpack 5
38+
import { something } from '@storybook/web-components-vite' // For Vite
39+
import { something } from '@storybook/nextjs' // For Next.js
2740
```
2841

2942
## When Not To Use It
3043

31-
If you have a specific need to use renderer packages directly in your stories, you can disable this rule. However, it's recommended to use the framework-specific packages as they are optimized for your build tool.
44+
If you have a specific need to use renderer packages directly in your stories, you can disable this rule. However, it's recommended to use the framework-specific packages as they are optimized for your build tool and provide better integration with your development environment.
3245

3346
## Further Reading
3447

@@ -37,3 +50,6 @@ For more information about Storybook's framework-specific packages and build too
3750
- [Storybook for React](https://storybook.js.org/docs/react/get-started/install)
3851
- [Storybook for Vue](https://storybook.js.org/docs/vue/get-started/install)
3952
- [Storybook for Web Components](https://storybook.js.org/docs/web-components/get-started/install)
53+
- [Storybook for Svelte](https://storybook.js.org/docs/svelte/get-started/install)
54+
- [Storybook for HTML](https://storybook.js.org/docs/html/get-started/install)
55+
- [Storybook for Preact](https://storybook.js.org/docs/preact/get-started/install)

lib/rules/no-renderer-packages.ts

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,36 @@ import { CategoryId } from '../utils/constants'
77
import { createStorybookRule } from '../utils/create-storybook-rule'
88
import { TSESTree } from '@typescript-eslint/utils'
99

10-
const rendererPackages: Record<string, string> = {
11-
'@storybook/html': 'html',
12-
'@storybook/polymer': 'polymer',
13-
'@storybook/preact': 'preact',
14-
'@storybook/react': 'react',
15-
'@storybook/server': 'server',
16-
'@storybook/svelte': 'svelte',
17-
'@storybook/vue': 'vue',
18-
'@storybook/vue3': 'vue3',
19-
'@storybook/web-components': 'web-components',
20-
}
10+
type RendererPackage =
11+
| '@storybook/html'
12+
| '@storybook/preact'
13+
| '@storybook/react'
14+
| '@storybook/server'
15+
| '@storybook/svelte'
16+
| '@storybook/vue3'
17+
| '@storybook/web-components'
2118

22-
const frameworkPackages: Record<string, string> = {
23-
'@storybook/experimental-nextjs-vite': 'experimental-nextjs-vite',
24-
'@storybook/html-vite': 'html-vite',
25-
'@storybook/html-webpack5': 'html-webpack5',
26-
'@storybook/nextjs': 'nextjs',
27-
'@storybook/preact-vite': 'preact-vite',
28-
'@storybook/preact-webpack5': 'preact-webpack5',
29-
'@storybook/react-native-web-vite': 'react-native-web-vite',
30-
'@storybook/react-vite': 'react-vite',
31-
'@storybook/react-webpack5': 'react-webpack5',
32-
'@storybook/server-webpack5': 'server-webpack5',
33-
'@storybook/svelte-vite': 'svelte-vite',
34-
'@storybook/svelte-webpack5': 'svelte-webpack5',
35-
'@storybook/sveltekit': 'sveltekit',
36-
'@storybook/vue3-vite': 'vue3-vite',
37-
'@storybook/vue3-webpack5': 'vue3-webpack5',
38-
'@storybook/web-components-vite': 'web-components-vite',
39-
'@storybook/web-components-webpack5': 'web-components-webpack5',
19+
const rendererToFrameworks: Record<RendererPackage, string[]> = {
20+
'@storybook/html': ['@storybook/html-vite', '@storybook/html-webpack5'],
21+
'@storybook/preact': ['@storybook/preact-vite', '@storybook/preact-webpack5'],
22+
'@storybook/react': [
23+
'@storybook/nextjs',
24+
'@storybook/react-vite',
25+
'@storybook/react-webpack5',
26+
'@storybook/react-native-web-vite',
27+
'@storybook/experimental-nextjs-vite',
28+
],
29+
'@storybook/server': ['@storybook/server-webpack5'],
30+
'@storybook/svelte': [
31+
'@storybook/svelte-vite',
32+
'@storybook/svelte-webpack5',
33+
'@storybook/sveltekit',
34+
],
35+
'@storybook/vue3': ['@storybook/vue3-vite', '@storybook/vue3-webpack5'],
36+
'@storybook/web-components': [
37+
'@storybook/web-components-vite',
38+
'@storybook/web-components-webpack5',
39+
],
4040
}
4141

4242
//------------------------------------------------------------------------------
@@ -64,29 +64,12 @@ export = createStorybookRule<Options, MessageIds>({
6464
},
6565

6666
create(context) {
67-
//----------------------------------------------------------------------
68-
// Helpers
69-
//----------------------------------------------------------------------
70-
71-
const getSuggestedFrameworkPackages = (rendererName: string): string[] => {
72-
const rendererType = rendererPackages[rendererName]
73-
if (!rendererType) return []
74-
75-
return Object.entries(frameworkPackages)
76-
.filter(([pkg]) => pkg.includes(rendererType))
77-
.map(([pkg]) => pkg)
78-
}
79-
80-
//----------------------------------------------------------------------
81-
// Public
82-
//----------------------------------------------------------------------
83-
8467
return {
8568
ImportDeclaration(node: TSESTree.ImportDeclaration) {
8669
const packageName = node.source.value
8770

88-
if (typeof packageName === 'string' && rendererPackages[packageName]) {
89-
const suggestions = getSuggestedFrameworkPackages(packageName)
71+
if (typeof packageName === 'string' && packageName in rendererToFrameworks) {
72+
const suggestions = rendererToFrameworks[packageName as RendererPackage]
9073

9174
context.report({
9275
node,

0 commit comments

Comments
 (0)