Skip to content

Commit

Permalink
Merge pull request #24691 from storybookjs/norbert/fast-build-no-docs
Browse files Browse the repository at this point in the history
TestBuild: Disable docs related stuff for test builds
  • Loading branch information
ndelangen committed Nov 10, 2023
2 parents 4f527a8 + c50fb27 commit e8d9ac7
Show file tree
Hide file tree
Showing 10 changed files with 139 additions and 33 deletions.
7 changes: 6 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,12 @@ jobs:
command: yarn task --task build --template $(yarn get-template --cadence << pipeline.parameters.workflow >> --task build) --no-link --start-from=never --junit
- run:
name: Verifying Telemetry
command: yarn ts-node ./event-log-checker build $(yarn get-template --cadence << pipeline.parameters.workflow >> --task build)
command: |
TEMPLATE=$(yarn get-template --cadence << pipeline.parameters.workflow >> --task build)
if [[ $TEMPLATE != bench/* ]]
then
yarn ts-node ./event-log-checker build $TEMPLATE
fi
working_directory: scripts
- report-workflow-on-failure:
template: $(yarn get-template --cadence << pipeline.parameters.workflow >> --task build)
Expand Down
44 changes: 36 additions & 8 deletions code/lib/core-common/src/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import type {
LoadOptions,
PresetConfig,
Presets,
StorybookConfig,
} from '@storybook/types';
import { join, parse } from 'path';
import { CriticalPresetLoadError } from '@storybook/core-events/server-errors';
Expand All @@ -17,6 +18,13 @@ import { safeResolve, safeResolveFrom } from './utils/safeResolve';
import { interopRequireDefault } from './utils/interpret-require';
import { stripAbsNodeModulesPath } from './utils/strip-abs-node-modules-path';

type InterPresetOptions = Omit<
CLIOptions &
LoadOptions &
BuilderOptions & { isCritical?: boolean; build?: StorybookConfig['build'] },
'frameworkPresets'
>;

const isObject = (val: unknown): val is Record<string, any> =>
val != null && typeof val === 'object' && Array.isArray(val) === false;
const isFunction = (val: unknown): val is Function => typeof val === 'function';
Expand Down Expand Up @@ -239,10 +247,34 @@ export async function loadPreset(
}

if (isObject(contents)) {
const { addons: addonsInput, presets: presetsInput, ...rest } = contents;
const { addons: addonsInput = [], presets: presetsInput = [], ...rest } = contents;

let filter = (i: PresetConfig) => {
return true;
};

const subPresets = resolvePresetFunction(presetsInput, presetOptions, storybookOptions);
const subAddons = resolvePresetFunction(addonsInput, presetOptions, storybookOptions);
if (
storybookOptions.isCritical !== true &&
storybookOptions.build?.test?.removeNonFastAddons
) {
filter = (i: PresetConfig) => {
// @ts-expect-error (Converted from ts-ignore)
const name = i.name ? i.name : i;

return (
!name.includes('@storybook/addon-docs') && !name.includes('@storybook/addon-coverage')
);
};
}

const subPresets = resolvePresetFunction(
presetsInput,
presetOptions,
storybookOptions
).filter(filter);
const subAddons = resolvePresetFunction(addonsInput, presetOptions, storybookOptions).filter(
filter
);

return [
...(await loadPresets([...subPresets], level + 1, storybookOptions)),
Expand Down Expand Up @@ -354,11 +386,6 @@ function applyPresets(
}, presetResult);
}

type InterPresetOptions = Omit<
CLIOptions & LoadOptions & BuilderOptions & { isCritical?: boolean },
'frameworkPresets'
>;

export async function getPresets(
presets: PresetConfig[],
storybookOptions: InterPresetOptions
Expand All @@ -379,6 +406,7 @@ export async function loadAllPresets(
overridePresets: PresetConfig[];
/** Whether preset failures should be critical or not */
isCritical?: boolean;
build?: StorybookConfig['build'];
}
) {
const { corePresets = [], overridePresets = [], ...restOptions } = options;
Expand Down
7 changes: 6 additions & 1 deletion code/lib/core-server/src/build-static.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ export async function buildStaticStandalone(options: BuildStaticStandaloneOption
...options,
});

const [previewBuilder, managerBuilder] = await getBuilders({ ...options, presets });
const { renderer } = await presets.apply<CoreConfig>('core', {});
const build = await presets.apply('build', {});
const [previewBuilder, managerBuilder] = await getBuilders({ ...options, presets, build });

const resolvedRenderer = renderer
? resolveAddonName(options.configDir, renderer, options)
: undefined;
Expand All @@ -111,6 +113,7 @@ export async function buildStaticStandalone(options: BuildStaticStandaloneOption
require.resolve('@storybook/core-server/dist/presets/common-override-preset'),
],
...options,
build,
});

const [features, core, staticDirs, indexers, deprecatedStoryIndexers, stories, docsOptions] =
Expand All @@ -135,6 +138,7 @@ export async function buildStaticStandalone(options: BuildStaticStandaloneOption
...options,
presets,
features,
build,
};

if (options.staticDir && !isEqual(staticDirs, defaultStaticDirs)) {
Expand Down Expand Up @@ -178,6 +182,7 @@ export async function buildStaticStandalone(options: BuildStaticStandaloneOption
docs: docsOptions,
storiesV2Compatibility: !features?.storyStoreV7,
storyStoreV7: !!features?.storyStoreV7,
build,
});

initializedStoryIndexGenerator = generator.initialize().then(() => generator);
Expand Down
42 changes: 42 additions & 0 deletions code/lib/core-server/src/presets/common-override-preset.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import type { PresetProperty, StorybookConfig } from '@storybook/types';
import { normalizeStories, commonGlobOptions } from '@storybook/core-common';
import { isAbsolute, join } from 'path';
import slash from 'slash';
import { glob } from 'glob';

export const framework: PresetProperty<'framework', StorybookConfig> = async (config) => {
// This will get called with the values from the user's main config, but before
Expand All @@ -12,3 +16,41 @@ export const framework: PresetProperty<'framework', StorybookConfig> = async (co
options,
};
};

export const stories: PresetProperty<'stories', StorybookConfig> = async (entries, options) => {
if (options?.build?.test?.removeMDXEntries) {
const out = (
await Promise.all(
normalizeStories(entries, {
configDir: options.configDir,
workingDir: options.configDir,
}).map(({ directory, files }) => {
const pattern = join(directory, files);
const absolutePattern = isAbsolute(pattern) ? pattern : join(options.configDir, pattern);

return glob(slash(absolutePattern), {
...commonGlobOptions(absolutePattern),
follow: true,
});
})
)
).reduce((carry, s) => carry.concat(s), []);

return out.filter((s) => !s.endsWith('.mdx'));
}
return entries;
};

export const typescript: PresetProperty<'typescript', StorybookConfig> = async (input, options) => {
if (options?.build?.test?.disableDocgen) {
return { ...(input ?? {}), reactDocgen: false, check: false };
}
return input;
};

export const docs: PresetProperty<'docs', StorybookConfig> = async (input, options) => {
if (options?.build?.test?.removeAutoDocs) {
return {};
}
return input;
};
7 changes: 6 additions & 1 deletion code/lib/core-server/src/presets/common-preset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
import type {
CLIOptions,
CoreConfig,
TestBuildFlags,
Indexer,
Options,
PresetPropertyFn,
Expand Down Expand Up @@ -185,8 +186,12 @@ export const previewAnnotations = async (base: any, options: Options) => {
return [...config, ...base];
};

const testBuildFeatures = (value: boolean) => ({
const testBuildFeatures = (value: boolean): Required<TestBuildFlags> => ({
emptyBlocks: value,
removeNonFastAddons: value,
removeMDXEntries: value,
removeAutoDocs: value,
disableDocgen: value,
});

export const features = async (
Expand Down
4 changes: 3 additions & 1 deletion code/lib/core-server/src/utils/StoryIndexGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import type {
Indexer,
IndexerOptions,
DeprecatedIndexer,
StorybookConfig,
} from '@storybook/types';
import { userOrAutoTitleFromSpecifier, sortStoriesV7 } from '@storybook/preview-api';
import { commonGlobOptions, normalizeStoryPath } from '@storybook/core-common';
Expand Down Expand Up @@ -58,6 +59,7 @@ export type StoryIndexGeneratorOptions = {
storyIndexers: StoryIndexer[];
indexers: Indexer[];
docs: DocsOptions;
build?: StorybookConfig['build'];
};

export const AUTODOCS_TAG = 'autodocs';
Expand Down Expand Up @@ -335,7 +337,7 @@ export class StoryIndexGenerator {
const createDocEntry =
autodocs === true || (autodocs === 'tag' && hasAutodocsTag) || isStoriesMdx;

if (createDocEntry) {
if (createDocEntry && this.options.build?.test?.removeAutoDocs !== true) {
const name = this.options.docs.defaultName ?? 'Docs';
const { metaId } = indexInputs[0];
const { title } = entries[0];
Expand Down
41 changes: 32 additions & 9 deletions code/lib/types/src/modules/core-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,10 @@ export interface StorybookConfigOptions {
presetsList?: LoadedPreset[];
}

export type Options = LoadOptions & StorybookConfigOptions & CLIOptions & BuilderOptions;
export type Options = LoadOptions &
StorybookConfigOptions &
CLIOptions &
BuilderOptions & { build?: TestBuildConfig };

export interface Builder<Config, BuilderStats extends Stats = Stats> {
getConfig: (options: Options) => Promise<Config>;
Expand Down Expand Up @@ -257,6 +260,33 @@ export type DocsOptions = {
docsMode?: boolean;
};

export interface TestBuildFlags {
/**
* The package @storybook/blocks will be excluded from the bundle, even when imported in e.g. the preview.
*/
emptyBlocks?: boolean;
/**
* Disable all addons
*/
removeNonFastAddons?: boolean;
/**
* Filter out .mdx stories entries
*/
removeMDXEntries?: boolean;
/**
* Override autodocs to be disabled
*/
removeAutoDocs?: boolean;
/**
* Override docgen to be disabled.
*/
disableDocgen?: boolean;
}

export interface TestBuildConfig {
test?: TestBuildFlags;
}

/**
* The interface for Storybook configuration in `main.ts` files.
*/
Expand Down Expand Up @@ -314,14 +344,7 @@ export interface StorybookConfig {
legacyDecoratorFileOrder?: boolean;
};

build?: {
test?: {
/**
* Globalize @storybook/blocks
*/
emptyBlocks?: boolean;
};
};
build?: TestBuildConfig;

/**
* Tells Storybook where to find stories.
Expand Down
3 changes: 2 additions & 1 deletion scripts/event-log-checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ async function run() {
8,
`Expected 8 stories but received ${exampleStoryCount} instead.`
);
const expectedDocsCount = template.modifications?.disableDocs ? 0 : 3;
const expectedDocsCount =
template.modifications?.disableDocs || template.modifications?.testBuild ? 0 : 3;
assert.equal(
exampleDocsCount,
expectedDocsCount,
Expand Down
7 changes: 1 addition & 6 deletions scripts/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -470,12 +470,7 @@ async function run() {
} catch (err) {
invariant(err instanceof Error);
logger.error(`Error running task ${getTaskKey(task)}:`);
// If it is the last task, we don't need to log the full trace
if (task === finalTask) {
logger.error(err.message);
} else {
logger.error(err);
}
logger.error(JSON.stringify(err, null, 2));

if (process.env.CI) {
logger.error(
Expand Down
10 changes: 5 additions & 5 deletions scripts/tasks/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ export const build: Task = {
const buildTime = now() - start;
const dir = join(sandboxDir, 'storybook-static');
const getSize = promisify(dirSize);
const buildSize = await getSize(dir);
const buildSbAddonsSize = await getSize(join(dir, 'sb-addons'));
const buildSbCommonSize = await getSize(join(dir, 'sb-common-assets'));
const buildSbManagerSize = await getSize(join(dir, 'sb-manager'));
const buildSbPreviewSize = await getSize(join(dir, 'sb-preview'));
const buildSize = await getSize(dir).catch(() => 0);
const buildSbAddonsSize = await getSize(join(dir, 'sb-addons')).catch(() => 0);
const buildSbCommonSize = await getSize(join(dir, 'sb-common-assets')).catch(() => 0);
const buildSbManagerSize = await getSize(join(dir, 'sb-manager')).catch(() => 0);
const buildSbPreviewSize = await getSize(join(dir, 'sb-preview')).catch(() => 0);
const buildPrebuildSize =
buildSbAddonsSize + buildSbCommonSize + buildSbManagerSize + buildSbPreviewSize;

Expand Down

0 comments on commit e8d9ac7

Please sign in to comment.