grafana/scripts/webpack/webpack.stats.ts
Jack Westbrook 0a10a5d133
Build: Refactor Webpack config to TS (#121181)
* build(webpack): add tsconfig.json for Node strip-types compliance

* build(webpack): extract shared esbuild options to esbuild.ts

* build(webpack): add package.json to declare ESM module type

* build(webpack): convert sass.rule to TypeScript

* build(webpack): convert CorsWorkerPlugin to TypeScript

* build(webpack): convert FeatureFlaggedSriPlugin to TypeScript

* build(webpack): convert webpack.common to TypeScript, add theme entries

* build(webpack): convert webpack.dev to TypeScript, remove esbuild duplication

* build(webpack): convert webpack.prod to TypeScript, remove esbuild duplication

* build(webpack): fix TypeScript types in webpack.prod transform callback

* build(webpack): convert webpack.stats to TypeScript

* build(webpack): update scripts to use TypeScript webpack configs

* build(webpack): simplify env-util to use import.meta.dirname directly

* build(webpack): tidy up plugins

* build(webpack): move rules for ts and sass into single module

* build(webpack): consolidate shared config into common, move splitChunks to prod

- Move MiniCssExtractPlugin, esbuildRule and sassRule into common so both
  dev and prod configs share them without duplication
- Move splitChunks/runtimeChunk optimisation to webpack.prod only (not
  needed in dev)
- Use require() for SubresourceIntegrityPlugin to work around broken ESM
  build (waysact/webpack-subresource-integrity#236)
- Refactor conditional plugin logic in dev from ternary to if-blocks

* build(webpack): remove dead import and clarify webpack destructure pattern

- Remove unused MiniCssExtractPlugin import from webpack.prod (moved to common)
- Add comment explaining why DefinePlugin/EnvironmentPlugin are destructured
  from the default webpack import rather than using named ESM imports

* style(webpack): reorder consts

* chore(env-util): fix up env-util and webpack configs so tests continue to run

* refactor(env-util): accept grafanaRoot param instead of relying on __dirname

Removes the global.__dirname mutation hack in webpack.common.ts by making
the grafana root path an explicit argument to getEnvConfig. Each caller
resolves its own root and passes it in, removing the implicit path-depth
contract and the CJS/ESM compatibility workaround.

* build(webpack): remove unused angular chunk group
2026-04-28 12:45:31 +02:00

52 lines
1.4 KiB
TypeScript

import { RsdoctorWebpackPlugin } from '@rsdoctor/webpack-plugin';
import type { Configuration } from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import { FilterStatsPlugin } from './plugins/FilterStatsPlugin.ts';
import type { Env } from './webpack.common.ts';
import prodConfig from './webpack.prod.ts';
export default (env: Env = {}) => {
const bundleAnalyzerOpts: BundleAnalyzerPlugin.Options = env.filtered
? {
analyzerMode: 'static',
reportFilename: 'bundle-stats.html',
openAnalyzer: false,
generateStatsFile: false,
}
: {};
const config: Configuration = {
plugins: [new BundleAnalyzerPlugin(bundleAnalyzerOpts)],
};
// yarn build:smolstats
if (env.filtered) {
config.plugins?.push(
new FilterStatsPlugin({
exclude: /@kusto|monaco-editor|public\/locales/,
minDominance: 0.75,
})
);
}
// yarn build:stats --env doctor
if (env.doctor) {
config.plugins?.push(new RsdoctorWebpackPlugin());
}
// disable hashing in output filenames to make them easier to identify
// yarn build:stats --env doctor --env namedChunks
if (env.namedChunks) {
config.optimization = {
chunkIds: 'named',
};
config.output = {
filename: '[name].js',
chunkFilename: '[name].js',
};
}
return merge(prodConfig(env), config);
};