From b7ecec29db86ba425b092bd74f86d7fbb7b10bb4 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Wed, 30 Aug 2023 16:12:56 +0200 Subject: [PATCH 1/5] WIP --- Cargo.lock | 79 +++++++++++++++++++++++++- Cargo.toml | 6 +- src/utils/sourcemaps.rs | 20 +++---- src/utils/sourcemaps/inject.rs | 6 +- tests/integration/sourcemaps/inject.rs | 4 +- 5 files changed, 96 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index efe804eb2c..fb98de7585 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,6 +165,21 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -1256,6 +1271,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + [[package]] name = "libz-sys" version = "1.1.8" @@ -1479,6 +1500,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1838,6 +1860,32 @@ dependencies = [ "uuid", ] +[[package]] +name = "proptest" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +dependencies = [ + "bit-set", + "bitflags", + "byteorder", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quick-xml" version = "0.26.0" @@ -1903,6 +1951,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "range-collections" version = "0.2.4" @@ -2052,6 +2109,18 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.12" @@ -2246,6 +2315,7 @@ dependencies = [ "predicates", "prettytable-rs", "proguard", + "proptest", "r2d2", "rayon", "regex", @@ -2483,12 +2553,11 @@ dependencies = [ [[package]] name = "sourcemap" version = "6.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4cbf65ca7dc576cf50e21f8d0712d96d4fcfd797389744b7b222a85cdf5bd90" dependencies = [ "data-encoding", "debugid", "if_chain", + "magic_string", "rustc_version 0.2.3", "scroll 0.10.2", "serde", @@ -2874,6 +2943,12 @@ dependencies = [ "libc", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.10" diff --git a/Cargo.toml b/Cargo.toml index e610ac73a6..40a7a8b3d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,7 @@ sentry = { version = "0.31.2", default-features = false, features = [ serde = { version = "1.0.152", features = ["derive"] } serde_json = "1.0.93" sha1_smol = { version = "1.0.0", features = ["serde"] } -sourcemap = { version = "6.4.1", features = ["ram_bundle"] } +sourcemap = { version = "6.4.1", features = ["ram_bundle", "magic_string"] } symbolic = { version = "12.1.5", features = ["debuginfo-serde", "il2cpp"] } thiserror = "1.0.38" url = "2.3.1" @@ -81,6 +81,7 @@ magic_string = "0.3.4" insta = { version = "1.26.0", features = ["redactions", "yaml"] } mockito = "0.31.1" predicates = "2.1.5" +proptest = "1.2.0" tempfile = "3.3.0" trycmd = "0.14.11" @@ -113,3 +114,6 @@ winapi = "0.3.9" [profile.release] opt-level = 3 panic = "abort" + +[patch.crates-io] +sourcemap = { path = "../rust-sourcemap" } diff --git a/src/utils/sourcemaps.rs b/src/utils/sourcemaps.rs index e7905a7787..753196d54c 100644 --- a/src/utils/sourcemaps.rs +++ b/src/utils/sourcemaps.rs @@ -815,7 +815,7 @@ impl SourceMapProcessor { bail!("Invalid embedded sourcemap in source file {source_url}"); }; - let sourcemap = SourceMap::from_slice(&decoded) + let mut sourcemap = SourceMap::from_slice(&decoded) .context("Invalid embedded sourcemap in source file {source_url}")?; let debug_id = sourcemap @@ -827,12 +827,12 @@ impl SourceMapProcessor { inject::fixup_js_file(&mut source_file.contents, debug_id).context( format!("Failed to process {}", source_file.path.display()), )?; - let mut adjusted_map = - SourceMap::adjust_mappings(&sourcemap, &adjustment_map); - adjusted_map.set_debug_id(Some(debug_id)); + + sourcemap.adjust_mappings(&adjustment_map); + sourcemap.set_debug_id(Some(debug_id)); decoded.clear(); - adjusted_map.to_writer(&mut decoded)?; + sourcemap.to_writer(&mut decoded)?; let encoded = data_encoding::BASE64.encode(&decoded); let new_sourcemap_url = format!("{DATA_PREAMBLE}{encoded}"); @@ -867,7 +867,7 @@ impl SourceMapProcessor { // We need to do a bit of a dance here because we can't mutably // borrow the source file and the sourcemap at the same time. - let (sourcemap, debug_id, debug_id_fresh) = { + let (mut sourcemap, debug_id, debug_id_fresh) = { let sourcemap_file = &self.sources[&sourcemap_url]; let sm = SourceMap::from_slice(&sourcemap_file.contents).context( @@ -892,13 +892,13 @@ impl SourceMapProcessor { "Failed to process {}", source_file.path.display() ))?; - let mut adjusted_map = - SourceMap::adjust_mappings(&sourcemap, &adjustment_map); - adjusted_map.set_debug_id(Some(debug_id)); + + sourcemap.adjust_mappings(&adjustment_map); + sourcemap.set_debug_id(Some(debug_id)); let sourcemap_file = self.sources.get_mut(&sourcemap_url).unwrap(); sourcemap_file.contents.clear(); - adjusted_map.to_writer(&mut sourcemap_file.contents)?; + sourcemap.to_writer(&mut sourcemap_file.contents)?; sourcemap_file .headers diff --git a/src/utils/sourcemaps/inject.rs b/src/utils/sourcemaps/inject.rs index caecd9560a..ad42b24c73 100644 --- a/src/utils/sourcemaps/inject.rs +++ b/src/utils/sourcemaps/inject.rs @@ -145,16 +145,14 @@ pub fn fixup_js_file(js_contents: &mut Vec, debug_id: DebugId) -> Result Date: Wed, 6 Sep 2023 17:23:25 +0200 Subject: [PATCH 2/5] WIP --- src/utils/sourcemaps/inject.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/utils/sourcemaps/inject.rs b/src/utils/sourcemaps/inject.rs index ad42b24c73..caecd9560a 100644 --- a/src/utils/sourcemaps/inject.rs +++ b/src/utils/sourcemaps/inject.rs @@ -145,14 +145,16 @@ pub fn fixup_js_file(js_contents: &mut Vec, debug_id: DebugId) -> Result Date: Thu, 7 Sep 2023 10:07:32 +0200 Subject: [PATCH 3/5] WIP --- Cargo.lock | 77 ------------------------------------------------------ Cargo.toml | 3 +-- 2 files changed, 1 insertion(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 327f53ac09..933aaca9c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,21 +165,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bitflags" version = "1.3.2" @@ -1271,12 +1256,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - [[package]] name = "libz-sys" version = "1.1.8" @@ -1500,7 +1479,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -1860,32 +1838,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "proptest" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" -dependencies = [ - "bit-set", - "bitflags", - "byteorder", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quick-xml" version = "0.26.0" @@ -1951,15 +1903,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - [[package]] name = "range-collections" version = "0.2.4" @@ -2109,18 +2052,6 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - [[package]] name = "ryu" version = "1.0.12" @@ -2315,7 +2246,6 @@ dependencies = [ "predicates", "prettytable-rs", "proguard", - "proptest", "r2d2", "rayon", "regex", @@ -2557,7 +2487,6 @@ dependencies = [ "data-encoding", "debugid", "if_chain", - "magic_string", "rustc_version 0.2.3", "scroll 0.10.2", "serde", @@ -2943,12 +2872,6 @@ dependencies = [ "libc", ] -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - [[package]] name = "unicode-bidi" version = "0.3.10" diff --git a/Cargo.toml b/Cargo.toml index d65f486777..bee93c25a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,7 @@ sentry = { version = "0.31.2", default-features = false, features = [ serde = { version = "1.0.152", features = ["derive"] } serde_json = "1.0.93" sha1_smol = { version = "1.0.0", features = ["serde"] } -sourcemap = { version = "6.4.1", features = ["ram_bundle", "magic_string"] } +sourcemap = { version = "6.4.1", features = ["ram_bundle"] } symbolic = { version = "12.1.5", features = ["debuginfo-serde", "il2cpp"] } thiserror = "1.0.38" url = "2.3.1" @@ -81,7 +81,6 @@ magic_string = "0.3.4" insta = { version = "1.26.0", features = ["redactions", "yaml"] } mockito = "0.31.1" predicates = "2.1.5" -proptest = "1.2.0" tempfile = "3.3.0" trycmd = "0.14.11" From a7d0b5a1f4ebbce9b63ba6560a49f90ee35344d6 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Thu, 7 Sep 2023 10:23:12 +0200 Subject: [PATCH 4/5] WIP --- Cargo.lock | 4 +++- Cargo.toml | 5 +---- .../_fixtures/inject_bundlers/esbuild/cjs.js.map.expected | 2 +- .../_fixtures/inject_bundlers/esbuild/iife.js.map.expected | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 933aaca9c5..0a4c5c1ab8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2482,7 +2482,9 @@ dependencies = [ [[package]] name = "sourcemap" -version = "6.4.1" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbecc42a2b6131acc3bf9a25c9fe4161dba438eb52131bba83c5d781b5b70be3" dependencies = [ "data-encoding", "debugid", diff --git a/Cargo.toml b/Cargo.toml index bee93c25a3..af7441f638 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,7 @@ sentry = { version = "0.31.2", default-features = false, features = [ serde = { version = "1.0.152", features = ["derive"] } serde_json = "1.0.93" sha1_smol = { version = "1.0.0", features = ["serde"] } -sourcemap = { version = "6.4.1", features = ["ram_bundle"] } +sourcemap = { version = "7.0.0", features = ["ram_bundle"] } symbolic = { version = "12.1.5", features = ["debuginfo-serde", "il2cpp"] } thiserror = "1.0.38" url = "2.3.1" @@ -113,6 +113,3 @@ winapi = "0.3.9" [profile.release] opt-level = 3 panic = "abort" - -[patch.crates-io] -sourcemap = { path = "../rust-sourcemap" } diff --git a/tests/integration/_fixtures/inject_bundlers/esbuild/cjs.js.map.expected b/tests/integration/_fixtures/inject_bundlers/esbuild/cjs.js.map.expected index 23d0396923..2f286f03ed 100644 --- a/tests/integration/_fixtures/inject_bundlers/esbuild/cjs.js.map.expected +++ b/tests/integration/_fixtures/inject_bundlers/esbuild/cjs.js.map.expected @@ -1 +1 @@ -{"version":3,"sources":["../src/bar.js","../src/foo.js","../src/index.js"],"sourcesContent":["export function bar(fn, msg) {\n fn(msg);\n}\n","import { bar } from './bar.js';\n\nexport function foo(fn, msg) {\n bar(fn, msg);\n}\n","\"use strict\";\nimport { foo } from './foo.js';\n\nfunction wat(fn, msg) {\n foo(fn, msg);\n}\n\nwat(function hello(msg) {\n throw new Error(msg);\n}, 'boop');\n"],"names":["bar","fn","msg","foo","wat"],"mappings":";;AAAO,SAASA,EAAIC,EAAIC,EAAK,CAC3BD,EAAGC,CAAG,CACR,CCAO,SAASC,EAAIF,EAAIC,EAAK,CAC3BF,EAAIC,EAAIC,CAAG,CACb,CCDA,SAASE,EAAIH,EAAIC,EAAK,CACpBC,EAAIF,EAAIC,CAAG,CACb,CAEAE,EAAI,SAAeF,EAAK,CACtB,MAAM,IAAI,MAAMA,CAAG,CACrB,EAAG,MAAM","debug_id":"a9f9a996-4e6c-5119-b8b8-e64559a6554c"} \ No newline at end of file +{"version":3,"sources":["../src/bar.js","../src/foo.js","../src/index.js"],"sourcesContent":["export function bar(fn, msg) {\n fn(msg);\n}\n","import { bar } from './bar.js';\n\nexport function foo(fn, msg) {\n bar(fn, msg);\n}\n","\"use strict\";\nimport { foo } from './foo.js';\n\nfunction wat(fn, msg) {\n foo(fn, msg);\n}\n\nwat(function hello(msg) {\n throw new Error(msg);\n}, 'boop');\n"],"names":["bar","fn","msg","foo","fn","msg","bar","wat","fn","msg","foo"],"mappings":";;AAAO,SAASA,EAAIC,EAAIC,EAAK,CAC3BD,EAAGC,CAAG,CACR,CCAO,SAASC,EAAIC,EAAIC,EAAK,CAC3BC,EAAIF,EAAIC,CAAG,CACb,CCDA,SAASE,EAAIC,EAAIC,EAAK,CACpBC,EAAIF,EAAIC,CAAG,CACb,CAEAF,EAAI,SAAeE,EAAK,CACtB,MAAM,IAAI,MAAMA,CAAG,CACrB,EAAG,MAAM","debug_id":"a9f9a996-4e6c-5119-b8b8-e64559a6554c"} \ No newline at end of file diff --git a/tests/integration/_fixtures/inject_bundlers/esbuild/iife.js.map.expected b/tests/integration/_fixtures/inject_bundlers/esbuild/iife.js.map.expected index fdb4ae06b3..ec6c183e79 100644 --- a/tests/integration/_fixtures/inject_bundlers/esbuild/iife.js.map.expected +++ b/tests/integration/_fixtures/inject_bundlers/esbuild/iife.js.map.expected @@ -1 +1 @@ -{"version":3,"sources":["../src/bar.js","../src/foo.js","../src/index.js"],"sourcesContent":["export function bar(fn, msg) {\n fn(msg);\n}\n","import { bar } from './bar.js';\n\nexport function foo(fn, msg) {\n bar(fn, msg);\n}\n","import { foo } from './foo.js';\n\nfunction wat(fn, msg) {\n foo(fn, msg);\n}\n\nwat(function hello(msg) {\n throw new Error(msg);\n}, 'boop');\n"],"names":["bar","fn","msg","foo","wat"],"mappings":";;MAAO,SAASA,EAAIC,EAAIC,EAAK,CAC3BD,EAAGC,CAAG,CACR,CCAO,SAASC,EAAIF,EAAIC,EAAK,CAC3BF,EAAIC,EAAIC,CAAG,CACb,CCFA,SAASE,EAAIH,EAAIC,EAAK,CACpBC,EAAIF,EAAIC,CAAG,CACb,CAEAE,EAAI,SAAeF,EAAK,CACtB,MAAM,IAAI,MAAMA,CAAG,CACrB,EAAG,MAAM","debug_id":"dd751360-5eae-531d-87f4-5e00c846a9a3"} \ No newline at end of file +{"version":3,"sources":["../src/bar.js","../src/foo.js","../src/index.js"],"sourcesContent":["export function bar(fn, msg) {\n fn(msg);\n}\n","import { bar } from './bar.js';\n\nexport function foo(fn, msg) {\n bar(fn, msg);\n}\n","import { foo } from './foo.js';\n\nfunction wat(fn, msg) {\n foo(fn, msg);\n}\n\nwat(function hello(msg) {\n throw new Error(msg);\n}, 'boop');\n"],"names":["bar","fn","msg","foo","fn","msg","bar","wat","fn","msg","foo"],"mappings":";;MAAO,SAASA,EAAIC,EAAIC,EAAK,CAC3BD,EAAGC,CAAG,CACR,CCAO,SAASC,EAAIC,EAAIC,EAAK,CAC3BC,EAAIF,EAAIC,CAAG,CACb,CCFA,SAASE,EAAIC,EAAIC,EAAK,CACpBC,EAAIF,EAAIC,CAAG,CACb,CAEAF,EAAI,SAAeE,EAAK,CACtB,MAAM,IAAI,MAAMA,CAAG,CACrB,EAAG,MAAM","debug_id":"dd751360-5eae-531d-87f4-5e00c846a9a3"} \ No newline at end of file From 29c7572e630934f8a0fa0c824476e5045d25a63d Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Thu, 7 Sep 2023 10:36:11 +0200 Subject: [PATCH 5/5] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7479b07e5..454f0a901f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### Various fixes & improvements - fix(sourcemaps): Query parameters and fragments are removed from source mapping URLs (#1735) by @loewenheim +- fix(sourcemaps): Debug ID injection is significantly faster (#1736) by @loewenheim ## 2.20.6