diff --git a/code/builders/builder-vite/src/build.ts b/code/builders/builder-vite/src/build.ts index 1e25b7d79c69..ccf9f9476a5f 100644 --- a/code/builders/builder-vite/src/build.ts +++ b/code/builders/builder-vite/src/build.ts @@ -12,11 +12,18 @@ export async function build(options: Options) { build: { outDir: options.outputDir, emptyOutDir: false, // do not clean before running Vite build - Storybook has already added assets in there! - sourcemap: !options.test, rollupOptions: { // Do not try to bundle the storybook runtime, it is copied into the output dir after the build. external: ['./sb-preview/runtime.js'], }, + ...(options.test + ? { + reportCompressedSize: false, + sourcemap: !options.build?.test?.disableSourcemaps, + target: 'esnext', + treeshake: !options.build?.test?.disableTreeShaking, + } + : {}), }, }).build; diff --git a/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts b/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts index 5b3ce2e29da1..0c3d53165e08 100644 --- a/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts +++ b/code/builders/builder-webpack5/src/preview/iframe-webpack.config.ts @@ -8,7 +8,8 @@ import TerserWebpackPlugin from 'terser-webpack-plugin'; import VirtualModulePlugin from 'webpack-virtual-modules'; import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; import slash from 'slash'; - +import type { TransformOptions as EsbuildOptions } from 'esbuild'; +import type { JsMinifyOptions as SwcOptions } from '@swc/core'; import type { Options, CoreConfig, DocsOptions, PreviewAnnotation } from '@storybook/types'; import { globalsNameReferenceMap } from '@storybook/preview/globals'; import { @@ -228,7 +229,7 @@ export default async ( name: 'preview', mode: isProd ? 'production' : 'development', bail: isProd, - devtool: options.test ? false : 'cheap-module-source-map', + devtool: options.build?.test?.disableSourcemaps ? false : 'cheap-module-source-map', entry: entries, output: { path: resolve(process.cwd(), outputDir), @@ -323,7 +324,7 @@ export default async ( fullySpecified: false, }, }, - builderOptions.useSWC + builderOptions.useSWC || options.build?.test?.optimizeCompilation ? await createSWCLoader(Object.keys(virtualModuleMapping), options) : createBabelLoader(babelOptions, typescriptOptions, Object.keys(virtualModuleMapping)), { @@ -356,17 +357,29 @@ export default async ( }, runtimeChunk: true, sideEffects: true, - usedExports: isProd, + usedExports: options.build?.test?.disableTreeShaking ? false : isProd, moduleIds: 'named', ...(isProd ? { minimize: true, - minimizer: builderOptions.useSWC + // eslint-disable-next-line no-nested-ternary + minimizer: options.build?.test?.optimizeCompilation ? [ - new TerserWebpackPlugin({ + new TerserWebpackPlugin({ + parallel: true, + minify: TerserWebpackPlugin.esbuildMinify, + terserOptions: { + sourcemap: !options.build?.test?.disableSourcemaps, + treeShaking: !options.build?.test?.disableTreeShaking, + }, + }), + ] + : builderOptions.useSWC + ? [ + new TerserWebpackPlugin({ minify: TerserWebpackPlugin.swcMinify, terserOptions: { - sourceMap: true, + sourceMap: !options.build?.test?.disableSourcemaps, mangle: false, keep_fnames: true, }, @@ -376,7 +389,7 @@ export default async ( new TerserWebpackPlugin({ parallel: true, terserOptions: { - sourceMap: true, + sourceMap: !options.build?.test?.disableSourcemaps, mangle: false, keep_fnames: true, }, diff --git a/code/lib/core-server/src/build-static.ts b/code/lib/core-server/src/build-static.ts index 286723d8c1a1..e6775f519829 100644 --- a/code/lib/core-server/src/build-static.ts +++ b/code/lib/core-server/src/build-static.ts @@ -3,7 +3,7 @@ import { copy, emptyDir, ensureDir } from 'fs-extra'; import { dirname, isAbsolute, join, resolve } from 'path'; import { global } from '@storybook/global'; import { deprecate, logger } from '@storybook/node-logger'; -import { telemetry, getPrecedingUpgrade } from '@storybook/telemetry'; +import { getPrecedingUpgrade, telemetry } from '@storybook/telemetry'; import type { BuilderOptions, CLIOptions, @@ -30,12 +30,11 @@ import { copyAllStaticFilesRelativeToMain, } from './utils/copy-all-static-files'; import { getBuilders } from './utils/get-builders'; -import { extractStoriesJson, convertToIndexV3 } from './utils/stories-json'; +import { convertToIndexV3, extractStoriesJson } from './utils/stories-json'; import { extractStorybookMetadata } from './utils/metadata'; import { StoryIndexGenerator } from './utils/StoryIndexGenerator'; import { summarizeIndex } from './utils/summarizeIndex'; import { defaultStaticDirs } from './utils/constants'; -import { warnOnIncompatibleAddons } from './utils/warnOnIncompatibleAddons'; export type BuildStaticStandaloneOptions = CLIOptions & LoadOptions & @@ -77,10 +76,6 @@ export async function buildStaticStandalone(options: BuildStaticStandaloneOption logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`); } - if (options.test) { - await warnOnIncompatibleAddons(config); - } - logger.info('=> Loading presets'); let presets = await loadAllPresets({ corePresets: [ diff --git a/code/lib/core-server/src/presets/common-preset.ts b/code/lib/core-server/src/presets/common-preset.ts index 22f75191ecf3..e953a5cd3dc7 100644 --- a/code/lib/core-server/src/presets/common-preset.ts +++ b/code/lib/core-server/src/presets/common-preset.ts @@ -192,6 +192,9 @@ const testBuildFeatures = (value: boolean): Required => ({ removeMDXEntries: value, removeAutoDocs: value, disableDocgen: value, + disableSourcemaps: value, + disableTreeShaking: value, + optimizeCompilation: value, }); export const features = async ( diff --git a/code/lib/types/src/modules/core-common.ts b/code/lib/types/src/modules/core-common.ts index 8ffe22b1d01f..47c7d88cba8b 100644 --- a/code/lib/types/src/modules/core-common.ts +++ b/code/lib/types/src/modules/core-common.ts @@ -283,6 +283,18 @@ export interface TestBuildFlags { * Override docgen to be disabled. */ disableDocgen?: boolean; + /** + * Override sourcemaps generation to be disabled. + */ + disableSourcemaps?: boolean; + /** + * Override tree-shaking (dead code elimination) to be disabled. + */ + disableTreeShaking?: boolean; + /** + * Compile/Optimize with SWC. + */ + optimizeCompilation?: boolean; } export interface TestBuildConfig {