Skip to content

Commit acdd0c8

Browse files
authored
fix: source-map matching in React Native DevTools (#787)
* fix: populate namespace in SourceMapDevToolPlugin * chore: add TODO for fixing directory structure in dev tools * fix: proper sourceUrl on iOS * chore: add uniqueName to tester-app * fix: proper sourceUrl on Android * refactor: align both platforms handling of query param * chore: add changeset * chore: clang format * refactor: review fixes
1 parent cf42d14 commit acdd0c8

File tree

15 files changed

+88
-41
lines changed

15 files changed

+88
-41
lines changed

.changeset/cold-apes-swim.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@callstack/repack": patch
3+
---
4+
5+
Fix sourceURL of bundles so source maps can be matched in dev tools

apps/tester-app/rspack.config.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export default (env) => {
4343
filename: 'index.bundle',
4444
chunkFilename: '[name].chunk.bundle',
4545
publicPath: Repack.getPublicPath({ platform, devServer }),
46+
uniqueName: 'tester-app',
4647
},
4748
optimization: {
4849
minimize,

apps/tester-app/webpack.config.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default (env) => {
5656
filename: 'index.bundle',
5757
chunkFilename: '[name].chunk.bundle',
5858
publicPath: Repack.getPublicPath({ platform, devServer }),
59+
uniqueName: 'tester-app',
5960
},
6061
optimization: {
6162
minimize,

apps/tester-federation-v2/rspack.config.host-app.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default (env) => {
4242
filename: 'index.bundle',
4343
chunkFilename: '[name].chunk.bundle',
4444
publicPath: Repack.getPublicPath({ platform, devServer }),
45-
uniqueName: 'MF2-HostApp',
45+
uniqueName: 'MF2Tester-HostApp',
4646
},
4747
optimization: {
4848
minimize,

apps/tester-federation-v2/rspack.config.mini-app.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default (env) => {
3939
filename: 'index.bundle',
4040
chunkFilename: '[name].chunk.bundle',
4141
publicPath: Repack.getPublicPath({ platform, devServer }),
42-
uniqueName: 'MF2-MiniApp',
42+
uniqueName: 'MF2Tester-MiniApp',
4343
},
4444
optimization: {
4545
minimize,

apps/tester-federation-v2/webpack.config.host-app.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default (env) => {
4242
filename: 'index.bundle',
4343
chunkFilename: '[name].chunk.bundle',
4444
publicPath: Repack.getPublicPath({ platform, devServer }),
45-
uniqueName: 'MFTester-HostApp',
45+
uniqueName: 'MF2Tester-HostApp',
4646
},
4747
optimization: {
4848
minimize,

apps/tester-federation-v2/webpack.config.mini-app.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default (env) => {
3636
filename: 'index.bundle',
3737
chunkFilename: '[name].chunk.bundle',
3838
publicPath: Repack.getPublicPath({ platform, devServer }),
39-
uniqueName: 'MFTester-MiniApp',
39+
uniqueName: 'MF2Tester-MiniApp',
4040
},
4141
optimization: {
4242
minimize,

packages/repack/android/src/main/java/com/callstack/repack/FileSystemScriptLoader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ class FileSystemScriptLoader(private val reactContext: ReactContext, private val
1212
val path = config.url.path
1313
val file = File(path)
1414
val code: ByteArray = FileInputStream(file).use { it.readBytes() }
15-
nativeLoader.evaluate(code, config.uniqueId, promise)
15+
nativeLoader.evaluate(code, config.sourceUrl, promise)
1616
} else {
1717
val assetName = config.url.file.split("/").last()
1818
val inputStream = reactContext.assets.open(assetName)
1919
val code: ByteArray = inputStream.use { it.readBytes() }
20-
nativeLoader.evaluate(code, config.uniqueId, promise)
20+
nativeLoader.evaluate(code, config.sourceUrl, promise)
2121
}
2222
} catch (error: Exception) {
2323
promise.reject(

packages/repack/android/src/main/java/com/callstack/repack/RemoteScriptLoader.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class RemoteScriptLoader(val reactContext: ReactContext, private val nativeLoade
107107
throw Exception("Script file exists but could not be read: $file")
108108
}
109109

110-
nativeLoader.evaluate(code, config.uniqueId, promise)
110+
nativeLoader.evaluate(code, config.sourceUrl, promise)
111111
} catch (error: Exception) {
112112
promise.reject(
113113
ScriptLoadingError.ScriptEvalFailure.code,

packages/repack/android/src/main/java/com/callstack/repack/ScriptConfig.kt

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ import okhttp3.MediaType.Companion.toMediaType
66
import okhttp3.RequestBody
77
import okhttp3.RequestBody.Companion.toRequestBody
88
import java.net.URL
9+
import java.net.URI
910

1011
data class ScriptConfig(
11-
val scriptId: String,
12-
val url: URL,
13-
val query: String?,
14-
val fetch: Boolean,
15-
val absolute: Boolean,
16-
val method: String,
17-
val body: RequestBody?,
18-
val timeout: Int,
19-
val headers: Headers,
20-
val verifyScriptSignature: String,
21-
val uniqueId: String
12+
val scriptId: String,
13+
val url: URL,
14+
val query: String?,
15+
val fetch: Boolean,
16+
val absolute: Boolean,
17+
val method: String,
18+
val body: RequestBody?,
19+
val timeout: Int,
20+
val headers: Headers,
21+
val verifyScriptSignature: String,
22+
val uniqueId: String,
23+
val sourceUrl: String
2224
) {
2325
companion object {
2426
fun fromReadableMap(scriptId: String, value: ReadableMap): ScriptConfig {
@@ -33,13 +35,25 @@ data class ScriptConfig(
3335
val verifyScriptSignature = requireNotNull(value.getString("verifyScriptSignature"))
3436
val uniqueId = requireNotNull(value.getString("uniqueId"))
3537

36-
val url = URL(
37-
if (query != null) {
38-
"$urlString?$query"
39-
} else {
40-
urlString
41-
}
42-
)
38+
val initialUrl = URL(urlString)
39+
val uri = initialUrl.toURI()
40+
41+
val sourceUrl = initialUrl.toString()
42+
43+
// overrides any existing query in the URL with config.query
44+
val finalUri = if (query != null) {
45+
URI(
46+
uri.scheme,
47+
uri.authority,
48+
uri.path,
49+
query,
50+
uri.fragment
51+
)
52+
} else {
53+
uri
54+
}
55+
56+
val url = finalUri.toURL()
4357

4458
val headers = Headers.Builder()
4559
val keyIterator = headersMap?.keySetIterator()
@@ -55,17 +69,18 @@ data class ScriptConfig(
5569
val body = bodyString?.toRequestBody(contentType)
5670

5771
return ScriptConfig(
58-
scriptId,
59-
url,
60-
query,
61-
fetch,
62-
absolute,
63-
method,
64-
body,
65-
timeout,
66-
headers.build(),
67-
verifyScriptSignature,
68-
uniqueId
72+
scriptId,
73+
url,
74+
query,
75+
fetch,
76+
absolute,
77+
method,
78+
body,
79+
timeout,
80+
headers.build(),
81+
verifyScriptSignature,
82+
uniqueId,
83+
sourceUrl
6984
)
7085
}
7186
}

0 commit comments

Comments
 (0)