webpack.config.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import path from 'path'
  2. import dotenv from 'dotenv'
  3. dotenv.config({
  4. path: `.env.${process.env.NODE_ENV}`,
  5. });
  6. import antdThemeOverrides from '../src/AntdTheme'
  7. import { getThemeVariables } from 'antd/dist/theme'
  8. export default ({ config }) => {
  9. // Transpile Gatsby module because Gatsby includes un-transpiled ES6 code.
  10. // ========================================================
  11. config.module.rules[0].exclude = [/node_modules\/(?!(gatsby)\/)/];
  12. // Add Babel rules
  13. // ========================================================
  14. // use installed babel-loader which is v8.0-beta (which is meant to work with @babel/core@7)
  15. config.module.rules[0].use[0].loader = require.resolve('babel-loader');
  16. // use @babel/preset-react for JSX and env (instead of staged presets)
  17. config.module.rules[0].use[0].options.presets = [
  18. require.resolve('@babel/preset-react'),
  19. require.resolve('@babel/preset-env'),
  20. // Emotion preset must run BEFORE reacts preset to properly convert css-prop.
  21. // Babel preset-ordering runs reversed (from last to first). Emotion has to be after React preset.
  22. ];
  23. config.module.rules[0].use[0].options.plugins = [
  24. // use @babel/plugin-proposal-class-properties for class arrow functions
  25. require.resolve('@babel/plugin-proposal-class-properties'),
  26. // use babel-plugin-remove-graphql-queries to remove static queries from components when rendering in storybook
  27. require.resolve('babel-plugin-remove-graphql-queries'),
  28. ];
  29. // Prefer Gatsby ES6 entrypoint (module) over commonjs (main) entrypoint
  30. // ========================================================
  31. config.resolve.mainFields = ['browser', 'module', 'main'];
  32. // Add Webpack rules for TypeScript
  33. // ========================================================
  34. config.module.rules.push({
  35. test: /\.(ts|tsx)$/,
  36. loader: require.resolve('babel-loader'),
  37. options: {
  38. presets: [
  39. ['react-app', { flow: false, typescript: true }],
  40. // Emotion preset must run BEFORE reacts preset to properly convert css-prop.
  41. // Babel preset-ordering runs reversed (from last to first). Emotion has to be after React preset.
  42. ],
  43. plugins: [
  44. require.resolve('@babel/plugin-proposal-class-properties'),
  45. // use babel-plugin-remove-graphql-queries to remove static queries from components when rendering in storybook
  46. require.resolve('babel-plugin-remove-graphql-queries'),
  47. ['import', {libraryName: "antd", libraryDirectory: 'es', style: true}]
  48. ],
  49. },
  50. });
  51. config.module.rules.push({
  52. test: /\.less$/,
  53. loaders: [
  54. "style-loader",
  55. "css-loader",
  56. {
  57. loader: "less-loader",
  58. options: {
  59. lessOptions: {
  60. javascriptEnabled: true,
  61. modifyVars: {
  62. ...getThemeVariables({
  63. dark: true, // Enable dark mode
  64. compact: true, // Enable compact mode,
  65. }),
  66. ...antdThemeOverrides,
  67. }
  68. }
  69. }
  70. }
  71. ],
  72. include: path.resolve(__dirname, "../")
  73. })
  74. config.resolve.extensions.push('.ts', '.tsx');
  75. // Add SVGR Loader
  76. // ========================================================
  77. // Remove svg rules from existing webpack rule
  78. const assetRule = config.module.rules.find(({ test }) => test.test('.svg'));
  79. const assetLoader = {
  80. loader: assetRule.loader,
  81. options: assetRule.options || assetRule.query,
  82. };
  83. config.module.rules.unshift({
  84. test: /\.svg$/,
  85. use: ['@svgr/webpack', assetLoader],
  86. });
  87. // Mirror project aliases for some reason (should be picked up by .babelrc)
  88. // ========================================================
  89. config.resolve.alias['~/utils'] = path.resolve(__dirname, '../src/utils');
  90. config.resolve.alias['~/components'] = path.resolve(
  91. __dirname,
  92. '../src/components'
  93. );
  94. config.resolve.alias['~/images'] = path.resolve(__dirname, '../src/images');
  95. config.resolve.alias['~/icons'] = path.resolve(__dirname, '../src/icons');
  96. return config;
  97. };