base.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. const path = require('path');
  2. const _ = require('lodash');
  3. const chalk = require('chalk').default;
  4. const utils = require('./utils');
  5. const fs = require('fs');
  6. let AnalyzePlugin = null
  7. if(process.env.__ENABLE_ANALYZE__ === 'true') {
  8. AnalyzePlugin = require("@ies/semi-page-analyze-inject/src/AnalyzePlugin")
  9. }
  10. function resolve(...dirs) {
  11. return path.join(__dirname, '../..', ...dirs);
  12. }
  13. /**
  14. * 当我们想获取 Cypress 代码覆盖率时,需要将 TEST_ENV 设置为 true。
  15. *
  16. * 这时会打开 babel-loader 配置,去掉 esbuild 配置,并在 babel plugin 中注入 babel-plugin-istanbul
  17. *
  18. * @see https://github.com/istanbuljs/babel-plugin-istanbul
  19. */
  20. function getAddons() {
  21. let addons = [
  22. // for performance reason, only open `@storybook/addon-a11y` when dev a11y
  23. // '@storybook/addon-a11y',
  24. '@storybook/addon-toolbars',
  25. ];
  26. if (!utils.isTest()) {
  27. console.log(chalk.yellow(`if you want to get cypress code coverage, set TEST_ENV=test, now it is '${process.env.TEST_ENV}'`));
  28. }
  29. return addons;
  30. }
  31. module.exports = {
  32. framework: {
  33. name: "@storybook/react-webpack5",
  34. options: {
  35. fastRefresh: true
  36. },
  37. },
  38. addons: getAddons(),
  39. webpackFinal: async (config) => {
  40. const rules =
  41. (config.module.rules &&
  42. config.module.rules.filter(rule => {
  43. const test = _.toString(rule && rule.test);
  44. if (/\.css/i.test(test) || /\.s(c|a)ss/i.test(test)) {
  45. return false;
  46. }
  47. return true;
  48. })) ||
  49. [];
  50. rules.push(
  51. {
  52. test: /\.css$/,
  53. use: ['style-loader', 'css-loader']
  54. },
  55. );
  56. rules.push(
  57. {
  58. test: /\.s(a|c)ss$/,
  59. include: [resolve('packages/semi-ui'), resolve('packages/semi-foundation'), resolve('packages/semi-icons')],
  60. use: ['style-loader', 'css-loader', 'sass-loader', resolve('packages/semi-webpack/lib/semi-theme-loader.js')],
  61. }
  62. );
  63. AnalyzePlugin && rules.push({
  64. test: /\.tsx?$/,
  65. include: [resolve('packages/semi-ui'), resolve('packages/semi-foundation')],
  66. exclude:/node_modules/,
  67. use: [
  68. {
  69. loader: "babel-loader",
  70. options: {
  71. plugins: [AnalyzePlugin],
  72. }
  73. },
  74. ]
  75. })
  76. rules.push({
  77. test: /jsonWorkerManager\.ts$/,
  78. use: [
  79. {
  80. loader: 'webpack-replace-loader',
  81. options: {
  82. search: '%WORKER_RAW%',
  83. replace: () => {
  84. const workFilePath = resolve('packages/semi-json-viewer-core/workerLib/worker.js');
  85. const result = fs.readFileSync(workFilePath, 'utf-8');
  86. const encodedResult = encodeURIComponent(result);
  87. return encodedResult;
  88. }
  89. }
  90. }
  91. ]
  92. });
  93. config.module.rules = rules;
  94. config.resolve.extensions.push('.js', '.jsx', '.ts', '.tsx');
  95. config.resolve.symlinks = false;
  96. config.mode = "development";
  97. config.resolve.alias = {
  98. '@douyinfe/semi-foundation': resolve('packages/semi-foundation'),
  99. '@douyinfe/semi-icons': resolve('packages/semi-icons/src'),
  100. '@douyinfe/semi-icons-lab': resolve('packages/semi-icons-lab/src'),
  101. '@douyinfe/semi-ui': resolve('packages/semi-ui'),
  102. '@douyinfe/semi-theme-default': resolve('packages/semi-theme-default'),
  103. '@douyinfe/semi-illustrations': resolve('packages/semi-illustrations/src'),
  104. '@douyinfe/semi-animation': resolve('packages/semi-animation'),
  105. '@douyinfe/semi-animation-react': resolve('packages/semi-animation-react'),
  106. '@douyinfe/semi-animation-styled': resolve('packages/semi-animation-styled'),
  107. '@douyinfe/semi-json-viewer-core': resolve('packages/semi-json-viewer-core/src'),
  108. };
  109. config.devtool = 'source-map';
  110. // config.output.publicPath = "/storybook/"
  111. return config;
  112. }
  113. };