From c87d6f99a7cab8c73801bdc76921156084157dd8 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 19 Oct 2023 13:58:33 +0200 Subject: [PATCH 1/7] feat: Allow to configure `bundleSizeOptimizations` --- packages/bundler-plugin-core/src/index.ts | 46 +++++- .../src/options-mapping.ts | 1 + packages/bundler-plugin-core/src/types.ts | 49 ++++++ packages/bundler-plugin-core/src/utils.ts | 25 ++++ .../bundler-plugin-core/test/utils.test.ts | 41 ++++- packages/esbuild-plugin/src/index.ts | 31 +++- packages/integration-tests/.eslintrc.js | 7 +- .../bundle-size-optimizations.test.ts | 40 +++++ .../expected/esbuild/bundle1.js | 5 + .../expected/esbuild/bundle2.js | 4 + .../expected/rollup/bundle1.js | 11 ++ .../expected/rollup/bundle2.js | 13 ++ .../expected/vite/bundle1.js | 5 + .../expected/vite/bundle2.js | 4 + .../expected/webpack4/bundle1.js | 10 ++ .../expected/webpack4/bundle2.js | 1 + .../expected/webpack5/bundle1.js | 10 ++ .../expected/webpack5/bundle2.js | 1 + .../input/bundle1.js | 17 +++ .../input/bundle2.js | 13 ++ .../bundle-size-optimizations/setup.ts | 25 ++++ packages/rollup-plugin/src/index.ts | 10 ++ packages/vite-plugin/src/index.ts | 10 ++ packages/webpack-plugin/src/index.ts | 27 ++++ yarn.lock | 140 +++++++++++++++++- 25 files changed, 539 insertions(+), 7 deletions(-) create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js create mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/setup.ts diff --git a/packages/bundler-plugin-core/src/index.ts b/packages/bundler-plugin-core/src/index.ts index d24835dd..fd1cbca8 100644 --- a/packages/bundler-plugin-core/src/index.ts +++ b/packages/bundler-plugin-core/src/index.ts @@ -9,13 +9,14 @@ import { releaseManagementPlugin } from "./plugins/release-management"; import { telemetryPlugin } from "./plugins/telemetry"; import { createLogger } from "./sentry/logger"; import { allowedToSendTelemetry, createSentryInstance } from "./sentry/telemetry"; -import { Options } from "./types"; +import { Options, SentrySDKBuildFlags } from "./types"; import { generateGlobalInjectorCode, generateModuleMetadataInjectorCode, getDependencies, getPackageJson, parseMajorVersion, + replaceBooleanFlagsInCode, stringToUUID, stripQueryAndHashFromPath, } from "./utils"; @@ -27,6 +28,7 @@ interface SentryUnpluginFactoryOptions { moduleMetadataInjectionPlugin?: (injectionCode: string) => UnpluginOptions; debugIdInjectionPlugin: () => UnpluginOptions; debugIdUploadPlugin: (upload: (buildArtifacts: string[]) => Promise) => UnpluginOptions; + bundleSizeOptimizationsPlugin: (buildFlags: SentrySDKBuildFlags) => UnpluginOptions; } /** @@ -61,6 +63,7 @@ export function sentryUnpluginFactory({ moduleMetadataInjectionPlugin, debugIdInjectionPlugin, debugIdUploadPlugin, + bundleSizeOptimizationsPlugin, }: SentryUnpluginFactoryOptions) { return createUnplugin((userOptions, unpluginMetaContext) => { const logger = createLogger({ @@ -161,6 +164,31 @@ export function sentryUnpluginFactory({ }) ); + if (options.bundleSizeOptimizations) { + const { bundleSizeOptimizations } = options; + const values: SentrySDKBuildFlags = {}; + + if (bundleSizeOptimizations.excludeDebugStatements) { + values["__SENTRY_DEBUG__"] = false; + } + if (bundleSizeOptimizations.excludePerformanceMonitoring) { + values["__SENTRY_TRACE__"] = false; + } + if (bundleSizeOptimizations.excludeReplayCanvas) { + values["__RRWEB_EXCLUDE_CANVAS__"] = true; + } + if (bundleSizeOptimizations.excludeReplayIframe) { + values["__RRWEB_EXCLUDE_IFRAME__"] = true; + } + if (bundleSizeOptimizations.excludeReplayShadowDom) { + values["__RRWEB_EXCLUDE_SHADOW_DOM__"] = true; + } + + if (Object.keys(values).length > 0) { + plugins.push(bundleSizeOptimizationsPlugin(values)); + } + } + if (!options.release.inject) { logger.debug( "Release injection disabled via `release.inject` option. Will not inject release." @@ -371,6 +399,18 @@ export function createRollupReleaseInjectionHooks(injectionCode: string) { }; } +export function createRollupBundleSizeOptimizationHooks(values: SentrySDKBuildFlags) { + return { + renderChunk(code: string) { + return replaceBooleanFlagsInCode(code, values); + }, + + transform(code: string) { + return replaceBooleanFlagsInCode(code, values); + }, + }; +} + // We need to be careful not to inject the snippet before any `"use strict";`s. // As an additional complication `"use strict";`s may come after any number of comments. const COMMENT_USE_STRICT_REGEX = @@ -475,6 +515,6 @@ export function getDebugIdSnippet(debugId: string): string { return `;!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="${debugId}",e._sentryDebugIdIdentifier="sentry-dbid-${debugId}")}catch(e){}}();`; } -export { stringToUUID } from "./utils"; +export { stringToUUID, replaceBooleanFlagsInCode } from "./utils"; -export type { Options } from "./types"; +export type { Options, SentrySDKBuildFlags } from "./types"; diff --git a/packages/bundler-plugin-core/src/options-mapping.ts b/packages/bundler-plugin-core/src/options-mapping.ts index 04ff712d..202f40ea 100644 --- a/packages/bundler-plugin-core/src/options-mapping.ts +++ b/packages/bundler-plugin-core/src/options-mapping.ts @@ -28,6 +28,7 @@ export function normalizeUserOptions(userOptions: UserOptions) { vcsRemote: userOptions.release?.vcsRemote ?? process.env["SENTRY_VSC_REMOTE"] ?? "origin", cleanArtifacts: userOptions.release?.cleanArtifacts ?? false, }, + bundleSizeOptimizations: userOptions.bundleSizeOptimizations, _experiments: userOptions._experiments ?? {}, }; diff --git a/packages/bundler-plugin-core/src/types.ts b/packages/bundler-plugin-core/src/types.ts index f3276f6a..15a9ca1d 100644 --- a/packages/bundler-plugin-core/src/types.ts +++ b/packages/bundler-plugin-core/src/types.ts @@ -228,6 +228,47 @@ export interface Options { uploadLegacySourcemaps?: string | IncludeEntry | Array; }; + /** + * Options related to bundle size optimizations. + */ + bundleSizeOptimizations?: { + /** + * If set to true, the plugin will try to tree-shake debug statements out. + * Note that the success of this depends on tree shaking generally being enabled in your build. + */ + excludeDebugStatements?: boolean; + + /** + * If set to true, the plugin will try to tree-shake performance monitoring statements out. + * Note that the success of this depends on tree shaking generally being enabled in your build. + * Attention: DO NOT enable this when you're using any performance monitoring-related SDK features (e.g. Sentry.startTransaction()). + * This flag is intended to be used in combination with packages like @sentry/next or @sentry/sveltekit, + * which automatically include performance monitoring functionality. + */ + excludePerformanceMonitoring?: boolean; + + /** + * If set to true, the plugin will try to tree-shake Session Replay's Canvas recording functionality out. + * You can safely do this when you do not want to capture any Canvas activity via Replay. + * Note that the success of this depends on tree shaking generally being enabled in your build. + */ + excludeReplayCanvas?: boolean; + + /** + * If set to true, the plugin will try to tree-shake Session Replay's Shadow DOM recording functionality out. + * You can safely do this when you do not want to capture any Shadow DOM activity via Replay. + * Note that the success of this depends on tree shaking generally being enabled in your build. + */ + excludeReplayShadowDom?: boolean; + + /** + * If set to true, the plugin will try to tree-shake Session Replay's IFrame recording functionality out. + * You can safely do this when you do not want to capture any IFrame activity via Replay. + * Note that the success of this depends on tree shaking generally being enabled in your build. + */ + excludeReplayIframe?: boolean; + }; + /** * Options that are considered experimental and subject to change. * @@ -348,6 +389,14 @@ export type IncludeEntry = { validate?: boolean; }; +export interface SentrySDKBuildFlags extends Record { + __SENTRY_DEBUG__?: boolean; + __SENTRY_TRACE__?: boolean; + __RRWEB_EXCLUDE_CANVAS__?: boolean; + __RRWEB_EXCLUDE_IFRAME__?: boolean; + __RRWEB_EXCLUDE_SHADOW_DOM__?: boolean; +} + type SetCommitsOptions = (AutoSetCommitsOptions | ManualSetCommitsOptions) & { /** * The commit before the beginning of this release (in other words, diff --git a/packages/bundler-plugin-core/src/utils.ts b/packages/bundler-plugin-core/src/utils.ts index 6658eb4b..447df412 100644 --- a/packages/bundler-plugin-core/src/utils.ts +++ b/packages/bundler-plugin-core/src/utils.ts @@ -4,6 +4,7 @@ import fs from "fs"; import os from "os"; import crypto from "crypto"; import childProcess from "child_process"; +import MagicString, { SourceMap } from "magic-string"; /** * Checks whether the given input is already an array, and if it isn't, wraps it in one. @@ -307,3 +308,27 @@ export function stripQueryAndHashFromPath(path: string): string { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return path.split("?")[0]!.split("#")[0]!; } + +export function replaceBooleanFlagsInCode( + code: string, + values: Record +): { code: string; map: SourceMap } | null { + const ms = new MagicString(code); + + Object.keys(values).forEach((key) => { + const value = values[key]; + + if (typeof value === "boolean") { + ms.replaceAll(key, value ? "true" : "false"); + } + }); + + if (ms.hasChanged()) { + return { + code: ms.toString(), + map: ms.generateMap({ hires: true }), + }; + } + + return null; +} diff --git a/packages/bundler-plugin-core/test/utils.test.ts b/packages/bundler-plugin-core/test/utils.test.ts index d587432b..3dcd93e1 100644 --- a/packages/bundler-plugin-core/test/utils.test.ts +++ b/packages/bundler-plugin-core/test/utils.test.ts @@ -1,4 +1,10 @@ -import { getDependencies, getPackageJson, parseMajorVersion, stringToUUID } from "../src/utils"; +import { + getDependencies, + getPackageJson, + parseMajorVersion, + replaceBooleanFlagsInCode, + stringToUUID, +} from "../src/utils"; import path from "node:path"; type PackageJson = Record; @@ -175,3 +181,36 @@ describe("stringToUUID", () => { expect(stringToUUID("Nothing personnel kid")).toBe("52c7a762-5ddf-49a7-af16-6874a8cb2512"); }); }); + +describe("replaceBooleanFlagsInCode", () => { + test("it works without a match", () => { + const code = "const a = 1;"; + const result = replaceBooleanFlagsInCode(code, { __DEBUG_BUILD__: false }); + expect(result).toBeNull(); + }); + + test("it works with matches", () => { + const code = `const a = 1; +if (__DEBUG_BUILD__ && checkMe()) { + // do something +} +if (__DEBUG_BUILD__ && __RRWEB_EXCLUDE_CANVAS__) { + const a = __RRWEB_EXCLUDE_CANVAS__ ? 1 : 2; +}`; + const result = replaceBooleanFlagsInCode(code, { + __DEBUG_BUILD__: false, + __RRWEB_EXCLUDE_CANVAS__: true, + }); + expect(result).toEqual({ + code: `const a = 1; +if (false && checkMe()) { + // do something +} +if (false && true) { + const a = true ? 1 : 2; +}`, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + map: expect.anything(), + }); + }); +}); diff --git a/packages/esbuild-plugin/src/index.ts b/packages/esbuild-plugin/src/index.ts index ca0d803f..e68158e8 100644 --- a/packages/esbuild-plugin/src/index.ts +++ b/packages/esbuild-plugin/src/index.ts @@ -1,6 +1,13 @@ -import { sentryUnpluginFactory, Options, getDebugIdSnippet } from "@sentry/bundler-plugin-core"; +import { + sentryUnpluginFactory, + Options, + getDebugIdSnippet, + SentrySDKBuildFlags, + replaceBooleanFlagsInCode, +} from "@sentry/bundler-plugin-core"; import type { UnpluginOptions } from "unplugin"; import * as path from "path"; +import * as fs from "fs"; import { v4 as uuidv4 } from "uuid"; @@ -226,11 +233,33 @@ function esbuildDebugIdUploadPlugin( }; } +function esbuildBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { + return { + name: "sentry-esbuild-bundle-size-optimizations-plugin", + esbuild: { + setup({ onLoad }) { + onLoad({ filter: /./ }, async (args) => { + const source = await fs.promises.readFile(args.path, "utf8"); + + const contents = replaceBooleanFlagsInCode(source, values); + + if (!contents) { + return null; + } + + return { contents: contents.code, loader: "default" }; + }); + }, + }, + }; +} + const sentryUnplugin = sentryUnpluginFactory({ releaseInjectionPlugin: esbuildReleaseInjectionPlugin, debugIdInjectionPlugin: esbuildDebugIdInjectionPlugin, moduleMetadataInjectionPlugin: esbuildModuleMetadataInjectionPlugin, debugIdUploadPlugin: esbuildDebugIdUploadPlugin, + bundleSizeOptimizationsPlugin: esbuildBundleSizeOptimizationsPlugin, }); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/integration-tests/.eslintrc.js b/packages/integration-tests/.eslintrc.js index bf333cd9..4feaa409 100644 --- a/packages/integration-tests/.eslintrc.js +++ b/packages/integration-tests/.eslintrc.js @@ -4,7 +4,12 @@ const jestPackageJson = require("jest/package.json"); module.exports = { root: true, extends: ["@sentry-internal/eslint-config/jest", "@sentry-internal/eslint-config/base"], - ignorePatterns: [".eslintrc.js", "fixtures/*/out", "jest.config.js"], + ignorePatterns: [ + ".eslintrc.js", + "fixtures/*/out", + "jest.config.js", + "fixtures/bundle-size-optimizations/*", + ], parserOptions: { tsconfigRootDir: __dirname, project: ["./tsconfig.json"], diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts new file mode 100644 index 00000000..ae909416 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts @@ -0,0 +1,40 @@ +/* eslint-disable jest/no-standalone-expect */ +/* eslint-disable jest/expect-expect */ +import path from "path"; +import fs from "fs"; +import { testIfNodeMajorVersionIsLessThan18 } from "../../utils/testIf"; + +function checkBundle(bundler: string, bundlePath: string): void { + const actualPath = path.join(__dirname, "out", bundler, bundlePath); + const expectedPath = path.join(__dirname, "expected", bundler, bundlePath); + + const actual = fs.readFileSync(actualPath, "utf-8"); + const expected = fs.readFileSync(expectedPath, "utf-8"); + + expect(actual).toContain(expected); +} + +test("esbuild bundle", () => { + checkBundle("esbuild", "bundle1.js"); + checkBundle("esbuild", "bundle2.js"); +}); + +test("rollup bundle", () => { + checkBundle("rollup", "bundle1.js"); + checkBundle("rollup", "bundle2.js"); +}); + +test("vite bundle", () => { + checkBundle("vite", "bundle1.js"); + checkBundle("vite", "bundle2.js"); +}); + +testIfNodeMajorVersionIsLessThan18("webpack 4 bundle", () => { + checkBundle("webpack4", "bundle1.js"); + checkBundle("webpack4", "bundle2.js"); +}); + +test("webpack 5 bundle", () => { + checkBundle("webpack5", "bundle1.js"); + checkBundle("webpack5", "bundle2.js"); +}); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js new file mode 100644 index 00000000..209709d1 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js @@ -0,0 +1,5 @@ +function e() { + let o = Math.random(); + return console.log("skip iframe", 1), o; +} +console.log(e()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js new file mode 100644 index 00000000..5a144ba7 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js @@ -0,0 +1,4 @@ +function a() { + return { debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }; +} +console.log(a()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js new file mode 100644 index 00000000..8fac4447 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js @@ -0,0 +1,11 @@ +function run() { + const a = Math.random(); + { + const myNum = 1; + console.log("skip iframe", myNum); + } + + return a; +} + +console.log(run()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js new file mode 100644 index 00000000..3a57a27d --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js @@ -0,0 +1,13 @@ +function run() { + const obj = { + debug: "b", + trace: "b", + replayCanvas: "a", + replayIframe: "a", + replayShadowDom: "a", + }; + + return obj; +} + +console.log(run()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js new file mode 100644 index 00000000..153a6b7f --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js @@ -0,0 +1,5 @@ +function d() { + const e = Math.random(); + return console.log("skip iframe", 1), e; +} +console.log(d()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js new file mode 100644 index 00000000..5a144ba7 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js @@ -0,0 +1,4 @@ +function a() { + return { debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }; +} +console.log(a()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js new file mode 100644 index 00000000..8cc59d94 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js @@ -0,0 +1,10 @@ +console.log( + (function () { + const e = Math.random(); + { + const e = 1; + console.log("skip iframe", e); + } + return e; + })() +); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js new file mode 100644 index 00000000..34c270c2 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js @@ -0,0 +1 @@ +console.log({ debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js new file mode 100644 index 00000000..8cc59d94 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js @@ -0,0 +1,10 @@ +console.log( + (function () { + const e = Math.random(); + { + const e = 1; + console.log("skip iframe", e); + } + return e; + })() +); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js new file mode 100644 index 00000000..34c270c2 --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js @@ -0,0 +1 @@ +console.log({ debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js new file mode 100644 index 00000000..63c801bd --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js @@ -0,0 +1,17 @@ +function run() { + const a = Math.random(); + if (__SENTRY_DEBUG__ && a > 0.5) { + console.log("a > 0.5"); + } + if (__SENTRY_DEBUG__ && __RRWEB_EXCLUDE_CANVAS__) { + console.log("debug & exclude"); + } + if (__RRWEB_EXCLUDE_IFRAME__) { + const myNum = __RRWEB_EXCLUDE_CANVAS__ ? 1 : 2; + console.log("skip iframe", myNum); + } + + return a; +} + +console.log(run()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js new file mode 100644 index 00000000..6ee39eba --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js @@ -0,0 +1,13 @@ +function run() { + const obj = { + debug: __SENTRY_DEBUG__ ? "a" : "b", + trace: __SENTRY_TRACE__ ? "a" : "b", + replayCanvas: __RRWEB_EXCLUDE_CANVAS__ ? "a" : "b", + replayIframe: __RRWEB_EXCLUDE_IFRAME__ ? "a" : "b", + replayShadowDom: __RRWEB_EXCLUDE_SHADOW_DOM__ ? "a" : "b", + }; + + return obj; +} + +console.log(run()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/setup.ts b/packages/integration-tests/fixtures/bundle-size-optimizations/setup.ts new file mode 100644 index 00000000..74699d2a --- /dev/null +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/setup.ts @@ -0,0 +1,25 @@ +import * as path from "path"; +import { createCjsBundles } from "../../utils/create-cjs-bundles"; + +const outputDir = path.resolve(__dirname, "out"); + +createCjsBundles( + { + bundle1: path.resolve(__dirname, "input", "bundle1.js"), + bundle2: path.resolve(__dirname, "input", "bundle2.js"), + }, + outputDir, + { + release: { + inject: false, + }, + telemetry: false, + bundleSizeOptimizations: { + excludeDebugStatements: true, + excludePerformanceMonitoring: true, + excludeReplayCanvas: true, + excludeReplayIframe: true, + excludeReplayShadowDom: true, + }, + } +); diff --git a/packages/rollup-plugin/src/index.ts b/packages/rollup-plugin/src/index.ts index dab98730..268d5a49 100644 --- a/packages/rollup-plugin/src/index.ts +++ b/packages/rollup-plugin/src/index.ts @@ -5,6 +5,8 @@ import { createRollupModuleMetadataInjectionHooks, createRollupDebugIdInjectionHooks, createRollupDebugIdUploadHooks, + SentrySDKBuildFlags, + createRollupBundleSizeOptimizationHooks, } from "@sentry/bundler-plugin-core"; import type { UnpluginOptions } from "unplugin"; @@ -38,11 +40,19 @@ function rollupDebugIdUploadPlugin( }; } +function rollupBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { + return { + name: "sentry-rollup-bundle-size-optimizations-plugin", + rollup: createRollupBundleSizeOptimizationHooks(values), + }; +} + const sentryUnplugin = sentryUnpluginFactory({ releaseInjectionPlugin: rollupReleaseInjectionPlugin, debugIdInjectionPlugin: rollupDebugIdInjectionPlugin, moduleMetadataInjectionPlugin: rollupModuleMetadataInjectionPlugin, debugIdUploadPlugin: rollupDebugIdUploadPlugin, + bundleSizeOptimizationsPlugin: rollupBundleSizeOptimizationsPlugin, }); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/vite-plugin/src/index.ts b/packages/vite-plugin/src/index.ts index 5ee62797..1700e776 100644 --- a/packages/vite-plugin/src/index.ts +++ b/packages/vite-plugin/src/index.ts @@ -5,6 +5,8 @@ import { createRollupModuleMetadataInjectionHooks, createRollupDebugIdInjectionHooks, createRollupDebugIdUploadHooks, + SentrySDKBuildFlags, + createRollupBundleSizeOptimizationHooks, } from "@sentry/bundler-plugin-core"; import { UnpluginOptions } from "unplugin"; @@ -39,11 +41,19 @@ function viteDebugIdUploadPlugin( }; } +function viteBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { + return { + name: "sentry-vite-bundle-size-optimizations-plugin", + vite: createRollupBundleSizeOptimizationHooks(values), + }; +} + const sentryUnplugin = sentryUnpluginFactory({ releaseInjectionPlugin: viteReleaseInjectionPlugin, debugIdInjectionPlugin: viteDebugIdInjectionPlugin, moduleMetadataInjectionPlugin: viteModuleMetadataInjectionPlugin, debugIdUploadPlugin: viteDebugIdUploadPlugin, + bundleSizeOptimizationsPlugin: viteBundleSizeOptimizationsPlugin, }); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/webpack-plugin/src/index.ts b/packages/webpack-plugin/src/index.ts index f879e0ad..7f271f30 100644 --- a/packages/webpack-plugin/src/index.ts +++ b/packages/webpack-plugin/src/index.ts @@ -3,6 +3,7 @@ import { Options, sentryUnpluginFactory, stringToUUID, + SentrySDKBuildFlags, } from "@sentry/bundler-plugin-core"; import * as path from "path"; import { UnpluginOptions } from "unplugin"; @@ -45,6 +46,31 @@ function webpackReleaseInjectionPlugin(injectionCode: string): UnpluginOptions { }; } +function webpackBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { + return { + name: "sentry-webpack-bundle-size-optimizations-plugin", + webpack(compiler) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore webpack version compatibility shenanigans + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + const DefinePlugin = + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore webpack version compatibility shenanigans + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + compiler?.webpack?.DefinePlugin || + webback4or5?.DefinePlugin || + webback4or5?.default?.DefinePlugin; + compiler.options.plugins = compiler.options.plugins || []; + compiler.options.plugins.push( + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call + new DefinePlugin({ + ...values, + }) + ); + }, + }; +} + function webpackDebugIdInjectionPlugin(): UnpluginOptions { return { name: "sentry-webpack-debug-id-injection-plugin", @@ -128,6 +154,7 @@ const sentryUnplugin = sentryUnpluginFactory({ moduleMetadataInjectionPlugin: webpackModuleMetadataInjectionPlugin, debugIdInjectionPlugin: webpackDebugIdInjectionPlugin, debugIdUploadPlugin: webpackDebugIdUploadPlugin, + bundleSizeOptimizationsPlugin: webpackBundleSizeOptimizationsPlugin, }); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/yarn.lock b/yarn.lock index 7c2106ea..0e65c43f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -977,51 +977,101 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + "@esbuild/android-arm64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz#74752a09301b8c6b9a415fbda9fb71406a62a7b7" integrity sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg== +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + "@esbuild/android-arm@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz#c27363e1e280e577d9b5c8fa7c7a3be2a8d79bf5" integrity sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ== +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + "@esbuild/android-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz#6c9ee03d1488973d928618100048b75b147e0426" integrity sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g== +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + "@esbuild/darwin-arm64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz#64e2ee945e5932cd49812caa80e8896e937e2f8b" integrity sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA== +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + "@esbuild/darwin-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz#d8e26e1b965df284692e4d1263ba69a49b39ac7a" integrity sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw== +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + "@esbuild/freebsd-arm64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz#29751a41b242e0a456d89713b228f1da4f45582f" integrity sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ== +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + "@esbuild/freebsd-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz#873edc0f73e83a82432460ea59bf568c1e90b268" integrity sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw== +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + "@esbuild/linux-arm64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz#659f2fa988d448dbf5010b5cc583be757cc1b914" integrity sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA== +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + "@esbuild/linux-arm@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz#d5b13a7ec1f1c655ce05c8d319b3950797baee55" integrity sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg== +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + "@esbuild/linux-ia32@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz#878cd8bf24c9847c77acdb5dd1b2ef6e4fa27a82" @@ -1032,61 +1082,121 @@ resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + "@esbuild/linux-loong64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz#df890499f6e566b7de3aa2361be6df2b8d5fa015" integrity sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg== +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + "@esbuild/linux-mips64el@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz#76eae4e88d2ce9f4f1b457e93892e802851b6807" integrity sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw== +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + "@esbuild/linux-ppc64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz#c49032f4abbcfa3f747b543a106931fe3dce41ff" integrity sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw== +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + "@esbuild/linux-riscv64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz#0f815a090772138503ee0465a747e16865bf94b1" integrity sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig== +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + "@esbuild/linux-s390x@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz#8d2cca20cd4e7c311fde8701d9f1042664f8b92b" integrity sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg== +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + "@esbuild/linux-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz#f618bec2655de49bff91c588777e37b5e3169d4a" integrity sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg== +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + "@esbuild/netbsd-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz#7889744ca4d60f1538d62382b95e90a49687cef2" integrity sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A== +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + "@esbuild/openbsd-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz#c3e436eb9271a423d2e8436fcb120e3fd90e2b01" integrity sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw== +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + "@esbuild/sunos-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz#f63f5841ba8c8c1a1c840d073afc99b53e8ce740" integrity sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw== +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + "@esbuild/win32-arm64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz#80be69cec92da4da7781cf7a8351b95cc5a236b0" integrity sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w== +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + "@esbuild/win32-ia32@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz#15dc0ed83d2794872b05d8edc4a358fecf97eb54" integrity sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg== +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + "@esbuild/win32-x64@0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz#d46a6e220a717f31f39ae80f49477cc3220be0f0" @@ -5512,7 +5622,7 @@ esbuild-windows-arm64@0.14.54: resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== -"esbuild019@npm:esbuild@^0.19.4", esbuild@0.19.4: +"esbuild019@npm:esbuild@^0.19.4": version "0.19.4" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz#cdf5c4c684956d550bc3c6d0c01dac7fef6c75b1" integrity sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA== @@ -5566,6 +5676,34 @@ esbuild@0.14.49: esbuild-windows-64 "0.14.49" esbuild-windows-arm64 "0.14.49" +esbuild@0.17.19: + version "0.17.19" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + esbuild@^0.14.47: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" From e435c0de764d2548d85570b3cc8bc285b1453315 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 20 Oct 2023 08:48:11 +0200 Subject: [PATCH 2/7] PR feedback --- packages/bundler-plugin-core/src/index.ts | 24 ++++++++++------------- packages/bundler-plugin-core/src/utils.ts | 8 ++++---- packages/esbuild-plugin/src/index.ts | 6 ++++-- packages/rollup-plugin/src/index.ts | 6 ++++-- packages/vite-plugin/src/index.ts | 6 ++++-- packages/webpack-plugin/src/index.ts | 6 ++++-- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/packages/bundler-plugin-core/src/index.ts b/packages/bundler-plugin-core/src/index.ts index fd1cbca8..3dc36c0d 100644 --- a/packages/bundler-plugin-core/src/index.ts +++ b/packages/bundler-plugin-core/src/index.ts @@ -166,26 +166,26 @@ export function sentryUnpluginFactory({ if (options.bundleSizeOptimizations) { const { bundleSizeOptimizations } = options; - const values: SentrySDKBuildFlags = {}; + const replacementValues: SentrySDKBuildFlags = {}; if (bundleSizeOptimizations.excludeDebugStatements) { - values["__SENTRY_DEBUG__"] = false; + replacementValues["__SENTRY_DEBUG__"] = false; } if (bundleSizeOptimizations.excludePerformanceMonitoring) { - values["__SENTRY_TRACE__"] = false; + replacementValues["__SENTRY_TRACE__"] = false; } if (bundleSizeOptimizations.excludeReplayCanvas) { - values["__RRWEB_EXCLUDE_CANVAS__"] = true; + replacementValues["__RRWEB_EXCLUDE_CANVAS__"] = true; } if (bundleSizeOptimizations.excludeReplayIframe) { - values["__RRWEB_EXCLUDE_IFRAME__"] = true; + replacementValues["__RRWEB_EXCLUDE_IFRAME__"] = true; } if (bundleSizeOptimizations.excludeReplayShadowDom) { - values["__RRWEB_EXCLUDE_SHADOW_DOM__"] = true; + replacementValues["__RRWEB_EXCLUDE_SHADOW_DOM__"] = true; } - if (Object.keys(values).length > 0) { - plugins.push(bundleSizeOptimizationsPlugin(values)); + if (Object.keys(replacementValues).length > 0) { + plugins.push(bundleSizeOptimizationsPlugin(replacementValues)); } } @@ -399,14 +399,10 @@ export function createRollupReleaseInjectionHooks(injectionCode: string) { }; } -export function createRollupBundleSizeOptimizationHooks(values: SentrySDKBuildFlags) { +export function createRollupBundleSizeOptimizationHooks(replacementValues: SentrySDKBuildFlags) { return { - renderChunk(code: string) { - return replaceBooleanFlagsInCode(code, values); - }, - transform(code: string) { - return replaceBooleanFlagsInCode(code, values); + return replaceBooleanFlagsInCode(code, replacementValues); }, }; } diff --git a/packages/bundler-plugin-core/src/utils.ts b/packages/bundler-plugin-core/src/utils.ts index 447df412..870dcb76 100644 --- a/packages/bundler-plugin-core/src/utils.ts +++ b/packages/bundler-plugin-core/src/utils.ts @@ -311,15 +311,15 @@ export function stripQueryAndHashFromPath(path: string): string { export function replaceBooleanFlagsInCode( code: string, - values: Record + replacementValues: Record ): { code: string; map: SourceMap } | null { const ms = new MagicString(code); - Object.keys(values).forEach((key) => { - const value = values[key]; + Object.keys(replacementValues).forEach((key) => { + const value = replacementValues[key]; if (typeof value === "boolean") { - ms.replaceAll(key, value ? "true" : "false"); + ms.replaceAll(key, JSON.stringify(value)); } }); diff --git a/packages/esbuild-plugin/src/index.ts b/packages/esbuild-plugin/src/index.ts index e68158e8..31317dbe 100644 --- a/packages/esbuild-plugin/src/index.ts +++ b/packages/esbuild-plugin/src/index.ts @@ -233,7 +233,9 @@ function esbuildDebugIdUploadPlugin( }; } -function esbuildBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { +function esbuildBundleSizeOptimizationsPlugin( + replacementValues: SentrySDKBuildFlags +): UnpluginOptions { return { name: "sentry-esbuild-bundle-size-optimizations-plugin", esbuild: { @@ -241,7 +243,7 @@ function esbuildBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): Unpl onLoad({ filter: /./ }, async (args) => { const source = await fs.promises.readFile(args.path, "utf8"); - const contents = replaceBooleanFlagsInCode(source, values); + const contents = replaceBooleanFlagsInCode(source, replacementValues); if (!contents) { return null; diff --git a/packages/rollup-plugin/src/index.ts b/packages/rollup-plugin/src/index.ts index 268d5a49..884d8e62 100644 --- a/packages/rollup-plugin/src/index.ts +++ b/packages/rollup-plugin/src/index.ts @@ -40,10 +40,12 @@ function rollupDebugIdUploadPlugin( }; } -function rollupBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { +function rollupBundleSizeOptimizationsPlugin( + replacementValues: SentrySDKBuildFlags +): UnpluginOptions { return { name: "sentry-rollup-bundle-size-optimizations-plugin", - rollup: createRollupBundleSizeOptimizationHooks(values), + rollup: createRollupBundleSizeOptimizationHooks(replacementValues), }; } diff --git a/packages/vite-plugin/src/index.ts b/packages/vite-plugin/src/index.ts index 1700e776..c85d3e3a 100644 --- a/packages/vite-plugin/src/index.ts +++ b/packages/vite-plugin/src/index.ts @@ -41,10 +41,12 @@ function viteDebugIdUploadPlugin( }; } -function viteBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { +function viteBundleSizeOptimizationsPlugin( + replacementValues: SentrySDKBuildFlags +): UnpluginOptions { return { name: "sentry-vite-bundle-size-optimizations-plugin", - vite: createRollupBundleSizeOptimizationHooks(values), + vite: createRollupBundleSizeOptimizationHooks(replacementValues), }; } diff --git a/packages/webpack-plugin/src/index.ts b/packages/webpack-plugin/src/index.ts index 7f271f30..a3e624be 100644 --- a/packages/webpack-plugin/src/index.ts +++ b/packages/webpack-plugin/src/index.ts @@ -46,7 +46,9 @@ function webpackReleaseInjectionPlugin(injectionCode: string): UnpluginOptions { }; } -function webpackBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): UnpluginOptions { +function webpackBundleSizeOptimizationsPlugin( + replacementValues: SentrySDKBuildFlags +): UnpluginOptions { return { name: "sentry-webpack-bundle-size-optimizations-plugin", webpack(compiler) { @@ -64,7 +66,7 @@ function webpackBundleSizeOptimizationsPlugin(values: SentrySDKBuildFlags): Unpl compiler.options.plugins.push( // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call new DefinePlugin({ - ...values, + ...replacementValues, }) ); }, From b08f9ff4a14aad8c4fe6dfa71523feb313778334 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 20 Oct 2023 10:21:56 +0200 Subject: [PATCH 3/7] fix whitespace tests --- .../bundle-size-optimizations.test.ts | 5 +++-- .../bundle-size-optimizations/expected/vite/bundle2.js | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts index ae909416..c34f6b99 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts @@ -8,8 +8,9 @@ function checkBundle(bundler: string, bundlePath: string): void { const actualPath = path.join(__dirname, "out", bundler, bundlePath); const expectedPath = path.join(__dirname, "expected", bundler, bundlePath); - const actual = fs.readFileSync(actualPath, "utf-8"); - const expected = fs.readFileSync(expectedPath, "utf-8"); + // We want to ignore whitespace differences, as they may not be stable + const actual = fs.readFileSync(actualPath, "utf-8").replace(/\s*/gm, ""); + const expected = fs.readFileSync(expectedPath, "utf-8").replace(/\s*/gm, ""); expect(actual).toContain(expected); } diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js index 5a144ba7..37553403 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js @@ -1,4 +1,4 @@ -function a() { +function n() { return { debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }; } -console.log(a()); +console.log(n()); From efa198e7f96e8d756bae8da10f99c7c770cb96bf Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 20 Oct 2023 10:36:07 +0200 Subject: [PATCH 4/7] fix expected checks --- .../bundle-size-optimizations.test.ts | 51 +++++++++++++++++-- .../expected/esbuild/bundle1.js | 5 -- .../expected/esbuild/bundle2.js | 4 -- .../expected/rollup/bundle1.js | 11 ---- .../expected/rollup/bundle2.js | 13 ----- .../expected/vite/bundle1.js | 5 -- .../expected/vite/bundle2.js | 4 -- .../expected/webpack4/bundle1.js | 10 ---- .../expected/webpack4/bundle2.js | 1 - .../expected/webpack5/bundle1.js | 10 ---- .../expected/webpack5/bundle2.js | 1 - 11 files changed, 47 insertions(+), 68 deletions(-) delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js delete mode 100644 packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts index c34f6b99..960eb66c 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts @@ -4,13 +4,56 @@ import path from "path"; import fs from "fs"; import { testIfNodeMajorVersionIsLessThan18 } from "../../utils/testIf"; +const expectedOutputs: Record> = { + esbuild: { + "bundle1.js": `function e(){let o=Math.random();return console.log("skip iframe",1),o}console.log(e());`, + "bundle2.js": `function a(){return{debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"}}console.log(a());`, + }, + rollup: { + "bundle1.js": `function run() { + const a = Math.random(); + { + const myNum = 1 ; + console.log("skip iframe", myNum); + } + + return a; +} + +console.log(run());`, + "bundle2.js": `function run() { + const obj = { + debug: "b", + trace: "b", + replayCanvas: "a" , + replayIframe: "a" , + replayShadowDom: "a" , + }; + + return obj; +} + +console.log(run());`, + }, + vite: { + "bundle1.js": `function d(){const e=Math.random();return console.log("skip iframe",1),e}console.log(d());`, + "bundle2.js": `function n(){return{debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"}}console.log(n());`, + }, + webpack4: { + "bundle1.js": `console.log(function(){const e=Math.random();{const e=1;console.log("skip iframe",e)}return e}())`, + "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"})`, + }, + webpack5: { + "bundle1.js": `console.log(function(){const e=Math.random();{const e=1;console.log("skip iframe",e)}return e}())`, + "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"});`, + }, +}; + function checkBundle(bundler: string, bundlePath: string): void { const actualPath = path.join(__dirname, "out", bundler, bundlePath); - const expectedPath = path.join(__dirname, "expected", bundler, bundlePath); - // We want to ignore whitespace differences, as they may not be stable - const actual = fs.readFileSync(actualPath, "utf-8").replace(/\s*/gm, ""); - const expected = fs.readFileSync(expectedPath, "utf-8").replace(/\s*/gm, ""); + const actual = fs.readFileSync(actualPath, "utf-8"); + const expected = expectedOutputs[bundler]?.[bundlePath]; expect(actual).toContain(expected); } diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js deleted file mode 100644 index 209709d1..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle1.js +++ /dev/null @@ -1,5 +0,0 @@ -function e() { - let o = Math.random(); - return console.log("skip iframe", 1), o; -} -console.log(e()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js deleted file mode 100644 index 5a144ba7..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/esbuild/bundle2.js +++ /dev/null @@ -1,4 +0,0 @@ -function a() { - return { debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }; -} -console.log(a()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js deleted file mode 100644 index 8fac4447..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle1.js +++ /dev/null @@ -1,11 +0,0 @@ -function run() { - const a = Math.random(); - { - const myNum = 1; - console.log("skip iframe", myNum); - } - - return a; -} - -console.log(run()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js deleted file mode 100644 index 3a57a27d..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/rollup/bundle2.js +++ /dev/null @@ -1,13 +0,0 @@ -function run() { - const obj = { - debug: "b", - trace: "b", - replayCanvas: "a", - replayIframe: "a", - replayShadowDom: "a", - }; - - return obj; -} - -console.log(run()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js deleted file mode 100644 index 153a6b7f..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle1.js +++ /dev/null @@ -1,5 +0,0 @@ -function d() { - const e = Math.random(); - return console.log("skip iframe", 1), e; -} -console.log(d()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js deleted file mode 100644 index 37553403..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/vite/bundle2.js +++ /dev/null @@ -1,4 +0,0 @@ -function n() { - return { debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }; -} -console.log(n()); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js deleted file mode 100644 index 8cc59d94..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle1.js +++ /dev/null @@ -1,10 +0,0 @@ -console.log( - (function () { - const e = Math.random(); - { - const e = 1; - console.log("skip iframe", e); - } - return e; - })() -); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js deleted file mode 100644 index 34c270c2..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack4/bundle2.js +++ /dev/null @@ -1 +0,0 @@ -console.log({ debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js deleted file mode 100644 index 8cc59d94..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle1.js +++ /dev/null @@ -1,10 +0,0 @@ -console.log( - (function () { - const e = Math.random(); - { - const e = 1; - console.log("skip iframe", e); - } - return e; - })() -); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js deleted file mode 100644 index 34c270c2..00000000 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/expected/webpack5/bundle2.js +++ /dev/null @@ -1 +0,0 @@ -console.log({ debug: "b", trace: "b", replayCanvas: "a", replayIframe: "a", replayShadowDom: "a" }); From a653af561422d22ea01ff9b8e8dfe2224a8ce4fb Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 20 Oct 2023 11:01:10 +0200 Subject: [PATCH 5/7] make bundle size optimization tests less flaky --- .../bundle-size-optimizations.test.ts | 49 +++++++------------ .../input/bundle1.js | 20 +++----- .../input/bundle2.js | 20 +++----- 3 files changed, 30 insertions(+), 59 deletions(-) diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts index 960eb66c..cbea7531 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts @@ -6,45 +6,29 @@ import { testIfNodeMajorVersionIsLessThan18 } from "../../utils/testIf"; const expectedOutputs: Record> = { esbuild: { - "bundle1.js": `function e(){let o=Math.random();return console.log("skip iframe",1),o}console.log(e());`, - "bundle2.js": `function a(){return{debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"}}console.log(a());`, + "bundle1.js": `console.log(1);`, + "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"});`, }, rollup: { - "bundle1.js": `function run() { - const a = Math.random(); - { - const myNum = 1 ; - console.log("skip iframe", myNum); - } - - return a; -} - -console.log(run());`, - "bundle2.js": `function run() { - const obj = { - debug: "b", - trace: "b", - replayCanvas: "a" , - replayIframe: "a" , - replayShadowDom: "a" , - }; - - return obj; -} - -console.log(run());`, + "bundle1.js": `console.log(1 );`, + "bundle2.js": `console.log({ + debug: "b", + trace: "b", + replayCanvas: "a" , + replayIframe: "a" , + replayShadowDom: "a" , +});`, }, vite: { - "bundle1.js": `function d(){const e=Math.random();return console.log("skip iframe",1),e}console.log(d());`, - "bundle2.js": `function n(){return{debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"}}console.log(n());`, + "bundle1.js": `console.log(1);`, + "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"});`, }, webpack4: { - "bundle1.js": `console.log(function(){const e=Math.random();{const e=1;console.log("skip iframe",e)}return e}())`, + "bundle1.js": `console.log(1)`, "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"})`, }, webpack5: { - "bundle1.js": `console.log(function(){const e=Math.random();{const e=1;console.log("skip iframe",e)}return e}())`, + "bundle1.js": `console.log(1)`, "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"});`, }, }; @@ -52,8 +36,9 @@ console.log(run());`, function checkBundle(bundler: string, bundlePath: string): void { const actualPath = path.join(__dirname, "out", bundler, bundlePath); - const actual = fs.readFileSync(actualPath, "utf-8"); - const expected = expectedOutputs[bundler]?.[bundlePath]; + // We replace multiple whitespaces with a single space for consistency + const actual = fs.readFileSync(actualPath, "utf-8").replace(/\s+/gim, " "); + const expected = expectedOutputs[bundler]?.[bundlePath]?.replace(/\s+/gim, " "); expect(actual).toContain(expected); } diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js index 63c801bd..85c2c6eb 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle1.js @@ -1,17 +1,9 @@ -function run() { - const a = Math.random(); - if (__SENTRY_DEBUG__ && a > 0.5) { - console.log("a > 0.5"); - } - if (__SENTRY_DEBUG__ && __RRWEB_EXCLUDE_CANVAS__) { - console.log("debug & exclude"); - } - if (__RRWEB_EXCLUDE_IFRAME__) { - const myNum = __RRWEB_EXCLUDE_CANVAS__ ? 1 : 2; - console.log("skip iframe", myNum); - } +if (__SENTRY_DEBUG__ && Math.random() > 0.5) { + console.log("was > 0.5"); +} - return a; +if (__SENTRY_DEBUG__ && __RRWEB_EXCLUDE_CANVAS__) { + console.log("debug & exclude"); } -console.log(run()); +console.log(__RRWEB_EXCLUDE_CANVAS__ ? 1 : 2); diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js index 6ee39eba..436e11bc 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/input/bundle2.js @@ -1,13 +1,7 @@ -function run() { - const obj = { - debug: __SENTRY_DEBUG__ ? "a" : "b", - trace: __SENTRY_TRACE__ ? "a" : "b", - replayCanvas: __RRWEB_EXCLUDE_CANVAS__ ? "a" : "b", - replayIframe: __RRWEB_EXCLUDE_IFRAME__ ? "a" : "b", - replayShadowDom: __RRWEB_EXCLUDE_SHADOW_DOM__ ? "a" : "b", - }; - - return obj; -} - -console.log(run()); +console.log({ + debug: __SENTRY_DEBUG__ ? "a" : "b", + trace: __SENTRY_TRACE__ ? "a" : "b", + replayCanvas: __RRWEB_EXCLUDE_CANVAS__ ? "a" : "b", + replayIframe: __RRWEB_EXCLUDE_IFRAME__ ? "a" : "b", + replayShadowDom: __RRWEB_EXCLUDE_SHADOW_DOM__ ? "a" : "b", +}); From 2b593f3ba3084a8272ab32ba75747ebf3bb78f14 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 23 Oct 2023 09:44:34 +0200 Subject: [PATCH 6/7] fix esbuild plugin --- packages/esbuild-plugin/src/index.ts | 22 +++++++------------ .../bundle-size-optimizations.test.ts | 4 ++-- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/packages/esbuild-plugin/src/index.ts b/packages/esbuild-plugin/src/index.ts index 31317dbe..b1061f65 100644 --- a/packages/esbuild-plugin/src/index.ts +++ b/packages/esbuild-plugin/src/index.ts @@ -3,11 +3,9 @@ import { Options, getDebugIdSnippet, SentrySDKBuildFlags, - replaceBooleanFlagsInCode, } from "@sentry/bundler-plugin-core"; import type { UnpluginOptions } from "unplugin"; import * as path from "path"; -import * as fs from "fs"; import { v4 as uuidv4 } from "uuid"; @@ -239,18 +237,14 @@ function esbuildBundleSizeOptimizationsPlugin( return { name: "sentry-esbuild-bundle-size-optimizations-plugin", esbuild: { - setup({ onLoad }) { - onLoad({ filter: /./ }, async (args) => { - const source = await fs.promises.readFile(args.path, "utf8"); - - const contents = replaceBooleanFlagsInCode(source, replacementValues); - - if (!contents) { - return null; - } - - return { contents: contents.code, loader: "default" }; - }); + setup({ initialOptions }) { + const replacementStringValues: Record = Object.entries( + replacementValues + ).reduce((acc, [key, value]) => { + return { ...acc, [key]: JSON.stringify(value) }; + }, {}); + + initialOptions.define = { ...initialOptions.define, ...replacementStringValues }; }, }, }; diff --git a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts index cbea7531..a12d9f78 100644 --- a/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts +++ b/packages/integration-tests/fixtures/bundle-size-optimizations/bundle-size-optimizations.test.ts @@ -6,8 +6,8 @@ import { testIfNodeMajorVersionIsLessThan18 } from "../../utils/testIf"; const expectedOutputs: Record> = { esbuild: { - "bundle1.js": `console.log(1);`, - "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"});`, + "bundle1.js": `console.log(1)`, + "bundle2.js": `console.log({debug:"b",trace:"b",replayCanvas:"a",replayIframe:"a",replayShadowDom:"a"})`, }, rollup: { "bundle1.js": `console.log(1 );`, From 8df41d83da8a302c6d03db4325535a9daec82bdd Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 23 Oct 2023 11:59:03 +0200 Subject: [PATCH 7/7] minor perf refactor --- packages/esbuild-plugin/src/index.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/esbuild-plugin/src/index.ts b/packages/esbuild-plugin/src/index.ts index b1061f65..cf5781d7 100644 --- a/packages/esbuild-plugin/src/index.ts +++ b/packages/esbuild-plugin/src/index.ts @@ -238,11 +238,10 @@ function esbuildBundleSizeOptimizationsPlugin( name: "sentry-esbuild-bundle-size-optimizations-plugin", esbuild: { setup({ initialOptions }) { - const replacementStringValues: Record = Object.entries( - replacementValues - ).reduce((acc, [key, value]) => { - return { ...acc, [key]: JSON.stringify(value) }; - }, {}); + const replacementStringValues: Record = {}; + Object.entries(replacementValues).forEach(([key, value]) => { + replacementStringValues[key] = JSON.stringify(value); + }); initialOptions.define = { ...initialOptions.define, ...replacementStringValues }; },