@@ -70,34 +70,52 @@ function exists(file) {
70
70
}
71
71
72
72
class CssWriter {
73
- constructor ( code , filename , map , warn , toAsset ) {
73
+ constructor ( context , bundle , isDev , code , filename , map ) {
74
74
this . code = code ;
75
75
this . filename = filename ;
76
- this . emit = toAsset ;
77
- this . warn = warn ;
78
- this . map = {
76
+
77
+ this . map = map && {
79
78
version : 3 ,
80
79
file : null ,
81
80
sources : map . sources ,
82
81
sourcesContent : map . sourcesContent ,
83
82
names : [ ] ,
84
83
mappings : map . mappings
85
84
} ;
85
+
86
+ this . warn = context . warn ;
87
+ this . emit = ( name , source ) => context . emitFile ( {
88
+ type : 'asset' , name, source
89
+ } ) ;
90
+
91
+ this . sourcemap = ( file , mapping ) => {
92
+ const ref = this . emit ( file , this . code ) ;
93
+ const filename = context . getFileName ( ref ) ;
94
+
95
+ const mapfile = `${ filename } .map` ;
96
+ const toRelative = src => path . relative ( path . dirname ( file ) , src ) ;
97
+
98
+ if ( bundle [ filename ] ) {
99
+ bundle [ filename ] . source += `\n/*# sourceMappingURL=${ mapfile } */` ;
100
+ } else {
101
+ // This should not ever happen, but just in case...
102
+ return this . warn ( `Missing "${ filename } " ("${ file } ") in bundle; skipping sourcemap!` ) ;
103
+ }
104
+
105
+ const source = JSON . stringify ( {
106
+ ...mapping ,
107
+ file : filename ,
108
+ sources : mapping . sources . map ( toRelative ) ,
109
+ } , null , isDev ? 2 : 0 ) ;
110
+
111
+ // use `fileName` to prevent additional Rollup hashing
112
+ context . emitFile ( { type : 'asset' , fileName : mapfile , source } ) ;
113
+ }
86
114
}
87
115
88
- write ( dest = this . filename , map = true ) {
89
- const basename = path . basename ( dest ) ;
90
-
91
- if ( map ) {
92
- this . emit ( dest , `${ this . code } \n/*# sourceMappingURL=${ basename } .map */` ) ;
93
- this . emit ( `${ dest } .map` , JSON . stringify ( {
94
- version : 3 ,
95
- file : basename ,
96
- sources : this . map . sources . map ( source => path . relative ( path . dirname ( dest ) , source ) ) ,
97
- sourcesContent : this . map . sourcesContent ,
98
- names : [ ] ,
99
- mappings : this . map . mappings
100
- } , null , 2 ) ) ;
116
+ write ( dest = this . filename , map = ! ! this . map ) {
117
+ if ( map && this . map ) {
118
+ this . sourcemap ( dest , this . map ) ;
101
119
} else {
102
120
this . emit ( dest , this . code ) ;
103
121
}
@@ -299,32 +317,33 @@ module.exports = function svelte(options = {}) {
299
317
/**
300
318
* If css: true then outputs a single file with all CSS bundled together
301
319
*/
302
- generateBundle ( options , bundle ) {
320
+ generateBundle ( config , bundle ) {
303
321
if ( css ) {
304
322
// TODO would be nice if there was a more idiomatic way to do this in Rollup
305
323
let result = '' ;
306
324
307
325
const mappings = [ ] ;
308
- const sources = [ ] ;
309
326
const sourcesContent = [ ] ;
327
+ const sources = [ ] ;
310
328
311
329
const chunks = Array . from ( cssLookup . keys ( ) ) . sort ( ) . map ( key => cssLookup . get ( key ) ) ;
312
330
313
331
for ( let chunk of chunks ) {
314
332
if ( ! chunk . code ) continue ;
315
333
result += chunk . code + '\n' ;
316
334
317
- if ( chunk . map ) {
318
- const i = sources . length ;
319
- sources . push ( chunk . map . sources [ 0 ] ) ;
320
- sourcesContent . push ( chunk . map . sourcesContent [ 0 ] ) ;
335
+
336
+ if ( config . sourcemap && chunk . map ) {
337
+ const len = sources . length ;
338
+ config . sourcemapExcludeSources || sources . push ( chunk . map . sources [ 0 ] ) ;
339
+ config . sourcemapExcludeSources || sourcesContent . push ( chunk . map . sourcesContent [ 0 ] ) ;
321
340
322
341
const decoded = decode ( chunk . map . mappings ) ;
323
342
324
- if ( i > 0 ) {
343
+ if ( len > 0 ) {
325
344
decoded . forEach ( line => {
326
345
line . forEach ( segment => {
327
- segment [ 1 ] = i ;
346
+ segment [ 1 ] = len ;
328
347
} ) ;
329
348
} ) ;
330
349
}
@@ -335,12 +354,10 @@ module.exports = function svelte(options = {}) {
335
354
336
355
const filename = Object . keys ( bundle ) [ 0 ] . split ( '.' ) . shift ( ) + '.css' ;
337
356
338
- const writer = new CssWriter ( result , filename , {
357
+ const writer = new CssWriter ( this , bundle , ! ! options . dev , result , filename , config . sourcemap && {
339
358
sources,
340
359
sourcesContent,
341
360
mappings : encode ( mappings )
342
- } , this . warn , ( fileName , source ) => {
343
- this . emitFile ( { type : 'asset' , fileName, source } ) ;
344
361
} ) ;
345
362
346
363
css ( writer ) ;
0 commit comments