split essentials in index/preset

This commit is contained in:
Yann Braga 2025-01-27 12:40:26 +01:00
parent e71bade8e2
commit 3f6a53e672
6 changed files with 134 additions and 144 deletions

View File

@ -25,7 +25,7 @@ import { definePreview } from '@storybook/react';
import addonTest from '@storybook/experimental-addon-test';
import addonA11y from '@storybook/addon-a11y';
import addonEssentials from '@storybook/addon-essentials/entry-preview';
import addonEssentials from '@storybook/addon-essentials';
import addonThemes from '@storybook/addon-themes';
import * as addonsPreview from '../addons/toolbars/template/stories/preview';

View File

@ -27,11 +27,6 @@
"import": "./dist/index.mjs",
"require": "./dist/index.js"
},
"./entry-preview": {
"types": "./dist/preview.d.ts",
"import": "./dist/preview.mjs",
"require": "./dist/preview.js"
},
"./actions/preview": {
"types": "./dist/actions/preview.d.ts",
"import": "./dist/actions/preview.mjs",
@ -77,6 +72,7 @@
"import": "./dist/viewport/preview.mjs",
"require": "./dist/viewport/preview.js"
},
"./preset": "./dist/preset.js",
"./package.json": "./package.json"
},
"main": "dist/index.js",
@ -86,9 +82,6 @@
"*": {
"*": [
"dist/index.d.ts"
],
"entry-preview": [
"dist/preview.d.ts"
]
}
},
@ -126,10 +119,13 @@
},
"bundler": {
"nodeEntries": [
"./src/index.ts",
"./src/preset.ts",
"./src/docs/preset.ts",
"./src/docs/mdx-react-shim.ts"
],
"exportEntries": [
"./src/index.ts"
],
"entries": [
"./src/docs/manager.ts"
],
@ -144,7 +140,6 @@
"./src/viewport/manager.ts"
],
"previewEntries": [
"./src/preview.ts",
"./src/actions/preview.ts",
"./src/backgrounds/preview.ts",
"./src/docs/preview.ts",

View File

@ -1,107 +1,22 @@
import { isAbsolute, join } from 'node:path';
import { composeConfigs, definePreview } from 'storybook/internal/preview-api';
import { serverRequire } from 'storybook/internal/common';
import { logger } from 'storybook/internal/node-logger';
import actionsAddon from '@storybook/addon-actions';
import backgroundsAddon from '@storybook/addon-backgrounds';
import docsAddon from '@storybook/addon-docs';
import highlightAddon from '@storybook/addon-highlight';
import measureAddon from '@storybook/addon-measure';
import outlineAddon from '@storybook/addon-outline';
import viewportAddon from '@storybook/addon-viewport';
interface PresetOptions {
/**
* Allow to use @storybook/addon-actions
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-actions
*/
actions?: boolean;
/**
* Allow to use @storybook/addon-backgrounds
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-backgrounds
*/
backgrounds?: boolean;
configDir: string;
/**
* Allow to use @storybook/addon-controls
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-controls
*/
controls?: boolean;
/**
* Allow to use @storybook/addon-docs
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-docs
*/
docs?: boolean;
/**
* Allow to use @storybook/addon-measure
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-measure
*/
measure?: boolean;
/**
* Allow to use @storybook/addon-outline
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-outline
*/
outline?: boolean;
themes?: boolean;
/**
* Allow to use @storybook/addon-toolbars
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-toolbars
*/
toolbars?: boolean;
/**
* Allow to use @storybook/addon-viewport
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-viewport
*/
viewport?: boolean;
}
const requireMain = (configDir: string) => {
const absoluteConfigDir = isAbsolute(configDir) ? configDir : join(process.cwd(), configDir);
const mainFile = join(absoluteConfigDir, 'main');
return serverRequire(mainFile) ?? {};
};
export function addons(options: PresetOptions) {
const checkInstalled = (addonName: string, main: any) => {
const addon = `@storybook/addon-${addonName}`;
const existingAddon = main.addons?.find((entry: string | { name: string }) => {
const name = typeof entry === 'string' ? entry : entry.name;
return name?.startsWith(addon);
});
if (existingAddon) {
logger.info(`Found existing addon ${JSON.stringify(existingAddon)}, skipping.`);
}
return !!existingAddon;
};
const main = requireMain(options.configDir);
// NOTE: The order of these addons is important.
return [
'controls',
'actions',
'docs',
'backgrounds',
'viewport',
'toolbars',
'measure',
'outline',
'highlight',
]
.filter((key) => (options as any)[key] !== false)
.filter((addon) => !checkInstalled(addon, main))
.map((addon) => {
// We point to the re-export from addon-essentials to support yarn pnp and pnpm.
return `@storybook/addon-essentials/${addon}`;
});
}
export default () =>
definePreview(
composeConfigs([
actionsAddon(),
docsAddon(),
backgroundsAddon(),
viewportAddon(),
measureAddon(),
outlineAddon(),
highlightAddon(),
])
);

View File

@ -0,0 +1,107 @@
import { isAbsolute, join } from 'node:path';
import { serverRequire } from 'storybook/internal/common';
import { logger } from 'storybook/internal/node-logger';
interface PresetOptions {
/**
* Allow to use @storybook/addon-actions
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-actions
*/
actions?: boolean;
/**
* Allow to use @storybook/addon-backgrounds
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-backgrounds
*/
backgrounds?: boolean;
configDir: string;
/**
* Allow to use @storybook/addon-controls
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-controls
*/
controls?: boolean;
/**
* Allow to use @storybook/addon-docs
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-docs
*/
docs?: boolean;
/**
* Allow to use @storybook/addon-measure
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-measure
*/
measure?: boolean;
/**
* Allow to use @storybook/addon-outline
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-outline
*/
outline?: boolean;
themes?: boolean;
/**
* Allow to use @storybook/addon-toolbars
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-toolbars
*/
toolbars?: boolean;
/**
* Allow to use @storybook/addon-viewport
*
* @default true
* @see https://storybook.js.org/addons/@storybook/addon-viewport
*/
viewport?: boolean;
}
const requireMain = (configDir: string) => {
const absoluteConfigDir = isAbsolute(configDir) ? configDir : join(process.cwd(), configDir);
const mainFile = join(absoluteConfigDir, 'main');
return serverRequire(mainFile) ?? {};
};
export function addons(options: PresetOptions) {
const checkInstalled = (addonName: string, main: any) => {
const addon = `@storybook/addon-${addonName}`;
const existingAddon = main.addons?.find((entry: string | { name: string }) => {
const name = typeof entry === 'string' ? entry : entry.name;
return name?.startsWith(addon);
});
if (existingAddon) {
logger.info(`Found existing addon ${JSON.stringify(existingAddon)}, skipping.`);
}
return !!existingAddon;
};
const main = requireMain(options.configDir);
// NOTE: The order of these addons is important.
return [
'controls',
'actions',
'docs',
'backgrounds',
'viewport',
'toolbars',
'measure',
'outline',
'highlight',
]
.filter((key) => (options as any)[key] !== false)
.filter((addon) => !checkInstalled(addon, main))
.map((addon) => {
// We point to the re-export from addon-essentials to support yarn pnp and pnpm.
return `@storybook/addon-essentials/${addon}`;
});
}

View File

@ -1,22 +0,0 @@
import { composeConfigs, definePreview } from 'storybook/internal/preview-api';
import actionsAddon from '@storybook/addon-actions';
import backgroundsAddon from '@storybook/addon-backgrounds';
import docsAddon from '@storybook/addon-docs';
import highlightAddon from '@storybook/addon-highlight';
import measureAddon from '@storybook/addon-measure';
import outlineAddon from '@storybook/addon-outline';
import viewportAddon from '@storybook/addon-viewport';
export default () =>
definePreview(
composeConfigs([
actionsAddon(),
docsAddon(),
backgroundsAddon(),
viewportAddon(),
measureAddon(),
outlineAddon(),
highlightAddon(),
])
);

View File

@ -37,12 +37,7 @@ export async function getAddonAnnotations(addon: string) {
data.importPath = `@storybook/${addon}/preview`;
}
// TODO: current workaround needed only for essentials, fix this once we change the preview entry-point for that package
if (addon === '@storybook/addon-essentials') {
data.importPath = '@storybook/addon-essentials/entry-preview';
} else {
require.resolve(path.join(addon, 'preview'));
}
require.resolve(path.join(addon, 'preview'));
return data;
} catch (err) {}