webpack.config.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { dirname, join } from "path";
  2. import { exec } from "child_process";
  3. import { fileURLToPath } from "url";
  4. import dotenv from "dotenv";
  5. import MiniCssExtractPlugin from "mini-css-extract-plugin";
  6. import CssMinimizerPlugin from "css-minimizer-webpack-plugin";
  7. dotenv.config();
  8. const mode = ["development", "production"].includes(process.env.NODE_ENV) ? process.env.NODE_ENV : "development";
  9. const outFileSuffix = process.env.OUTFILE_SUFFIX ?? "";
  10. /** @param {import("./src/types").WebpackEnv} env */
  11. const getConfig = (env) => ({
  12. entry: "./src/BetterYTM.user.ts",
  13. output: {
  14. filename: `BetterYTM${outFileSuffix}.user.js`,
  15. path: join(dirname(fileURLToPath(import.meta.url)), "/dist"),
  16. clean: true,
  17. module: true,
  18. },
  19. experiments: {
  20. // userscripts are automatically wrapped in an IIFE by the browser extension, so this can be enabled
  21. outputModule: true,
  22. },
  23. mode,
  24. resolve: {
  25. extensions: [
  26. ".ts",
  27. ".js",
  28. ".css",
  29. ".md",
  30. ],
  31. },
  32. module: {
  33. rules: [
  34. {
  35. test: /\.tsx?$/,
  36. use: "ts-loader",
  37. exclude: /node_modules/,
  38. },
  39. {
  40. test: /\.html$/i,
  41. loader: "html-loader",
  42. },
  43. {
  44. test: /\.md$/,
  45. use: [
  46. {
  47. loader: "html-loader",
  48. },
  49. {
  50. loader: "markdown-loader",
  51. },
  52. ],
  53. },
  54. {
  55. test: /.css$/,
  56. use: [MiniCssExtractPlugin.loader, "css-loader" /*, "sass-loader"*/],
  57. },
  58. ],
  59. },
  60. optimization: {
  61. minimizer: [
  62. `...`,
  63. new CssMinimizerPlugin(),
  64. ],
  65. },
  66. plugins: [
  67. new MiniCssExtractPlugin(),
  68. {
  69. apply: (compiler) => {
  70. compiler.hooks.afterEmit.tap("AfterEmitPlugin", () => {
  71. exec("npm run post-build", (_err, stdout, stderr) => {
  72. stdout && process.stdout.write(stdout);
  73. stderr && process.stderr.write(stderr);
  74. });
  75. });
  76. },
  77. },
  78. ],
  79. devtool: "source-map",
  80. });
  81. export default getConfig;