@@ -237,7 +237,17 @@ impl<'a, 'o, 's, P: SourceProvider> Bundler<'a, 'o, 's, P> {
237237 . flat_map ( |s| s. stylesheet . as_ref ( ) . unwrap ( ) . sources . iter ( ) . cloned ( ) )
238238 . collect ( ) ;
239239
240- Ok ( StyleSheet :: new ( sources, CssRuleList ( rules) , self . options . clone ( ) ) )
240+ let mut stylesheet = StyleSheet :: new ( sources, CssRuleList ( rules) , self . options . clone ( ) ) ;
241+
242+ stylesheet. source_map_urls = self
243+ . stylesheets
244+ . get_mut ( )
245+ . unwrap ( )
246+ . iter ( )
247+ . flat_map ( |s| s. stylesheet . as_ref ( ) . unwrap ( ) . source_map_urls . iter ( ) . cloned ( ) )
248+ . collect ( ) ;
249+
250+ Ok ( stylesheet)
241251 }
242252
243253 fn find_filename ( & self , source_index : u32 ) -> String {
@@ -329,14 +339,19 @@ impl<'a, 'o, 's, P: SourceProvider> Bundler<'a, 'o, 's, P> {
329339 opts. filename = filename. to_owned ( ) ;
330340 opts. source_index = source_index;
331341
342+ let mut stylesheet = StyleSheet :: parse ( code, opts) ?;
343+
332344 if let Some ( source_map) = & self . source_map {
333- let mut source_map = source_map. lock ( ) . unwrap ( ) ;
334- let source_index = source_map. add_source ( filename) ;
335- let _ = source_map. set_source_content ( source_index as usize , code) ;
345+ // Only add source if we don't have an input source map.
346+ // If we do, this will be handled by the printer when remapping locations.
347+ let sm = stylesheet. source_map_url ( 0 ) ;
348+ if sm. is_none ( ) || !sm. unwrap ( ) . starts_with ( "data" ) {
349+ let mut source_map = source_map. lock ( ) . unwrap ( ) ;
350+ let source_index = source_map. add_source ( filename) ;
351+ let _ = source_map. set_source_content ( source_index as usize , code) ;
352+ }
336353 }
337354
338- let mut stylesheet = StyleSheet :: parse ( code, opts) ?;
339-
340355 // Collect and load dependencies for this stylesheet in parallel.
341356 let dependencies: Result < Vec < u32 > , _ > = stylesheet
342357 . rules
@@ -1759,4 +1774,49 @@ mod tests {
17591774 }
17601775 ) ;
17611776 }
1777+
1778+ #[ test]
1779+ fn test_source_map ( ) {
1780+ let source = r#".imported {
1781+ content: "yay, file support!";
1782+ }
1783+
1784+ .selector {
1785+ margin: 1em;
1786+ background-color: #f60;
1787+ }
1788+
1789+ .selector .nested {
1790+ margin: 0.5em;
1791+ }
1792+
1793+ /*# sourceMappingURL=data:application/json;base64,ewoJInZlcnNpb24iOiAzLAoJInNvdXJjZVJvb3QiOiAicm9vdCIsCgkiZmlsZSI6ICJzdGRvdXQiLAoJInNvdXJjZXMiOiBbCgkJInN0ZGluIiwKCQkic2Fzcy9fdmFyaWFibGVzLnNjc3MiLAoJCSJzYXNzL19kZW1vLnNjc3MiCgldLAoJInNvdXJjZXNDb250ZW50IjogWwoJCSJAaW1wb3J0IFwiX3ZhcmlhYmxlc1wiO1xuQGltcG9ydCBcIl9kZW1vXCI7XG5cbi5zZWxlY3RvciB7XG4gIG1hcmdpbjogJHNpemU7XG4gIGJhY2tncm91bmQtY29sb3I6ICRicmFuZENvbG9yO1xuXG4gIC5uZXN0ZWQge1xuICAgIG1hcmdpbjogJHNpemUgLyAyO1xuICB9XG59IiwKCQkiJGJyYW5kQ29sb3I6ICNmNjA7XG4kc2l6ZTogMWVtOyIsCgkJIi5pbXBvcnRlZCB7XG4gIGNvbnRlbnQ6IFwieWF5LCBmaWxlIHN1cHBvcnQhXCI7XG59IgoJXSwKCSJtYXBwaW5ncyI6ICJBRUFBLFNBQVMsQ0FBQztFQUNSLE9BQU8sRUFBRSxvQkFBcUI7Q0FDL0I7O0FGQ0QsU0FBUyxDQUFDO0VBQ1IsTUFBTSxFQ0hELEdBQUc7RURJUixnQkFBZ0IsRUNMTCxJQUFJO0NEVWhCOztBQVBELFNBQVMsQ0FJUCxPQUFPLENBQUM7RUFDTixNQUFNLEVDUEgsS0FBRztDRFFQIiwKCSJuYW1lcyI6IFtdCn0= */"# ;
1794+
1795+ let fs = TestProvider {
1796+ map : fs ! {
1797+ "/a.css" : r#"
1798+ @import "/b.css";
1799+ .a { color: red; }
1800+ "# ,
1801+ "/b.css" : source
1802+ } ,
1803+ } ;
1804+
1805+ let mut sm = parcel_sourcemap:: SourceMap :: new ( "/" ) ;
1806+ let mut bundler = Bundler :: new ( & fs, Some ( & mut sm) , ParserOptions :: default ( ) ) ;
1807+ let mut stylesheet = bundler. bundle ( Path :: new ( "/a.css" ) ) . unwrap ( ) ;
1808+ stylesheet. minify ( MinifyOptions :: default ( ) ) . unwrap ( ) ;
1809+ stylesheet
1810+ . to_css ( PrinterOptions {
1811+ source_map : Some ( & mut sm) ,
1812+ minify : true ,
1813+ ..PrinterOptions :: default ( )
1814+ } )
1815+ . unwrap ( ) ;
1816+ let map = sm. to_json ( None ) . unwrap ( ) ;
1817+ assert_eq ! (
1818+ map,
1819+ r#"{"version":3,"sourceRoot":null,"mappings":"ACAA,uCCGA,2CAAA,8BFDQ","sources":["a.css","sass/_demo.scss","stdin"],"sourcesContent":["\n @import \"/b.css\";\n .a { color: red; }\n ",".imported {\n content: \"yay, file support!\";\n}","@import \"_variables\";\n@import \"_demo\";\n\n.selector {\n margin: $size;\n background-color: $brandColor;\n\n .nested {\n margin: $size / 2;\n }\n}"],"names":[]}"#
1820+ ) ;
1821+ }
17621822}
0 commit comments