Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vitest: Add plugins from viteFinal #30105

Open
wants to merge 21 commits into
base: next
Choose a base branch
from

Conversation

JReinhold
Copy link
Contributor

@JReinhold JReinhold commented Dec 18, 2024

Closes storybookjs/addon-svelte-csf#213, follow-up to #29806 (comment)

What I did

To support Svelte CSF stories, we're now also including Vite plugins collected from the viteFinal preset (and thus addons) in our Vitest plugin. So now, instead of just returning a plugin, we're returning a list of plugins (which is totally valid). With the other changes to @storybook/addon-svelte-csf landing (storybookjs/addon-svelte-csf#244, storybookjs/addon-svelte-csf#247, storybookjs/addon-svelte-csf#248) this is all that's necessary to add automatic support for stories.svelte files.

This PR also cleans up our viteFinals frameworks, because some of them were mutating configs and plugins arrays which could cause issues if the presets were loaded in another order than expected.

Things to consider:

  1. This also adds all other plugins, like Vite docgen plugins (not just for Svelte, but also React, etc.) which could incur an unnecessary perf penalty. Do we want to handle that as part of this, or later, and how? (make it work, then make it fast?) EDIT: fixed, explicitly removing a hard coded list of known unnecessary plugins.
  2. We're now also removing the enforce: 'pre' from the Vitest plugin, meaning that it would be more affected by changes to the plugin order. We need to QA this, but currently I can't see how this would cause issues.

Checklist for Contributors

Testing

The changes in this PR are covered in the following automated tests:

  • stories
  • unit tests
  • integration tests
  • end-to-end tests

Manual testing

This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!

Documentation

  • Add or update documentation reflecting your changes
  • If you are deprecating/removing a feature, make sure to update
    MIGRATION.MD

Checklist for Maintainers

  • When this PR is ready for testing, make sure to add ci:normal, ci:merged or ci:daily GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found in code/lib/cli-storybook/src/sandbox-templates.ts

  • Make sure this PR contains one of the labels below:

    Available labels
    • bug: Internal changes that fixes incorrect behavior.
    • maintenance: User-facing maintenance tasks.
    • dependencies: Upgrading (sometimes downgrading) dependencies.
    • build: Internal-facing build tooling & test updates. Will not show up in release changelog.
    • cleanup: Minor cleanup style change. Will not show up in release changelog.
    • documentation: Documentation only changes. Will not show up in release changelog.
    • feature request: Introducing a new feature.
    • BREAKING CHANGE: Changes that break compatibility in some way with current major version.
    • other: Changes that don't fit in the above categories.

🦋 Canary release

This pull request has been released as version 0.0.0-pr-30105-sha-a2609294. Try it out in a new sandbox by running npx [email protected] sandbox or in an existing project with npx [email protected] upgrade.

More information
Published version 0.0.0-pr-30105-sha-a2609294
Triggered by @JReinhold
Repository storybookjs/storybook
Branch jeppe/support-svelte-csf-in-vitest
Commit a2609294
Datetime Wed Jan 8 10:19:20 UTC 2025 (1736331560)
Workflow run 12668562395

To request a new release of this pull request, mention the @storybookjs/core team.

core team members can create a new canary release here or locally with gh workflow run --repo storybookjs/storybook canary-release-pr.yml --field pr=30105

name before after diff z %
createSize 0 B 0 B 0 B - -
generateSize 77.8 MB 77.8 MB 0 B -2.12 0%
initSize 131 MB 131 MB 26 B -0.34 0%
diffSize 53 MB 53 MB 26 B -0.33 0%
buildSize 7.19 MB 7.19 MB 0 B 1.08 0%
buildSbAddonsSize 1.85 MB 1.85 MB 0 B - 0%
buildSbCommonSize 195 kB 195 kB 0 B - 0%
buildSbManagerSize 1.87 MB 1.87 MB 0 B -0.82 0%
buildSbPreviewSize 0 B 0 B 0 B - -
buildStaticSize 0 B 0 B 0 B - -
buildPrebuildSize 3.91 MB 3.91 MB 0 B -0.82 0%
buildPreviewSize 3.28 MB 3.28 MB 0 B 1.09 0%
testBuildSize 0 B 0 B 0 B - -
testBuildSbAddonsSize 0 B 0 B 0 B - -
testBuildSbCommonSize 0 B 0 B 0 B - -
testBuildSbManagerSize 0 B 0 B 0 B - -
testBuildSbPreviewSize 0 B 0 B 0 B - -
testBuildStaticSize 0 B 0 B 0 B - -
testBuildPrebuildSize 0 B 0 B 0 B - -
testBuildPreviewSize 0 B 0 B 0 B - -
name before after diff z %
createTime 11.8s 25.9s 14s 1.37 🔺54.3%
generateTime 22.5s 19.1s -3s -369ms -1.11 -17.6%
initTime 15.1s 12.5s -2s -559ms -1.41 🔰-20.4%
buildTime 8.2s 11.6s 3.3s 1.98 🔺28.8%
testBuildTime 0ms 0ms 0ms - -
devPreviewResponsive 5.2s 7.1s 1.8s 3.4 🔺26.2%
devManagerResponsive 3.9s 4.9s 1s 3.12 🔺20.3%
devManagerHeaderVisible 586ms 809ms 223ms 2.82 🔺27.6%
devManagerIndexVisible 613ms 842ms 229ms 2.53 🔺27.2%
devStoryVisibleUncached 2.1s 3s 867ms 2.26 🔺28.4%
devStoryVisible 614ms 840ms 226ms 2.51 🔺26.9%
devAutodocsVisible 549ms 810ms 261ms 2.76 🔺32.2%
devMDXVisible 490ms 824ms 334ms 3.83 🔺40.5%
buildManagerHeaderVisible 530ms 885ms 355ms 2.64 🔺40.1%
buildManagerIndexVisible 621ms 899ms 278ms 1.75 🔺30.9%
buildStoryVisible 519ms 864ms 345ms 3.15 🔺39.9%
buildAutodocsVisible 415ms 682ms 267ms 3.03 🔺39.1%
buildMDXVisible 407ms 682ms 275ms 3.42 🔺40.3%

Greptile Summary

Based on the provided information, I'll create a concise summary of the key changes in this pull request:

Adds support for Svelte CSF stories in Vitest by modifying the Storybook test plugin architecture.

  • Modified storybookTest in /code/addons/test/src/vitest-plugin/index.ts to return multiple plugins and include Vite plugins from viteFinal
  • Removed framework-specific plugin configuration from postinstall script, simplifying addon setup
  • Removed enforce: 'pre' setting from Vitest plugin to improve plugin compatibility
  • Updated documentation to reflect simplified plugin configuration process
  • Refactored framework presets (Next.js, React, SvelteKit) to handle plugin arrays immutably

The changes enable automatic support for .stories.svelte files while maintaining a cleaner plugin architecture, though there are potential performance implications from including additional plugins that need to be monitored.

@JReinhold JReinhold changed the title Jeppe/support-svelte-csf-in-vitest Vitest: Add plugins from viteFinal Dec 18, 2024
Copy link

nx-cloud bot commented Dec 18, 2024

View your CI Pipeline Execution ↗ for commit f7285f0.

Command Status Duration Result
nx run-many -t build --parallel=3 ✅ Succeeded 1m 35s View ↗

☁️ Nx Cloud last updated this comment at 2025-01-10 12:50:21 UTC

@JReinhold JReinhold self-assigned this Dec 18, 2024
@JReinhold JReinhold added feature request svelte addon: test ci:daily Run the CI jobs that normally run in the daily job. labels Dec 18, 2024
@storybook-pr-benchmarking
Copy link

storybook-pr-benchmarking bot commented Dec 19, 2024

Package Benchmarks

Commit: f7285f0, ran on 10 January 2025 at 12:56:47 UTC

No significant changes detected, all good. 👏

@@ -51,5 +51,5 @@ export const viteFinal: NonNullable<StorybookConfig['viteFinal']> = async (confi
);
}

return config;
return { ...config, plugins };
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

before, this preset would discard any config set by previous viteFinal presets. We never noticed it because this would always run first in Storybook. But in the Vitest plugin it appears that main.ts runs first, so we need to handle it properly here.

@JReinhold JReinhold marked this pull request as ready for review December 20, 2024 09:50
@JReinhold JReinhold requested a review from yannbf December 20, 2024 09:50
@JReinhold JReinhold requested a review from ndelangen December 20, 2024 09:50
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

12 file(s) reviewed, 4 comment(s)
Edit PR Review Bot Settings | Greptile

code/addons/test/src/vitest-plugin/index.ts Show resolved Hide resolved
code/frameworks/react-vite/src/preset.ts Show resolved Hide resolved
code/frameworks/sveltekit/src/preset.ts Show resolved Hide resolved

// ! Relative import to prebundle it without needing to depend on the Vite builder
import { withoutVitePlugins } from '../../../../builders/builder-vite/src/utils/without-vite-plugins';
Copy link
Contributor

@valentinpalkovic valentinpalkovic Jan 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

without-vite-plugins uses a type import from vite. That means that the experimental-addon-test also depends on Vite; otherwise, the PluginOption cannot be resolved in package manager environments, which are strict about peer dependencies.

Generally, I like to avoid relative imports like this because of the likelihood is high that the package that imports from another package utils or functions doesn't get the dependencies right. It can easily be overseen.

If I were you, I would copy-paste the helper function and remove the PluginOptions reference. Otherwise, experimental-addon-test needs to mention vite as a peer dependency.

Copy link
Contributor Author

@JReinhold JReinhold Jan 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But type imports are stripped from the dist, so it wouldn't show up in the package, so it's not necessary. Unless the imported type made its way into a generated .d.ts file, but it doesn't because it's not part of the public API.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, I am talking about the .d.ts file. Maybe you can check, whether a vite import is part of it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But it's fair to be defensive and say maybe in the future that module would import from dependencies that were in the original package but not the sibling package, without considering the sibling package.

code/addons/test/src/vitest-plugin/index.ts Show resolved Hide resolved
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
addon: test ci:daily Run the CI jobs that normally run in the daily job. feature request svelte
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Request] Support for portable stories and experimental vitest-addon
3 participants