mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-08 06:23:00 +08:00
Merge branch 'next' into feature/portable-stories-improvements
This commit is contained in:
commit
9b9d6bed4e
@ -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:
|
||||
|
60
.github/workflows/generate-sandboxes-main.yml
vendored
60
.github/workflows/generate-sandboxes-main.yml
vendored
@ -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 }})'
|
60
.github/workflows/generate-sandboxes-next.yml
vendored
60
.github/workflows/generate-sandboxes-next.yml
vendored
@ -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
127
.github/workflows/generate-sandboxes.yml
vendored
Normal 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 }})
|
@ -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)!
|
||||
|
30
MIGRATION.md
30
MIGRATION.md
@ -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
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/addon-storysource",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "View a story’s source code to see how it works and paste into your app",
|
||||
"keywords": [
|
||||
"addon",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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 Storybook’s viewport size and orientation",
|
||||
"keywords": [
|
||||
"addon",
|
||||
|
@ -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"
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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": {
|
||||
|
@ -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": {
|
||||
|
@ -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';
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/channels",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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]`);
|
||||
});
|
||||
});
|
||||
|
@ -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 });
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "sb",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "Storybook CLI",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "storybook",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "Storybook CLI",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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",
|
||||
|
148
code/lib/cli/src/add.test.ts
Normal file
148
code/lib/cli/src/add.test.ts
Normal 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',
|
||||
});
|
||||
});
|
||||
});
|
@ -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+$/);
|
||||
}
|
||||
|
@ -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`)}
|
||||
|
||||
|
44
code/lib/cli/src/automigrate/fixes/addons-api.test.ts
Normal file
44
code/lib/cli/src/automigrate/fixes/addons-api.test.ts
Normal 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();
|
||||
});
|
||||
});
|
45
code/lib/cli/src/automigrate/fixes/addons-api.ts
Normal file
45
code/lib/cli/src/automigrate/fixes/addons-api.ts
Normal 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'
|
||||
)}
|
||||
`;
|
||||
},
|
||||
};
|
@ -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,
|
||||
|
19
code/lib/cli/src/postinstallAddon.ts
Normal file
19
code/lib/cli/src/postinstallAddon.ts
Normal 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
|
||||
}
|
||||
};
|
@ -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',
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/client-logger",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -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',
|
||||
};
|
||||
|
@ -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"
|
||||
|
@ -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,
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/instrumenter",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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"
|
||||
|
@ -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,
|
||||
|
@ -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];
|
||||
|
@ -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/' };
|
||||
|
@ -1 +1 @@
|
||||
export const version = '8.0.0-rc.1';
|
||||
export const version = '8.0.0-rc.2';
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/node-logger",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/preview-api",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/preview",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/react-dom-shim",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/test",
|
||||
"version": "8.0.0-rc.1",
|
||||
"version": "8.0.0-rc.2",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user