diff --git a/CHANGELOG.prerelease.md b/CHANGELOG.prerelease.md index bd3066ba9728..6e9e1eb4ba44 100644 --- a/CHANGELOG.prerelease.md +++ b/CHANGELOG.prerelease.md @@ -1,3 +1,9 @@ +## 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)! +- Onboarding: Fix manager dist reference - [#26282](https://github.com/storybookjs/storybook/pull/26282), thanks [@shilman](https://github.com/shilman)! +- ReactVite: Docgen ignore un-parsable files - [#26254](https://github.com/storybookjs/storybook/pull/26254), thanks [@ndelangen](https://github.com/ndelangen)! + ## 8.0.0-rc.0 Bumping 8.0.0-beta.6 to 8.0.0-rc.0. Please refer to the changelogs of previous beta releases. diff --git a/code/addons/onboarding/preset.js b/code/addons/onboarding/preset.js index 2c7ea670f4a6..87f1602c2f26 100644 --- a/code/addons/onboarding/preset.js +++ b/code/addons/onboarding/preset.js @@ -1,5 +1,5 @@ function managerEntries(entry = []) { - return [...entry, require.resolve('./dist/manager.mjs')]; + return [...entry, require.resolve('./dist/manager.js')]; } module.exports = { diff --git a/code/frameworks/react-vite/package.json b/code/frameworks/react-vite/package.json index 1518d1f76df9..43a88fdc2838 100644 --- a/code/frameworks/react-vite/package.json +++ b/code/frameworks/react-vite/package.json @@ -52,7 +52,8 @@ "@storybook/builder-vite": "workspace:*", "@storybook/react": "workspace:*", "magic-string": "^0.30.0", - "react-docgen": "^7.0.0" + "react-docgen": "^7.0.0", + "resolve": "^1.22.8" }, "devDependencies": { "@types/node": "^18.0.0", diff --git a/code/frameworks/react-vite/src/plugins/docgen-resolver.ts b/code/frameworks/react-vite/src/plugins/docgen-resolver.ts new file mode 100644 index 000000000000..ab0fda807cf8 --- /dev/null +++ b/code/frameworks/react-vite/src/plugins/docgen-resolver.ts @@ -0,0 +1,74 @@ +import { extname } from 'path'; +import resolve from 'resolve'; + +export class ReactDocgenResolveError extends Error { + // the magic string that react-docgen uses to check if a module is ignored + readonly code = 'MODULE_NOT_FOUND'; + + constructor(filename: string) { + super(`'${filename}' was ignored by react-docgen.`); + } +} + +/* The below code was copied from: + * https://github.com/reactjs/react-docgen/blob/df2daa8b6f0af693ecc3c4dc49f2246f60552bcb/packages/react-docgen/src/importer/makeFsImporter.ts#L14-L63 + * because it wasn't exported from the react-docgen package. + * watch out: when updating this code, also update the code in code/presets/react-webpack/src/loaders/docgen-resolver.ts + */ + +// These extensions are sorted by priority +// resolve() will check for files in the order these extensions are sorted +export const RESOLVE_EXTENSIONS = [ + '.js', + '.cts', // These were originally not in the code, I added them + '.mts', // These were originally not in the code, I added them + '.ctsx', // These were originally not in the code, I added them + '.mtsx', // These were originally not in the code, I added them + '.ts', + '.tsx', + '.mjs', + '.cjs', + '.mts', + '.cts', + '.jsx', +]; + +export function defaultLookupModule(filename: string, basedir: string): string { + const resolveOptions = { + basedir, + extensions: RESOLVE_EXTENSIONS, + // we do not need to check core modules as we cannot import them anyway + includeCoreModules: false, + }; + + try { + return resolve.sync(filename, resolveOptions); + } catch (error) { + const ext = extname(filename); + let newFilename: string; + + // if we try to import a JavaScript file it might be that we are actually pointing to + // a TypeScript file. This can happen in ES modules as TypeScript requires to import other + // TypeScript files with .js extensions + // https://www.typescriptlang.org/docs/handbook/esm-node.html#type-in-packagejson-and-new-extensions + switch (ext) { + case '.js': + case '.mjs': + case '.cjs': + newFilename = `${filename.slice(0, -2)}ts`; + break; + + case '.jsx': + newFilename = `${filename.slice(0, -3)}tsx`; + break; + default: + throw error; + } + + return resolve.sync(newFilename, { + ...resolveOptions, + // we already know that there is an extension at this point, so no need to check other extensions + extensions: [], + }); + } +} diff --git a/code/frameworks/react-vite/src/plugins/react-docgen.ts b/code/frameworks/react-vite/src/plugins/react-docgen.ts index 5be555fbd081..9d2242ce2654 100644 --- a/code/frameworks/react-vite/src/plugins/react-docgen.ts +++ b/code/frameworks/react-vite/src/plugins/react-docgen.ts @@ -6,18 +6,22 @@ import { parse, builtinHandlers as docgenHandlers, builtinResolvers as docgenResolver, - builtinImporters as docgenImporters, + makeFsImporter, } from 'react-docgen'; import MagicString from 'magic-string'; import type { PluginOption } from 'vite'; import actualNameHandler from './docgen-handlers/actualNameHandler'; +import { + RESOLVE_EXTENSIONS, + ReactDocgenResolveError, + defaultLookupModule, +} from './docgen-resolver'; type DocObj = Documentation & { actualName: string }; // TODO: None of these are able to be overridden, so `default` is aspirational here. const defaultHandlers = Object.values(docgenHandlers).map((handler) => handler); const defaultResolver = new docgenResolver.FindExportedDefinitionsResolver(); -const defaultImporter = docgenImporters.fsImporter; const handlers = [...defaultHandlers, actualNameHandler]; type Options = { @@ -36,14 +40,23 @@ export function reactDocgen({ name: 'storybook:react-docgen-plugin', enforce: 'pre', async transform(src: string, id: string) { - const relPath = path.relative(cwd, id); - if (!filter(relPath)) return; + if (!filter(path.relative(cwd, id))) { + return; + } try { const docgenResults = parse(src, { resolver: defaultResolver, handlers, - importer: defaultImporter, + importer: makeFsImporter((filename, basedir) => { + const result = defaultLookupModule(filename, basedir); + + if (RESOLVE_EXTENSIONS.find((ext) => result.endsWith(ext))) { + return result; + } + + throw new ReactDocgenResolveError(filename); + }), filename: id, }) as DocObj[]; const s = new MagicString(src); diff --git a/code/lib/cli/src/doctor/getIncompatibleAddons.ts b/code/lib/cli/src/doctor/getIncompatibleAddons.ts deleted file mode 100644 index e46297e94087..000000000000 --- a/code/lib/cli/src/doctor/getIncompatibleAddons.ts +++ /dev/null @@ -1,82 +0,0 @@ -import type { StorybookConfig } from '@storybook/types'; -import type { SemVer } from 'semver'; -import semver from 'semver'; -import { getAddonNames } from '../automigrate/helpers/mainConfigFile'; -import { JsPackageManagerFactory } from '@storybook/core-common'; - -export const getIncompatibleAddons = async ( - mainConfig: StorybookConfig, - packageManager = JsPackageManagerFactory.getPackageManager() -) => { - // TODO: Keep this up to date with https://github.com/storybookjs/storybook/issues/20529 in case more addons get added - const incompatibleList = { - '@storybook/addon-knobs': '6.4.0', - '@storybook/addon-postcss': '2.0.0', - 'storybook-addon-next-router': '4.0.2', - 'storybook-addon-outline': '1.4.2', // (deprecated) - '@storybook/addon-info': '5.3.21', - 'storybook-addon-designs': '6.3.1', - 'storybook-addon-next': '1.7.0', // (deprecated)' - 'storybook-docs-toc': '1.7.0', - '@storybook/addon-google-analytics': '6.2.9', - 'storybook-addon-pseudo-states': '1.15.5', - 'storybook-dark-mode': '2.1.1', - 'storybook-addon-gatsby': '0.0.5', - '@etchteam/storybook-addon-css-variables-theme': '1.4.0', - '@storybook/addon-cssresources': '6.2.9', - 'storybook-addon-grid': '0.3.1', - 'storybook-multilevel-sort': '1.2.0', - 'storybook-addon-i18next': '1.3.0', - 'storybook-source-link': '2.0.8', - 'babel-plugin-storybook-csf-title': '2.1.0', - '@urql/storybook-addon': '2.0.1', - 'storybook-addon-intl': '2.4.1', - 'storybook-addon-mock': '3.2.0', - '@chakra-ui/storybook-addon': '4.0.16', - 'storybook-mobile-addon': '1.0.2', - '@storybook/addon-queryparams': '6.2.9', - }; - - const addons = getAddonNames(mainConfig).filter( - (addon): addon is keyof typeof incompatibleList => addon in incompatibleList - ); - - const dependencies = await packageManager.getAllDependencies(); - const storybookPackages = Object.keys(dependencies).filter((dep) => dep.includes('storybook')); - - const packagesToCheck = [...new Set([...addons, ...storybookPackages])]; - - const addonVersions = await Promise.all( - packagesToCheck.map( - async (addon) => - ({ - name: addon, - version: await packageManager.getPackageVersion(addon), - }) as { name: keyof typeof incompatibleList; version: string } - ) - ); - - if (addonVersions.length === 0) { - return []; - } - - const incompatibleAddons: { name: string; version: string }[] = []; - addonVersions.forEach(({ name, version: installedVersion }) => { - if (installedVersion === null) { - return; - } - - const addonVersion = incompatibleList[name]; - try { - if ( - semver.lte(semver.coerce(installedVersion) as SemVer, semver.coerce(addonVersion) as SemVer) - ) { - incompatibleAddons.push({ name, version: installedVersion }); - } - } catch (err) { - // we tried our best but if we can't compare, we just no-op for that addon - } - }); - - return incompatibleAddons; -}; diff --git a/code/lib/cli/src/doctor/getIncompatibleStorybookPackages.ts b/code/lib/cli/src/doctor/getIncompatibleStorybookPackages.ts index d481fae93c82..d27694136074 100644 --- a/code/lib/cli/src/doctor/getIncompatibleStorybookPackages.ts +++ b/code/lib/cli/src/doctor/getIncompatibleStorybookPackages.ts @@ -88,7 +88,7 @@ export const getIncompatibleStorybookPackages = async ( const allDeps = await packageManager.getAllDependencies(); const storybookLikeDeps = Object.keys(allDeps).filter((dep) => dep.includes('storybook')); - if (storybookLikeDeps.length === 0) { + if (storybookLikeDeps.length === 0 && !context.skipErrors) { throw new Error('No Storybook dependencies found in the package.json'); } diff --git a/code/package.json b/code/package.json index 071cf4a60003..3f0d826438ec 100644 --- a/code/package.json +++ b/code/package.json @@ -294,5 +294,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "8.0.0-rc.1" } diff --git a/code/presets/react-webpack/package.json b/code/presets/react-webpack/package.json index 90b90e2bad23..8654c9934571 100644 --- a/code/presets/react-webpack/package.json +++ b/code/presets/react-webpack/package.json @@ -74,6 +74,7 @@ "fs-extra": "^11.1.0", "magic-string": "^0.30.5", "react-docgen": "^7.0.0", + "resolve": "^1.22.8", "semver": "^7.3.7", "webpack": "5" }, diff --git a/code/presets/react-webpack/src/loaders/docgen-resolver.ts b/code/presets/react-webpack/src/loaders/docgen-resolver.ts new file mode 100644 index 000000000000..71e2bde5d742 --- /dev/null +++ b/code/presets/react-webpack/src/loaders/docgen-resolver.ts @@ -0,0 +1,74 @@ +import { extname } from 'path'; +import resolve from 'resolve'; + +export class ReactDocgenResolveError extends Error { + // the magic string that react-docgen uses to check if a module is ignored + readonly code = 'MODULE_NOT_FOUND'; + + constructor(filename: string) { + super(`'${filename}' was ignored by react-docgen.`); + } +} + +/* The below code was copied from: + * https://github.com/reactjs/react-docgen/blob/df2daa8b6f0af693ecc3c4dc49f2246f60552bcb/packages/react-docgen/src/importer/makeFsImporter.ts#L14-L63 + * because it wasn't exported from the react-docgen package. + * watch out: when updating this code, also update the code in code/frameworks/react-vite/src/plugins/docgen-resolver.ts + */ + +// These extensions are sorted by priority +// resolve() will check for files in the order these extensions are sorted +export const RESOLVE_EXTENSIONS = [ + '.js', + '.cts', // These were originally not in the code, I added them + '.mts', // These were originally not in the code, I added them + '.ctsx', // These were originally not in the code, I added them + '.mtsx', // These were originally not in the code, I added them + '.ts', + '.tsx', + '.mjs', + '.cjs', + '.mts', + '.cts', + '.jsx', +]; + +export function defaultLookupModule(filename: string, basedir: string): string { + const resolveOptions = { + basedir, + extensions: RESOLVE_EXTENSIONS, + // we do not need to check core modules as we cannot import them anyway + includeCoreModules: false, + }; + + try { + return resolve.sync(filename, resolveOptions); + } catch (error) { + const ext = extname(filename); + let newFilename: string; + + // if we try to import a JavaScript file it might be that we are actually pointing to + // a TypeScript file. This can happen in ES modules as TypeScript requires to import other + // TypeScript files with .js extensions + // https://www.typescriptlang.org/docs/handbook/esm-node.html#type-in-packagejson-and-new-extensions + switch (ext) { + case '.js': + case '.mjs': + case '.cjs': + newFilename = `${filename.slice(0, -2)}ts`; + break; + + case '.jsx': + newFilename = `${filename.slice(0, -3)}tsx`; + break; + default: + throw error; + } + + return resolve.sync(newFilename, { + ...resolveOptions, + // we already know that there is an extension at this point, so no need to check other extensions + extensions: [], + }); + } +} diff --git a/code/presets/react-webpack/src/loaders/react-docgen-loader.ts b/code/presets/react-webpack/src/loaders/react-docgen-loader.ts index fd22ca12bf5d..12ab911fd546 100644 --- a/code/presets/react-webpack/src/loaders/react-docgen-loader.ts +++ b/code/presets/react-webpack/src/loaders/react-docgen-loader.ts @@ -2,7 +2,7 @@ import { parse, builtinResolvers as docgenResolver, builtinHandlers as docgenHandlers, - builtinImporters as docgenImporters, + makeFsImporter, ERROR_CODES, utils, } from 'react-docgen'; @@ -11,6 +11,12 @@ import type { LoaderContext } from 'webpack'; import type { Handler, NodePath, babelTypes as t, Documentation } from 'react-docgen'; import { logger } from '@storybook/node-logger'; +import { + RESOLVE_EXTENSIONS, + ReactDocgenResolveError, + defaultLookupModule, +} from './docgen-resolver'; + const { getNameOrValue, isReactForwardRefCall } = utils; const actualNameHandler: Handler = function actualNameHandler(documentation, componentDefinition) { @@ -54,7 +60,6 @@ type DocObj = Documentation & { actualName: string }; const defaultHandlers = Object.values(docgenHandlers).map((handler) => handler); const defaultResolver = new docgenResolver.FindExportedDefinitionsResolver(); -const defaultImporter = docgenImporters.fsImporter; const handlers = [...defaultHandlers, actualNameHandler]; export default async function reactDocgenLoader( @@ -71,7 +76,15 @@ export default async function reactDocgenLoader( filename: this.resourcePath, resolver: defaultResolver, handlers, - importer: defaultImporter, + importer: makeFsImporter((filename, basedir) => { + const result = defaultLookupModule(filename, basedir); + + if (RESOLVE_EXTENSIONS.find((ext) => result.endsWith(ext))) { + return result; + } + + throw new ReactDocgenResolveError(filename); + }), babelOptions: { babelrc: false, configFile: false, diff --git a/code/renderers/react/template/stories/docgen-components/imported.module.css b/code/renderers/react/template/stories/docgen-components/imported.module.css new file mode 100644 index 000000000000..a15c877ac01f --- /dev/null +++ b/code/renderers/react/template/stories/docgen-components/imported.module.css @@ -0,0 +1,3 @@ +.foo { + color: red; +} diff --git a/code/renderers/react/template/stories/docgen-components/ts-function-component/input.tsx b/code/renderers/react/template/stories/docgen-components/ts-function-component/input.tsx index 9f0c2598ff07..193c2e2c71ae 100644 --- a/code/renderers/react/template/stories/docgen-components/ts-function-component/input.tsx +++ b/code/renderers/react/template/stories/docgen-components/ts-function-component/input.tsx @@ -1,6 +1,9 @@ import React from 'react'; import { imported } from '../imported'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore (css import not supported in TS) +import styles from '../imported.module.css'; const local = 'local-value'; @@ -26,6 +29,7 @@ interface PropsWriterProps { importedReference?: string; globalReference?: any; stringGlobalName?: string; + myClass: typeof styles.foo; } /** @@ -47,6 +51,7 @@ PropsWriter.defaultProps = { importedReference: imported, globalReference: Date, stringGlobalName: 'top', + myClass: styles.foo, }; export const component = PropsWriter; diff --git a/code/yarn.lock b/code/yarn.lock index c0338dabe0c4..039c28a0c940 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -6343,6 +6343,7 @@ __metadata: fs-extra: "npm:^11.1.0" magic-string: "npm:^0.30.5" react-docgen: "npm:^7.0.0" + resolve: "npm:^1.22.8" semver: "npm:^7.3.7" typescript: "npm:^5.3.2" webpack: "npm:5" @@ -6491,6 +6492,7 @@ __metadata: "@types/node": "npm:^18.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^7.0.0" + resolve: "npm:^1.22.8" typescript: "npm:^5.3.2" vite: "npm:^4.0.0" peerDependencies: @@ -25657,7 +25659,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.10.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.4.0": +"resolve@npm:1.22.8, resolve@npm:^1.10.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -25683,7 +25685,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": +"resolve@patch:resolve@npm%3A1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: diff --git a/docs/snippets/common/my-component-play-function-with-canvas.js.mdx b/docs/snippets/common/my-component-play-function-with-canvas.js.mdx index 26ec005f70fa..a5da1d3eed5f 100644 --- a/docs/snippets/common/my-component-play-function-with-canvas.js.mdx +++ b/docs/snippets/common/my-component-play-function-with-canvas.js.mdx @@ -1,7 +1,7 @@ ```js // MyComponent.stories.js|jsx -import { getByRole, userEvent, within } from '@storybook/testing-library'; +import { userEvent, within } from '@storybook/test'; import { MyComponent } from './MyComponent'; diff --git a/docs/snippets/react/login-form-with-play-function.ts-4-9.mdx b/docs/snippets/react/login-form-with-play-function.ts-4-9.mdx index d6a86876817c..84dffad550b1 100644 --- a/docs/snippets/react/login-form-with-play-function.ts-4-9.mdx +++ b/docs/snippets/react/login-form-with-play-function.ts-4-9.mdx @@ -3,9 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { within, userEvent } from '@storybook/testing-library'; - -import { expect } from '@storybook/test'; +import { userEvent, within, expect } from '@storybook/test'; import { LoginForm } from './LoginForm'; diff --git a/docs/snippets/react/login-form-with-play-function.ts.mdx b/docs/snippets/react/login-form-with-play-function.ts.mdx index f31a2a8fcbe2..de6854f0e180 100644 --- a/docs/snippets/react/login-form-with-play-function.ts.mdx +++ b/docs/snippets/react/login-form-with-play-function.ts.mdx @@ -3,9 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { within, userEvent } from '@storybook/testing-library'; - -import { expect } from '@storybook/test'; +import { userEvent, within, expect } from '@storybook/test'; import { LoginForm } from './LoginForm'; diff --git a/docs/snippets/svelte/login-form-with-play-function.js.mdx b/docs/snippets/svelte/login-form-with-play-function.js.mdx index e65f60e9a3cb..4408fc6261a0 100644 --- a/docs/snippets/svelte/login-form-with-play-function.js.mdx +++ b/docs/snippets/svelte/login-form-with-play-function.js.mdx @@ -1,8 +1,7 @@ ```js // LoginForm.stories.js -import { userEvent, within } from '@storybook/testing-library'; -import { expect } from '@storybook/test'; +import { expect, userEvent, within } from '@storybook/test'; import LoginForm from './LoginForm.svelte'; diff --git a/docs/snippets/svelte/login-form-with-play-function.ts-4-9.mdx b/docs/snippets/svelte/login-form-with-play-function.ts-4-9.mdx index 265d8fa36b9d..b975337dc799 100644 --- a/docs/snippets/svelte/login-form-with-play-function.ts-4-9.mdx +++ b/docs/snippets/svelte/login-form-with-play-function.ts-4-9.mdx @@ -2,8 +2,7 @@ // LoginForm.stories.ts import type { Meta, StoryObj } from '@storybook/svelte'; -import { userEvent, within } from '@storybook/testing-library'; -import { expect } from '@storybook/test'; +import { expect, userEvent, within } from '@storybook/test'; import LoginForm from './LoginForm.svelte'; diff --git a/docs/snippets/svelte/login-form-with-play-function.ts.mdx b/docs/snippets/svelte/login-form-with-play-function.ts.mdx index ff5891c617d8..24bcd6c1d41a 100644 --- a/docs/snippets/svelte/login-form-with-play-function.ts.mdx +++ b/docs/snippets/svelte/login-form-with-play-function.ts.mdx @@ -2,8 +2,7 @@ // LoginForm.stories.ts import type { Meta, StoryObj } from '@storybook/svelte'; -import { userEvent, within } from '@storybook/testing-library'; -import { expect } from '@storybook/test'; +import { expect, userEvent, within } from '@storybook/test'; import LoginForm from './LoginForm.svelte'; diff --git a/docs/snippets/web-components/my-component-play-function-with-canvas.js.mdx b/docs/snippets/web-components/my-component-play-function-with-canvas.js.mdx index 2ed5c0bec08d..d3812d7d1af0 100644 --- a/docs/snippets/web-components/my-component-play-function-with-canvas.js.mdx +++ b/docs/snippets/web-components/my-component-play-function-with-canvas.js.mdx @@ -1,7 +1,7 @@ ```js // MyComponent.stories.js -import { getByRole, userEvent, within } from '@storybook/testing-library'; +import { userEvent, within } from '@storybook/test'; export default { component: 'demo-my-component', diff --git a/docs/versions/next.json b/docs/versions/next.json index 7e6974b261e7..a1c6e9350e50 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"8.0.0-rc.0","info":{"plain":"Bumping 8.0.0-beta.6 to 8.0.0-rc.0. Please refer to the changelogs of previous beta releases."}} +{"version":"8.0.0-rc.1","info":{"plain":"- CLI: Fix addon compatibility check error reporting in storybook dev - [#26258](https://github.com/storybookjs/storybook/pull/26258), thanks [@yannbf](https://github.com/yannbf)!\n- Onboarding: Fix manager dist reference - [#26282](https://github.com/storybookjs/storybook/pull/26282), thanks [@shilman](https://github.com/shilman)!\n- ReactVite: Docgen ignore un-parsable files - [#26254](https://github.com/storybookjs/storybook/pull/26254), thanks [@ndelangen](https://github.com/ndelangen)!"}}