From 617de3564b17b639156ad8fed698b08014b56639 Mon Sep 17 00:00:00 2001 From: Jennifer Thakar Date: Mon, 29 Jul 2024 12:51:29 -0700 Subject: [PATCH] Backport deprecation API to legacy JS API --- CHANGELOG.md | 15 +++++ bin/sass.dart | 19 +++--- lib/sass.dart | 20 +++++-- lib/src/async_compile.dart | 14 +++-- lib/src/async_import_cache.dart | 51 ++++++++++++++-- lib/src/compile.dart | 16 ++--- lib/src/deprecation.dart | 1 + lib/src/executable/compile_stylesheet.dart | 5 +- lib/src/import_cache.dart | 53 ++++++++++++++--- lib/src/js/compile.dart | 69 ++++++---------------- lib/src/js/deprecations.dart | 34 +++++++++++ lib/src/js/legacy.dart | 41 ++++++++++--- lib/src/js/legacy/render_options.dart | 6 ++ lib/src/logger/deprecation_processing.dart | 5 +- pubspec.yaml | 2 +- 15 files changed, 247 insertions(+), 104 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8533ae1c8..5fd22af05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## 1.78.0 + +### JS API + +* Backport the deprecation options (`fatalDeprecations`, `futureDeprecations`, + and `silenceDeprecations`) to the legacy JS API. The legacy JS API is itself + deprecated, and you should move off of it if possible, but this will allow + users of bundlers and other tools that are still using the legacy API to + still control deprecation warnings. + +### Embedded Sass + +* Fix a bug where parse-time deprecation warnings could not be controlled by + the deprecation options in some circumstances. + ## 1.77.8 * No user-visible changes. diff --git a/bin/sass.dart b/bin/sass.dart index cc912d041..18571be48 100644 --- a/bin/sass.dart +++ b/bin/sass.dart @@ -46,18 +46,13 @@ Future main(List args) async { } var graph = StylesheetGraph(ImportCache( - importers: [...options.pkgImporters, FilesystemImporter.noLoadPath], - loadPaths: options.loadPaths, - // This logger is only used for handling fatal/future deprecations - // during parsing, and is re-used across parses, so we don't want to - // limit repetition. A separate DeprecationHandlingLogger is created for - // each compilation, which will limit repetition if verbose is not - // passed in addition to handling fatal/future deprecations. - logger: DeprecationProcessingLogger(options.logger, - silenceDeprecations: options.silenceDeprecations, - fatalDeprecations: options.fatalDeprecations, - futureDeprecations: options.futureDeprecations, - limitRepetition: false))); + importers: [...options.pkgImporters, FilesystemImporter.noLoadPath], + loadPaths: options.loadPaths, + logger: options.logger, + silenceDeprecations: options.silenceDeprecations, + fatalDeprecations: options.fatalDeprecations, + futureDeprecations: options.futureDeprecations, + )); if (options.watch) { await watch(options, graph); return; diff --git a/lib/sass.dart b/lib/sass.dart index eb58adc4f..7fab3b014 100644 --- a/lib/sass.dart +++ b/lib/sass.dart @@ -117,7 +117,10 @@ CompileResult compileToResult(String path, importers: importers, logger: logger ?? Logger.stderr(color: color), loadPaths: loadPaths, - packageConfig: packageConfig), + packageConfig: packageConfig, + silenceDeprecations: {...?silenceDeprecations}, + fatalDeprecations: {...?fatalDeprecations}, + futureDeprecations: {...?futureDeprecations}), functions: functions, style: style, quietDeps: quietDeps, @@ -219,7 +222,10 @@ CompileResult compileStringToResult(String source, importers: importers, logger: logger ?? Logger.stderr(color: color), packageConfig: packageConfig, - loadPaths: loadPaths), + loadPaths: loadPaths, + silenceDeprecations: {...?silenceDeprecations}, + fatalDeprecations: {...?fatalDeprecations}, + futureDeprecations: {...?futureDeprecations}), functions: functions, style: style, importer: importer, @@ -258,7 +264,10 @@ Future compileToResultAsync(String path, importers: importers, logger: logger ?? Logger.stderr(color: color), loadPaths: loadPaths, - packageConfig: packageConfig), + packageConfig: packageConfig, + silenceDeprecations: {...?silenceDeprecations}, + fatalDeprecations: {...?fatalDeprecations}, + futureDeprecations: {...?futureDeprecations}), functions: functions, style: style, quietDeps: quietDeps, @@ -301,7 +310,10 @@ Future compileStringToResultAsync(String source, importers: importers, logger: logger ?? Logger.stderr(color: color), packageConfig: packageConfig, - loadPaths: loadPaths), + loadPaths: loadPaths, + silenceDeprecations: {...?silenceDeprecations}, + fatalDeprecations: {...?fatalDeprecations}, + futureDeprecations: {...?futureDeprecations}), functions: functions, style: style, importer: importer, diff --git a/lib/src/async_compile.dart b/lib/src/async_compile.dart index 063f3d2dc..ea701f598 100644 --- a/lib/src/async_compile.dart +++ b/lib/src/async_compile.dart @@ -45,12 +45,13 @@ Future compileAsync(String path, Iterable? silenceDeprecations, Iterable? fatalDeprecations, Iterable? futureDeprecations}) async { - DeprecationProcessingLogger deprecationLogger = logger = - DeprecationProcessingLogger(logger ?? Logger.stderr(), + DeprecationProcessingLogger deprecationLogger = + logger = DeprecationProcessingLogger(logger ?? Logger.stderr(), silenceDeprecations: {...?silenceDeprecations}, fatalDeprecations: {...?fatalDeprecations}, futureDeprecations: {...?futureDeprecations}, - limitRepetition: !verbose); + limitRepetition: !verbose) + ..validate(); // If the syntax is different than the importer would default to, we have to // parse the file manually and we can't store it in the cache. @@ -111,12 +112,13 @@ Future compileStringAsync(String source, Iterable? silenceDeprecations, Iterable? fatalDeprecations, Iterable? futureDeprecations}) async { - DeprecationProcessingLogger deprecationLogger = logger = - DeprecationProcessingLogger(logger ?? Logger.stderr(), + DeprecationProcessingLogger deprecationLogger = + logger = DeprecationProcessingLogger(logger ?? Logger.stderr(), silenceDeprecations: {...?silenceDeprecations}, fatalDeprecations: {...?fatalDeprecations}, futureDeprecations: {...?futureDeprecations}, - limitRepetition: !verbose); + limitRepetition: !verbose) + ..validate(); var stylesheet = Stylesheet.parse(source, syntax ?? Syntax.scss, url: url, logger: logger); diff --git a/lib/src/async_import_cache.dart b/lib/src/async_import_cache.dart index 6d6e4fa8c..dd66f86cb 100644 --- a/lib/src/async_import_cache.dart +++ b/lib/src/async_import_cache.dart @@ -16,6 +16,7 @@ import 'importer/no_op.dart'; import 'importer/utils.dart'; import 'io.dart'; import 'logger.dart'; +import 'logger/deprecation_processing.dart'; import 'util/map.dart'; import 'util/nullable.dart'; import 'utils.dart'; @@ -95,20 +96,40 @@ final class AsyncImportCache { {Iterable? importers, Iterable? loadPaths, PackageConfig? packageConfig, - Logger? logger}) + Logger? logger, + Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) : _importers = _toImporters(importers, loadPaths, packageConfig), - _logger = logger ?? const Logger.stderr(); + _logger = _makeLogger(logger, + fatalDeprecations: fatalDeprecations, + futureDeprecations: futureDeprecations, + silenceDeprecations: silenceDeprecations); /// Creates an import cache without any globally-available importers. - AsyncImportCache.none({Logger? logger}) + AsyncImportCache.none( + {Logger? logger, + Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) : _importers = const [], - _logger = logger ?? const Logger.stderr(); + _logger = _makeLogger(logger, + fatalDeprecations: fatalDeprecations, + futureDeprecations: futureDeprecations, + silenceDeprecations: silenceDeprecations); /// Creates an import cache without any globally-available importers, and only /// the passed in importers. - AsyncImportCache.only(Iterable importers, {Logger? logger}) + AsyncImportCache.only(Iterable importers, + {Logger? logger, + Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) : _importers = List.unmodifiable(importers), - _logger = logger ?? const Logger.stderr(); + _logger = _makeLogger(logger, + fatalDeprecations: fatalDeprecations, + futureDeprecations: futureDeprecations, + silenceDeprecations: silenceDeprecations); /// Converts the user's [importers], [loadPaths], and [packageConfig] /// options into a single list of importers. @@ -127,6 +148,24 @@ final class AsyncImportCache { ]; } + /// Wraps [logger] to support deprecation options, unless [logger] is already + /// a [DeprecationProcessingLogger]. + static DeprecationProcessingLogger _makeLogger(Logger? logger, + {Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) => + switch (logger) { + DeprecationProcessingLogger logger => logger, + _ => DeprecationProcessingLogger(logger ?? const Logger.stderr(), + fatalDeprecations: fatalDeprecations ?? const {}, + futureDeprecations: futureDeprecations ?? const {}, + silenceDeprecations: silenceDeprecations ?? const {}, + // This wrapper may be used for multiple compilations, so we don't + // limit repetition to make sure warnings are emitted with each + // compilation. + limitRepetition: false), + }; + /// Canonicalizes [url] according to one of this cache's importers. /// /// The [baseUrl] should be the canonical URL of the stylesheet that contains diff --git a/lib/src/compile.dart b/lib/src/compile.dart index 5a7fe54f2..6854dd68e 100644 --- a/lib/src/compile.dart +++ b/lib/src/compile.dart @@ -5,7 +5,7 @@ // DO NOT EDIT. This file was generated from async_compile.dart. // See tool/grind/synchronize.dart for details. // -// Checksum: ab2c6fa2588988a86abdbe87512134098e01b39e +// Checksum: 69b31749dc94c7f717e9d395327e4209c4d3feb0 // // ignore_for_file: unused_import @@ -54,12 +54,13 @@ CompileResult compile(String path, Iterable? silenceDeprecations, Iterable? fatalDeprecations, Iterable? futureDeprecations}) { - DeprecationProcessingLogger deprecationLogger = logger = - DeprecationProcessingLogger(logger ?? Logger.stderr(), + DeprecationProcessingLogger deprecationLogger = + logger = DeprecationProcessingLogger(logger ?? Logger.stderr(), silenceDeprecations: {...?silenceDeprecations}, fatalDeprecations: {...?fatalDeprecations}, futureDeprecations: {...?futureDeprecations}, - limitRepetition: !verbose); + limitRepetition: !verbose) + ..validate(); // If the syntax is different than the importer would default to, we have to // parse the file manually and we can't store it in the cache. @@ -120,12 +121,13 @@ CompileResult compileString(String source, Iterable? silenceDeprecations, Iterable? fatalDeprecations, Iterable? futureDeprecations}) { - DeprecationProcessingLogger deprecationLogger = logger = - DeprecationProcessingLogger(logger ?? Logger.stderr(), + DeprecationProcessingLogger deprecationLogger = + logger = DeprecationProcessingLogger(logger ?? Logger.stderr(), silenceDeprecations: {...?silenceDeprecations}, fatalDeprecations: {...?fatalDeprecations}, futureDeprecations: {...?futureDeprecations}, - limitRepetition: !verbose); + limitRepetition: !verbose) + ..validate(); var stylesheet = Stylesheet.parse(source, syntax ?? Syntax.scss, url: url, logger: logger); diff --git a/lib/src/deprecation.dart b/lib/src/deprecation.dart index b71960c47..dca4e1354 100644 --- a/lib/src/deprecation.dart +++ b/lib/src/deprecation.dart @@ -6,6 +6,7 @@ import 'package:cli_pkg/js.dart'; import 'package:collection/collection.dart'; import 'package:pub_semver/pub_semver.dart'; +import 'logger.dart'; import 'util/nullable.dart'; /// A deprecated feature in the language. diff --git a/lib/src/executable/compile_stylesheet.dart b/lib/src/executable/compile_stylesheet.dart index 3dbf3dbe0..652bef6f7 100644 --- a/lib/src/executable/compile_stylesheet.dart +++ b/lib/src/executable/compile_stylesheet.dart @@ -97,7 +97,10 @@ Future _compileStylesheetWithoutErrorHandling(ExecutableOptions options, var importCache = AsyncImportCache( importers: options.pkgImporters, loadPaths: options.loadPaths, - logger: options.logger); + logger: options.logger, + silenceDeprecations: options.silenceDeprecations, + fatalDeprecations: options.fatalDeprecations, + futureDeprecations: options.futureDeprecations); result = source == null ? await compileStringAsync(await readStdin(), diff --git a/lib/src/import_cache.dart b/lib/src/import_cache.dart index 9590b0e5a..220832210 100644 --- a/lib/src/import_cache.dart +++ b/lib/src/import_cache.dart @@ -5,7 +5,7 @@ // DO NOT EDIT. This file was generated from async_import_cache.dart. // See tool/grind/synchronize.dart for details. // -// Checksum: 4362e28e5cd425786c235d2a6a2bb60539403799 +// Checksum: eabe4eaed7125aa058e11e5442a7e9f2e696df26 // // ignore_for_file: unused_import @@ -23,6 +23,7 @@ import 'importer/no_op.dart'; import 'importer/utils.dart'; import 'io.dart'; import 'logger.dart'; +import 'logger/deprecation_processing.dart'; import 'util/map.dart'; import 'util/nullable.dart'; import 'utils.dart'; @@ -96,20 +97,40 @@ final class ImportCache { {Iterable? importers, Iterable? loadPaths, PackageConfig? packageConfig, - Logger? logger}) + Logger? logger, + Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) : _importers = _toImporters(importers, loadPaths, packageConfig), - _logger = logger ?? const Logger.stderr(); + _logger = _makeLogger(logger, + fatalDeprecations: fatalDeprecations, + futureDeprecations: futureDeprecations, + silenceDeprecations: silenceDeprecations); /// Creates an import cache without any globally-available importers. - ImportCache.none({Logger? logger}) + ImportCache.none( + {Logger? logger, + Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) : _importers = const [], - _logger = logger ?? const Logger.stderr(); + _logger = _makeLogger(logger, + fatalDeprecations: fatalDeprecations, + futureDeprecations: futureDeprecations, + silenceDeprecations: silenceDeprecations); /// Creates an import cache without any globally-available importers, and only /// the passed in importers. - ImportCache.only(Iterable importers, {Logger? logger}) + ImportCache.only(Iterable importers, + {Logger? logger, + Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) : _importers = List.unmodifiable(importers), - _logger = logger ?? const Logger.stderr(); + _logger = _makeLogger(logger, + fatalDeprecations: fatalDeprecations, + futureDeprecations: futureDeprecations, + silenceDeprecations: silenceDeprecations); /// Converts the user's [importers], [loadPaths], and [packageConfig] /// options into a single list of importers. @@ -128,6 +149,24 @@ final class ImportCache { ]; } + /// Wraps [logger] to support deprecation options, unless [logger] is already + /// a [DeprecationProcessingLogger]. + static DeprecationProcessingLogger _makeLogger(Logger? logger, + {Set? fatalDeprecations, + Set? futureDeprecations, + Set? silenceDeprecations}) => + switch (logger) { + DeprecationProcessingLogger logger => logger, + _ => DeprecationProcessingLogger(logger ?? const Logger.stderr(), + fatalDeprecations: fatalDeprecations ?? const {}, + futureDeprecations: futureDeprecations ?? const {}, + silenceDeprecations: silenceDeprecations ?? const {}, + // This wrapper may be used for multiple compilations, so we don't + // limit repetition to make sure warnings are emitted with each + // compilation. + limitRepetition: false), + }; + /// Canonicalizes [url] according to one of this cache's importers. /// /// The [baseUrl] should be the canonical URL of the stylesheet that contains diff --git a/lib/src/js/compile.dart b/lib/src/js/compile.dart index ab5c57cc0..b86ff4c04 100644 --- a/lib/src/js/compile.dart +++ b/lib/src/js/compile.dart @@ -9,7 +9,7 @@ import 'package:term_glyph/term_glyph.dart' as glyph; import 'package:path/path.dart' as p; import 'package:pub_semver/pub_semver.dart'; -import '../../sass.dart'; +import '../../sass.dart' hide Deprecation; import '../importer/no_op.dart'; import '../importer/js_to_dart/async.dart'; import '../importer/js_to_dart/async_file.dart'; @@ -21,7 +21,7 @@ import '../logger/js_to_dart.dart'; import '../util/nullable.dart'; import 'compile_options.dart'; import 'compile_result.dart'; -import 'deprecations.dart' as js show Deprecation; +import 'deprecations.dart'; import 'exception.dart'; import 'importer.dart'; import 'reflection.dart'; @@ -51,12 +51,12 @@ NodeCompileResult compile(String path, [CompileOptions? options]) { logger: logger, importers: options?.importers?.map(_parseImporter), functions: _parseFunctions(options?.functions).cast(), - fatalDeprecations: _parseDeprecations( - logger, options?.fatalDeprecations, supportVersions: true), + fatalDeprecations: parseDeprecations(logger, options?.fatalDeprecations, + supportVersions: true), silenceDeprecations: - _parseDeprecations(logger, options?.silenceDeprecations), + parseDeprecations(logger, options?.silenceDeprecations), futureDeprecations: - _parseDeprecations(logger, options?.futureDeprecations)); + parseDeprecations(logger, options?.futureDeprecations)); return _convertResult(result, includeSourceContents: options?.sourceMapIncludeSources ?? false); } on SassException catch (error, stackTrace) { @@ -89,12 +89,12 @@ NodeCompileResult compileString(String text, [CompileStringOptions? options]) { importer: options?.importer.andThen(_parseImporter) ?? (options?.url == null ? NoOpImporter() : null), functions: _parseFunctions(options?.functions).cast(), - fatalDeprecations: _parseDeprecations( - logger, options?.fatalDeprecations, supportVersions: true), + fatalDeprecations: parseDeprecations(logger, options?.fatalDeprecations, + supportVersions: true), silenceDeprecations: - _parseDeprecations(logger, options?.silenceDeprecations), + parseDeprecations(logger, options?.silenceDeprecations), futureDeprecations: - _parseDeprecations(logger, options?.futureDeprecations)); + parseDeprecations(logger, options?.futureDeprecations)); return _convertResult(result, includeSourceContents: options?.sourceMapIncludeSources ?? false); } on SassException catch (error, stackTrace) { @@ -127,12 +127,12 @@ Promise compileAsync(String path, [CompileOptions? options]) { importers: options?.importers ?.map((importer) => _parseAsyncImporter(importer)), functions: _parseFunctions(options?.functions, asynch: true), - fatalDeprecations: _parseDeprecations( - logger, options?.fatalDeprecations, supportVersions: true), + fatalDeprecations: parseDeprecations(logger, options?.fatalDeprecations, + supportVersions: true), silenceDeprecations: - _parseDeprecations(logger, options?.silenceDeprecations), + parseDeprecations(logger, options?.silenceDeprecations), futureDeprecations: - _parseDeprecations(logger, options?.futureDeprecations)); + parseDeprecations(logger, options?.futureDeprecations)); return _convertResult(result, includeSourceContents: options?.sourceMapIncludeSources ?? false); }()), color: color, ascii: ascii); @@ -165,12 +165,12 @@ Promise compileStringAsync(String text, [CompileStringOptions? options]) { .andThen((importer) => _parseAsyncImporter(importer)) ?? (options?.url == null ? NoOpImporter() : null), functions: _parseFunctions(options?.functions, asynch: true), - fatalDeprecations: _parseDeprecations( - logger, options?.fatalDeprecations, supportVersions: true), + fatalDeprecations: parseDeprecations(logger, options?.fatalDeprecations, + supportVersions: true), silenceDeprecations: - _parseDeprecations(logger, options?.silenceDeprecations), + parseDeprecations(logger, options?.silenceDeprecations), futureDeprecations: - _parseDeprecations(logger, options?.futureDeprecations)); + parseDeprecations(logger, options?.futureDeprecations)); return _convertResult(result, includeSourceContents: options?.sourceMapIncludeSources ?? false); }()), color: color, ascii: ascii); @@ -359,39 +359,6 @@ List _parseFunctions(Object? functions, {bool asynch = false}) { return result; } -/// Parses a list of [deprecations] from JS into an list of Dart [Deprecation] -/// objects. -/// -/// [deprecations] can contain deprecation IDs, JS Deprecation objects, and -/// (if [supportVersions] is true) [Version]s. -Iterable? _parseDeprecations( - JSToDartLogger logger, List? deprecations, - {bool supportVersions = false}) { - if (deprecations == null) return null; - return () sync* { - for (var item in deprecations) { - switch (item) { - case String id: - var deprecation = Deprecation.fromId(id); - if (deprecation == null) { - logger.warn('Invalid deprecation "$id".'); - } else { - yield deprecation; - } - case js.Deprecation(:var id): - var deprecation = Deprecation.fromId(id); - if (deprecation == null) { - logger.warn('Invalid deprecation "$id".'); - } else { - yield deprecation; - } - case Version version when supportVersions: - yield* Deprecation.forVersion(version); - } - } - }(); -} - /// The exported `NodePackageImporter` class that can be added to the /// `importers` option to enable loading `pkg:` URLs from `node_modules`. final JSClass nodePackageImporterClass = () { diff --git a/lib/src/js/deprecations.dart b/lib/src/js/deprecations.dart index 51e3aec1a..e26fe9ea3 100644 --- a/lib/src/js/deprecations.dart +++ b/lib/src/js/deprecations.dart @@ -6,6 +6,7 @@ import 'package:js/js.dart'; import 'package:pub_semver/pub_semver.dart'; import '../deprecation.dart' as dart show Deprecation; +import '../logger/js_to_dart.dart'; import 'reflection.dart'; @JS() @@ -44,6 +45,39 @@ final Map deprecations = { obsoleteIn: deprecation.deprecatedIn), }; +/// Parses a list of [deprecations] from JS into an list of Dart [Deprecation] +/// objects. +/// +/// [deprecations] can contain deprecation IDs, JS Deprecation objects, and +/// (if [supportVersions] is true) [Version]s. +Iterable? parseDeprecations( + JSToDartLogger logger, List? deprecations, + {bool supportVersions = false}) { + if (deprecations == null) return null; + return () sync* { + for (var item in deprecations) { + switch (item) { + case String id: + var deprecation = dart.Deprecation.fromId(id); + if (deprecation == null) { + logger.warn('Invalid deprecation "$id".'); + } else { + yield deprecation; + } + case Deprecation(:var id): + var deprecation = dart.Deprecation.fromId(id); + if (deprecation == null) { + logger.warn('Invalid deprecation "$id".'); + } else { + yield deprecation; + } + case Version version when supportVersions: + yield* dart.Deprecation.forVersion(version); + } + } + }(); +} + /// The JavaScript `Version` class. final JSClass versionClass = () { var jsClass = createJSClass('sass.Version', diff --git a/lib/src/js/legacy.dart b/lib/src/js/legacy.dart index ed4ba7584..65ae4ca48 100644 --- a/lib/src/js/legacy.dart +++ b/lib/src/js/legacy.dart @@ -27,6 +27,7 @@ import '../util/nullable.dart'; import '../utils.dart'; import '../value.dart'; import '../visitor/serialize.dart'; +import 'deprecations.dart'; import 'function.dart'; import 'legacy/render_context.dart'; import 'legacy/render_options.dart'; @@ -76,6 +77,8 @@ Future _renderAsync(RenderOptions options) async { CompileResult result; var file = options.file.andThen(p.absolute); + var logger = + JSToDartLogger(options.logger, Logger.stderr(color: hasTerminal)); if (options.data case var data?) { result = await compileStringAsync(data, nodeImporter: _parseImporter(options, start), @@ -88,11 +91,16 @@ Future _renderAsync(RenderOptions options) async { lineFeed: _parseLineFeed(options.linefeed), url: file == null ? 'stdin' : p.toUri(file).toString(), quietDeps: options.quietDeps ?? false, + fatalDeprecations: parseDeprecations(logger, options.fatalDeprecations, + supportVersions: true), + futureDeprecations: + parseDeprecations(logger, options.futureDeprecations), + silenceDeprecations: + parseDeprecations(logger, options.silenceDeprecations), verbose: options.verbose ?? false, charset: options.charset ?? true, sourceMap: _enableSourceMaps(options), - logger: - JSToDartLogger(options.logger, Logger.stderr(color: hasTerminal))); + logger: logger); } else if (file != null) { result = await compileAsync(file, nodeImporter: _parseImporter(options, start), @@ -104,11 +112,16 @@ Future _renderAsync(RenderOptions options) async { indentWidth: _parseIndentWidth(options.indentWidth), lineFeed: _parseLineFeed(options.linefeed), quietDeps: options.quietDeps ?? false, + fatalDeprecations: parseDeprecations(logger, options.fatalDeprecations, + supportVersions: true), + futureDeprecations: + parseDeprecations(logger, options.futureDeprecations), + silenceDeprecations: + parseDeprecations(logger, options.silenceDeprecations), verbose: options.verbose ?? false, charset: options.charset ?? true, sourceMap: _enableSourceMaps(options), - logger: - JSToDartLogger(options.logger, Logger.stderr(color: hasTerminal))); + logger: logger); } else { throw ArgumentError("Either options.data or options.file must be set."); } @@ -131,6 +144,8 @@ RenderResult renderSync(RenderOptions options) { CompileResult result; var file = options.file.andThen(p.absolute); + var logger = + JSToDartLogger(options.logger, Logger.stderr(color: hasTerminal)); if (options.data case var data?) { result = compileString(data, nodeImporter: _parseImporter(options, start), @@ -143,11 +158,16 @@ RenderResult renderSync(RenderOptions options) { lineFeed: _parseLineFeed(options.linefeed), url: file == null ? 'stdin' : p.toUri(file).toString(), quietDeps: options.quietDeps ?? false, + fatalDeprecations: parseDeprecations( + logger, options.fatalDeprecations, supportVersions: true), + futureDeprecations: + parseDeprecations(logger, options.futureDeprecations), + silenceDeprecations: + parseDeprecations(logger, options.silenceDeprecations), verbose: options.verbose ?? false, charset: options.charset ?? true, sourceMap: _enableSourceMaps(options), - logger: JSToDartLogger( - options.logger, Logger.stderr(color: hasTerminal))); + logger: logger); } else if (file != null) { result = compile(file, nodeImporter: _parseImporter(options, start), @@ -159,11 +179,16 @@ RenderResult renderSync(RenderOptions options) { indentWidth: _parseIndentWidth(options.indentWidth), lineFeed: _parseLineFeed(options.linefeed), quietDeps: options.quietDeps ?? false, + fatalDeprecations: parseDeprecations( + logger, options.fatalDeprecations, supportVersions: true), + futureDeprecations: + parseDeprecations(logger, options.futureDeprecations), + silenceDeprecations: + parseDeprecations(logger, options.silenceDeprecations), verbose: options.verbose ?? false, charset: options.charset ?? true, sourceMap: _enableSourceMaps(options), - logger: JSToDartLogger( - options.logger, Logger.stderr(color: hasTerminal))); + logger: logger); } else { throw ArgumentError("Either options.data or options.file must be set."); } diff --git a/lib/src/js/legacy/render_options.dart b/lib/src/js/legacy/render_options.dart index ac8cc61b8..e63de45f1 100644 --- a/lib/src/js/legacy/render_options.dart +++ b/lib/src/js/legacy/render_options.dart @@ -30,6 +30,9 @@ class RenderOptions { external bool? get sourceMapEmbed; external String? get sourceMapRoot; external bool? get quietDeps; + external List? get fatalDeprecations; + external List? get futureDeprecations; + external List? get silenceDeprecations; external bool? get verbose; external bool? get charset; external JSLogger? get logger; @@ -54,6 +57,9 @@ class RenderOptions { bool? sourceMapEmbed, String? sourceMapRoot, bool? quietDeps, + List? fatalDeprecations, + List? futureDeprecations, + List? silenceDeprecations, bool? verbose, bool? charset, JSLogger? logger}); diff --git a/lib/src/logger/deprecation_processing.dart b/lib/src/logger/deprecation_processing.dart index 37bd4464f..d83c2ef80 100644 --- a/lib/src/logger/deprecation_processing.dart +++ b/lib/src/logger/deprecation_processing.dart @@ -45,7 +45,10 @@ final class DeprecationProcessingLogger extends LoggerWithDeprecationType { {required this.silenceDeprecations, required this.fatalDeprecations, required this.futureDeprecations, - this.limitRepetition = true}) { + this.limitRepetition = true}); + + /// Warns if any of the deprecations options are incompatible or unnecessary. + void validate() { for (var deprecation in fatalDeprecations) { switch (deprecation) { case Deprecation(isFuture: true) diff --git a/pubspec.yaml b/pubspec.yaml index 1c78769ae..61bb6f35e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: sass -version: 1.77.8 +version: 1.78.0-dev description: A Sass implementation in Dart. homepage: https://github.com/sass/dart-sass