diff --git a/packages/bundler-plugin-core/src/options-mapping.ts b/packages/bundler-plugin-core/src/options-mapping.ts index d85321a0..762720df 100644 --- a/packages/bundler-plugin-core/src/options-mapping.ts +++ b/packages/bundler-plugin-core/src/options-mapping.ts @@ -76,6 +76,7 @@ export type NormalizedOptions = { _metaOptions: { telemetry: { metaFramework: string | undefined; + bundlerMajorVersion: string | undefined; }; }; applicationKey: string | undefined; @@ -121,6 +122,7 @@ export function normalizeUserOptions(userOptions: UserOptions): NormalizedOption _metaOptions: { telemetry: { metaFramework: userOptions._metaOptions?.telemetry?.metaFramework, + bundlerMajorVersion: userOptions._metaOptions?.telemetry?.bundlerMajorVersion, }, }, applicationKey: userOptions.applicationKey, diff --git a/packages/bundler-plugin-core/src/sentry/telemetry.ts b/packages/bundler-plugin-core/src/sentry/telemetry.ts index 70c17b3e..7f48ec4a 100644 --- a/packages/bundler-plugin-core/src/sentry/telemetry.ts +++ b/packages/bundler-plugin-core/src/sentry/telemetry.ts @@ -111,6 +111,8 @@ export function setTelemetryDataOnScope( bundler: buildTool, }); + scope.setTag("bundler-major-version", options._metaOptions.telemetry.bundlerMajorVersion); + scope.setUser({ id: org }); } diff --git a/packages/bundler-plugin-core/src/types.ts b/packages/bundler-plugin-core/src/types.ts index 292b6bd5..1c00c94a 100644 --- a/packages/bundler-plugin-core/src/types.ts +++ b/packages/bundler-plugin-core/src/types.ts @@ -418,6 +418,10 @@ export interface Options { * The meta framework using the plugin. */ metaFramework?: string; + /** + * The major version of the bundler (e.g., "4" or "5" for webpack). + */ + bundlerMajorVersion?: string; }; }; } diff --git a/packages/webpack-plugin/src/index.ts b/packages/webpack-plugin/src/index.ts index 9b1bfa24..cb4683e1 100644 --- a/packages/webpack-plugin/src/index.ts +++ b/packages/webpack-plugin/src/index.ts @@ -8,14 +8,42 @@ const BannerPlugin = webpack4or5?.BannerPlugin || webpack4or5?.default?.BannerPl const DefinePlugin = webpack4or5?.DefinePlugin || webpack4or5?.default?.DefinePlugin; +// Detect webpack major version for telemetry (helps differentiate webpack 4 vs 5 usage) +function getWebpackMajorVersion(): string | undefined { + try { + const webpack = webpack4or5 as unknown as + | { version?: string; default?: { version?: string } } + | undefined; + const version = webpack?.version ?? webpack?.default?.version; + const webpackMajorVersion = version?.split(".")[0]; // "4" or "5" + return webpackMajorVersion; + } catch (error) { + return undefined; + } +} + +const webpackMajorVersion = getWebpackMajorVersion(); + const sentryUnplugin = sentryWebpackUnpluginFactory({ BannerPlugin, DefinePlugin, }); // eslint-disable-next-line @typescript-eslint/no-explicit-any -export const sentryWebpackPlugin: (options?: SentryWebpackPluginOptions) => any = - sentryUnplugin.webpack; +export const sentryWebpackPlugin: (options?: SentryWebpackPluginOptions) => any = (options) => { + const enhancedOptions: SentryWebpackPluginOptions = { + ...options, + _metaOptions: { + ...options?._metaOptions, + telemetry: { + ...options?._metaOptions?.telemetry, + bundlerMajorVersion: + options?._metaOptions?.telemetry?.bundlerMajorVersion ?? webpackMajorVersion, + }, + }, + }; + return sentryUnplugin.webpack(enhancedOptions); +}; export { sentryCliBinaryExists } from "@sentry/bundler-plugin-core";