swc
swc copied to clipboard
SWC may generate invalid source map when inputSourceMap is provided
Describe the bug
https://stackblitz.com/~/github.com/noyobo/swc-issues
$ npm run build
[Error: failed to read input source map from user-provided sourcemap
Caused by:
bad reference to source #299] {
code: 'GenericFailure'
}
Input code
No response
Config
import {transform} from '@swc/core';
import fs from "node:fs";
const fileCode = fs.readFileSync("./a.js", "utf-8");
const fileMap = fs.readFileSync("./a.js.map", "utf-8");
// valid check https://evanw.github.io/source-map-visualization/
// transformed successfully
const result = await transform(fileCode, {
filename: 'a.js',
sourceMaps: true,
inputSourceMap: fileMap,
jsc: {target: 'es5'},
module: {type: "commonjs", strictMode: false},
})
// fs.writeFileSync("./a.transformed.js", result.code);
// fs.writeFileSync("./a.transformed.js.map", result.map);
// Using the result again to transform throws an error
// and verification failed in https://evanw.github.io/source-map-visualization/
await transform(result.code, {
filename: "a.js",
sourceMaps: true,
inputSourceMap: result.map,
module: {type: "commonjs", strictMode: false},
}).catch((e) => {
/**
* [Error: failed to read input source map from user-provided sourcemap
*
* Caused by:
* bad reference to source #299] {
* code: 'GenericFailure'
* }
*/
console.log(e);
});
Playground link (or link to the minimal reproduction)
https://stackblitz.com/~/github.com/noyobo/swc-issues
SWC Info output
No response
Expected behavior
The transformed sourceMap content can be used again
Actual behavior
No response
Version
1.4.11
Additional context
No response
@kdy1 Is it fixed in v1.4.12? I tried to use 1.4.12 and the problem still exists.
https://stackblitz.com/~/github.com/noyobo/swc-issues
> npx -y swc-info@latest && node ./transform-a.mjs
Operating System:
Platform: linux
Arch: x64
Machine Type: undefined
Version: Ubuntu 20.04.0 LTS Tue Apr 09 2024 10:36:06 GMT+0800 (中国标准时间)
CPU: (3 cores)
Models: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
Binaries:
Node: 18.18.0
npm: 10.2.3
Yarn: 1.22.19
pnpm: 8.15.3
Relevant Packages:
@swc/core: 1.4.12
@swc/helpers: N/A
@swc/types: N/A
SWC Config:
output: N/A
.swcrc path: N/A
Next.js info:
output: N/A
failed to process js file
Caused by:
0: failed to read input source map from user-provided sourcemap
1: bad reference to source #299
Seeing the same when updating from 1.4.11 to 1.5.5.
Caused by:
relative URL without a base
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/swc-0.275.0/src/lib.rs:386
ERROR failed to read input source map: failed to parse inline source map url
index.js.map
My hunch is that this issue is caused by npm packages that include references to source maps (via //# sourceMappingURL=<some-file.js.map> comments) but omit the referenced source map files from the published package.
One example is @trezor/protobuf. They've got a semi-related issue: https://github.com/trezor/trezor-suite/issues/9334
@davidmurdoch https://github.com/swc-project/swc/pull/8951 should fix your issue, although I'm not sure if it fixes this issue
1.5.6 same
Sorry, I can't provide a smaller reproducible example yet, I don't know what boundary conditions are triggered.
As an FYI - All of the errors we were seeing as a result of missing sourcemaps are not appearing. The sourcemaps are still not there, but we are at least not seeing those specific errors.
Thank you @kdy1!
I'm working on this, and the failure happens at https://github.com/swc-project/swc/blob/54ac992781fa5a619ee1bcb9f097c3915276d9a3/crates/swc/src/lib.rs#L423-L425.
sourcemap::SourceMap::from_slice(s.as_bytes()) fails, which means the input source map is a wrong source map file. And I think error in an explicitly passed file should not be ignored.
I added the babel transform process for comparison. From the results, it seems that babel's transform is always normal.
https://github.com/noyobo/swc-issues/blob/676db973ad2d5085adbb9e46188ae5c8a2a2a935/transform.mjs#L58
Using swc transform babelResult, I got a new error:
[Error: data did not match any variant of untagged enum InputSourceMap at line 1 column 2320758] {
code: 'InvalidArg'
}
Babel transforms babelResult again and it passes
https://github.com/noyobo/swc-issues/blob/676db973ad2d5085adbb9e46188ae5c8a2a2a935/transform.mjs#L73
It does not mean that the input source map is valid. babel may not validate the input source map before processing. Closing as the explicit input was wrong.
ok, but invalid inputSourceMap is generated from first transform of swc. 😅
https://github.com/noyobo/swc-issues/blob/676db973ad2d5085adbb9e46188ae5c8a2a2a935/transform.mjs#L13~L27
I'll see if there are smaller examples later.
My guess is that sourcemap uses a hashmap internally and that causes a problem for input source maps that have duplicate contents.
[crates/swc_common/src/source_map.rs:1223:13] orig.sources().count() = 300
[crates/swc_common/src/source_map.rs:1226:17] id = 0
[crates/swc_common/src/source_map.rs:1226:17] id = 1
[crates/swc_common/src/source_map.rs:1226:17] id = 2
[crates/swc_common/src/source_map.rs:1226:17] id = 3
[crates/swc_common/src/source_map.rs:1226:17] id = 4
[crates/swc_common/src/source_map.rs:1226:17] id = 5
[crates/swc_common/src/source_map.rs:1226:17] id = 6
[crates/swc_common/src/source_map.rs:1226:17] id = 7
[crates/swc_common/src/source_map.rs:1226:17] id = 8
[crates/swc_common/src/source_map.rs:1226:17] id = 9
[crates/swc_common/src/source_map.rs:1226:17] id = 10
[crates/swc_common/src/source_map.rs:1226:17] id = 11
[crates/swc_common/src/source_map.rs:1226:17] id = 12
[crates/swc_common/src/source_map.rs:1226:17] id = 13
[crates/swc_common/src/source_map.rs:1226:17] id = 14
[crates/swc_common/src/source_map.rs:1226:17] id = 15
[crates/swc_common/src/source_map.rs:1226:17] id = 16
[crates/swc_common/src/source_map.rs:1226:17] id = 17
[crates/swc_common/src/source_map.rs:1226:17] id = 18
[crates/swc_common/src/source_map.rs:1226:17] id = 19
[crates/swc_common/src/source_map.rs:1226:17] id = 20
[crates/swc_common/src/source_map.rs:1226:17] id = 21
[crates/swc_common/src/source_map.rs:1226:17] id = 22
[crates/swc_common/src/source_map.rs:1226:17] id = 23
[crates/swc_common/src/source_map.rs:1226:17] id = 24
[crates/swc_common/src/source_map.rs:1226:17] id = 25
[crates/swc_common/src/source_map.rs:1226:17] id = 26
[crates/swc_common/src/source_map.rs:1226:17] id = 27
[crates/swc_common/src/source_map.rs:1226:17] id = 28
[crates/swc_common/src/source_map.rs:1226:17] id = 29
[crates/swc_common/src/source_map.rs:1226:17] id = 30
[crates/swc_common/src/source_map.rs:1226:17] id = 31
[crates/swc_common/src/source_map.rs:1226:17] id = 32
[crates/swc_common/src/source_map.rs:1226:17] id = 33
[crates/swc_common/src/source_map.rs:1226:17] id = 34
[crates/swc_common/src/source_map.rs:1226:17] id = 35
[crates/swc_common/src/source_map.rs:1226:17] id = 36
[crates/swc_common/src/source_map.rs:1226:17] id = 37
[crates/swc_common/src/source_map.rs:1226:17] id = 38
[crates/swc_common/src/source_map.rs:1226:17] id = 39
[crates/swc_common/src/source_map.rs:1226:17] id = 40
[crates/swc_common/src/source_map.rs:1226:17] id = 41
[crates/swc_common/src/source_map.rs:1226:17] id = 42
[crates/swc_common/src/source_map.rs:1226:17] id = 43
[crates/swc_common/src/source_map.rs:1226:17] id = 44
[crates/swc_common/src/source_map.rs:1226:17] id = 45
[crates/swc_common/src/source_map.rs:1226:17] id = 46
[crates/swc_common/src/source_map.rs:1226:17] id = 47
[crates/swc_common/src/source_map.rs:1226:17] id = 48
[crates/swc_common/src/source_map.rs:1226:17] id = 49
[crates/swc_common/src/source_map.rs:1226:17] id = 50
[crates/swc_common/src/source_map.rs:1226:17] id = 51
[crates/swc_common/src/source_map.rs:1226:17] id = 52
[crates/swc_common/src/source_map.rs:1226:17] id = 53
[crates/swc_common/src/source_map.rs:1226:17] id = 54
[crates/swc_common/src/source_map.rs:1226:17] id = 55
[crates/swc_common/src/source_map.rs:1226:17] id = 56
[crates/swc_common/src/source_map.rs:1226:17] id = 57
[crates/swc_common/src/source_map.rs:1226:17] id = 58
[crates/swc_common/src/source_map.rs:1226:17] id = 59
[crates/swc_common/src/source_map.rs:1226:17] id = 60
[crates/swc_common/src/source_map.rs:1226:17] id = 61
[crates/swc_common/src/source_map.rs:1226:17] id = 62
[crates/swc_common/src/source_map.rs:1226:17] id = 63
[crates/swc_common/src/source_map.rs:1226:17] id = 64
[crates/swc_common/src/source_map.rs:1226:17] id = 65
[crates/swc_common/src/source_map.rs:1226:17] id = 66
[crates/swc_common/src/source_map.rs:1226:17] id = 67
[crates/swc_common/src/source_map.rs:1226:17] id = 68
[crates/swc_common/src/source_map.rs:1226:17] id = 69
[crates/swc_common/src/source_map.rs:1226:17] id = 70
[crates/swc_common/src/source_map.rs:1226:17] id = 71
[crates/swc_common/src/source_map.rs:1226:17] id = 72
[crates/swc_common/src/source_map.rs:1226:17] id = 73
[crates/swc_common/src/source_map.rs:1226:17] id = 74
[crates/swc_common/src/source_map.rs:1226:17] id = 75
[crates/swc_common/src/source_map.rs:1226:17] id = 76
[crates/swc_common/src/source_map.rs:1226:17] id = 77
[crates/swc_common/src/source_map.rs:1226:17] id = 78
[crates/swc_common/src/source_map.rs:1226:17] id = 79
[crates/swc_common/src/source_map.rs:1226:17] id = 80
[crates/swc_common/src/source_map.rs:1226:17] id = 81
[crates/swc_common/src/source_map.rs:1226:17] id = 82
[crates/swc_common/src/source_map.rs:1226:17] id = 83
[crates/swc_common/src/source_map.rs:1226:17] id = 84
[crates/swc_common/src/source_map.rs:1226:17] id = 85
[crates/swc_common/src/source_map.rs:1226:17] id = 86
[crates/swc_common/src/source_map.rs:1226:17] id = 87
[crates/swc_common/src/source_map.rs:1226:17] id = 88
[crates/swc_common/src/source_map.rs:1226:17] id = 89
[crates/swc_common/src/source_map.rs:1226:17] id = 90
[crates/swc_common/src/source_map.rs:1226:17] id = 91
[crates/swc_common/src/source_map.rs:1226:17] id = 92
[crates/swc_common/src/source_map.rs:1226:17] id = 93
[crates/swc_common/src/source_map.rs:1226:17] id = 94
[crates/swc_common/src/source_map.rs:1226:17] id = 95
[crates/swc_common/src/source_map.rs:1226:17] id = 96
[crates/swc_common/src/source_map.rs:1226:17] id = 97
[crates/swc_common/src/source_map.rs:1226:17] id = 98
[crates/swc_common/src/source_map.rs:1226:17] id = 99
[crates/swc_common/src/source_map.rs:1226:17] id = 100
[crates/swc_common/src/source_map.rs:1226:17] id = 101
[crates/swc_common/src/source_map.rs:1226:17] id = 102
[crates/swc_common/src/source_map.rs:1226:17] id = 103
[crates/swc_common/src/source_map.rs:1226:17] id = 104
[crates/swc_common/src/source_map.rs:1226:17] id = 105
[crates/swc_common/src/source_map.rs:1226:17] id = 106
[crates/swc_common/src/source_map.rs:1226:17] id = 107
[crates/swc_common/src/source_map.rs:1226:17] id = 108
[crates/swc_common/src/source_map.rs:1226:17] id = 109
[crates/swc_common/src/source_map.rs:1226:17] id = 110
[crates/swc_common/src/source_map.rs:1226:17] id = 111
[crates/swc_common/src/source_map.rs:1226:17] id = 112
[crates/swc_common/src/source_map.rs:1226:17] id = 113
[crates/swc_common/src/source_map.rs:1226:17] id = 114
[crates/swc_common/src/source_map.rs:1226:17] id = 115
[crates/swc_common/src/source_map.rs:1226:17] id = 116
[crates/swc_common/src/source_map.rs:1226:17] id = 117
[crates/swc_common/src/source_map.rs:1226:17] id = 118
[crates/swc_common/src/source_map.rs:1226:17] id = 119
[crates/swc_common/src/source_map.rs:1226:17] id = 120
[crates/swc_common/src/source_map.rs:1226:17] id = 121
[crates/swc_common/src/source_map.rs:1226:17] id = 122
[crates/swc_common/src/source_map.rs:1226:17] id = 123
[crates/swc_common/src/source_map.rs:1226:17] id = 124
[crates/swc_common/src/source_map.rs:1226:17] id = 125
[crates/swc_common/src/source_map.rs:1226:17] id = 126
[crates/swc_common/src/source_map.rs:1226:17] id = 127
[crates/swc_common/src/source_map.rs:1226:17] id = 128
[crates/swc_common/src/source_map.rs:1226:17] id = 129
[crates/swc_common/src/source_map.rs:1226:17] id = 130
[crates/swc_common/src/source_map.rs:1226:17] id = 131
[crates/swc_common/src/source_map.rs:1226:17] id = 132
[crates/swc_common/src/source_map.rs:1226:17] id = 133
[crates/swc_common/src/source_map.rs:1226:17] id = 134
[crates/swc_common/src/source_map.rs:1226:17] id = 135
[crates/swc_common/src/source_map.rs:1226:17] id = 136
[crates/swc_common/src/source_map.rs:1226:17] id = 137
[crates/swc_common/src/source_map.rs:1226:17] id = 138
[crates/swc_common/src/source_map.rs:1226:17] id = 139
[crates/swc_common/src/source_map.rs:1226:17] id = 140
[crates/swc_common/src/source_map.rs:1226:17] id = 141
[crates/swc_common/src/source_map.rs:1226:17] id = 142
[crates/swc_common/src/source_map.rs:1226:17] id = 143
[crates/swc_common/src/source_map.rs:1226:17] id = 144
[crates/swc_common/src/source_map.rs:1226:17] id = 145
[crates/swc_common/src/source_map.rs:1226:17] id = 146
[crates/swc_common/src/source_map.rs:1226:17] id = 147
[crates/swc_common/src/source_map.rs:1226:17] id = 148
[crates/swc_common/src/source_map.rs:1226:17] id = 149
[crates/swc_common/src/source_map.rs:1226:17] id = 150
[crates/swc_common/src/source_map.rs:1226:17] id = 151
[crates/swc_common/src/source_map.rs:1226:17] id = 152
[crates/swc_common/src/source_map.rs:1226:17] id = 153
[crates/swc_common/src/source_map.rs:1226:17] id = 154
[crates/swc_common/src/source_map.rs:1226:17] id = 155
[crates/swc_common/src/source_map.rs:1226:17] id = 156
[crates/swc_common/src/source_map.rs:1226:17] id = 157
[crates/swc_common/src/source_map.rs:1226:17] id = 158
[crates/swc_common/src/source_map.rs:1226:17] id = 159
[crates/swc_common/src/source_map.rs:1226:17] id = 160
[crates/swc_common/src/source_map.rs:1226:17] id = 161
[crates/swc_common/src/source_map.rs:1226:17] id = 162
[crates/swc_common/src/source_map.rs:1226:17] id = 163
[crates/swc_common/src/source_map.rs:1226:17] id = 164
[crates/swc_common/src/source_map.rs:1226:17] id = 165
[crates/swc_common/src/source_map.rs:1226:17] id = 166
[crates/swc_common/src/source_map.rs:1226:17] id = 167
[crates/swc_common/src/source_map.rs:1226:17] id = 168
[crates/swc_common/src/source_map.rs:1226:17] id = 169
[crates/swc_common/src/source_map.rs:1226:17] id = 170
[crates/swc_common/src/source_map.rs:1226:17] id = 171
[crates/swc_common/src/source_map.rs:1226:17] id = 172
[crates/swc_common/src/source_map.rs:1226:17] id = 173
[crates/swc_common/src/source_map.rs:1226:17] id = 174
[crates/swc_common/src/source_map.rs:1226:17] id = 175
[crates/swc_common/src/source_map.rs:1226:17] id = 176
[crates/swc_common/src/source_map.rs:1226:17] id = 177
[crates/swc_common/src/source_map.rs:1226:17] id = 178
[crates/swc_common/src/source_map.rs:1226:17] id = 179
[crates/swc_common/src/source_map.rs:1226:17] id = 180
[crates/swc_common/src/source_map.rs:1226:17] id = 181
[crates/swc_common/src/source_map.rs:1226:17] id = 182
[crates/swc_common/src/source_map.rs:1226:17] id = 183
[crates/swc_common/src/source_map.rs:1226:17] id = 184
[crates/swc_common/src/source_map.rs:1226:17] id = 185
[crates/swc_common/src/source_map.rs:1226:17] id = 186
[crates/swc_common/src/source_map.rs:1226:17] id = 187
[crates/swc_common/src/source_map.rs:1226:17] id = 188
[crates/swc_common/src/source_map.rs:1226:17] id = 189
[crates/swc_common/src/source_map.rs:1226:17] id = 190
[crates/swc_common/src/source_map.rs:1226:17] id = 191
[crates/swc_common/src/source_map.rs:1226:17] id = 192
[crates/swc_common/src/source_map.rs:1226:17] id = 193
[crates/swc_common/src/source_map.rs:1226:17] id = 194
[crates/swc_common/src/source_map.rs:1226:17] id = 195
[crates/swc_common/src/source_map.rs:1226:17] id = 196
[crates/swc_common/src/source_map.rs:1226:17] id = 197
[crates/swc_common/src/source_map.rs:1226:17] id = 198
[crates/swc_common/src/source_map.rs:1226:17] id = 199
[crates/swc_common/src/source_map.rs:1226:17] id = 200
[crates/swc_common/src/source_map.rs:1226:17] id = 201
[crates/swc_common/src/source_map.rs:1226:17] id = 192
[crates/swc_common/src/source_map.rs:1226:17] id = 202
[crates/swc_common/src/source_map.rs:1226:17] id = 203
[crates/swc_common/src/source_map.rs:1226:17] id = 204
[crates/swc_common/src/source_map.rs:1226:17] id = 205
[crates/swc_common/src/source_map.rs:1226:17] id = 206
[crates/swc_common/src/source_map.rs:1226:17] id = 207
[crates/swc_common/src/source_map.rs:1226:17] id = 208
[crates/swc_common/src/source_map.rs:1226:17] id = 209
[crates/swc_common/src/source_map.rs:1226:17] id = 210
[crates/swc_common/src/source_map.rs:1226:17] id = 211
[crates/swc_common/src/source_map.rs:1226:17] id = 212
[crates/swc_common/src/source_map.rs:1226:17] id = 213
[crates/swc_common/src/source_map.rs:1226:17] id = 214
[crates/swc_common/src/source_map.rs:1226:17] id = 215
[crates/swc_common/src/source_map.rs:1226:17] id = 216
[crates/swc_common/src/source_map.rs:1226:17] id = 217
[crates/swc_common/src/source_map.rs:1226:17] id = 218
[crates/swc_common/src/source_map.rs:1226:17] id = 219
[crates/swc_common/src/source_map.rs:1226:17] id = 220
[crates/swc_common/src/source_map.rs:1226:17] id = 221
[crates/swc_common/src/source_map.rs:1226:17] id = 222
[crates/swc_common/src/source_map.rs:1226:17] id = 223
[crates/swc_common/src/source_map.rs:1226:17] id = 224
[crates/swc_common/src/source_map.rs:1226:17] id = 225
[crates/swc_common/src/source_map.rs:1226:17] id = 226
[crates/swc_common/src/source_map.rs:1226:17] id = 227
[crates/swc_common/src/source_map.rs:1226:17] id = 228
[crates/swc_common/src/source_map.rs:1226:17] id = 229
[crates/swc_common/src/source_map.rs:1226:17] id = 230
[crates/swc_common/src/source_map.rs:1226:17] id = 231
[crates/swc_common/src/source_map.rs:1226:17] id = 232
[crates/swc_common/src/source_map.rs:1226:17] id = 233
[crates/swc_common/src/source_map.rs:1226:17] id = 234
[crates/swc_common/src/source_map.rs:1226:17] id = 235
[crates/swc_common/src/source_map.rs:1226:17] id = 236
[crates/swc_common/src/source_map.rs:1226:17] id = 237
[crates/swc_common/src/source_map.rs:1226:17] id = 238
[crates/swc_common/src/source_map.rs:1226:17] id = 239
[crates/swc_common/src/source_map.rs:1226:17] id = 240
[crates/swc_common/src/source_map.rs:1226:17] id = 241
[crates/swc_common/src/source_map.rs:1226:17] id = 242
[crates/swc_common/src/source_map.rs:1226:17] id = 243
[crates/swc_common/src/source_map.rs:1226:17] id = 244
[crates/swc_common/src/source_map.rs:1226:17] id = 245
[crates/swc_common/src/source_map.rs:1226:17] id = 246
[crates/swc_common/src/source_map.rs:1226:17] id = 247
[crates/swc_common/src/source_map.rs:1226:17] id = 248
[crates/swc_common/src/source_map.rs:1226:17] id = 249
[crates/swc_common/src/source_map.rs:1226:17] id = 250
[crates/swc_common/src/source_map.rs:1226:17] id = 251
[crates/swc_common/src/source_map.rs:1226:17] id = 252
[crates/swc_common/src/source_map.rs:1226:17] id = 253
[crates/swc_common/src/source_map.rs:1226:17] id = 254
[crates/swc_common/src/source_map.rs:1226:17] id = 255
[crates/swc_common/src/source_map.rs:1226:17] id = 256
[crates/swc_common/src/source_map.rs:1226:17] id = 257
[crates/swc_common/src/source_map.rs:1226:17] id = 258
[crates/swc_common/src/source_map.rs:1226:17] id = 259
[crates/swc_common/src/source_map.rs:1226:17] id = 260
[crates/swc_common/src/source_map.rs:1226:17] id = 261
[crates/swc_common/src/source_map.rs:1226:17] id = 262
[crates/swc_common/src/source_map.rs:1226:17] id = 263
[crates/swc_common/src/source_map.rs:1226:17] id = 264
[crates/swc_common/src/source_map.rs:1226:17] id = 265
[crates/swc_common/src/source_map.rs:1226:17] id = 266
[crates/swc_common/src/source_map.rs:1226:17] id = 267
[crates/swc_common/src/source_map.rs:1226:17] id = 268
[crates/swc_common/src/source_map.rs:1226:17] id = 269
[crates/swc_common/src/source_map.rs:1226:17] id = 270
[crates/swc_common/src/source_map.rs:1226:17] id = 271
[crates/swc_common/src/source_map.rs:1226:17] id = 272
[crates/swc_common/src/source_map.rs:1226:17] id = 273
[crates/swc_common/src/source_map.rs:1226:17] id = 274
[crates/swc_common/src/source_map.rs:1226:17] id = 275
[crates/swc_common/src/source_map.rs:1226:17] id = 276
[crates/swc_common/src/source_map.rs:1226:17] id = 277
[crates/swc_common/src/source_map.rs:1226:17] id = 278
[crates/swc_common/src/source_map.rs:1226:17] id = 279
[crates/swc_common/src/source_map.rs:1226:17] id = 280
[crates/swc_common/src/source_map.rs:1226:17] id = 281
[crates/swc_common/src/source_map.rs:1226:17] id = 282
[crates/swc_common/src/source_map.rs:1226:17] id = 283
[crates/swc_common/src/source_map.rs:1226:17] id = 284
[crates/swc_common/src/source_map.rs:1226:17] id = 285
[crates/swc_common/src/source_map.rs:1226:17] id = 286
[crates/swc_common/src/source_map.rs:1226:17] id = 287
[crates/swc_common/src/source_map.rs:1226:17] id = 288
[crates/swc_common/src/source_map.rs:1226:17] id = 289
[crates/swc_common/src/source_map.rs:1226:17] id = 290
[crates/swc_common/src/source_map.rs:1226:17] id = 291
[crates/swc_common/src/source_map.rs:1226:17] id = 292
[crates/swc_common/src/source_map.rs:1226:17] id = 293
[crates/swc_common/src/source_map.rs:1226:17] id = 294
[crates/swc_common/src/source_map.rs:1226:17] id = 295
[crates/swc_common/src/source_map.rs:1226:17] id = 296
[crates/swc_common/src/source_map.rs:1226:17] id = 297
[crates/swc_common/src/source_map.rs:1226:17] id = 298
[crates/swc_common/src/source_map.rs:1226:17] id = 201
[crates/swc_common/src/source_map.rs:1226:17] id = 192
if id == 192 {
dbg!(src);
}
[crates/swc_common/src/source_map.rs:1231:21] src = "/Users/noyobo/home/gitlab/tuya-public/illuminate-base-mp/dist/../dist/src/components.ts"
Yeap it was the cause
I left https://github.com/getsentry/rust-sourcemap/issues/89
Something in v1.4.12 (and still present in v7.22.8) of @swc-project/swc is causing the following error when targeting es5 + sourcemap: true
Caused by:
relative URL without a base
at /Users/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/swc-0.282.3/src/lib.rs:407
ERROR failed to read input source map: failed to parse inline source map url out.js.map
In my case, I'm using tsup; my options currently are:
- Downgrade to
@swc/core/1.v.4.11 - Disable
sourcemap: falsein tsup.config.ts - Or change to
target: es6in tsup.config.ts
After looking at this a bit more, a minimal reproduction looks like this
npm init
npm install @swc/[email protected] [email protected] [email protected] --save-dev
# create a file to build
echo "export default () => console.log('hello world');" > index.ts
# remove dist and tsup it
rm -rf ./dist/ && npx tsup --sourcemap --treeshake --target es5 ./index.ts
# results in error
# > ERROR failed to read input source map: failed to parse inline source map url
It looks like there's a race condition. If you run again and ./dist already has the output, then it will not fail
https://github.com/getsentry/rust-sourcemap/pull/91 is still not merged/published so it's expected
Wait?, I tested version 1.7.7-nightly-20240806.4, and it just didn't report an error. But the generated sourcemap seems to be unavailable
- Use swc transform a.js & a.js.map
console.log('==== use swc transform es6 to es5 ====');
// transformed successfully
const result = await transform(fileCode, {
filename: 'a.js',
sourceMaps: true,
inputSourceMap: fileMap,
jsc: { target: 'es5' },
minify: true,
module: { type: 'commonjs', strictMode: false },
});
fs.writeFileSync('./a.swc.js', result.code);
fs.writeFileSync('./a.swc.js.map', result.map);
- Validate transformed sourcemap
const fs = require('fs');
const path = require('path');
const { SourceMapConsumer } = require('source-map'); // 0.7.4
async function verifySourcemap({ file, map, offset, line }) {
const sourceMap = fs.readFileSync(map, 'utf8');
const consumer = await new SourceMapConsumer(sourceMap);
const originalPosition = consumer.originalPositionFor({
line: line,
column: offset,
});
if (originalPosition.source === null) {
// @swc/core@nightly always return null for source
return null;
}
let miniCode = fs.readFileSync(file, 'utf8');
miniCode = miniCode.split('\n')[line - 1];
miniCode = miniCode.substring(offset - 20, offset + 20);
const source = consumer.sourceContentFor(originalPosition.source);
const code = source.split('\n')[originalPosition.line - 1];
// 1.7.6 that works
return { sourceFile: originalPosition.source, code, miniCode };
}
verifySourcemap({
file: path.join(__dirname, 'a.swc.js'),
map: path.join(__dirname, 'a.swc.js.map'),
line: 1,
offset: 207274,
}).then((result) => {
console.log('swc:', result);
});
Is this a new problem?
Yes, please file another issue
This closed issue has been automatically locked because it had no new activity for a month. If you are running into a similar issue, please create a new issue with the steps to reproduce. Thank you.