Repository navigation
fix(core): Mark package as side-effect free - #6829
Merged
Merged
Conversation
devclaimjuimperai
requested review from
alwx,
antonis and
lucas-zimerman
as code owners
October 3, 2026 22:37
antonis
approved these changes
Oct 5, 2026
antonis
left a comment
Contributor
There was a problem hiding this comment.
LGTM 🎉 Thank you for your contribution 🙇
Verified this is safe to mark side-effect free:
- Tree-shaking confirmed — reproduced the issue's esbuild setup: import { SDK_VERSION } drops from ~86 KB / 119 input files down to a couple hundred bytes / 2 files with the flag applied. Matches the
expected result in the issue. - No import-time side effects — audited everything reachable from index.ts (excluding Node-only tools/): no bare side-effect imports, no top-level global patching/polyfills/registration. The
Promise/encode polyfills and all native/global touches run inside init()/wrap()/integration factories, so false (not a module allowlist) is the correct choice — consistent with @sentry/core,
@sentry/browser and @sentry/react. - No API/behavior change — package metadata only; default Metro builds are unaffected, tree-shaking bundlers (Rollup/webpack/esbuild/Expo) get the win.
7 of 11 tasks
3 tasks
antonis
added a commit
that referenced
this pull request
Oct 12, 2026
…6836) * ci(core): Guard the "sideEffects": false contract with a lint check PR #6829 marked @sentry/react-native as side-effect free so bundlers can tree-shake unused exports. That flag is an unguarded, package-wide promise: if any shipped module ever runs code at import time, a bundler may drop it when its exports are unused, silently breaking the SDK in consumer bundles. Add scripts/check-side-effects.js, wired into `yarn lint`, which scans src/js (excluding Node-only tools/) and fails if a module has an import-time side effect: a bare side-effect import, or a top-level executed statement (call, assignment, IIFE, global write). Declarations are allowed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ci(core): Harden side-effect scan against wrapped statements Review feedback (Seer + Cursor Bugbot): the scan only flagged top-level ExpressionStatements and clause-less imports, so a side effect wrapped in an `if`/`for`/`while`/`try`/block — or an empty-binding `import {} from 'x'` — slipped through while the lint stayed green. Invert to an allowlist: permit only pure declarations at module top level (function/class/interface/type/enum/namespace/variable/export/import-equals), flag every other statement, and treat an import that binds nothing (incl. `import {} from 'x'`) as a side-effect import. Type-only imports are erased, so they're allowed. Exclude `vendor/` (audited third-party code) alongside `tools/`, so the guard targets first-party SDK code. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📢 Type of change
📜 Description
Adds
"sideEffects": falseto@sentry/react-native's package.json, same as@sentry/core,@sentry/reactand@sentry/browseralready have.I grepped
src/jsfor anything that runs at import time. The only top-level calls are insrc/js/tools/(metro config, babel transformer, collect-modules script), and those get loaded by Node directly, never bundled into the app. Nothing else patches globals on import.💡 Motivation and Context
Fixes getsentry/sentry#126410. Without the flag, importing even just
SDK_VERSIONdrags most of the SDK into the bundle with esbuild/Rollup/webpack (and Expo's tree shaking).💚 How did you test it?
Ran the repro from the issue against the published 8.29.0, with and without the flag patched into its package.json (I also had to mark
promise/*as external):📝 Checklist
sendDefaultPIIis enabled.🔮 Next steps