Skip to content

Commit 76ad1db

Browse files
committed
Enhance sourceMapIncludeSources option
1 parent a4cac51 commit 76ad1db

18 files changed

Lines changed: 303 additions & 79 deletions

lib/sass.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'src/import_cache.dart';
1616
import 'src/importer.dart';
1717
import 'src/importer/utils.dart';
1818
import 'src/logger.dart';
19+
import 'src/source_map_include_sources.dart';
1920
import 'src/syntax.dart';
2021
import 'src/util/nullable.dart';
2122
import 'src/visitor/serialize.dart';
@@ -26,6 +27,7 @@ export 'src/deprecation.dart';
2627
export 'src/exception.dart' show SassException;
2728
export 'src/importer.dart';
2829
export 'src/logger.dart' show Logger;
30+
export 'src/source_map_include_sources.dart';
2931
export 'src/syntax.dart';
3032
export 'src/value.dart'
3133
hide
@@ -112,6 +114,8 @@ CompileResult compileToResult(
112114
bool quietDeps = false,
113115
bool verbose = false,
114116
bool sourceMap = false,
117+
SourceMapIncludeSources sourceMapIncludeSources =
118+
SourceMapIncludeSources.auto,
115119
bool charset = true,
116120
Iterable<Deprecation>? silenceDeprecations,
117121
Iterable<Deprecation>? fatalDeprecations,
@@ -130,6 +134,7 @@ CompileResult compileToResult(
130134
quietDeps: quietDeps,
131135
verbose: verbose,
132136
sourceMap: sourceMap,
137+
sourceMapIncludeSources: sourceMapIncludeSources,
133138
charset: charset,
134139
silenceDeprecations: silenceDeprecations,
135140
fatalDeprecations: fatalDeprecations,
@@ -224,6 +229,8 @@ CompileResult compileStringToResult(
224229
bool quietDeps = false,
225230
bool verbose = false,
226231
bool sourceMap = false,
232+
SourceMapIncludeSources sourceMapIncludeSources =
233+
SourceMapIncludeSources.auto,
227234
bool charset = true,
228235
Iterable<Deprecation>? silenceDeprecations,
229236
Iterable<Deprecation>? fatalDeprecations,
@@ -245,6 +252,7 @@ CompileResult compileStringToResult(
245252
quietDeps: quietDeps,
246253
verbose: verbose,
247254
sourceMap: sourceMap,
255+
sourceMapIncludeSources: sourceMapIncludeSources,
248256
charset: charset,
249257
silenceDeprecations: silenceDeprecations,
250258
fatalDeprecations: fatalDeprecations,
@@ -268,6 +276,8 @@ Future<CompileResult> compileToResultAsync(
268276
bool quietDeps = false,
269277
bool verbose = false,
270278
bool sourceMap = false,
279+
SourceMapIncludeSources sourceMapIncludeSources =
280+
SourceMapIncludeSources.auto,
271281
bool charset = true,
272282
Iterable<Deprecation>? silenceDeprecations,
273283
Iterable<Deprecation>? fatalDeprecations,
@@ -286,6 +296,7 @@ Future<CompileResult> compileToResultAsync(
286296
quietDeps: quietDeps,
287297
verbose: verbose,
288298
sourceMap: sourceMap,
299+
sourceMapIncludeSources: sourceMapIncludeSources,
289300
charset: charset,
290301
silenceDeprecations: silenceDeprecations,
291302
fatalDeprecations: fatalDeprecations,
@@ -314,6 +325,8 @@ Future<CompileResult> compileStringToResultAsync(
314325
bool quietDeps = false,
315326
bool verbose = false,
316327
bool sourceMap = false,
328+
SourceMapIncludeSources sourceMapIncludeSources =
329+
SourceMapIncludeSources.auto,
317330
bool charset = true,
318331
Iterable<Deprecation>? silenceDeprecations,
319332
Iterable<Deprecation>? fatalDeprecations,
@@ -335,6 +348,7 @@ Future<CompileResult> compileStringToResultAsync(
335348
quietDeps: quietDeps,
336349
verbose: verbose,
337350
sourceMap: sourceMap,
351+
sourceMapIncludeSources: sourceMapIncludeSources,
338352
charset: charset,
339353
silenceDeprecations: silenceDeprecations,
340354
fatalDeprecations: fatalDeprecations,

lib/src/async_compile.dart

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// MIT-style license that can be found in the LICENSE file or at
33
// https://opensource.org/licenses/MIT.
44

5-
import 'dart:convert';
6-
75
import 'package:cli_pkg/js.dart';
86
import 'package:path/path.dart' as p;
97

@@ -18,8 +16,8 @@ import 'importer/no_op.dart';
1816
import 'io.dart';
1917
import 'logger.dart';
2018
import 'logger/deprecation_processing.dart';
19+
import 'source_map_include_sources.dart';
2120
import 'syntax.dart';
22-
import 'utils.dart';
2321
import 'visitor/async_evaluate.dart';
2422
import 'visitor/serialize.dart';
2523

@@ -42,6 +40,8 @@ Future<CompileResult> compileAsync(
4240
bool quietDeps = false,
4341
bool verbose = false,
4442
bool sourceMap = false,
43+
SourceMapIncludeSources sourceMapIncludeSources =
44+
SourceMapIncludeSources.auto,
4545
bool charset = true,
4646
Iterable<Deprecation>? silenceDeprecations,
4747
Iterable<Deprecation>? fatalDeprecations,
@@ -88,6 +88,7 @@ Future<CompileResult> compileAsync(
8888
lineFeed,
8989
quietDeps,
9090
sourceMap,
91+
sourceMapIncludeSources,
9192
charset,
9293
);
9394

@@ -117,6 +118,8 @@ Future<CompileResult> compileStringAsync(
117118
bool quietDeps = false,
118119
bool verbose = false,
119120
bool sourceMap = false,
121+
SourceMapIncludeSources sourceMapIncludeSources =
122+
SourceMapIncludeSources.auto,
120123
bool charset = true,
121124
Iterable<Deprecation>? silenceDeprecations,
122125
Iterable<Deprecation>? fatalDeprecations,
@@ -156,6 +159,7 @@ Future<CompileResult> compileStringAsync(
156159
lineFeed,
157160
quietDeps,
158161
sourceMap,
162+
sourceMapIncludeSources,
159163
charset,
160164
);
161165

@@ -179,6 +183,7 @@ Future<CompileResult> _compileStylesheet(
179183
LineFeed? lineFeed,
180184
bool quietDeps,
181185
bool sourceMap,
186+
SourceMapIncludeSources? sourceMapIncludeSources,
182187
bool charset,
183188
) async {
184189
if (nodeImporter != null) {
@@ -213,15 +218,19 @@ Future<CompileResult> _compileStylesheet(
213218

214219
var resultSourceMap = serializeResult.sourceMap;
215220
if (resultSourceMap != null && importCache != null) {
216-
mapInPlace(
217-
resultSourceMap.urls,
218-
(url) => url == ''
219-
? Uri.dataFromString(
220-
stylesheet.span.file.getText(0),
221-
encoding: utf8,
222-
).toString()
223-
: importCache.sourceMapUrl(Uri.parse(url)).toString(),
224-
);
221+
for (var i = 0, length = resultSourceMap.urls.length; i < length; i++) {
222+
var url = resultSourceMap.urls[i];
223+
var canonicalUrl = Uri.parse(url);
224+
if (url != '') {
225+
resultSourceMap.urls[i] =
226+
importCache.sourceMapUrl(canonicalUrl).toString();
227+
}
228+
if (sourceMapIncludeSources == SourceMapIncludeSources.never ||
229+
(sourceMapIncludeSources == SourceMapIncludeSources.auto &&
230+
importCache.hasSourceMapUrl(canonicalUrl))) {
231+
resultSourceMap.files[i] = null;
232+
}
233+
}
225234
}
226235

227236
return CompileResult(evaluateResult, serializeResult);

lib/src/async_import_cache.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,11 @@ final class AsyncImportCache {
368368
// as-is.
369369
canonicalUrl;
370370

371+
/// Returns whether `sourceMapUrl` is explictly defined for a given
372+
/// [canonicalUrl].
373+
bool hasSourceMapUrl(Uri canonicalUrl) =>
374+
_resultsCache[canonicalUrl]?.sourceMapUrl != null;
375+
371376
/// Returns the URL to use in the source map to refer to [canonicalUrl].
372377
///
373378
/// Returns [canonicalUrl] as-is if it hasn't been loaded by this cache.

lib/src/compile.dart

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@
55
// DO NOT EDIT. This file was generated from async_compile.dart.
66
// See tool/grind/synchronize.dart for details.
77
//
8-
// Checksum: d305a0f75e329a29f5aff734ac31ce145fd3b8d5
8+
// Checksum: c267b9e22b3b61e5cf9a4a1bb7f00db2661ea619
99
//
1010
// ignore_for_file: unused_import
1111

1212
export 'async_compile.dart';
1313

14-
import 'dart:convert';
15-
1614
import 'package:cli_pkg/js.dart';
1715
import 'package:path/path.dart' as p;
1816

@@ -27,8 +25,8 @@ import 'importer/no_op.dart';
2725
import 'io.dart';
2826
import 'logger.dart';
2927
import 'logger/deprecation_processing.dart';
28+
import 'source_map_include_sources.dart';
3029
import 'syntax.dart';
31-
import 'utils.dart';
3230
import 'visitor/evaluate.dart';
3331
import 'visitor/serialize.dart';
3432

@@ -51,6 +49,8 @@ CompileResult compile(
5149
bool quietDeps = false,
5250
bool verbose = false,
5351
bool sourceMap = false,
52+
SourceMapIncludeSources sourceMapIncludeSources =
53+
SourceMapIncludeSources.auto,
5454
bool charset = true,
5555
Iterable<Deprecation>? silenceDeprecations,
5656
Iterable<Deprecation>? fatalDeprecations,
@@ -97,6 +97,7 @@ CompileResult compile(
9797
lineFeed,
9898
quietDeps,
9999
sourceMap,
100+
sourceMapIncludeSources,
100101
charset,
101102
);
102103

@@ -126,6 +127,8 @@ CompileResult compileString(
126127
bool quietDeps = false,
127128
bool verbose = false,
128129
bool sourceMap = false,
130+
SourceMapIncludeSources sourceMapIncludeSources =
131+
SourceMapIncludeSources.auto,
129132
bool charset = true,
130133
Iterable<Deprecation>? silenceDeprecations,
131134
Iterable<Deprecation>? fatalDeprecations,
@@ -165,6 +168,7 @@ CompileResult compileString(
165168
lineFeed,
166169
quietDeps,
167170
sourceMap,
171+
sourceMapIncludeSources,
168172
charset,
169173
);
170174

@@ -188,6 +192,7 @@ CompileResult _compileStylesheet(
188192
LineFeed? lineFeed,
189193
bool quietDeps,
190194
bool sourceMap,
195+
SourceMapIncludeSources? sourceMapIncludeSources,
191196
bool charset,
192197
) {
193198
if (nodeImporter != null) {
@@ -222,15 +227,19 @@ CompileResult _compileStylesheet(
222227

223228
var resultSourceMap = serializeResult.sourceMap;
224229
if (resultSourceMap != null && importCache != null) {
225-
mapInPlace(
226-
resultSourceMap.urls,
227-
(url) => url == ''
228-
? Uri.dataFromString(
229-
stylesheet.span.file.getText(0),
230-
encoding: utf8,
231-
).toString()
232-
: importCache.sourceMapUrl(Uri.parse(url)).toString(),
233-
);
230+
for (var i = 0, length = resultSourceMap.urls.length; i < length; i++) {
231+
var url = resultSourceMap.urls[i];
232+
var canonicalUrl = Uri.parse(url);
233+
if (url != '') {
234+
resultSourceMap.urls[i] =
235+
importCache.sourceMapUrl(canonicalUrl).toString();
236+
}
237+
if (sourceMapIncludeSources == SourceMapIncludeSources.never ||
238+
(sourceMapIncludeSources == SourceMapIncludeSources.auto &&
239+
importCache.hasSourceMapUrl(canonicalUrl))) {
240+
resultSourceMap.files[i] = null;
241+
}
242+
}
234243
}
235244

236245
return CompileResult(evaluateResult, serializeResult);

lib/src/embedded/compilation_dispatcher.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:sass/sass.dart' as sass;
1515
import 'package:sass/src/importer/node_package.dart' as npi;
1616

1717
import '../logger.dart';
18+
import '../util/source_map.dart';
1819
import '../value/function.dart';
1920
import '../value/mixin.dart';
2021
import 'embedded_sass.pb.dart';
@@ -164,6 +165,14 @@ final class CompilationDispatcher {
164165
(signature) => hostCallable(this, functions, mixins, signature),
165166
);
166167

168+
var sourceMapIncludeSources = switch (request.sourceMapIncludeSources) {
169+
SourceMapIncludeSources.AUTO => sass.SourceMapIncludeSources.auto,
170+
SourceMapIncludeSources.ALWAYS => sass.SourceMapIncludeSources.always,
171+
SourceMapIncludeSources.NEVER => sass.SourceMapIncludeSources.never,
172+
_ =>
173+
throw "Unknown SourceMapIncludeSources ${request.sourceMapIncludeSources}.",
174+
};
175+
167176
late sass.CompileResult result;
168177
switch (request.whichInput()) {
169178
case InboundMessage_CompileRequest_Input.string:
@@ -185,6 +194,7 @@ final class CompilationDispatcher {
185194
silenceDeprecations: silenceDeprecations,
186195
futureDeprecations: futureDeprecations,
187196
sourceMap: request.sourceMap,
197+
sourceMapIncludeSources: sourceMapIncludeSources,
188198
charset: request.charset,
189199
);
190200

@@ -230,11 +240,8 @@ final class CompilationDispatcher {
230240

231241
var sourceMap = result.sourceMap;
232242
if (sourceMap != null) {
233-
success.sourceMap = json.encode(
234-
sourceMap.toJson(
235-
includeSourceContents: request.sourceMapIncludeSources,
236-
),
237-
);
243+
success.sourceMap = json.encode(sourceMapToJson(sourceMap,
244+
sourceMapIncludeSources: sourceMapIncludeSources));
238245
}
239246
return OutboundMessage_CompileResponse()
240247
..success = success

lib/src/embedded/utils.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import 'package:term_glyph/term_glyph.dart' as term_glyph;
1212

1313
import '../syntax.dart';
1414
import 'embedded_sass.pb.dart' as proto;
15-
import 'embedded_sass.pb.dart' hide SourceSpan, Syntax;
15+
import 'embedded_sass.pb.dart' hide SourceMapIncludeSources, SourceSpan, Syntax;
1616
import 'util/varint_builder.dart';
1717

1818
/// The special ID that indicates an error that's not associated with a specific

lib/src/executable/compile_stylesheet.dart

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import '../importer/filesystem.dart';
1616
import '../io.dart';
1717
import '../stylesheet_graph.dart';
1818
import '../syntax.dart';
19+
import '../util/source_map.dart';
1920
import '../utils.dart';
21+
2022
import '../visitor/serialize.dart';
2123
import 'options.dart';
2224

@@ -131,6 +133,7 @@ Future<void> _compileStylesheetWithoutErrorHandling(
131133
quietDeps: options.quietDeps,
132134
verbose: options.verbose,
133135
sourceMap: options.emitSourceMap,
136+
sourceMapIncludeSources: options.sourceMapIncludeSources,
134137
charset: options.charset,
135138
silenceDeprecations: options.silenceDeprecations,
136139
fatalDeprecations: options.fatalDeprecations,
@@ -145,6 +148,7 @@ Future<void> _compileStylesheetWithoutErrorHandling(
145148
quietDeps: options.quietDeps,
146149
verbose: options.verbose,
147150
sourceMap: options.emitSourceMap,
151+
sourceMapIncludeSources: options.sourceMapIncludeSources,
148152
charset: options.charset,
149153
silenceDeprecations: options.silenceDeprecations,
150154
fatalDeprecations: options.fatalDeprecations,
@@ -166,6 +170,7 @@ Future<void> _compileStylesheetWithoutErrorHandling(
166170
quietDeps: options.quietDeps,
167171
verbose: options.verbose,
168172
sourceMap: options.emitSourceMap,
173+
sourceMapIncludeSources: options.sourceMapIncludeSources,
169174
charset: options.charset,
170175
silenceDeprecations: options.silenceDeprecations,
171176
fatalDeprecations: options.fatalDeprecations,
@@ -180,6 +185,7 @@ Future<void> _compileStylesheetWithoutErrorHandling(
180185
quietDeps: options.quietDeps,
181186
verbose: options.verbose,
182187
sourceMap: options.emitSourceMap,
188+
sourceMapIncludeSources: options.sourceMapIncludeSources,
183189
charset: options.charset,
184190
silenceDeprecations: options.silenceDeprecations,
185191
fatalDeprecations: options.fatalDeprecations,
@@ -246,15 +252,12 @@ String _writeSourceMap(
246252
sourceMap.targetUrl = p.toUri(p.basename(destination)).toString();
247253
}
248254

249-
// TODO(nweiz): Don't explicitly use a type parameter when dart-lang/sdk#25490
250-
// is fixed.
251-
mapInPlace<String>(
255+
mapInPlace(
252256
sourceMap.urls,
253257
(url) => options.sourceMapUrl(Uri.parse(url), destination).toString(),
254258
);
255-
var sourceMapText = jsonEncode(
256-
sourceMap.toJson(includeSourceContents: options.embedSources),
257-
);
259+
var sourceMapText = jsonEncode(sourceMapToJson(sourceMap,
260+
sourceMapIncludeSources: options.sourceMapIncludeSources));
258261

259262
Uri url;
260263
if (options.embedSourceMap) {

0 commit comments

Comments
 (0)