webpack.config.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const path = require('path');
  2. const SRC_PATH = path.join(__dirname, '../src');
  3. const STORIES_PATH = path.join(__dirname, '../stories');
  4. module.exports = ({ config }) => {
  5. // don't use storybook's default svg configuration
  6. // https://github.com/storybookjs/storybook/issues/6758
  7. config.module.rules = config.module.rules.map(rule => {
  8. if (rule.test.toString().includes('svg')) {
  9. const test = rule.test.toString().replace('svg|', '').replace(/\//g, '');
  10. return { ...rule, test: new RegExp(test) };
  11. } else {
  12. return rule;
  13. }
  14. });
  15. // ts rules
  16. config.module.rules.push({
  17. test: /\.(ts|tsx)$/,
  18. // dont need stories path if you have your stories inside your src folder
  19. include: [SRC_PATH, STORIES_PATH],
  20. use: [
  21. {
  22. loader: require.resolve('ts-loader'),
  23. options: {
  24. configFile: './.storybook/tsconfig.json'
  25. }
  26. }
  27. ]
  28. });
  29. config.resolve.extensions.push('.ts', '.tsx');
  30. // svg rules
  31. config.module.rules.push({
  32. // in css files, svg is loaded as a url formatted string
  33. test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
  34. issuer: /\.css$/,
  35. use: {
  36. loader: 'svg-url-loader',
  37. options: { encoding: 'none', limit: 10000 }
  38. }
  39. });
  40. config.module.rules.push({
  41. // in js, jsx, ts, and tsx files svg is loaded as a raw string
  42. test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
  43. issuer: { test: /\.(js|jsx|ts|tsx)$/ },
  44. use: {
  45. loader: 'raw-loader'
  46. }
  47. });
  48. return config;
  49. };