swc icon indicating copy to clipboard operation
swc copied to clipboard

SWC may generate invalid source map when inputSourceMap is provided

Open noyobo opened this issue 1 year ago • 15 comments

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

noyobo avatar Mar 28 '24 11:03 noyobo

@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

noyobo avatar Apr 09 '24 02:04 noyobo

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

davidmurdoch avatar May 10 '24 18:05 davidmurdoch

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 avatar May 10 '24 18:05 davidmurdoch

@davidmurdoch https://github.com/swc-project/swc/pull/8951 should fix your issue, although I'm not sure if it fixes this issue

kdy1 avatar May 13 '24 08:05 kdy1

1.5.6 same

Sorry, I can't provide a smaller reproducible example yet, I don't know what boundary conditions are triggered.

noyobo avatar May 15 '24 02:05 noyobo

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!

jd-carroll avatar May 23 '24 15:05 jd-carroll

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.

kdy1 avatar Jun 13 '24 04:06 kdy1

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

noyobo avatar Jun 14 '24 02:06 noyobo

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.

kdy1 avatar Jun 14 '24 03:06 kdy1

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.

noyobo avatar Jun 14 '24 06:06 noyobo

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

kdy1 avatar Jun 14 '24 07:06 kdy1

[crates/swc_common/src/source_map.rs:1226:17] id = 201
[crates/swc_common/src/source_map.rs:1226:17] id = 192

kdy1 avatar Jun 14 '24 07:06 kdy1

                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"

kdy1 avatar Jun 14 '24 07:06 kdy1

image

Yeap it was the cause

kdy1 avatar Jun 14 '24 07:06 kdy1

I left https://github.com/getsentry/rust-sourcemap/issues/89

kdy1 avatar Jun 14 '24 13:06 kdy1

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:

  1. Downgrade to @swc/core/1.v.4.11
  2. Disable sourcemap: false in tsup.config.ts
  3. Or change to target: es6 in 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

potench avatar Aug 01 '24 22:08 potench

https://github.com/getsentry/rust-sourcemap/pull/91 is still not merged/published so it's expected

kdy1 avatar Aug 02 '24 01:08 kdy1

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

  1. 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);
  1. 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?

noyobo avatar Aug 07 '24 03:08 noyobo

Yes, please file another issue

kdy1 avatar Aug 07 '24 03:08 kdy1

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.

swc-bot avatar Sep 06 '24 12:09 swc-bot