From aae19db286d9cea3fee640ed174a1b58af7e85b1 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 11 Jun 2026 14:19:45 +0200 Subject: [PATCH 1/2] fix: Use build directory for web debug ID injection Pass the web build folder directly to `sentry-cli sourcemaps inject` instead of enumerating each `.js` file. The previous per-file workaround existed because of a sentry-cli bug that corrupted Flutter Web source maps; that bug was fixed in sentry-cli 2.58.6 (shipped in 3.4.0). Honors `ignore_web_source_paths` during injection via `--ignore` so ignored files are no longer mutated in-place (consistent with upload), adds `--allow-empty` to avoid erroring on builds without source maps, and skips injection when the web build directory does not exist. Co-authored-by: Cursor --- lib/sentry_dart_plugin.dart | 37 +++++++++++++++++++++---------------- test/plugin_test.dart | 18 +++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/sentry_dart_plugin.dart b/lib/sentry_dart_plugin.dart index 9782775..283b912 100644 --- a/lib/sentry_dart_plugin.dart +++ b/lib/sentry_dart_plugin.dart @@ -246,32 +246,37 @@ class SentryDartPlugin { return results; } - Future> _findAllJsFilePaths() => _collectWebFiles( - extension: '.js', - builder: (file) => file.path, - ); - Future> _findAllSourceMapFiles() => _collectWebFiles( extension: '.js.map', builder: (file) => file.absolute, ); Future _injectDebugIds() async { - List params = []; - params.add('sourcemaps'); - - // There is currently a sentry-cli bug that mutates the Flutter Web source map - // in such a way that it becomes corrupt / invalid -> that's why we need to - // inject each file separately instead of using a directory - // TODO(buenaflor): in the future we should use the directory when sentry-cli is fixed - final jsFilePaths = await _findAllJsFilePaths(); - if (jsFilePaths.isEmpty) { + final fs = injector.get(); + final webDir = fs.directory(_configuration.webBuildFilesFolder); + if (!await webDir.exists()) { + Log.warn( + 'Web build directory "${_configuration.webBuildFilesFolder}" does not exist, ' + 'skipping debug id injection.', + ); return false; } + List params = []; + params.add('sourcemaps'); params.add('inject'); - for (final path in jsFilePaths) { - params.add(path); + params.add(_configuration.webBuildFilesFolder); + + // Exit successfully when there are no JS + sourcemap pairs instead of + // erroring out, e.g. when the web build contains no source maps. + params.add('--allow-empty'); + + // Honor ignore_web_source_paths during injection so ignored files are not + // mutated in-place. Patterns are gitignore-style globs interpreted relative + // to the web build folder, matching the upload step. + for (final ignorePattern in _configuration.ignoreWebSourcePaths) { + params.add('--ignore'); + params.add(ignorePattern); } params.addAll(_baseCliParams()); diff --git a/test/plugin_test.dart b/test/plugin_test.dart index dae8d66..1fee705 100644 --- a/test/plugin_test.dart +++ b/test/plugin_test.dart @@ -102,7 +102,7 @@ void main() { expect(commandLog, [ '$cli $args debug-files upload $orgAndProject --include-sources $buildDir/app/outputs', '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject $buildDir/web/file.js $orgAndProject', + '$cli sourcemaps inject $buildDir/web --allow-empty --ignore testdir/**/*.js $orgAndProject', '$cli $args sourcemaps upload --release $release $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ ./ --ext dart --ignore testdir/**/*.js $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto --ignore-missing', '$cli $args releases $orgAndProject finalize $release' @@ -293,7 +293,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $release $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -314,7 +314,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $configRelease $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' @@ -337,7 +337,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $release --dist $build $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -359,7 +359,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $configRelease $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' @@ -381,7 +381,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $release --dist $configDist $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -406,7 +406,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $release --dist $configDist $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -429,7 +429,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $configRelease --dist $configDist $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' @@ -457,7 +457,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web/file.js $orgAndProject', + '$cli sourcemaps inject build/web --allow-empty $orgAndProject', '$cli $args sourcemaps upload --release $configRelease --dist $configDist --url-prefix ~/app/ $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' From 7be6f1fd701f52df2271ed68042e1d92f028eabc Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 11 Jun 2026 15:22:18 +0200 Subject: [PATCH 2/2] fix: remove invalid --allow-empty flag from sourcemaps inject Co-authored-by: Cursor --- lib/sentry_dart_plugin.dart | 4 ---- test/plugin_test.dart | 18 +++++++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/sentry_dart_plugin.dart b/lib/sentry_dart_plugin.dart index 283b912..731c388 100644 --- a/lib/sentry_dart_plugin.dart +++ b/lib/sentry_dart_plugin.dart @@ -267,10 +267,6 @@ class SentryDartPlugin { params.add('inject'); params.add(_configuration.webBuildFilesFolder); - // Exit successfully when there are no JS + sourcemap pairs instead of - // erroring out, e.g. when the web build contains no source maps. - params.add('--allow-empty'); - // Honor ignore_web_source_paths during injection so ignored files are not // mutated in-place. Patterns are gitignore-style globs interpreted relative // to the web build folder, matching the upload step. diff --git a/test/plugin_test.dart b/test/plugin_test.dart index 1fee705..d06ece6 100644 --- a/test/plugin_test.dart +++ b/test/plugin_test.dart @@ -102,7 +102,7 @@ void main() { expect(commandLog, [ '$cli $args debug-files upload $orgAndProject --include-sources $buildDir/app/outputs', '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject $buildDir/web --allow-empty --ignore testdir/**/*.js $orgAndProject', + '$cli sourcemaps inject $buildDir/web --ignore testdir/**/*.js $orgAndProject', '$cli $args sourcemaps upload --release $release $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ ./ --ext dart --ignore testdir/**/*.js $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto --ignore-missing', '$cli $args releases $orgAndProject finalize $release' @@ -293,7 +293,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $release $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -314,7 +314,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $configRelease $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' @@ -337,7 +337,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $release --dist $build $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -359,7 +359,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $configRelease $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' @@ -381,7 +381,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $release --dist $configDist $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -406,7 +406,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $release', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $release --dist $configDist $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $release --auto', '$cli $args releases $orgAndProject finalize $release' @@ -429,7 +429,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $configRelease --dist $configDist $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease' @@ -457,7 +457,7 @@ void main() { final args = commonArgs; expect(commandLog, [ '$cli $args releases $orgAndProject new $configRelease', - '$cli sourcemaps inject build/web --allow-empty $orgAndProject', + '$cli sourcemaps inject build/web $orgAndProject', '$cli $args sourcemaps upload --release $configRelease --dist $configDist --url-prefix ~/app/ $buildDir/web --ext js --ext map --strip-prefix ../../Documents --strip-prefix ../../../../ --strip-prefix ../../ --strip-prefix ../ $orgAndProject', '$cli $args releases $orgAndProject set-commits $configRelease --auto', '$cli $args releases $orgAndProject finalize $configRelease'