webpack.config.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*eslint-env node*/
  2. /*eslint import/no-nodejs-modules:0 */
  3. const path = require('path');
  4. const webpack = require('webpack');
  5. const appConfig = require('../webpack.config');
  6. const staticPath = path.resolve(
  7. __dirname,
  8. '..',
  9. 'src',
  10. 'sentry',
  11. 'static',
  12. 'sentry',
  13. 'app'
  14. );
  15. /**
  16. * Default the config parameter that storybook passes into our webpack config
  17. * to an empty object specifically for eslint, since it will load this config
  18. * without passing in a config object.
  19. */
  20. const emptyConfig = {
  21. module: {rules: []},
  22. resolve: {alias: {}, extensions: []},
  23. plugins: [],
  24. };
  25. module.exports = ({config} = {config: emptyConfig}) => {
  26. const [firstRule, ...rules] = config.module.rules;
  27. const filteredRules = rules.filter(rule => {
  28. return (
  29. (!rule.loader || !rule.loader.includes('file-loader')) &&
  30. (!Array.isArray(rule.use) ||
  31. !rule.use.find(({loader}) => loader && loader.includes('postcss-loader')))
  32. );
  33. });
  34. const newConfig = {
  35. ...config,
  36. module: {
  37. ...config.module,
  38. rules: [
  39. {
  40. ...firstRule,
  41. test: /\.(mjs|[tj]sx?)$/,
  42. include: [path.join(__dirname), staticPath, path.join(__dirname, '../docs-ui')],
  43. },
  44. {
  45. test: /app\/icons\/.*\.svg$/,
  46. use: [
  47. {
  48. loader: 'svg-sprite-loader',
  49. },
  50. {
  51. loader: 'svgo-loader',
  52. },
  53. ],
  54. },
  55. {
  56. test: /\.css$/,
  57. use: ['style-loader', 'css-loader'],
  58. },
  59. {
  60. test: /\.less$/,
  61. use: [
  62. {
  63. loader: 'style-loader',
  64. },
  65. {
  66. loader: 'css-loader',
  67. },
  68. {
  69. loader: 'less-loader',
  70. },
  71. ],
  72. },
  73. {
  74. test: /\.(woff|woff2|ttf|eot|svg|png|gif|ico|jpg)($|\?)/,
  75. exclude: /app\/icons\/.*\.svg$/,
  76. loader: 'file-loader?name=' + '[name].[ext]',
  77. },
  78. {
  79. test: /\.po$/,
  80. loader: 'po-catalog-loader',
  81. query: {
  82. referenceExtensions: ['.js', '.jsx'],
  83. domain: 'sentry',
  84. },
  85. },
  86. ...filteredRules,
  87. ],
  88. },
  89. plugins: [
  90. ...config.plugins,
  91. new webpack.ProvidePlugin({
  92. $: 'jquery',
  93. jQuery: 'jquery',
  94. 'window.jQuery': 'jquery',
  95. 'root.jQuery': 'jquery',
  96. underscore: 'underscore',
  97. _: 'underscore',
  98. }),
  99. new webpack.DefinePlugin({
  100. 'process.env': {
  101. FIXED_DYNAMIC_CONTENT: true,
  102. },
  103. }),
  104. ],
  105. resolve: {
  106. ...config.resolve,
  107. extensions: Array.from(
  108. new Set([...config.resolve.extensions, ...appConfig.resolve.extensions])
  109. ),
  110. alias: {
  111. ...config.resolve.alias,
  112. ...appConfig.resolve.alias,
  113. app: staticPath,
  114. },
  115. },
  116. };
  117. return newConfig;
  118. };