mirror of
https://github.com/grafana/grafana.git
synced 2026-06-13 02:20:51 -04:00
* 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
43 lines
1.7 KiB
TypeScript
43 lines
1.7 KiB
TypeScript
import webpack, { type Compiler } from 'webpack';
|
|
|
|
const { Template } = webpack;
|
|
|
|
const PLUGIN_NAME = 'FeatureFlaggedSRIPlugin';
|
|
const FEATURE_TOGGLE_WRAP = ['if (window.__grafanaAssetSriChecksEnabled) {', '}'];
|
|
|
|
/**
|
|
* Webpack plugin that wraps Webpack runtime integrity checks in a feature flag.
|
|
* This allows us to enable/disable SRI checks in both the initial chunks and the dynamically loaded chunks.
|
|
* The Webpack SRI plugin needs to be enabled for this plugin to work, as it relies on the presence
|
|
* of the integrity attribute in the generated script tags to identify where to wrap the feature flag.
|
|
*
|
|
*/
|
|
export default class FeatureFlaggedSRIPlugin {
|
|
apply(compiler: Compiler): void {
|
|
compiler.hooks.afterPlugins.tap(PLUGIN_NAME, (compiler) => {
|
|
const logger = compiler.getInfrastructureLogger(PLUGIN_NAME);
|
|
compiler.hooks.thisCompilation.tap({ name: PLUGIN_NAME }, (compilation) => {
|
|
const { mainTemplate } = compilation;
|
|
mainTemplate.hooks.jsonpScript.tap(PLUGIN_NAME, (source: string) => {
|
|
if (source.includes('script.integrity =')) {
|
|
logger.log('FeatureFlaggedSRIPlugin: Wrapping SRI checks in feature flag');
|
|
return createFeatureFlaggedSRITemplate(source);
|
|
}
|
|
return source;
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function createFeatureFlaggedSRITemplate(source: string): string {
|
|
const lines = source.split('\n');
|
|
const integrityAttributeLineNumber = lines.findIndex((line) => line.includes('script.integrity ='));
|
|
const [prefix, suffix] = FEATURE_TOGGLE_WRAP;
|
|
return Template.asString([
|
|
...lines.slice(0, integrityAttributeLineNumber),
|
|
prefix,
|
|
Template.indent(lines.slice(integrityAttributeLineNumber)),
|
|
suffix,
|
|
]);
|
|
}
|