Skip to content
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

TestBuild: Disable docs related stuff for test builds #24691

Merged
merged 19 commits into from
Nov 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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