13

I am using rollup with svelte + typescript + scss. My problem is that I am not able to generate source maps.

Following is my rollup config file:

import svelte from 'rollup-plugin-svelte'
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import livereload from 'rollup-plugin-livereload'
import { terser } from 'rollup-plugin-terser'
import typescript from '@rollup/plugin-typescript'
import alias from '@rollup/plugin-alias'
    
const production = !process.env.ROLLUP_WATCH
const path = require('path').resolve(__dirname, 'src')
const svelteOptions = require('./svelte.config')
    
function serve() {
    let server
    
    function toExit() {
        if (server) server.kill(0)
    }
    
    return {
        writeBundle() {
            if (server) return
            server = require('child_process').spawn(
                'yarn',
                ['run', 'start', '--', '--dev'],
                {
                    stdio: ['ignore', 'inherit', 'inherit'],
                    shell: true,
                }
            )
    
            process.on('SIGTERM', toExit)
            process.on('exit', toExit)
        },
    }
}
    
export default {
    input: 'src/main.ts',
    output: {
        sourcemap: true,
        format: 'iife',
        name: 'app',
        file: 'public/build/bundle.js',
    },
    plugins: [
        alias({
            entries: [
                { find: '@app', replacement: `${path}` },
                { find: '@components', replacement: `${path}/components` },
                { find: '@includes', replacement: `${path}/includes` },
                { find: '@styles', replacement: `${path}/styles` },
                { find: '@pages', replacement: `${path}/pages` },
            ],
        }),
        svelte(svelteOptions),
    
        // If you have external dependencies installed from
        // npm, you'll most likely need these plugins. In
        // some cases you'll need additional configuration -
        // consult the documentation for details:
        // https://github.com/rollup/plugins/tree/master/packages/commonjs
        resolve({
            browser: true,
            dedupe: ['svelte'],
        }),
        commonjs(),
        typescript({ sourceMap: !production }),
    
        // In dev mode, call `npm run start` once
        // the bundle has been generated
        !production && serve(),
    
        // Watch the `public` directory and refresh the
        // browser on changes when not in production
        !production && livereload('public'),
    
        // If we're building for production (npm run build
        // instead of npm run dev), minify
        production && terser(),
    ],
    watch: {
        clearScreen: false,
    },
}

I am not sure what exactly am I doing wrong. Here is the link to code I am using. Any help will be deeply appreciated!

flying sheep
  • 8,475
  • 5
  • 56
  • 73
dasfdsa
  • 7,102
  • 8
  • 51
  • 93
  • I just cloned your project, ran `npm run build`, and got the typescript sourcemap generated just fine. It outputs `bundle.js.map`. What command are you running that's giving you trouble? – Carlos Roso Aug 03 '20 at 15:36
  • @CarlosRoso Log something on chrome console in TS file and click on the line number to check if you see TS file in chrome inspector. (I have described my issue here: https://github.com/sveltejs/template/issues/157) – dasfdsa Aug 03 '20 at 15:38

5 Answers5

17

This is what worked for me: you need to set sourceMap: false in the typescript rollup plugin options.

export default {
  input: 'src/main.ts',
  output: {
    sourcemap: true,
    format: 'iife',
    ...
  },
  plugins: [
    ...
    svelte(...),
    typescript({ sourceMap: false }),
    ...
  ]
}

It turns out rollup's sourcemap collapser conflicts with the typescript's plugin sourcemap generator. That's why it works on prod builds but not in dev builds (because originally it is sourceMap: !production). Just let rollup do the heavy lifting.

Carlos Roso
  • 1,435
  • 1
  • 11
  • 14
  • 3
    This is ridiculous and so frustrating when you waste almost half an hour trying to figure out what's the unlogic logic behind the system. – vdegenne Jan 11 '22 at 10:47
  • 2
    Thanks for the tip! In my case, my plugin options were: `typescript({ tsconfig: './tsconfig.json' })`, but I had `"sourceMap": true` in my `tsconfig.json`. Removing that compiler option fixed it for me. – ChrisCrossCrash Feb 28 '22 at 17:22
7

As also mentioned by others, it seems like the combination of TypeScript and Rollup leads to the problem. Disabling the source map in TypeScript only fixes the problem of mapping Svelte to TypeScript. However you only receive a source map showing source in the compiled JavaScript, not in the original TypeScript. I finally found a solution, that worked for me: Just add the Option inlineSources: true to the TypeScript options:

typescript({ sourceMap: !production, inlineSources: !production }),

This circumvents the problem by simply not creating a duplicate SourceMap, but by copying the source code from TypeScript into the SourceMap.

freytag
  • 4,769
  • 2
  • 27
  • 32
  • 1
    I tried this, but I'm still just getting sourcemaps for compiled JavaScript (better than nothing), but not maps to the original TypeScript. Does the minifier make a difference? I'm using terser, not svelte. – kshetline Jun 30 '21 at 01:12
3

For anyone using terser, not svelte, this solved the same problem for me:

import sourcemaps from 'rollup-plugin-sourcemaps';
import { terser } from 'rollup-plugin-terser';
import typescript from '@rollup/plugin-typescript';

export default [
  {
    input: 'dist/index.js',
    output: [
      {
        file: 'dist/cjs/index.js',
        format: 'cjs'
      },
      {
        file: 'dist/fesm2015/index.js',
        format: 'es'
      }
    ],
    plugins: [
      sourcemaps(),
      terser(),
      typescript({ sourceMap: true, inlineSources: true })
    ]
  }
];

Apparently rollup-plugin-sourcemaps is needed to do the magic necessary to utilize the map files generated by the TypeScript compiler and feed them to terser.

kshetline
  • 12,547
  • 4
  • 37
  • 73
  • I tried doing `npm install rollup-plugin-sourcemaps --save-dev` but get deprecation warnings and other errors about peer dependencies. What installation steps did you follow to get this to work? – Eric Mutta Dec 21 '22 at 22:34
  • 1
    @Eric Mutta, all I did was the same basic install that you did. My only guess is that maybe something else in your dependencies is out of date with the latest `rollup-plugin-sourcemaps`, meaning either you have to update other packages or install an older version of `rollup-plugin-sourcemaps`. – kshetline Dec 21 '22 at 23:30
2

For me, I am able to map, by making sourcemap: "inline"

In the /build/index.esm.js file will have mapping inside.

export default {
  input: "src/index.ts",
  output: [
    {
      file: 'build/index.esm.js',
      format: 'es',
      sourcemap:  "inline"
    },
  ],
  plugins: [
    typescript({ sourceMap: false, inlineSources: true  }),
  ]
}
Haryono
  • 2,184
  • 1
  • 21
  • 14
1

I was having a similar issue with Karma, rollup, and typescript. I fixed it by adding "sourceRoot":"/base/" to my tsconfig.json file. Before: map file entries pointed to /src/. After: map file entries pointed to /base/src/ and everything worked.

// tsconfig.rollup.json
"compilerOptions": {
  "module": "ES2022",
  "esModuleInterop": true,
  "target": "ES2022",
  "moduleResolution": "classic",
  "sourceMap": true,
  "sourceRoot": "/base/"
 ...
}
// rollup.config.js
import typescript from '@rollup/plugin-typescript';
export default [
 {
  input: './src/test/test_context.spec.ts',
  output: {
    file: './dist/test/test_context.spec.js',
    format: 'es',
    sourcemap: 'inline'
  },
  plugins: [
    typescript({
      tsconfig: './tsconfig.rollup.json'
    })
  ]
}
];
Steve B
  • 36,818
  • 21
  • 101
  • 174
Eric Rohlfs
  • 1,811
  • 2
  • 19
  • 29