import type { StorybookConfig } from "@storybook/react-webpack5";
|
|
const config: StorybookConfig = {
|
stories: ["../../../libs/**/*.@(mdx|stories.@(js|jsx|ts|tsx))", "../../../apps/**/*.@(mdx|stories.@(js|jsx|ts|tsx))"],
|
|
staticDirs: ["../public"],
|
|
addons: ["@nx/react/plugins/storybook", "@storybook/addon-docs", "../addons/theme-toggle/register"],
|
|
webpackFinal(config) {
|
const css_prefix = "ls-";
|
const rules = config.module?.rules ?? [];
|
|
for (const rule of rules) {
|
if (!rule || typeof rule === "string") continue;
|
|
const testString = rule.test?.toString() ?? "";
|
const isCss = testString.includes("\\.css");
|
const isScss = testString.includes("scss") || testString.includes("sass");
|
|
if (isCss) {
|
rule.exclude = /tailwind\.css/;
|
}
|
|
// Apply BEM class prefixing to non-module SCSS files
|
if (isScss && rule.oneOf) {
|
const scssRules = rule.oneOf.filter((r: any) => {
|
if (!r.use) return false;
|
const testString = r.test?.toString() ?? "";
|
// Skip CSS modules and node_modules
|
if (testString.match(/module/) || r.exclude?.toString().includes("node_modules")) return false;
|
// Target rules with css-loader
|
return (
|
testString.match(/scss|sass/) &&
|
Array.isArray(r.use) &&
|
r.use.some((u: any) => u.loader && u.loader.includes("css-loader"))
|
);
|
});
|
|
scssRules.forEach((r: any) => {
|
const cssLoader = r.use.find((use: any) => use.loader && use.loader.includes("css-loader"));
|
|
if (cssLoader && cssLoader.options) {
|
cssLoader.options.modules = {
|
localIdentName: `${css_prefix}[local]`,
|
getLocalIdent(ctx: any, _ident: any, className: string) {
|
// Skip prefixing for Storybook preview styles (targets Storybook DOM classes)
|
if (ctx.resourcePath?.includes("preview.scss")) return className;
|
if (className.includes("ant")) return className;
|
},
|
};
|
}
|
});
|
}
|
}
|
|
return {
|
...config,
|
module: {
|
...(config.module ?? {}),
|
rules: [
|
{
|
test: /tailwind\.css/,
|
exclude: /node_modules/,
|
use: [
|
"style-loader",
|
{
|
loader: "css-loader",
|
options: {
|
importLoaders: 1,
|
},
|
},
|
"postcss-loader",
|
],
|
},
|
|
...(config.module?.rules ?? []),
|
],
|
},
|
};
|
},
|
|
framework: "@storybook/react-webpack5",
|
|
typescript: {
|
reactDocgen: "react-docgen",
|
},
|
};
|
|
export default config;
|
|
// To customize your webpack configuration you can use the webpackFinal field.
|
// Check https://storybook.js.org/docs/react/builders/webpack#extending-storybooks-webpack-config
|
// and https://nx.dev/recipes/storybook/custom-builder-configs
|