-
-
Notifications
You must be signed in to change notification settings - Fork 9.8k
Manifests: Refactor from componentManifestGenerator to extensible manifests preset property
#33392
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: next
Are you sure you want to change the base?
Conversation
| const generator = await presets.apply('storyIndexGenerator'); | ||
| invariant(generator, 'storyIndexGenerator must be configured'); | ||
| const index = await generator.getIndex(); | ||
| const manifests = ((await presets.apply('experimental_manifests', {}, { index })) ?? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there's an obvious performance optimization needed here. Any request to /manifests/X.json will currently cause all manifests to get re-generated. I have ideas for how to fix this, but perf optimisation is for later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
most changes here are whitespace, I recommend you to use the "Hide whitespace" feature when reviewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
scratch that, this file was refactored into helper functions, but functionality should be identical.
|
View your CI Pipeline Execution ↗ for commit ce8e6b9
☁️ Nx Cloud last updated this comment at |
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. 📝 WalkthroughWalkthroughCentralizes manifest generation and serving: adds writeManifests and registerManifests, replaces componentManifestGenerator with manifests, updates types and renderer exports, and wires the new utilities into build-static and dev-server flows. Changes
Sequence Diagram(s)sequenceDiagram
participant Build as Build process
participant Presets as Presets pipeline
participant Renderer as Renderer preset (manifests)
participant FS as Filesystem
Build->>Presets: request story index
Presets->>Renderer: apply experimental_manifests with index
Renderer-->>Presets: return manifests object
Build->>FS: write /output/manifests/*.json and components.html (if present)
FS-->>Build: write result / error
sequenceDiagram
participant Client as Browser
participant DevServer as Polka app
participant Presets as Presets pipeline
participant Renderer as Renderer preset (manifests)
Client->>DevServer: GET /manifests/:name.json or /manifests/components.html
DevServer->>Presets: presets.apply('experimental_manifests')
Presets->>Renderer: produce manifests
Renderer-->>DevServer: manifest JSON or components manifest
DevServer->>Client: respond with JSON or rendered HTML (200 / 404 / 500)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45–60 minutes
Possibly related PRs
✨ Finishing touches
📜 Recent review detailsConfiguration used: Organization UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🧰 Additional context used📓 Path-based instructions (5)**/*.{js,jsx,json,html,ts,tsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
**/*.{ts,tsx}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
code/**/*.{ts,tsx,js,jsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
code/**/*.{ts,tsx,js,jsx}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
code/**/*.{js,jsx,json,html,ts,tsx,mjs}📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Files:
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
🔇 Additional comments (2)
Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
code/core/src/core-server/utils/manifests/manifests.ts (1)
40-47: Performance optimization opportunity acknowledged.The past review comment correctly notes that every request to
/manifests/:name.jsonregenerates all manifests. This is acceptable for the initial implementation, with optimization planned for later.Note: This duplicates the concern raised in the existing past review comment on line 44.
🧹 Nitpick comments (2)
code/renderers/react/src/componentManifest/generator.ts (2)
24-28: Consider removingasyncif no asynchronous operations are performed.The function is declared
asyncbut doesn't contain anyawaitexpressions. Unless you're planning to add asynchronous operations in the near future, consider removing theasynckeyword to avoid unnecessary Promise wrapping overhead.🔎 Apply this diff if no async operations are planned:
-export const manifests: PresetPropertyFn< +export const manifests: PresetPropertyFn< 'experimental_manifests', StorybookConfigRaw, { index: StoryIndex } -> = async (existingManifests = {}, { index }) => { +> = (existingManifests = {}, { index }) => {
45-174: Consider error handling for malformed story files.The
loadCsf()call at line 48 could throw if the story file is malformed. While individual story processing has try-catch blocks (lines 87-104), a file-level parsing error would cause the entire manifest generation to fail. Consider wrapping the component processing in a try-catch to handle malformed files gracefully.🔎 View suggested approach:
const components = singleEntryPerComponent.map((entry): ReactComponentManifest | undefined => { + try { const absoluteImportPath = path.join(process.cwd(), entry.importPath); const storyFile = cachedReadFileSync(absoluteImportPath, 'utf-8') as string; const csf = loadCsf(storyFile, { makeTitle: (title) => title ?? 'No title' }).parse(); // ... rest of the processing + } catch (e) { + logger.warn(`Failed to process component manifest for ${entry.importPath}:`, e); + return undefined; + } });This ensures that a single malformed file doesn't prevent manifest generation for other components.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
code/core/src/core-server/build-static.ts(3 hunks)code/core/src/core-server/dev-server.ts(2 hunks)code/core/src/core-server/utils/manifests/manifests.test.ts(1 hunks)code/core/src/core-server/utils/manifests/manifests.ts(1 hunks)code/core/src/core-server/utils/manifests/render-components-manifest.ts(3 hunks)code/core/src/types/modules/core-common.ts(2 hunks)code/renderers/react/src/componentManifest/generator.test.ts(2 hunks)code/renderers/react/src/componentManifest/generator.ts(2 hunks)code/renderers/react/src/preset.ts(1 hunks)
🧰 Additional context used
📓 Path-based instructions (8)
**/*.{js,jsx,json,html,ts,tsx,mjs}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use ESLint and Prettier configurations that are enforced in the codebase
Files:
code/core/src/core-server/build-static.tscode/core/src/types/modules/core-common.tscode/core/src/core-server/utils/manifests/render-components-manifest.tscode/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.tscode/core/src/core-server/utils/manifests/manifests.test.tscode/renderers/react/src/preset.tscode/renderers/react/src/componentManifest/generator.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Enable TypeScript strict mode
Files:
code/core/src/core-server/build-static.tscode/core/src/types/modules/core-common.tscode/core/src/core-server/utils/manifests/render-components-manifest.tscode/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.tscode/core/src/core-server/utils/manifests/manifests.test.tscode/renderers/react/src/preset.tscode/renderers/react/src/componentManifest/generator.ts
code/**/*.{ts,tsx,js,jsx,mjs}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
code/**/*.{ts,tsx,js,jsx,mjs}: Use server-side logger from 'storybook/internal/node-logger' for Node.js code
Use client-side logger from 'storybook/internal/client-logger' for browser code
Do not use console.log, console.warn, or console.error directly unless in isolated files where importing loggers would significantly increase bundle size
Files:
code/core/src/core-server/build-static.tscode/core/src/types/modules/core-common.tscode/core/src/core-server/utils/manifests/render-components-manifest.tscode/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.tscode/core/src/core-server/utils/manifests/manifests.test.tscode/renderers/react/src/preset.tscode/renderers/react/src/componentManifest/generator.ts
code/**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Export functions that need to be tested from their modules
Files:
code/core/src/core-server/build-static.tscode/core/src/types/modules/core-common.tscode/core/src/core-server/utils/manifests/render-components-manifest.tscode/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.tscode/core/src/core-server/utils/manifests/manifests.test.tscode/renderers/react/src/preset.tscode/renderers/react/src/componentManifest/generator.ts
code/**/*.{js,jsx,json,html,ts,tsx,mjs}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
code/**/*.{js,jsx,json,html,ts,tsx,mjs}: Run Prettier with --write flag to format code before committing
Run ESLint with yarn lint:js:cmd to check for linting issues and fix errors before committing
Files:
code/core/src/core-server/build-static.tscode/core/src/types/modules/core-common.tscode/core/src/core-server/utils/manifests/render-components-manifest.tscode/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.tscode/core/src/core-server/utils/manifests/manifests.test.tscode/renderers/react/src/preset.tscode/renderers/react/src/componentManifest/generator.ts
**/*.{test,spec}.{ts,tsx}
📄 CodeRabbit inference engine (.cursorrules)
**/*.{test,spec}.{ts,tsx}: Test files should follow the naming pattern*.test.ts,*.test.tsx,*.spec.ts, or*.spec.tsx
Follow the spy mocking rules defined in.cursor/rules/spy-mocking.mdcfor consistent mocking patterns with Vitest
Files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
**/*.test.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.cursor/rules/spy-mocking.mdc)
**/*.test.{ts,tsx,js,jsx}: Usevi.mock()with thespy: trueoption for all package and file mocks in Vitest tests
Place all mocks at the top of the test file before any test cases
Usevi.mocked()to type and access the mocked functions in Vitest tests
Implement mock behaviors inbeforeEachblocks in Vitest tests
Mock all required dependencies that the test subject uses
Each mock implementation should return a Promise for async functions in Vitest
Mock implementations should match the expected return type of the original function
Mock all required properties and methods that the test subject uses in Vitest tests
Avoid direct function mocking withoutvi.mocked()in Vitest tests
Avoid mock implementations outside ofbeforeEachblocks in Vitest tests
Avoid mocking without thespy: trueoption in Vitest tests
Avoid inline mock implementations within test cases in Vitest tests
Avoid mocking only a subset of required dependencies in Vitest tests
Mock at the highest level of abstraction needed in Vitest tests
Keep mock implementations simple and focused in Vitest tests
Use type-safe mocking withvi.mocked()in Vitest tests
Document complex mock behaviors in Vitest tests
Group related mocks together in Vitest tests
Files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
code/**/*.{test,spec}.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
code/**/*.{test,spec}.{ts,tsx,js,jsx}: Write meaningful unit tests that actually import and call the functions being tested
Mock external dependencies using vi.mock() for file system, loggers, and other external dependencies in tests
Aim for high test coverage of business logic (75%+ for statements/lines) using coverage reports
Files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
🧠 Learnings (21)
📓 Common learnings
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/components/components/Select/Select.tsx:200-204
Timestamp: 2025-11-05T09:38:47.712Z
Learning: Repo: storybookjs/storybook — Guidance: Until Storybook 11 is released, do not suggest using React.useId anywhere (e.g., in code/core/src/components/components/Select/Select.tsx) to maintain compatibility with React 17 runtimes. Prefer advising: accept a caller-provided props.id and, if needed, generate a client-only fallback id to minimize SSR hydration issues — but avoid useId. Resume prompting for useId after Storybook 11.
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Follow existing patterns and conventions in the Storybook codebase
Applied to files:
code/core/src/core-server/build-static.tscode/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.ts
📚 Learning: 2025-09-17T07:31:04.432Z
Learnt from: ndelangen
Repo: storybookjs/storybook PR: 32484
File: code/core/package.json:326-326
Timestamp: 2025-09-17T07:31:04.432Z
Learning: In Storybook's core package, dependencies like `open` are bundled into the final distribution during the build process, so they should remain in devDependencies rather than being moved to dependencies. End users don't need these packages as separate runtime dependencies since they're included in the bundled code.
Applied to files:
code/core/src/core-server/build-static.ts
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to code/**/*.{ts,tsx,js,jsx,mjs} : Use server-side logger from 'storybook/internal/node-logger' for Node.js code
Applied to files:
code/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.ts
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to code/**/*.{ts,tsx,js,jsx,mjs} : Use client-side logger from 'storybook/internal/client-logger' for browser code
Applied to files:
code/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.ts
📚 Learning: 2025-09-24T09:39:39.233Z
Learnt from: ndelangen
Repo: storybookjs/storybook PR: 32507
File: code/core/src/manager/globals/globals-module-info.ts:25-33
Timestamp: 2025-09-24T09:39:39.233Z
Learning: In Storybook, storybook/actions/decorator is a preview-only entrypoint and should not be included in manager globals configuration. The duplicatedKeys array in code/core/src/manager/globals/globals-module-info.ts is specifically for manager-side externalization, not preview entrypoints.
Applied to files:
code/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.ts
📚 Learning: 2025-11-05T09:37:25.920Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/components/components/tooltip/WithTooltip.tsx:54-96
Timestamp: 2025-11-05T09:37:25.920Z
Learning: Repo: storybookjs/storybook — In code/core/src/components/components/tooltip/WithTooltip.tsx, the legacy WithTooltip implementation is intentionally reintroduced for backward compatibility and is deprecated; maintainers (per Sidnioulz) do not want maintenance or improvements on it. Prefer WithTooltipNew/Popover; avoid suggesting changes to WithTooltip.* going forward.
Applied to files:
code/core/src/core-server/dev-server.tscode/renderers/react/src/componentManifest/generator.ts
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to code/**/*.{test,spec}.{ts,tsx,js,jsx} : Write meaningful unit tests that actually import and call the functions being tested
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Document complex mock behaviors in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Avoid mocking only a subset of required dependencies in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Avoid inline mock implementations within test cases in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Mock all required properties and methods that the test subject uses in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Group related mocks together in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Avoid mock implementations outside of `beforeEach` blocks in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Mock all required dependencies that the test subject uses
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Mock implementations should match the expected return type of the original function
Applied to files:
code/renderers/react/src/componentManifest/generator.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Keep mock implementations simple and focused in Vitest tests
Applied to files:
code/renderers/react/src/componentManifest/generator.test.tscode/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to code/**/*.{test,spec}.{ts,tsx,js,jsx} : Mock external dependencies using vi.mock() for file system, loggers, and other external dependencies in tests
Applied to files:
code/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Implement mock behaviors in `beforeEach` blocks in Vitest tests
Applied to files:
code/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Each mock implementation should return a Promise for async functions in Vitest
Applied to files:
code/core/src/core-server/utils/manifests/manifests.test.ts
📚 Learning: 2025-11-05T09:38:47.712Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/components/components/Select/Select.tsx:200-204
Timestamp: 2025-11-05T09:38:47.712Z
Learning: Repo: storybookjs/storybook — Guidance: Until Storybook 11 is released, do not suggest using React.useId anywhere (e.g., in code/core/src/components/components/Select/Select.tsx) to maintain compatibility with React 17 runtimes. Prefer advising: accept a caller-provided props.id and, if needed, generate a client-only fallback id to minimize SSR hydration issues — but avoid useId. Resume prompting for useId after Storybook 11.
Applied to files:
code/renderers/react/src/componentManifest/generator.ts
🧬 Code graph analysis (6)
code/core/src/core-server/build-static.ts (1)
code/core/src/core-server/utils/manifests/manifests.ts (1)
writeManifests(12-37)
code/core/src/core-server/utils/manifests/render-components-manifest.ts (1)
code/core/src/types/modules/core-common.ts (1)
ComponentsManifest(371-374)
code/core/src/core-server/dev-server.ts (1)
code/core/src/core-server/utils/manifests/manifests.ts (1)
registerManifests(39-86)
code/renderers/react/src/componentManifest/generator.test.ts (1)
code/renderers/react/src/componentManifest/fixtures.ts (2)
fsMocks(3-108)indexJson(110-189)
code/core/src/core-server/utils/manifests/manifests.ts (4)
code/core/src/types/modules/core-common.ts (2)
ComponentsManifest(371-374)Manifests(378-382)code/renderers/react/src/componentManifest/generator.ts (1)
manifests(24-189)code/renderers/react/src/preset.ts (1)
manifests(11-11)code/core/src/core-server/utils/manifests/render-components-manifest.ts (1)
renderComponentsManifest(9-599)
code/core/src/core-server/utils/manifests/manifests.test.ts (2)
code/core/src/core-server/utils/manifests/manifests.ts (2)
writeManifests(12-37)registerManifests(39-86)code/core/src/components/components/Modal/Modal.styled.tsx (1)
Error(287-294)
🪛 Biome (2.1.2)
code/core/src/core-server/utils/manifests/manifests.test.ts
[error] 36-36: This code will never be reached ...
... because either this statement, ...
... this statement, ...
... or this statement will return from the function beforehand
(lint/correctness/noUnreachable)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
- GitHub Check: CodeQL analysis (javascript-typescript)
- GitHub Check: Agent
- GitHub Check: normal
- GitHub Check: Core Unit Tests, windows-latest
- GitHub Check: nx
🔇 Additional comments (16)
code/core/src/types/modules/core-common.ts (2)
376-382: LGTM! Type refactoring aligns with the new manifest API.The transition from a generator function to a data structure (
Manifeststype) is a clean simplification. The TODO on line 380 regarding JSON-serializable type constraints is acknowledged and can be addressed in a follow-up.
399-399: API rename is consistent with the PR objective.The change from
experimental_componentManifestGeneratortoexperimental_manifestsaligns with the broader refactoring across the codebase.code/renderers/react/src/preset.ts (1)
11-11: LGTM! Export alias updated correctly.The re-export aligns with the new
manifestsAPI naming convention used throughout this PR.code/core/src/core-server/build-static.ts (1)
151-151: LGTM! Manifest generation properly consolidated.The refactor delegates manifest generation to the centralized
writeManifestsutility and correctly uses the effects array for asynchronous execution. Error handling is appropriately encapsulated in the utility function.code/core/src/core-server/dev-server.ts (1)
164-164: LGTM! Manifest serving properly consolidated.The refactor consolidates manifest HTTP endpoints into the centralized
registerManifestsutility, eliminating code duplication and improving maintainability.code/core/src/core-server/utils/manifests/render-components-manifest.ts (2)
9-9: LGTM! Function renamed for consistency.The rename from
renderManifestComponentsPagetorenderComponentsManifestimproves naming consistency across the manifests module.
828-840: LGTM! Appropriate reduction of public API surface.Making
ParsedDocgenandparseReactDocgenprivate is correct—these are internal implementation details that don't need to be exposed.code/core/src/core-server/utils/manifests/manifests.test.ts (2)
46-118: LGTM! Comprehensive test coverage for writeManifests.The test suite thoroughly covers:
- Empty manifests (no-op behavior)
- JSON file generation
- HTML generation for components manifest
- Error handling with proper logging
- Non-Error error objects
120-388: LGTM! Thorough test coverage for registerManifests.The tests comprehensively validate:
- Route registration
- JSON endpoint behavior (success, 404, error paths)
- HTML endpoint behavior (success, 404, error paths)
- Error logging and status codes
- Non-Error error handling
code/renderers/react/src/componentManifest/generator.test.ts (2)
9-9: LGTM! Tests updated for new manifests API.The test updates correctly reflect the API changes:
- Import renamed from
generatortomanifests- Call signature updated to
manifests(undefined, { index })- Assertions updated to access the nested
result?.componentsstructureAlso applies to: 17-17, 19-19
282-284: LGTM! Helper function updated consistently.The
getManifestForStoryhelper correctly uses the new API and accesses the nested component structure.code/core/src/core-server/utils/manifests/manifests.ts (3)
12-37: LGTM! Well-structured manifest generation with proper error handling.The
writeManifestsfunction correctly:
- Handles empty manifests with an early return
- Creates the manifests directory recursively
- Writes all manifest JSON files in parallel
- Generates the components HTML when applicable
- Logs errors appropriately
49-65: LGTM! JSON manifest endpoint properly implemented.The route handler correctly:
- Fetches the requested manifest
- Sets appropriate Content-Type headers
- Returns 404 for missing manifests with a clear message
- Handles errors with logging and 500 status
- Handles non-Error error objects
67-85: LGTM! HTML components endpoint properly implemented.The route handler correctly:
- Fetches the components manifest
- Returns friendly 404 message when not configured
- Renders HTML using
renderComponentsManifest- Sets proper Content-Type with charset
- Includes error stack in error responses for debugging
code/renderers/react/src/componentManifest/generator.ts (2)
8-9: LGTM!The added type imports align correctly with the refactored function signature.
178-189: LGTM!The return statement correctly implements the extensibility pattern by spreading
existingManifestsand adding the newcomponentsmanifest. This allows other presets to contribute additional manifests, which aligns with the PR's objective.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR refactors the component manifest generation system from a function-based approach (experimental_componentManifestGenerator) to a more extensible object-based approach (experimental_manifests). The refactor enables multiple presets (renderers, addons, etc.) to contribute to multiple manifest types in a composable way, preparing for future additions like MDX-based docs manifests.
Key changes:
- Changed from passing
StoryIndexGeneratoras a function argument to accessing the pre-generatedStoryIndexfrom preset context - Replaced
ComponentManifestGeneratortype withManifeststype that returns aRecord<ManifestName, ManifestContent>structure - Centralized manifest generation logic into new
manifests.tsutility module withwriteManifestsandregisterManifestsfunctions
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| code/renderers/react/src/preset.ts | Updated export from componentManifestGenerator to manifests to match new API |
| code/renderers/react/src/componentManifest/generator.ts | Refactored from returning a generator function to directly implementing the preset property; now receives index from context instead of generator |
| code/renderers/react/src/componentManifest/generator.test.ts | Updated tests to call new manifests function directly with index parameter instead of via generator pattern |
| code/core/src/types/modules/core-common.ts | Removed ComponentManifestGenerator type; added Manifests type for extensible manifest structure; updated config interface |
| code/core/src/core-server/utils/manifests/render-components-manifest.ts | Renamed function from renderManifestComponentsPage to renderComponentsManifest; changed helper types/functions from exports to internal |
| code/core/src/core-server/utils/manifests/manifests.ts | New utility module centralizing manifest generation logic with writeManifests for build and registerManifests for dev server routes |
| code/core/src/core-server/utils/manifests/manifests.test.ts | Comprehensive test suite for new manifest utilities covering both write operations and HTTP route handlers |
| code/core/src/core-server/dev-server.ts | Replaced inline manifest route handling with call to registerManifests utility; removed old imports |
| code/core/src/core-server/build-static.ts | Replaced inline manifest generation with call to writeManifests utility; simplified error handling |
|
|
||
| const docgen = docgenResult.type === 'success' ? docgenResult.data : undefined; | ||
| const error = docgenResult.type === 'error' ? docgenResult.error : undefined; | ||
| export const manifests: PresetPropertyFn< |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This preset is quite verbose. Could you find meaningful ways to encapsulate logic in smaller helper functions to make the logic more readable and declarative?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did some minor refactoring to helper functions and variable names to improve the readability a little.
…kjs/storybook into jeppe/manifests-preset-property
Package BenchmarksCommit: The following packages have significant changes to their size or dependencies:
|
| Before | After | Difference | |
|---|---|---|---|
| Dependency count | 18 | 18 | 0 |
| Self size | 1.79 MB | 1.64 MB | 🎉 -153 KB 🎉 |
| Dependency size | 9.25 MB | 9.25 MB | 🚨 +6 B 🚨 |
| Bundle Size Analyzer | Link | Link |
storybook
| Before | After | Difference | |
|---|---|---|---|
| Dependency count | 49 | 49 | 0 |
| Self size | 20.52 MB | 19.92 MB | 🎉 -606 KB 🎉 |
| Dependency size | 16.52 MB | 16.52 MB | 0 B |
| Bundle Size Analyzer | Link | Link |
@storybook/cli
| Before | After | Difference | |
|---|---|---|---|
| Dependency count | 183 | 183 | 0 |
| Self size | 775 KB | 775 KB | 0 B |
| Dependency size | 67.58 MB | 66.97 MB | 🎉 -606 KB 🎉 |
| Bundle Size Analyzer | Link | Link |
@storybook/codemod
| Before | After | Difference | |
|---|---|---|---|
| Dependency count | 176 | 176 | 0 |
| Self size | 30 KB | 30 KB | 🚨 +36 B 🚨 |
| Dependency size | 66.15 MB | 65.54 MB | 🎉 -606 KB 🎉 |
| Bundle Size Analyzer | Link | Link |
create-storybook
| Before | After | Difference | |
|---|---|---|---|
| Dependency count | 50 | 50 | 0 |
| Self size | 999 KB | 999 KB | 🎉 -42 B 🎉 |
| Dependency size | 37.04 MB | 36.44 MB | 🎉 -606 KB 🎉 |
| Bundle Size Analyzer | node | node |
|
Love it! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
code/renderers/react/src/componentManifest/generator.ts (1)
100-104: Consider removing unnecessary async keyword.The
manifestsfunction is declaredasyncbut doesn't contain anyawaitexpressions. Unless thePresetPropertyFntype requires async functions or this is intentional for future-proofing, theasynckeyword can be removed.🔎 Proposed fix to remove async
-export const manifests: PresetPropertyFn< +export const manifests: PresetPropertyFn< 'experimental_manifests', StorybookConfigRaw, { index: StoryIndex } -> = async (existingManifests = {}, { index }) => { +> = (existingManifests = {}, { index }) => {
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (9)
code/.eslintrc.js(1 hunks)code/addons/docs/package.json(1 hunks)code/addons/vitest/package.json(1 hunks)code/core/package.json(1 hunks)code/lib/codemod/package.json(1 hunks)code/package.json(1 hunks)code/renderers/react/package.json(1 hunks)code/renderers/react/src/componentManifest/generator.ts(3 hunks)scripts/package.json(1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{js,jsx,json,html,ts,tsx,mjs}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use ESLint and Prettier configurations that are enforced in the codebase
Files:
code/package.jsoncode/addons/docs/package.jsoncode/renderers/react/package.jsonscripts/package.jsoncode/renderers/react/src/componentManifest/generator.tscode/core/package.jsoncode/addons/vitest/package.jsoncode/lib/codemod/package.json
code/**/*.{js,jsx,json,html,ts,tsx,mjs}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
code/**/*.{js,jsx,json,html,ts,tsx,mjs}: Run Prettier with --write flag to format code before committing
Run ESLint with yarn lint:js:cmd to check for linting issues and fix errors before committing
Files:
code/package.jsoncode/addons/docs/package.jsoncode/renderers/react/package.jsoncode/renderers/react/src/componentManifest/generator.tscode/core/package.jsoncode/addons/vitest/package.jsoncode/lib/codemod/package.json
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Enable TypeScript strict mode
Files:
code/renderers/react/src/componentManifest/generator.ts
code/**/*.{ts,tsx,js,jsx,mjs}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
code/**/*.{ts,tsx,js,jsx,mjs}: Use server-side logger from 'storybook/internal/node-logger' for Node.js code
Use client-side logger from 'storybook/internal/client-logger' for browser code
Do not use console.log, console.warn, or console.error directly unless in isolated files where importing loggers would significantly increase bundle size
Files:
code/renderers/react/src/componentManifest/generator.ts
code/**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Export functions that need to be tested from their modules
Files:
code/renderers/react/src/componentManifest/generator.ts
🧠 Learnings (12)
📚 Learning: 2025-09-17T07:31:04.432Z
Learnt from: ndelangen
Repo: storybookjs/storybook PR: 32484
File: code/core/package.json:326-326
Timestamp: 2025-09-17T07:31:04.432Z
Learning: In Storybook's core package, dependencies like `open` are bundled into the final distribution during the build process, so they should remain in devDependencies rather than being moved to dependencies. End users don't need these packages as separate runtime dependencies since they're included in the bundled code.
Applied to files:
code/package.jsoncode/lib/codemod/package.json
📚 Learning: 2025-09-29T13:20:23.346Z
Learnt from: mrginglymus
Repo: storybookjs/storybook PR: 32556
File: code/core/package.json:309-313
Timestamp: 2025-09-29T13:20:23.346Z
Learning: The `fast-printf` dependency in Storybook's core package is bundled into the final distribution during the build process, so it should remain in devDependencies rather than being moved to dependencies, following the same pattern as other bundled dependencies like `open`.
Applied to files:
code/package.jsoncode/lib/codemod/package.json
📚 Learning: 2025-11-05T09:38:47.712Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/components/components/Select/Select.tsx:200-204
Timestamp: 2025-11-05T09:38:47.712Z
Learning: Repo: storybookjs/storybook — Guidance: Until Storybook 11 is released, do not suggest using React.useId anywhere (e.g., in code/core/src/components/components/Select/Select.tsx) to maintain compatibility with React 17 runtimes. Prefer advising: accept a caller-provided props.id and, if needed, generate a client-only fallback id to minimize SSR hydration issues — but avoid useId. Resume prompting for useId after Storybook 11.
Applied to files:
code/package.jsoncode/.eslintrc.jscode/renderers/react/src/componentManifest/generator.ts
📚 Learning: 2025-10-02T09:22:13.215Z
Learnt from: JReinhold
Repo: storybookjs/storybook PR: 32607
File: code/package.json:243-243
Timestamp: 2025-10-02T09:22:13.215Z
Learning: The Storybook repository uses Yarn v^4 (any 4.x version) as the package manager, configured via .yarnrc.yml and package.json packageManager field. Specific patch versions within v4 can be upgraded as needed.
Applied to files:
code/package.jsoncode/lib/codemod/package.json
📚 Learning: 2025-09-24T13:04:58.631Z
Learnt from: cylewaitforit
Repo: storybookjs/storybook PR: 31965
File: code/lib/eslint-plugin/src/rules/only-csf3.ts:31-33
Timestamp: 2025-09-24T13:04:58.631Z
Learning: The Storybook ESLint plugin supports ESLint v8.57+ where context.sourceCode is already available as a property since it was introduced in v8.40.0, so no fallback to context.getSourceCode() is needed in rules.
Applied to files:
code/package.json
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to **/*.{js,jsx,json,html,ts,tsx,mjs} : Use ESLint and Prettier configurations that are enforced in the codebase
Applied to files:
code/package.jsonscripts/package.jsoncode/.eslintrc.jscode/lib/codemod/package.json
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to **/*.{ts,tsx} : Enable TypeScript strict mode
Applied to files:
code/.eslintrc.js
📚 Learning: 2025-10-01T15:24:01.060Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32594
File: code/core/src/components/components/Popover/WithPopover.tsx:7-9
Timestamp: 2025-10-01T15:24:01.060Z
Learning: In the Storybook repository, "react-aria-components/patched-dist/*" (e.g., "react-aria-components/patched-dist/Dialog", "react-aria-components/patched-dist/Popover", "react-aria-components/patched-dist/Tooltip") are valid import paths created by a patch applied to the react-aria-components package. These imports should not be flagged as broken or invalid until a maintainer explicitly states they are no longer acceptable.
Applied to files:
code/.eslintrc.js
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Avoid mocking only a subset of required dependencies in Vitest tests
Applied to files:
code/.eslintrc.jscode/addons/vitest/package.json
📚 Learning: 2025-11-28T14:50:24.889Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-28T14:50:24.889Z
Learning: Applies to code/**/*.{ts,tsx,js,jsx,mjs} : Do not use console.log, console.warn, or console.error directly unless in isolated files where importing loggers would significantly increase bundle size
Applied to files:
code/.eslintrc.js
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Mock all required properties and methods that the test subject uses in Vitest tests
Applied to files:
code/addons/vitest/package.json
📚 Learning: 2025-11-24T17:49:59.279Z
Learnt from: CR
Repo: storybookjs/storybook PR: 0
File: .cursor/rules/spy-mocking.mdc:0-0
Timestamp: 2025-11-24T17:49:59.279Z
Learning: Applies to **/*.test.{ts,tsx,js,jsx} : Avoid mocking without the `spy: true` option in Vitest tests
Applied to files:
code/addons/vitest/package.json
🧬 Code graph analysis (1)
code/renderers/react/src/componentManifest/generator.ts (5)
code/renderers/react/src/componentManifest/getComponentImports.ts (2)
getComponents(61-231)getImports(256-510)code/renderers/react/src/componentManifest/utils.ts (2)
cachedFindUp(91-91)cachedReadFileSync(89-89)code/core/src/core-server/utils/StoryIndexGenerator.ts (1)
extractStories(401-522)code/core/src/csf-tools/CsfFile.ts (2)
loadCsf(1059-1063)stories(968-970)code/renderers/react/src/componentManifest/jsdocTags.ts (1)
extractJSDocInfo(5-21)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: normal
- GitHub Check: Core Unit Tests, windows-latest
- GitHub Check: nx
🔇 Additional comments (17)
code/.eslintrc.js (1)
54-59: LGTM! Consistent with existing patterns.The new
es-toolkitimport restriction follows the same structure as the existingreact-aria,react-stately, andreact-aria-componentsrules. SettingallowTypeImports: trueis appropriate since type-only imports are eliminated at compile time and don't affect bundle size.code/renderers/react/package.json (1)
67-67: Consistent version bump.The es-toolkit upgrade aligns with the repository-wide update to ^1.43.0.
code/lib/codemod/package.json (1)
45-45: Version bump consistent with repository-wide update.Note that unlike other packages where es-toolkit is a devDependency (bundled during build), the codemod package correctly lists it as a runtime dependency since codemod scripts are executed directly as CLI tools.
code/package.json (1)
137-137: Consistent with repository-wide es-toolkit upgrade.The version bump to ^1.43.0 aligns with all other packages in this PR.
code/core/package.json (1)
277-277: Version bump aligns with repository-wide update.The es-toolkit upgrade to ^1.43.0 is consistent across all packages. As a devDependency in the core package, it will be bundled into the final distribution during the build process. Based on learnings, this follows Storybook's pattern where dependencies like this are bundled rather than listed as runtime dependencies.
scripts/package.json (1)
108-108: Consistent version bump completes the repository-wide update.The es-toolkit upgrade to ^1.43.0 in the scripts package completes the coordinated version bump across all packages in this PR.
code/addons/docs/package.json (1)
96-96: Version update is consistent across the repository.The es-toolkit upgrade to ^1.43.0 is applied uniformly across all relevant packages (scripts, code, core, renderers, codemods, and addons), maintaining consistency throughout the codebase.
code/addons/vitest/package.json (1)
82-82: No issues found. The es-toolkit version bump from ^1.36.0 to ^1.43.0 is safe—all changes in this version range are bug fixes and enhancements with no breaking changes.code/renderers/react/src/componentManifest/generator.ts (9)
25-37: LGTM!The
findMatchingComponenthelper is well-structured and clearly separates the matching logic. The function first attempts exact name matching, then falls back to substring matching in the title, which is a sensible heuristic.
39-51: LGTM!The
getPackageInfohelper appropriately handles errors during package.json lookup and parsing. The use of cached filesystem operations is good for performance.
53-85: LGTM!The
extractStorieshelper provides robust per-story error handling and correctly filters stories by the manifest tag usingcombineTags. The JSDoc extraction and fallback logic for description is well-implemented.
87-98: LGTM!The
extractComponentDescriptionhelper provides a clean abstraction for extracting component-level documentation from either the CSF meta statement or docgen data.
109-114: LGTM!The use of
uniqByto deduplicate story entries by component group ID (the part before '--') is an efficient approach to identify unique components for manifest generation.
116-195: LGTM!The component processing logic is well-structured with clear separation between:
- Early return for entries without manifest tags
- Component matching and import resolution
- Error handling for missing components
- Success path with docgen extraction
The refactored code using helper functions significantly improves readability compared to the previous implementation.
199-205: LGTM!The return structure correctly merges
existingManifestswith the newly generated component manifests. This design allows other presets (renderers, addons) to extend or add additional manifests, which aligns with the PR objective of making manifest generation more extensible.
197-197: LGTM!The performance logging correctly measures and reports component manifest generation time. The previous issue about misleading "Story index generation" timing has been properly resolved.
12-12: No action required. TheuniqByfunction from es-toolkit maintains API compatibility across the version range 1.36.0 to 1.43.0 with no breaking changes documented.
Works on Milestone 4 in storybookjs/mcp#107
Telescopes on to #30612
What I did
This is purely an internal refactor, the manifest locations or content doesn't change in this PR.
This PR refactors component manifest generation, to make it more extensible.
Before, it was a function returned by the
experimental_componentManifestGeneratorpreset, which the React renderer set. This allowed core to pass in theStoryIndexGeneratorneeded to generate the manifest, as an argument to the generator function. However it's very hard to extend, which we want when we wantaddon-docsto start adding an MDX-based docs manifest too.But now that #30612 makes the
StoryIndexGeneratoravailable as a preset property, we don't need the manifest generator to be a function anymore, because we don't need to explicitly inject the SIG anymore. 🎉This refactor changes the function-returning preset to be an extensible
experimental_manifestspreset instead. That returns aRecord<ManifestName, ManifestContent>, whereManifestNamewill be the name of the JSON file written to disk, ie./manifests/ManifestName.json, andManifestContentis simply the content of the JSON file. Any preset such as renderers, addons, etc. can define this preset to add their own information to either new manifests or extend other presets manifests. This allows something like this to work:Which would result in
/manifests/components.jsonand/manifests/docs.jsonto exist.addon-docscould also modify the manifest output from the React renderer by just smartly merging withexistingManifests, eg. if it wanted to add references from the component manifest into the docs maninfest.In upcoming PR we'll integrate addon-docs with this new architecture.
Checklist for Contributors
Testing
The changes in this PR are covered in the following automated tests:
Manual testing
This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!
Documentation
MIGRATION.MD
Checklist for Maintainers
When this PR is ready for testing, make sure to add
ci:normal,ci:mergedorci:dailyGH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found incode/lib/cli-storybook/src/sandbox-templates.tsMake sure this PR contains one of the labels below:
Available labels
bug: Internal changes that fixes incorrect behavior.maintenance: User-facing maintenance tasks.dependencies: Upgrading (sometimes downgrading) dependencies.build: Internal-facing build tooling & test updates. Will not show up in release changelog.cleanup: Minor cleanup style change. Will not show up in release changelog.documentation: Documentation only changes. Will not show up in release changelog.feature request: Introducing a new feature.BREAKING CHANGE: Changes that break compatibility in some way with current major version.other: Changes that don't fit in the above categories.🦋 Canary release
This PR does not have a canary release associated. You can request a canary release of this pull request by mentioning the
@storybookjs/coreteam here.core team members can create a canary release here or locally with
gh workflow run --repo storybookjs/storybook publish.yml --field pr=<PR_NUMBER>Summary by CodeRabbit
Refactor
New Features
Tests
Breaking Changes
Chores
✏️ Tip: You can customize this high-level summary in your review settings.