Merge branch 'next' into feature/portable-stories-improvements

This commit is contained in:
Yann Braga 2024-03-05 21:33:28 +01:00
commit 9b9d6bed4e
133 changed files with 1310 additions and 692 deletions

View File

@ -759,22 +759,22 @@ workflows:
requires:
- build
- create-sandboxes:
parallelism: 34
parallelism: 35
requires:
- build
# - smoke-test-sandboxes: # disabled for now
# requires:
# - create-sandboxes
- build-sandboxes:
parallelism: 34
parallelism: 35
requires:
- create-sandboxes
- chromatic-sandboxes:
parallelism: 31
parallelism: 32
requires:
- build-sandboxes
- e2e-production:
parallelism: 29
parallelism: 30
requires:
- build-sandboxes
- e2e-dev:
@ -782,7 +782,7 @@ workflows:
requires:
- create-sandboxes
- test-runner-production:
parallelism: 29
parallelism: 30
requires:
- build-sandboxes
- test-portable-stories:

View File

@ -1,60 +0,0 @@
name: Generate and push sandboxes (main)
on:
schedule:
- cron: '2 2 */1 * *'
workflow_dispatch:
# To test fixes on push rather than wait for the scheduling, do the following:
# 1. Uncomment the lines below and add your branch.
# push:
# branches:
# - <your-branch-name>
# 2. change the "ref" value to <your-branch-name> in the actions/checkout step below.
# 3. 👉 DON'T FORGET TO UNDO THE VALUES BACK TO `main` BEFORE YOU MERGE YOUR CHANGES!
jobs:
generate:
runs-on: ubuntu-latest
env:
YARN_ENABLE_IMMUTABLE_INSTALLS: false
CLEANUP_SANDBOX_NODE_MODULES: true
steps:
- uses: actions/checkout@v3
with:
ref: main
- uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
- name: Setup git user
run: |
git config --global user.name "Storybook Bot"
git config --global user.email "bot@storybook.js.org"
- name: Install dependencies
run: |
cd ./scripts
node --experimental-modules ./check-dependencies.js
cd ..
- name: Compile Storybook libraries
run: yarn task --task compile --start-from=auto --no-link
- name: Publishing to local registry
run: yarn local-registry --publish
working-directory: ./code
- name: Running local registry
run: yarn local-registry --open &
working-directory: ./code
- name: Wait for registry
run: yarn wait-on tcp:127.0.0.1:6001
working-directory: ./code
- name: Generate
run: yarn generate-sandboxes --local-registry
working-directory: ./code
- name: Publish
run: yarn publish-sandboxes --remote=https://storybook-bot:${{ secrets.PAT_STORYBOOK_BOT}}@github.com/storybookjs/sandboxes.git --push --branch=main
working-directory: ./code
- name: The job has failed
if: ${{ failure() || cancelled() }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_MONITORING_URL }}
uses: Ilshidur/action-discord@master
with:
args: 'The generation of sandboxes in the **main** branch has failed. [View Run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})'

View File

@ -1,60 +0,0 @@
name: Generate and push sandboxes (next)
on:
schedule:
- cron: '2 2 */1 * *'
workflow_dispatch:
# To test fixes on push rather than wait for the scheduling, do the following:
# 1. Uncomment the lines below and add your branch.
# push:
# branches:
# - <your-branch-name>
# 2. change the "ref" value to <your-branch-name> in the actions/checkout step below.
# 3. 👉 DON'T FORGET TO UNDO THE VALUES BACK TO `next` BEFORE YOU MERGE YOUR CHANGES!
jobs:
generate:
runs-on: ubuntu-latest
env:
YARN_ENABLE_IMMUTABLE_INSTALLS: false
CLEANUP_SANDBOX_NODE_MODULES: true
steps:
- uses: actions/checkout@v3
with:
ref: next
- uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
- name: Setup git user
run: |
git config --global user.name "Storybook Bot"
git config --global user.email "bot@storybook.js.org"
- name: Install dependencies
run: |
cd ./scripts
node --experimental-modules ./check-dependencies.js
cd ..
- name: Compile Storybook libraries
run: yarn task --task compile --start-from=auto --no-link
- name: Publishing to local registry
run: yarn local-registry --publish
working-directory: ./code
- name: Running local registry
run: yarn local-registry --open &
working-directory: ./code
- name: Wait for registry
run: yarn wait-on tcp:127.0.0.1:6001
working-directory: ./code
- name: Generate
run: yarn generate-sandboxes --local-registry --debug
working-directory: ./code
- name: Publish
run: yarn publish-sandboxes --remote=https://storybook-bot:${{ secrets.PAT_STORYBOOK_BOT}}@github.com/storybookjs/sandboxes.git --push --branch=next
working-directory: ./code
- name: The job has failed
if: ${{ failure() || cancelled() }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_MONITORING_URL }}
uses: Ilshidur/action-discord@master
with:
args: 'The generation of sandboxes in the **next** branch has failed. [View Run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})'

127
.github/workflows/generate-sandboxes.yml vendored Normal file
View File

@ -0,0 +1,127 @@
name: Generate and publish sandboxes
on:
schedule:
- cron: "2 2 */1 * *"
workflow_dispatch:
# To test fixes on push rather than wait for the scheduling, do the following:
# 1. Uncomment the lines below and add your branch.
# push:
# branches:
# - <your-branch-name>
# 2. Change the "ref" value to <your-branch-name> in the actions/checkout step below.
# 3. Comment out the whole "generate-main" job starting at line 77
# 4. 👉 DON'T FORGET TO UNDO THE STEPS BEFORE YOU MERGE YOUR CHANGES!
env:
YARN_ENABLE_IMMUTABLE_INSTALLS: "false"
CLEANUP_SANDBOX_NODE_MODULES: "true"
defaults:
run:
working-directory: ./code
jobs:
generate-next:
name: Generate to next
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: next
- uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
- name: Setup git user
run: |
git config --global user.name "storybook-bot"
git config --global user.email "32066757+storybook-bot@users.noreply.github.com"
- name: Install dependencies
working-directory: ./scripts
run: node --experimental-modules ./check-dependencies.js
- name: Compile Storybook libraries
run: yarn task --task compile --start-from=auto --no-link
- name: Publish to local registry
run: yarn local-registry --publish
- name: Run local registry
run: yarn local-registry --open &
- name: Wait for registry
run: yarn wait-on tcp:127.0.0.1:6001
- name: Generate
id: generate
run: yarn generate-sandboxes --local-registry
- name: Publish
# publish sandboxes even if the generation fails, as some sandboxes might have been generated successfully
if: ${{ !cancelled() }}
run: yarn publish-sandboxes --remote=https://storybook-bot:${{ secrets.PAT_STORYBOOK_BOT }}@github.com/storybookjs/sandboxes.git --push --branch=next
- name: Report failure to Discord
if: failure()
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_MONITORING_URL }}
uses: Ilshidur/action-discord@master
with:
args: |
The generation of some or all sandboxes on the **next** branch has failed.
[See the job summary for details](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})
generate-main:
name: Generate to main
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: main
- uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
- name: Setup git user
run: |
git config --global user.name "storybook-bot"
git config --global user.email "32066757+storybook-bot@users.noreply.github.com"
- name: Install dependencies
working-directory: ./scripts
run: node --experimental-modules ./check-dependencies.js
- name: Compile Storybook libraries
run: yarn task --task compile --start-from=auto --no-link
- name: Publish to local registry
run: yarn local-registry --publish
- name: Run local registry
run: yarn local-registry --open &
- name: Wait for registry
run: yarn wait-on tcp:127.0.0.1:6001
- name: Generate
id: generate
run: yarn generate-sandboxes --local-registry
- name: Publish
# publish sandboxes even if the generation fails, as some sandboxes might have been generated successfully
if: ${{ !cancelled() }}
run: yarn publish-sandboxes --remote=https://storybook-bot:${{ secrets.PAT_STORYBOOK_BOT }}@github.com/storybookjs/sandboxes.git --push --branch=main
- name: Report failure to Discord
if: failure()
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_MONITORING_URL }}
uses: Ilshidur/action-discord@master
with:
args: |
The generation of some or all sandboxes on the **main** branch has failed.
[See the job summary for details](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})

View File

@ -1,3 +1,19 @@
## 8.0.0-rc.2
- CLI: Add @storybook/addons automigration - [#26295](https://github.com/storybookjs/storybook/pull/26295), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)!
- CLI: Fix vite config automigration to resolve from project root - [#26262](https://github.com/storybookjs/storybook/pull/26262), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)!
- CLI: Improve `add` command & add tests - [#26298](https://github.com/storybookjs/storybook/pull/26298), thanks [@ndelangen](https://github.com/ndelangen)!
- CLI: Update minimum Node.js version requirement - [#26312](https://github.com/storybookjs/storybook/pull/26312), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)!
- CSF-tools/Codemods: Upgrade recast - [#26286](https://github.com/storybookjs/storybook/pull/26286), thanks [@43081j](https://github.com/43081j)!
- Controls: Fix type summary when table.type unset - [#26283](https://github.com/storybookjs/storybook/pull/26283), thanks [@shilman](https://github.com/shilman)!
- Core: Add event when serverChannel disconnects - [#26322](https://github.com/storybookjs/storybook/pull/26322), thanks [@ndelangen](https://github.com/ndelangen)!
- Core: Fix composition of storybooks on same origin - [#26304](https://github.com/storybookjs/storybook/pull/26304), thanks [@ndelangen](https://github.com/ndelangen)!
- Portable stories: Improve existing APIs, add loaders support - [#26267](https://github.com/storybookjs/storybook/pull/26267), thanks [@yannbf](https://github.com/yannbf)!
- React: Handle TypeScript path aliases in react-docgen loader - [#26273](https://github.com/storybookjs/storybook/pull/26273), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)!
- Svelte: Support `5.0.0-next.65` prerelease - [#26188](https://github.com/storybookjs/storybook/pull/26188), thanks [@JReinhold](https://github.com/JReinhold)!
- Upgrade: Add missing isUpgrade parameter to automigrate function - [#26293](https://github.com/storybookjs/storybook/pull/26293), thanks [@valentinpalkovic](https://github.com/valentinpalkovic)!
- Vue: Return component from `composeStory` - [#26317](https://github.com/storybookjs/storybook/pull/26317), thanks [@JReinhold](https://github.com/JReinhold)!
## 8.0.0-rc.1
- CLI: Fix addon compatibility check error reporting in storybook dev - [#26258](https://github.com/storybookjs/storybook/pull/26258), thanks [@yannbf](https://github.com/yannbf)!

View File

@ -5,6 +5,7 @@
- [Project annotations are now merged instead of overwritten in composeStory](#project-annotations-are-now-merged-instead-of-overwritten-in-composestory)
- [Type change in `composeStories` API](#type-change-in-composestories-api)
- [DOM structure changed in portable stories](#dom-structure-changed-in-portable-stories)
- [Composed Vue stories are now components instead of functions](#composed-vue-stories-are-now-components-instead-of-functions)
- [Tab addons are now routed to a query parameter](#tab-addons-are-now-routed-to-a-query-parameter)
- [Default keyboard shortcuts changed](#default-keyboard-shortcuts-changed)
- [Manager addons are now rendered with React 18](#manager-addons-are-now-rendered-with-react-18)
@ -467,6 +468,33 @@ test("snapshots the story with custom id", () => {
});
```
#### Composed Vue stories are now components instead of functions
`composeStory` (and `composeStories`) from `@storybook/vue3` now return Vue components rather than story functions that return components. This means that when rendering these composed stories you just pass the composed story _without_ first calling it.
Previously when using `composeStory` from `@storybook/testing-vue3`, you would render composed stories with e.g. `render(MyStoryComposedStory({ someProp: true}))`. That is now changed to more [closely match how you would render regular Vue components](https://testing-library.com/docs/vue-testing-library/examples).
When migrating from `@storybook/testing-vue3`, you will likely hit the following error:
```ts
TypeError: Cannot read properties of undefined (reading 'devtoolsRawSetupState')
```
To fix it, you should change the usage of the composed story to reference it instead of calling it as a function. Here's an example using `@testing-library/vue` and Vitest:
```diff
import { it } from 'vitest';
import { render } from '@testing-library/vue';
import * as stories from './Button.stories';
import { composeStory } from '@storybook/vue3';
it('renders primary button', () => {
const Primary = composeStory(stories.Primary, stories.default);
- render(Primary({ label: 'Hello world' }));
+ render(Primary, { props: { label: 'Hello world' } });
});
```
### Tab addons are now routed to a query parameter
The URL of a tab used to be: `http://localhost:6006/?path=/my-addon-tab/my-story`.
@ -1061,7 +1089,7 @@ The `hideNoControlsWarning` parameter is now removed. [More info here](#addon-co
The `setGlobalConfig` (used for reusing stories in your tests) is now removed in favor of `setProjectAnnotations`.
```ts
import { setProjectAnnotations } from `@storybook/testing-react`.
import { setProjectAnnotations } from `@storybook/react`.
```
#### StorybookViteConfig type from @storybook/builder-vite

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-a11y",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Test component compliance with web accessibility standards",
"keywords": [
"a11y",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-actions",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Get UI feedback when an action is performed on an interactive element",
"keywords": [
"storybook",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-backgrounds",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Switch backgrounds to view components in different settings",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-controls",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Interact with component inputs dynamically in the Storybook UI",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-docs",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Document component usage and properties in Markdown",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-essentials",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Curated addons to bring out the best of Storybook",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-mdx-gfm",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "GitHub Flavored Markdown in Storybook",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-highlight",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Highlight DOM nodes within your stories",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-interactions",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Automate, test and debug user interactions",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-jest",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "React storybook addon that show component jest report",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-links",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Link stories together to build demos and prototypes with your UI components",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-measure",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Inspect layouts by visualizing the box model",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-onboarding",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook Addon Onboarding - Introduces a new onboarding experience",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-outline",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Outline all elements with CSS to help with layout placement and alignment",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-storysource",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "View a storys source code to see how it works and paste into your app",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-themes",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Switch between multiple themes for you components in Storybook",
"keywords": [
"css",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-toolbars",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Create your own toolbar items that control story rendering",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-viewport",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Build responsive components by adjusting Storybooks viewport size and orientation",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-manager",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook manager builder",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "A plugin to run and build Storybooks with Vite",
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/builders/builder-vite/#readme",
"bugs": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/angular",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Angular: Develop Angular components in isolation with hot reloading.",
"keywords": [
"storybook",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/ember",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Ember: Develop Ember Component in isolation with Hot Reloading.",
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/frameworks/ember",
"bugs": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for HTML and Vite: Develop HTML in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/nextjs",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Next.js",
"keywords": [
"storybook",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Preact and Vite: Develop Preact components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Preact: Develop Preact Component in isolation.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for React and Vite: Develop React components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for React: Develop React Component in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/server-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/svelte-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Svelte and Vite: Develop Svelte components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -58,13 +58,13 @@
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^3.0.1",
"@types/node": "^18.0.0",
"svelte": "^5.0.0-next.28",
"svelte": "^5.0.0-next.65",
"typescript": "^5.3.2",
"vite": "^4.0.0"
},
"peerDependencies": {
"@sveltejs/vite-plugin-svelte": "^2.0.0 || ^3.0.0",
"svelte": "^4.0.0 || ^5.0.0-next.16",
"svelte": "^4.0.0 || ^5.0.0-next.65",
"vite": "^4.0.0 || ^5.0.0"
},
"engines": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/svelte-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -58,7 +58,7 @@
"typescript": "^5.3.2"
},
"peerDependencies": {
"svelte": "^4.0.0 || ^5.0.0-next.16",
"svelte": "^4.0.0 || ^5.0.0-next.65",
"svelte-loader": "*"
},
"engines": {

View File

@ -1,3 +1,2 @@
declare module '@storybook/svelte/templates/SlotDecorator.svelte';
declare module '@storybook/svelte/templates/PreviewRender.svelte';
declare module '@storybook/svelte/templates/HOC.svelte';
declare module '@storybook/svelte/internal/SlotDecorator.svelte';
declare module '@storybook/svelte/internal/PreviewRender.svelte';

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/sveltekit",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for SvelteKit",
"keywords": [
"storybook",
@ -64,7 +64,7 @@
"vite": "^4.0.0"
},
"peerDependencies": {
"svelte": "^4.0.0 || ^5.0.0-next.16",
"svelte": "^4.0.0 || ^5.0.0-next.65",
"vite": "^4.0.0 || ^5.0.0"
},
"engines": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue3-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Vue3 and Vite: Develop Vue3 components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue3-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Vue 3: Develop Vue 3 Components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/web-components-vite",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for web-components and Vite: Develop Web Components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/web-components-webpack5",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for web-components: View web components snippets in isolation with Hot Reloading.",
"keywords": [
"lit",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/channels",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,9 +1,43 @@
import { describe, beforeEach, it, expect, vi } from 'vitest';
import type { ChannelTransport, Listener } from '.';
import { Channel } from '.';
import { Channel, WebsocketTransport } from '.';
vi.useFakeTimers();
const MockedWebsocket = vi.hoisted(() => {
const ref = { current: undefined as unknown as InstanceType<typeof MyMockedWebsocket> };
class MyMockedWebsocket {
onopen: () => void;
onmessage: (event: { data: string }) => void;
onerror: (e: any) => void;
onclose: () => void;
constructor(url: string) {
this.onopen = vi.fn();
this.onmessage = vi.fn();
this.onerror = vi.fn();
this.onclose = vi.fn();
ref.current = this;
}
send(data: string) {
this.onmessage({ data });
}
}
return { MyMockedWebsocket, ref };
});
vi.mock('@storybook/global', () => ({
global: {
...global,
WebSocket: MockedWebsocket.MyMockedWebsocket,
},
}));
describe('Channel', () => {
let transport: ChannelTransport;
let channel: Channel;
@ -232,3 +266,78 @@ describe('Channel', () => {
});
});
});
describe('WebsocketTransport', () => {
it('should connect', async () => {
const onError = vi.fn();
const handler = vi.fn();
const transport = new WebsocketTransport({
url: 'ws://localhost:6006',
page: 'preview',
onError,
});
transport.setHandler(handler);
MockedWebsocket.ref.current.onopen();
expect(handler).toHaveBeenCalledTimes(0);
});
it('should send message upon disconnect', async () => {
const onError = vi.fn();
const handler = vi.fn();
const transport = new WebsocketTransport({
url: 'ws://localhost:6006',
page: 'preview',
onError,
});
transport.setHandler(handler);
MockedWebsocket.ref.current.onclose();
expect(handler.mock.calls[0][0]).toMatchInlineSnapshot(`
{
"args": [],
"from": "preview",
"type": "channelWSDisconnect",
}
`);
});
it('should send message when send', async () => {
const onError = vi.fn();
const handler = vi.fn();
const transport = new WebsocketTransport({
url: 'ws://localhost:6006',
page: 'preview',
onError,
});
transport.setHandler(handler);
MockedWebsocket.ref.current.send('{ "type": "test", "args": [], "from": "preview" }');
expect(handler.mock.calls[0][0]).toMatchInlineSnapshot(`
{
"args": [],
"from": "preview",
"type": "test",
}
`);
});
it('should call onError handler', async () => {
const onError = vi.fn();
const handler = vi.fn();
const transport = new WebsocketTransport({
url: 'ws://localhost:6006',
page: 'preview',
onError,
});
transport.setHandler(handler);
MockedWebsocket.ref.current.onerror(new Error('testError'));
expect(onError.mock.calls[0][0]).toMatchInlineSnapshot(`[Error: testError]`);
});
});

View File

@ -35,7 +35,7 @@ export function createBrowserChannel({ page, extraTransports = [] }: Options): C
const { hostname, port } = window.location;
const channelUrl = `${protocol}://${hostname}:${port}/storybook-server-channel`;
transports.push(new WebsocketTransport({ url: channelUrl, onError: () => {} }));
transports.push(new WebsocketTransport({ url: channelUrl, onError: () => {}, page }));
}
return new Channel({ transports });

View File

@ -7,6 +7,14 @@ export const getEventSourceUrl = (event: MessageEvent) => {
// try to find the originating iframe by matching it's contentWindow
// This might not be cross-origin safe
const [frame, ...remainder] = frames.filter((element) => {
try {
return (
element.contentWindow?.location.origin === (event.source as Window).location.origin &&
element.contentWindow?.location.pathname === (event.source as Window).location.pathname
);
} catch (err) {
// continue
}
try {
return element.contentWindow === event.source;
} catch (err) {

View File

@ -5,13 +5,14 @@ import { global } from '@storybook/global';
import { isJSON, parse, stringify } from 'telejson';
import invariant from 'tiny-invariant';
import type { ChannelTransport, ChannelHandler } from '../types';
import * as EVENTS from '@storybook/core-events';
import type { ChannelTransport, ChannelHandler, Config } from '../types';
const { WebSocket } = global;
type OnError = (message: Event) => void;
interface WebsocketTransportArgs {
interface WebsocketTransportArgs extends Partial<Config> {
url: string;
onError: OnError;
}
@ -25,7 +26,7 @@ export class WebsocketTransport implements ChannelTransport {
private isReady = false;
constructor({ url, onError }: WebsocketTransportArgs) {
constructor({ url, onError, page }: WebsocketTransportArgs) {
this.socket = new WebSocket(url);
this.socket.onopen = () => {
this.isReady = true;
@ -41,6 +42,10 @@ export class WebsocketTransport implements ChannelTransport {
onError(e);
}
};
this.socket.onclose = () => {
invariant(this.handler, 'WebsocketTransport handler should be set');
this.handler({ type: EVENTS.CHANNEL_WS_DISCONNECT, args: [], from: page || 'preview' });
};
}
setHandler(handler: ChannelHandler) {

View File

@ -1,6 +1,6 @@
{
"name": "sb",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook CLI",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "storybook",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook CLI",
"keywords": [
"storybook"

View File

@ -1,8 +1,8 @@
#!/usr/bin/env node
const majorNodeVersion = parseInt(process.version.toString().replace('v', '').split('.')[0], 10);
if (majorNodeVersion < 16) {
console.error('To run storybook you need to have node 16 or higher');
const majorNodeVersion = parseInt(process.versions.node, 10);
if (majorNodeVersion < 18) {
console.error('To run Storybook you need to have Node.js 18 or higher');
process.exit(1);
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/cli",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook's CLI - install, dev, build, upgrade, and more",
"keywords": [
"cli",

View File

@ -0,0 +1,148 @@
import { describe, expect, test, vi } from 'vitest';
import { add, getVersionSpecifier } from './add';
const MockedConfig = vi.hoisted(() => {
return {
appendValueToArray: vi.fn(),
};
});
const MockedPackageManager = vi.hoisted(() => {
return {
retrievePackageJson: vi.fn(() => ({})),
latestVersion: vi.fn(() => '1.0.0'),
addDependencies: vi.fn(() => {}),
type: 'npm',
};
});
const MockedPostInstall = vi.hoisted(() => {
return {
postinstallAddon: vi.fn(),
};
});
const MockedConsole = {
log: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
} as any as Console;
vi.mock('@storybook/csf-tools', () => {
return {
readConfig: vi.fn(() => MockedConfig),
writeConfig: vi.fn(),
};
});
vi.mock('./postinstallAddon', () => {
return MockedPostInstall;
});
vi.mock('@storybook/core-common', () => {
return {
getStorybookInfo: vi.fn(() => ({ mainConfig: {}, configDir: '' })),
serverRequire: vi.fn(() => ({})),
JsPackageManagerFactory: {
getPackageManager: vi.fn(() => MockedPackageManager),
},
getCoercedStorybookVersion: vi.fn(() => '8.0.0'),
versions: {
'@storybook/addon-docs': '^8.0.0',
},
};
});
describe('getVersionSpecifier', (it) => {
test.each([
['@storybook/addon-docs', ['@storybook/addon-docs', undefined]],
['@storybook/addon-docs@7.0.1', ['@storybook/addon-docs', '7.0.1']],
['@storybook/addon-docs@7.0.1-beta.1', ['@storybook/addon-docs', '7.0.1-beta.1']],
['@storybook/addon-docs@~7.0.1-beta.1', ['@storybook/addon-docs', '~7.0.1-beta.1']],
['@storybook/addon-docs@^7.0.1-beta.1', ['@storybook/addon-docs', '^7.0.1-beta.1']],
['@storybook/addon-docs@next', ['@storybook/addon-docs', 'next']],
])('%s => %s', (input, expected) => {
const result = getVersionSpecifier(input);
expect(result[0]).toEqual(expected[0]);
expect(result[1]).toEqual(expected[1]);
});
});
describe('add', () => {
const testData = [
{ input: 'aa', expected: 'aa@^1.0.0' }, // resolves to the latest version
{ input: 'aa@4', expected: 'aa@^4' },
{ input: 'aa@4.1.0', expected: 'aa@^4.1.0' },
{ input: 'aa@^4', expected: 'aa@^4' },
{ input: 'aa@~4', expected: 'aa@~4' },
{ input: 'aa@4.1.0-alpha.1', expected: 'aa@^4.1.0-alpha.1' },
{ input: 'aa@next', expected: 'aa@next' },
{ input: '@org/aa', expected: '@org/aa@^1.0.0' },
{ input: '@org/aa@4', expected: '@org/aa@^4' },
{ input: '@org/aa@4.1.0', expected: '@org/aa@^4.1.0' },
{ input: '@org/aa@4.1.0-alpha.1', expected: '@org/aa@^4.1.0-alpha.1' },
{ input: '@org/aa@next', expected: '@org/aa@next' },
{ input: '@storybook/addon-docs@~4', expected: '@storybook/addon-docs@~4' },
{ input: '@storybook/addon-docs@next', expected: '@storybook/addon-docs@next' },
{ input: '@storybook/addon-docs', expected: '@storybook/addon-docs@^8.0.0' }, // takes it from the versions file
];
test.each(testData)('$input', async ({ input, expected }) => {
const [packageName] = getVersionSpecifier(input);
await add(input, { packageManager: 'npm', skipPostinstall: true }, MockedConsole);
expect(MockedConfig.appendValueToArray).toHaveBeenCalledWith(
expect.arrayContaining(['addons']),
packageName
);
expect(MockedPackageManager.addDependencies).toHaveBeenCalledWith(
{ installAsDevDependencies: true },
[expected]
);
});
});
describe('add (extra)', () => {
test('not warning when installing the correct version of storybook', async () => {
await add(
'@storybook/addon-docs',
{ packageManager: 'npm', skipPostinstall: true },
MockedConsole
);
expect(MockedConsole.warn).not.toHaveBeenCalledWith(
expect.stringContaining(`is not the same as the version of Storybook you are using.`)
);
});
test('not warning when installing unrelated package', async () => {
await add('aa', { packageManager: 'npm', skipPostinstall: true }, MockedConsole);
expect(MockedConsole.warn).not.toHaveBeenCalledWith(
expect.stringContaining(`is not the same as the version of Storybook you are using.`)
);
});
test('warning when installing a core addon mismatching version of storybook', async () => {
await add(
'@storybook/addon-docs@2.0.0',
{ packageManager: 'npm', skipPostinstall: true },
MockedConsole
);
expect(MockedConsole.warn).toHaveBeenCalledWith(
expect.stringContaining(
`The version of @storybook/addon-docs you are installing is not the same as the version of Storybook you are using. This may lead to unexpected behavior.`
)
);
});
test('postInstall', async () => {
await add(
'@storybook/addon-docs',
{ packageManager: 'npm', skipPostinstall: false },
MockedConsole
);
expect(MockedPostInstall.postinstallAddon).toHaveBeenCalledWith('@storybook/addon-docs', {
packageManager: 'npm',
});
});
});

View File

@ -1,44 +1,32 @@
import {
getStorybookInfo,
serverRequire,
getCoercedStorybookVersion,
isCorePackage,
JsPackageManagerFactory,
getCoercedStorybookVersion,
type PackageManagerName,
versions,
} from '@storybook/core-common';
import { readConfig, writeConfig } from '@storybook/csf-tools';
import { isAbsolute, join } from 'path';
import SemVer from 'semver';
import dedent from 'ts-dedent';
import { postinstallAddon } from './postinstallAddon';
const logger = console;
interface PostinstallOptions {
export interface PostinstallOptions {
packageManager: PackageManagerName;
}
const postinstallAddon = async (addonName: string, options: PostinstallOptions) => {
try {
const modulePath = require.resolve(`${addonName}/postinstall`, { paths: [process.cwd()] });
const postinstall = require(modulePath);
try {
logger.log(`Running postinstall script for ${addonName}`);
await postinstall(options);
} catch (e) {
logger.error(`Error running postinstall script for ${addonName}`);
logger.error(e);
}
} catch (e) {
// no postinstall script
}
};
const getVersionSpecifier = (addon: string) => {
const groups = /^(...*)@(.*)$/.exec(addon);
/**
* Extract the addon name and version specifier from the input string
* @param addon - the input string
* @returns [addonName, versionSpecifier]
* @example
* getVersionSpecifier('@storybook/addon-docs@7.0.1') => ['@storybook/addon-docs', '7.0.1']
*/
export const getVersionSpecifier = (addon: string) => {
const groups = /^(@{0,1}[^@]+)(?:@(.+))?$/.exec(addon);
if (groups) {
return [groups[0], groups[2]] as const;
return [groups[1], groups[2]] as const;
}
return [addon, undefined] as const;
};
@ -58,6 +46,8 @@ const checkInstalled = (addonName: string, main: any) => {
return !!existingAddon;
};
const isCoreAddon = (addonName: string) => Object.hasOwn(versions, addonName);
/**
* Install the given addon package and add it to main.js
*
@ -71,9 +61,11 @@ const checkInstalled = (addonName: string, main: any) => {
*/
export async function add(
addon: string,
options: { packageManager: PackageManagerName; skipPostinstall: boolean }
options: { packageManager: PackageManagerName; skipPostinstall: boolean },
logger = console
) {
const { packageManager: pkgMgr } = options;
const [addonName, inputVersion] = getVersionSpecifier(addon);
const packageManager = JsPackageManagerFactory.getPackageManager({ force: pkgMgr });
const packageJson = await packageManager.retrievePackageJson();
@ -85,43 +77,52 @@ export async function add(
`);
}
if (checkInstalled(addon, requireMain(configDir))) {
throw new Error(dedent`
Addon ${addon} is already installed; we skipped adding it to your ${mainConfig}.
`);
}
const [addonName, versionSpecifier] = getVersionSpecifier(addon);
if (!mainConfig) {
logger.error('Unable to find storybook main.js config');
return;
}
const main = await readConfig(mainConfig);
logger.log(`Verifying ${addonName}`);
const latestVersion = await packageManager.latestVersion(addonName);
if (!latestVersion) {
logger.error(`Unknown addon ${addonName}`);
if (checkInstalled(addonName, requireMain(configDir))) {
throw new Error(dedent`
Addon ${addonName} is already installed; we skipped adding it to your ${mainConfig}.
`);
}
// add to package.json
const isStorybookAddon = addonName.startsWith('@storybook/');
const isAddonFromCore = isCorePackage(addonName);
const storybookVersion = await getCoercedStorybookVersion(packageManager);
const version = versionSpecifier || (isAddonFromCore ? storybookVersion : latestVersion);
const main = await readConfig(mainConfig);
logger.log(`Verifying ${addonName}`);
const addonWithVersion = SemVer.valid(version)
const storybookVersion = await getCoercedStorybookVersion(packageManager);
let version = inputVersion;
if (!version && isCoreAddon(addonName) && storybookVersion) {
version = storybookVersion;
}
if (!version) {
version = await packageManager.latestVersion(addonName);
}
if (isCoreAddon(addonName) && version !== storybookVersion) {
logger.warn(
`The version of ${addonName} you are installing is not the same as the version of Storybook you are using. This may lead to unexpected behavior.`
);
}
const addonWithVersion = isValidVersion(version)
? `${addonName}@^${version}`
: `${addonName}@${version}`;
logger.log(`Installing ${addonWithVersion}`);
await packageManager.addDependencies({ installAsDevDependencies: true }, [addonWithVersion]);
// add to main.js
logger.log(`Adding '${addon}' to main.js addons field.`);
main.appendValueToArray(['addons'], addonName);
await writeConfig(main);
if (!options.skipPostinstall && isStorybookAddon) {
if (!options.skipPostinstall && isCoreAddon(addonName)) {
await postinstallAddon(addonName, { packageManager: packageManager.type });
}
}
function isValidVersion(version: string) {
return SemVer.valid(version) || version.match(/^\d+$/);
}

View File

@ -29,7 +29,7 @@ export const addonPostCSS: Fix<AddonPostcssRunOptions> = {
return dedent`
${chalk.bold(
'Attention'
)}: We've detected that you're using the following package which are incompatible with Storybook 8 and beyond:
)}: We've detected that you're using the following package which is incompatible with Storybook 8 and beyond:
- ${chalk.cyan(`@storybook/addon-postcss`)}

View File

@ -0,0 +1,44 @@
import { addonsAPI } from './addons-api';
import type { StorybookConfig } from '@storybook/types';
import type { JsPackageManager } from '@storybook/core-common';
import { expect, describe, it } from 'vitest';
const checkAddonsAPI = async ({
packageManager,
mainConfig = {},
storybookVersion = '7.0.0',
}: {
packageManager?: Partial<JsPackageManager>;
mainConfig?: Partial<StorybookConfig>;
storybookVersion?: string;
}) => {
return addonsAPI.check({
packageManager: packageManager as any,
storybookVersion,
mainConfig: mainConfig as any,
});
};
describe('check function', () => {
it('should return { usesAddonsAPI: true } if @storybook/addons is installed', async () => {
await expect(
checkAddonsAPI({
packageManager: {
getAllDependencies: async () => ({
'@storybook/addons': '6.0.0',
}),
},
})
).resolves.toEqual({ usesAddonsAPI: true });
});
it('should return null if @storybook/addons is not installed', async () => {
await expect(
checkAddonsAPI({
packageManager: {
getAllDependencies: async () => ({}),
},
})
).resolves.toBeNull();
});
});

View File

@ -0,0 +1,45 @@
import chalk from 'chalk';
import { dedent } from 'ts-dedent';
import type { Fix } from '../types';
interface AddonsAPIRunOptions {
usesAddonsAPI: boolean;
}
export const addonsAPI: Fix<AddonsAPIRunOptions> = {
id: 'addons-api',
versionRange: ['<8', '>=8'],
promptType: 'notification',
async check({ packageManager }) {
const allDependencies = await packageManager.getAllDependencies();
const usesAddonsAPI = !!allDependencies['@storybook/addons'];
if (!usesAddonsAPI) {
return null;
}
return { usesAddonsAPI: true };
},
prompt() {
return dedent`
${chalk.bold(
'Attention'
)}: We've detected that you're using the following package which is removed in Storybook 8 and beyond:
- ${chalk.cyan(`@storybook/addons`)}
This package has been deprecated and replaced with ${chalk.cyan(
`@storybook/preview-api`
)} and ${chalk.cyan(`@storybook/manager-api`)}.
You can find more information about the new addons API in the migration guide:
${chalk.yellow(
'https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#new-addons-api'
)}
`;
},
};

View File

@ -23,12 +23,14 @@ import { storyshotsMigration } from './storyshots-migration';
import { removeArgtypesRegex } from './remove-argtypes-regex';
import { webpack5CompilerSetup } from './webpack5-compiler-setup';
import { removeJestTestingLibrary } from './remove-jest-testing-library';
import { addonsAPI } from './addons-api';
import { mdx1to3 } from './mdx-1-to-3';
import { addonPostCSS } from './addon-postcss';
export * from '../types';
export const allFixes: Fix[] = [
addonsAPI,
newFrameworks,
cra5,
webpack5,

View File

@ -0,0 +1,19 @@
import type { PostinstallOptions } from './add';
export const postinstallAddon = async (addonName: string, options: PostinstallOptions) => {
try {
const modulePath = require.resolve(`${addonName}/postinstall`, { paths: [process.cwd()] });
const postinstall = require(modulePath);
try {
console.log(`Running postinstall script for ${addonName}`);
await postinstall(options);
} catch (e) {
console.error(`Error running postinstall script for ${addonName}`);
console.error(e);
}
} catch (e) {
// no postinstall script
}
};

View File

@ -626,6 +626,7 @@ export const daily: TemplateKey[] = [
'vue-cli/default-js',
'lit-vite/default-js',
'svelte-kit/skeleton-js',
'svelte-kit/prerelease-ts',
'svelte-vite/default-js',
'nextjs/13-ts',
'nextjs/default-js',

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/client-logger",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/codemod",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "A collection of codemod scripts written with JSCodeshift",
"keywords": [
"storybook"
@ -67,7 +67,7 @@
"jscodeshift": "^0.15.1",
"lodash": "^4.17.21",
"prettier": "^3.1.1",
"recast": "^0.23.1",
"recast": "^0.23.5",
"tiny-invariant": "^1.3.1"
},
"devDependencies": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-common",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,83 +1,83 @@
// auto generated file, do not edit
export default {
'@storybook/addon-a11y': '8.0.0-rc.1',
'@storybook/addon-actions': '8.0.0-rc.1',
'@storybook/addon-backgrounds': '8.0.0-rc.1',
'@storybook/addon-controls': '8.0.0-rc.1',
'@storybook/addon-docs': '8.0.0-rc.1',
'@storybook/addon-essentials': '8.0.0-rc.1',
'@storybook/addon-highlight': '8.0.0-rc.1',
'@storybook/addon-interactions': '8.0.0-rc.1',
'@storybook/addon-jest': '8.0.0-rc.1',
'@storybook/addon-links': '8.0.0-rc.1',
'@storybook/addon-mdx-gfm': '8.0.0-rc.1',
'@storybook/addon-measure': '8.0.0-rc.1',
'@storybook/addon-onboarding': '8.0.0-rc.1',
'@storybook/addon-outline': '8.0.0-rc.1',
'@storybook/addon-storysource': '8.0.0-rc.1',
'@storybook/addon-themes': '8.0.0-rc.1',
'@storybook/addon-toolbars': '8.0.0-rc.1',
'@storybook/addon-viewport': '8.0.0-rc.1',
'@storybook/angular': '8.0.0-rc.1',
'@storybook/blocks': '8.0.0-rc.1',
'@storybook/builder-manager': '8.0.0-rc.1',
'@storybook/builder-vite': '8.0.0-rc.1',
'@storybook/builder-webpack5': '8.0.0-rc.1',
'@storybook/channels': '8.0.0-rc.1',
'@storybook/cli': '8.0.0-rc.1',
'@storybook/client-logger': '8.0.0-rc.1',
'@storybook/codemod': '8.0.0-rc.1',
'@storybook/components': '8.0.0-rc.1',
'@storybook/core-common': '8.0.0-rc.1',
'@storybook/core-events': '8.0.0-rc.1',
'@storybook/core-server': '8.0.0-rc.1',
'@storybook/core-webpack': '8.0.0-rc.1',
'@storybook/csf-plugin': '8.0.0-rc.1',
'@storybook/csf-tools': '8.0.0-rc.1',
'@storybook/docs-tools': '8.0.0-rc.1',
'@storybook/ember': '8.0.0-rc.1',
'@storybook/html': '8.0.0-rc.1',
'@storybook/html-vite': '8.0.0-rc.1',
'@storybook/html-webpack5': '8.0.0-rc.1',
'@storybook/instrumenter': '8.0.0-rc.1',
'@storybook/manager': '8.0.0-rc.1',
'@storybook/manager-api': '8.0.0-rc.1',
'@storybook/nextjs': '8.0.0-rc.1',
'@storybook/node-logger': '8.0.0-rc.1',
'@storybook/preact': '8.0.0-rc.1',
'@storybook/preact-vite': '8.0.0-rc.1',
'@storybook/preact-webpack5': '8.0.0-rc.1',
'@storybook/preset-create-react-app': '8.0.0-rc.1',
'@storybook/preset-html-webpack': '8.0.0-rc.1',
'@storybook/preset-preact-webpack': '8.0.0-rc.1',
'@storybook/preset-react-webpack': '8.0.0-rc.1',
'@storybook/preset-server-webpack': '8.0.0-rc.1',
'@storybook/preset-svelte-webpack': '8.0.0-rc.1',
'@storybook/preset-vue3-webpack': '8.0.0-rc.1',
'@storybook/preview': '8.0.0-rc.1',
'@storybook/preview-api': '8.0.0-rc.1',
'@storybook/react': '8.0.0-rc.1',
'@storybook/react-dom-shim': '8.0.0-rc.1',
'@storybook/react-vite': '8.0.0-rc.1',
'@storybook/react-webpack5': '8.0.0-rc.1',
'@storybook/router': '8.0.0-rc.1',
'@storybook/server': '8.0.0-rc.1',
'@storybook/server-webpack5': '8.0.0-rc.1',
'@storybook/source-loader': '8.0.0-rc.1',
'@storybook/svelte': '8.0.0-rc.1',
'@storybook/svelte-vite': '8.0.0-rc.1',
'@storybook/svelte-webpack5': '8.0.0-rc.1',
'@storybook/sveltekit': '8.0.0-rc.1',
'@storybook/telemetry': '8.0.0-rc.1',
'@storybook/test': '8.0.0-rc.1',
'@storybook/theming': '8.0.0-rc.1',
'@storybook/types': '8.0.0-rc.1',
'@storybook/vue3': '8.0.0-rc.1',
'@storybook/vue3-vite': '8.0.0-rc.1',
'@storybook/vue3-webpack5': '8.0.0-rc.1',
'@storybook/web-components': '8.0.0-rc.1',
'@storybook/web-components-vite': '8.0.0-rc.1',
'@storybook/web-components-webpack5': '8.0.0-rc.1',
sb: '8.0.0-rc.1',
storybook: '8.0.0-rc.1',
'@storybook/addon-a11y': '8.0.0-rc.2',
'@storybook/addon-actions': '8.0.0-rc.2',
'@storybook/addon-backgrounds': '8.0.0-rc.2',
'@storybook/addon-controls': '8.0.0-rc.2',
'@storybook/addon-docs': '8.0.0-rc.2',
'@storybook/addon-essentials': '8.0.0-rc.2',
'@storybook/addon-highlight': '8.0.0-rc.2',
'@storybook/addon-interactions': '8.0.0-rc.2',
'@storybook/addon-jest': '8.0.0-rc.2',
'@storybook/addon-links': '8.0.0-rc.2',
'@storybook/addon-mdx-gfm': '8.0.0-rc.2',
'@storybook/addon-measure': '8.0.0-rc.2',
'@storybook/addon-onboarding': '8.0.0-rc.2',
'@storybook/addon-outline': '8.0.0-rc.2',
'@storybook/addon-storysource': '8.0.0-rc.2',
'@storybook/addon-themes': '8.0.0-rc.2',
'@storybook/addon-toolbars': '8.0.0-rc.2',
'@storybook/addon-viewport': '8.0.0-rc.2',
'@storybook/angular': '8.0.0-rc.2',
'@storybook/blocks': '8.0.0-rc.2',
'@storybook/builder-manager': '8.0.0-rc.2',
'@storybook/builder-vite': '8.0.0-rc.2',
'@storybook/builder-webpack5': '8.0.0-rc.2',
'@storybook/channels': '8.0.0-rc.2',
'@storybook/cli': '8.0.0-rc.2',
'@storybook/client-logger': '8.0.0-rc.2',
'@storybook/codemod': '8.0.0-rc.2',
'@storybook/components': '8.0.0-rc.2',
'@storybook/core-common': '8.0.0-rc.2',
'@storybook/core-events': '8.0.0-rc.2',
'@storybook/core-server': '8.0.0-rc.2',
'@storybook/core-webpack': '8.0.0-rc.2',
'@storybook/csf-plugin': '8.0.0-rc.2',
'@storybook/csf-tools': '8.0.0-rc.2',
'@storybook/docs-tools': '8.0.0-rc.2',
'@storybook/ember': '8.0.0-rc.2',
'@storybook/html': '8.0.0-rc.2',
'@storybook/html-vite': '8.0.0-rc.2',
'@storybook/html-webpack5': '8.0.0-rc.2',
'@storybook/instrumenter': '8.0.0-rc.2',
'@storybook/manager': '8.0.0-rc.2',
'@storybook/manager-api': '8.0.0-rc.2',
'@storybook/nextjs': '8.0.0-rc.2',
'@storybook/node-logger': '8.0.0-rc.2',
'@storybook/preact': '8.0.0-rc.2',
'@storybook/preact-vite': '8.0.0-rc.2',
'@storybook/preact-webpack5': '8.0.0-rc.2',
'@storybook/preset-create-react-app': '8.0.0-rc.2',
'@storybook/preset-html-webpack': '8.0.0-rc.2',
'@storybook/preset-preact-webpack': '8.0.0-rc.2',
'@storybook/preset-react-webpack': '8.0.0-rc.2',
'@storybook/preset-server-webpack': '8.0.0-rc.2',
'@storybook/preset-svelte-webpack': '8.0.0-rc.2',
'@storybook/preset-vue3-webpack': '8.0.0-rc.2',
'@storybook/preview': '8.0.0-rc.2',
'@storybook/preview-api': '8.0.0-rc.2',
'@storybook/react': '8.0.0-rc.2',
'@storybook/react-dom-shim': '8.0.0-rc.2',
'@storybook/react-vite': '8.0.0-rc.2',
'@storybook/react-webpack5': '8.0.0-rc.2',
'@storybook/router': '8.0.0-rc.2',
'@storybook/server': '8.0.0-rc.2',
'@storybook/server-webpack5': '8.0.0-rc.2',
'@storybook/source-loader': '8.0.0-rc.2',
'@storybook/svelte': '8.0.0-rc.2',
'@storybook/svelte-vite': '8.0.0-rc.2',
'@storybook/svelte-webpack5': '8.0.0-rc.2',
'@storybook/sveltekit': '8.0.0-rc.2',
'@storybook/telemetry': '8.0.0-rc.2',
'@storybook/test': '8.0.0-rc.2',
'@storybook/theming': '8.0.0-rc.2',
'@storybook/types': '8.0.0-rc.2',
'@storybook/vue3': '8.0.0-rc.2',
'@storybook/vue3-vite': '8.0.0-rc.2',
'@storybook/vue3-webpack5': '8.0.0-rc.2',
'@storybook/web-components': '8.0.0-rc.2',
'@storybook/web-components-vite': '8.0.0-rc.2',
'@storybook/web-components-webpack5': '8.0.0-rc.2',
sb: '8.0.0-rc.2',
storybook: '8.0.0-rc.2',
};

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-events",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Event names used in storybook core",
"keywords": [
"storybook"

View File

@ -1,5 +1,6 @@
// eslint-disable-next-line @typescript-eslint/naming-convention
enum events {
CHANNEL_WS_DISCONNECT = 'channelWSDisconnect',
CHANNEL_CREATED = 'channelCreated',
// There was an error executing the config, likely an bug in the user's preview.js
CONFIG_ERROR = 'configError',
@ -80,6 +81,7 @@ export default events;
// Enables: `import * as Events from ...` or `import { CHANNEL_CREATED } as Events from ...`
// This is the preferred method
export const {
CHANNEL_WS_DISCONNECT,
CHANNEL_CREATED,
CONFIG_ERROR,
CURRENT_STORY_WAS_SET,

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-server",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/csf-plugin",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Enrich CSF files via static analysis",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/csf-tools",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Parse and manipulate CSF and Storybook config files",
"keywords": [
"storybook"
@ -49,7 +49,7 @@
"@storybook/csf": "^0.1.2",
"@storybook/types": "workspace:*",
"fs-extra": "^11.1.0",
"recast": "^0.23.1",
"recast": "^0.23.5",
"ts-dedent": "^2.0.0"
},
"devDependencies": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/docs-tools",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Shared utility functions for frameworks to implement docs",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/instrumenter",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/manager-api",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Core Storybook Manager API & Context",
"keywords": [
"storybook"

View File

@ -19,9 +19,13 @@ export const getEventMetadata = (context: Meta, fullAPI: API) => {
const { source, refId, type } = context;
const [sourceType, sourceLocation] = getSourceType(source!, refId);
const ref =
refId && fullAPI.getRefs()[refId] ? fullAPI.getRefs()[refId] : fullAPI.findRef(sourceLocation!);
let ref: API_ComposedRef | undefined;
if (refId || sourceType === 'external') {
ref =
refId && fullAPI.getRefs()[refId]
? fullAPI.getRefs()[refId]
: fullAPI.findRef(sourceLocation!);
}
const meta = {
source,
sourceType,

View File

@ -20,8 +20,6 @@ import type { ModuleFn } from '../lib/types';
const { location, fetch } = global;
const findFilename = /(\/((?:[^\/]+?)\.[^\/]+?)|\/)$/;
export interface SubState {
refs: API_Refs;
}
@ -75,8 +73,10 @@ export const getSourceType = (source: string, refId?: string) => {
const { origin: localOrigin, pathname: localPathname } = location;
const { origin: sourceOrigin, pathname: sourcePathname } = new URL(source);
const localFull = `${localOrigin + localPathname}`.replace(findFilename, '');
const sourceFull = `${sourceOrigin + sourcePathname}`.replace(findFilename, '');
const localFull = `${localOrigin + localPathname}`.replace('/iframe.html', '').replace(/\/$/, '');
const sourceFull = `${sourceOrigin + sourcePathname}`
.replace('/iframe.html', '')
.replace(/\/$/, '');
if (localFull === sourceFull) {
return ['local', sourceFull];

View File

@ -25,7 +25,7 @@ vi.mock('@storybook/global', () => {
// Add additional variations of global.location mock return values in this array.
// NOTE: The order must match the order that global.location is called in the unit tests.
const edgecaseLocations = [
{ origin: 'https://storybook.js.org', pathname: '/storybook/index.html' },
{ origin: 'https://storybook.js.org', pathname: '/storybook/iframe.html' },
];
// global.location value after all edgecaseLocations are returned
const lastLocation = { origin: 'https://storybook.js.org', pathname: '/storybook/' };

View File

@ -1 +1 @@
export const version = '8.0.0-rc.1';
export const version = '8.0.0-rc.2';

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/node-logger",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preview-api",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preview",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-dom-shim",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/router",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Core Storybook Router",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/source-loader",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Source loader",
"keywords": [
"lib",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/telemetry",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Telemetry logging for crash reports and usage statistics",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/test",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/theming",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Core Storybook Components",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/types",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Core Storybook TS Types",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/root",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"private": true,
"description": "Storybook root",
"homepage": "https://storybook.js.org/",
@ -214,7 +214,7 @@
"react-dom": "^18.2.0",
"semver": "^7.3.7",
"serve-static": "^1.14.1",
"svelte": "^5.0.0-next.28",
"svelte": "^5.0.0-next.65",
"trash": "^7.0.0",
"ts-dedent": "^2.0.0",
"ts-node": "^10.9.1",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-create-react-app",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Create React App preset",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-html-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-preact-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Preact: Develop Preact Component in isolation.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-react-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for React: Develop React Component in isolation with Hot Reloading",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-server-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-svelte-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -75,7 +75,7 @@
"typescript": "^5.3.2"
},
"peerDependencies": {
"svelte": "^4.0.0 || ^5.0.0-next.16",
"svelte": "^4.0.0 || ^5.0.0-next.65",
"svelte-loader": "*"
},
"engines": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-vue3-webpack",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook for Vue 3: Develop Vue 3 Components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook HTML renderer",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook Preact renderer",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react",
"version": "8.0.0-rc.1",
"version": "8.0.0-rc.2",
"description": "Storybook React renderer",
"keywords": [
"storybook"

Some files were not shown because too many files have changed in this diff Show More