Skip to content

Commit c8be35d

Browse files
committed
Enhance sourceMapIncludeSources option
1 parent a4cac51 commit c8be35d

17 files changed

+231
-75
lines changed

lib/sass.dart

Lines changed: 20 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
@@ -90,6 +92,9 @@ export 'src/evaluation_context.dart' show warn;
9092
///
9193
/// [`source_maps`]: https://pub.dartlang.org/packages/source_maps
9294
///
95+
/// The [sourceMapIncludeSources] parameter controls the ways in which the
96+
/// compiler can choose to include source contents in the source map.
97+
///
9398
/// If [charset] is `true`, this will include a `@charset` declaration or a
9499
/// UTF-8 [byte-order mark][] if the stylesheet contains any non-ASCII
95100
/// characters. Otherwise, it will never include a `@charset` declaration or a
@@ -112,6 +117,8 @@ CompileResult compileToResult(
112117
bool quietDeps = false,
113118
bool verbose = false,
114119
bool sourceMap = false,
120+
SourceMapIncludeSources sourceMapIncludeSources =
121+
SourceMapIncludeSources.always,
115122
bool charset = true,
116123
Iterable<Deprecation>? silenceDeprecations,
117124
Iterable<Deprecation>? fatalDeprecations,
@@ -130,6 +137,7 @@ CompileResult compileToResult(
130137
quietDeps: quietDeps,
131138
verbose: verbose,
132139
sourceMap: sourceMap,
140+
sourceMapIncludeSources: sourceMapIncludeSources,
133141
charset: charset,
134142
silenceDeprecations: silenceDeprecations,
135143
fatalDeprecations: fatalDeprecations,
@@ -199,6 +207,9 @@ CompileResult compileToResult(
199207
///
200208
/// [`source_maps`]: https://pub.dartlang.org/packages/source_maps
201209
///
210+
/// The [sourceMapIncludeSources] parameter controls the ways in which the
211+
/// compiler can choose to include source contents in the source map.
212+
///
202213
/// If [charset] is `true`, this will include a `@charset` declaration or a
203214
/// UTF-8 [byte-order mark][] if the stylesheet contains any non-ASCII
204215
/// characters. Otherwise, it will never include a `@charset` declaration or a
@@ -224,6 +235,8 @@ CompileResult compileStringToResult(
224235
bool quietDeps = false,
225236
bool verbose = false,
226237
bool sourceMap = false,
238+
SourceMapIncludeSources sourceMapIncludeSources =
239+
SourceMapIncludeSources.always,
227240
bool charset = true,
228241
Iterable<Deprecation>? silenceDeprecations,
229242
Iterable<Deprecation>? fatalDeprecations,
@@ -245,6 +258,7 @@ CompileResult compileStringToResult(
245258
quietDeps: quietDeps,
246259
verbose: verbose,
247260
sourceMap: sourceMap,
261+
sourceMapIncludeSources: sourceMapIncludeSources,
248262
charset: charset,
249263
silenceDeprecations: silenceDeprecations,
250264
fatalDeprecations: fatalDeprecations,
@@ -268,6 +282,8 @@ Future<CompileResult> compileToResultAsync(
268282
bool quietDeps = false,
269283
bool verbose = false,
270284
bool sourceMap = false,
285+
SourceMapIncludeSources sourceMapIncludeSources =
286+
SourceMapIncludeSources.always,
271287
bool charset = true,
272288
Iterable<Deprecation>? silenceDeprecations,
273289
Iterable<Deprecation>? fatalDeprecations,
@@ -286,6 +302,7 @@ Future<CompileResult> compileToResultAsync(
286302
quietDeps: quietDeps,
287303
verbose: verbose,
288304
sourceMap: sourceMap,
305+
sourceMapIncludeSources: sourceMapIncludeSources,
289306
charset: charset,
290307
silenceDeprecations: silenceDeprecations,
291308
fatalDeprecations: fatalDeprecations,
@@ -314,6 +331,8 @@ Future<CompileResult> compileStringToResultAsync(
314331
bool quietDeps = false,
315332
bool verbose = false,
316333
bool sourceMap = false,
334+
SourceMapIncludeSources sourceMapIncludeSources =
335+
SourceMapIncludeSources.always,
317336
bool charset = true,
318337
Iterable<Deprecation>? silenceDeprecations,
319338
Iterable<Deprecation>? fatalDeprecations,
@@ -335,6 +354,7 @@ Future<CompileResult> compileStringToResultAsync(
335354
quietDeps: quietDeps,
336355
verbose: verbose,
337356
sourceMap: sourceMap,
357+
sourceMapIncludeSources: sourceMapIncludeSources,
338358
charset: charset,
339359
silenceDeprecations: silenceDeprecations,
340360
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.always,
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.always,
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: 0ba148b6904d5b7d3a99310515098d0b8450133e
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.always,
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.always,
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: 13 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

@@ -207,6 +217,7 @@ final class CompilationDispatcher {
207217
silenceDeprecations: silenceDeprecations,
208218
futureDeprecations: futureDeprecations,
209219
sourceMap: request.sourceMap,
220+
sourceMapIncludeSources: sourceMapIncludeSources,
210221
charset: request.charset,
211222
);
212223
} on FileSystemException catch (error) {
@@ -230,11 +241,8 @@ final class CompilationDispatcher {
230241

231242
var sourceMap = result.sourceMap;
232243
if (sourceMap != null) {
233-
success.sourceMap = json.encode(
234-
sourceMap.toJson(
235-
includeSourceContents: request.sourceMapIncludeSources,
236-
),
237-
);
244+
success.sourceMap = json.encode(sourceMapToJson(sourceMap,
245+
sourceMapIncludeSources: sourceMapIncludeSources));
238246
}
239247
return OutboundMessage_CompileResponse()
240248
..success = success

0 commit comments

Comments
 (0)