main.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { createRequire } from "node:module";
  2. import type { StorybookConfig } from "@storybook/nextjs";
  3. const resolve = createRequire(import.meta.url).resolve;
  4. const config = {
  5. framework: "@storybook/nextjs",
  6. stories: [
  7. "../src/**/*.mdx",
  8. "../src/**/?(*.)story.tsx",
  9. "../src/**/?(*.)stories.tsx",
  10. ],
  11. features: {
  12. backgrounds: true,
  13. },
  14. addons: [
  15. "@storybook/addon-themes",
  16. {
  17. name: "@storybook/addon-styling-webpack",
  18. options: {
  19. rules: [
  20. {
  21. test: /\.s[ac]ss$/i,
  22. use: [
  23. "style-loader",
  24. {
  25. loader: "css-loader",
  26. options: {
  27. modules: {
  28. auto: true,
  29. localIdentName: "[name]__[local]--[hash:base64:5]",
  30. exportLocalsConvention: "as-is",
  31. },
  32. importLoaders: 1,
  33. esModule: false,
  34. },
  35. },
  36. {
  37. loader: "sass-loader",
  38. options: { implementation: resolve("sass") },
  39. },
  40. ],
  41. },
  42. ],
  43. },
  44. },
  45. ],
  46. webpackFinal: (config) => {
  47. config.resolve = {
  48. ...config.resolve,
  49. extensionAlias: {
  50. ...config.resolve?.extensionAlias,
  51. ".js": [".js", ".ts"],
  52. ".jsx": [".jsx", ".tsx"],
  53. },
  54. };
  55. for (const rule of config.module?.rules ?? []) {
  56. if (
  57. typeof rule === "object" &&
  58. rule !== null &&
  59. rule.test instanceof RegExp &&
  60. rule.test.test(".svg")
  61. ) {
  62. rule.exclude = /\.svg$/i;
  63. }
  64. }
  65. config.module = {
  66. ...config.module,
  67. rules: [
  68. ...(config.module?.rules ?? []),
  69. {
  70. test: /\.svg$/i,
  71. use: ["@svgr/webpack"],
  72. },
  73. ],
  74. };
  75. return config;
  76. },
  77. } satisfies StorybookConfig;
  78. export default config;