diff --git a/lib/src/importer/js_to_dart/async.dart b/lib/src/importer/js_to_dart/async.dart index e34a7419e..c6d26cbe2 100644 --- a/lib/src/importer/js_to_dart/async.dart +++ b/lib/src/importer/js_to_dart/async.dart @@ -13,6 +13,7 @@ import '../../js/url.dart'; import '../../js/utils.dart'; import '../../util/nullable.dart'; import '../async.dart'; +import '../canonicalize_context.dart'; import '../result.dart'; import 'utils.dart'; @@ -20,7 +21,7 @@ import 'utils.dart'; /// a Dart [AsyncImporter]. final class JSToDartAsyncImporter extends AsyncImporter { /// The wrapped canonicalize function. - final Object? Function(String, JSCanonicalizeContext) _canonicalize; + final Object? Function(String, CanonicalizeContext) _canonicalize; /// The wrapped load function. final Object? Function(JSUrl) _load; @@ -38,8 +39,8 @@ final class JSToDartAsyncImporter extends AsyncImporter { } FutureOr canonicalize(Uri url) async { - var result = wrapJSExceptions(() => _canonicalize( - url.toString(), dartToJSCanonicalizeContext(canonicalizeContext))); + var result = wrapJSExceptions( + () => _canonicalize(url.toString(), canonicalizeContext)); if (isPromise(result)) result = await promiseToFuture(result as Promise); if (result == null) return null; diff --git a/lib/src/importer/js_to_dart/async_file.dart b/lib/src/importer/js_to_dart/async_file.dart index af7a3fa57..95b2af908 100644 --- a/lib/src/importer/js_to_dart/async_file.dart +++ b/lib/src/importer/js_to_dart/async_file.dart @@ -8,10 +8,10 @@ import 'package:cli_pkg/js.dart'; import 'package:node_interop/js.dart'; import 'package:node_interop/util.dart'; -import '../../js/importer.dart'; import '../../js/url.dart'; import '../../js/utils.dart'; import '../async.dart'; +import '../canonicalize_context.dart'; import '../filesystem.dart'; import '../result.dart'; import '../utils.dart'; @@ -20,15 +20,15 @@ import '../utils.dart'; /// it as a Dart [AsyncImporter]. final class JSToDartAsyncFileImporter extends AsyncImporter { /// The wrapped `findFileUrl` function. - final Object? Function(String, JSCanonicalizeContext) _findFileUrl; + final Object? Function(String, CanonicalizeContext) _findFileUrl; JSToDartAsyncFileImporter(this._findFileUrl); FutureOr canonicalize(Uri url) async { if (url.scheme == 'file') return FilesystemImporter.cwd.canonicalize(url); - var result = wrapJSExceptions(() => _findFileUrl( - url.toString(), dartToJSCanonicalizeContext(canonicalizeContext))); + var result = wrapJSExceptions( + () => _findFileUrl(url.toString(), canonicalizeContext)); if (isPromise(result)) result = await promiseToFuture(result as Promise); if (result == null) return null; if (!isJSUrl(result)) { diff --git a/lib/src/importer/js_to_dart/file.dart b/lib/src/importer/js_to_dart/file.dart index 8b271fb01..555c9df16 100644 --- a/lib/src/importer/js_to_dart/file.dart +++ b/lib/src/importer/js_to_dart/file.dart @@ -6,24 +6,24 @@ import 'package:cli_pkg/js.dart'; import 'package:node_interop/js.dart'; import '../../importer.dart'; -import '../../js/importer.dart'; import '../../js/url.dart'; import '../../js/utils.dart'; +import '../canonicalize_context.dart'; import '../utils.dart'; /// A wrapper for a potentially-asynchronous JS API file importer that exposes /// it as a Dart [AsyncImporter]. final class JSToDartFileImporter extends Importer { /// The wrapped `findFileUrl` function. - final Object? Function(String, JSCanonicalizeContext) _findFileUrl; + final Object? Function(String, CanonicalizeContext) _findFileUrl; JSToDartFileImporter(this._findFileUrl); Uri? canonicalize(Uri url) { if (url.scheme == 'file') return FilesystemImporter.cwd.canonicalize(url); - var result = wrapJSExceptions(() => _findFileUrl( - url.toString(), dartToJSCanonicalizeContext(canonicalizeContext))); + var result = wrapJSExceptions( + () => _findFileUrl(url.toString(), canonicalizeContext)); if (result == null) return null; if (isPromise(result)) { diff --git a/lib/src/importer/js_to_dart/sync.dart b/lib/src/importer/js_to_dart/sync.dart index ad302af1a..06b91310a 100644 --- a/lib/src/importer/js_to_dart/sync.dart +++ b/lib/src/importer/js_to_dart/sync.dart @@ -10,13 +10,14 @@ import '../../js/importer.dart'; import '../../js/url.dart'; import '../../js/utils.dart'; import '../../util/nullable.dart'; +import '../canonicalize_context.dart'; import 'utils.dart'; /// A wrapper for a synchronous JS API importer that exposes it as a Dart /// [Importer]. final class JSToDartImporter extends Importer { /// The wrapped canonicalize function. - final Object? Function(String, JSCanonicalizeContext) _canonicalize; + final Object? Function(String, CanonicalizeContext) _canonicalize; /// The wrapped load function. final Object? Function(JSUrl) _load; @@ -34,8 +35,8 @@ final class JSToDartImporter extends Importer { } Uri? canonicalize(Uri url) { - var result = wrapJSExceptions(() => _canonicalize( - url.toString(), dartToJSCanonicalizeContext(canonicalizeContext))); + var result = wrapJSExceptions( + () => _canonicalize(url.toString(), canonicalizeContext)); if (result == null) return null; if (isJSUrl(result)) return jsToDartUrl(result as JSUrl); diff --git a/lib/src/js.dart b/lib/src/js.dart index 79bf90180..dc0384bc4 100644 --- a/lib/src/js.dart +++ b/lib/src/js.dart @@ -7,6 +7,7 @@ import 'package:js/js_util.dart'; import 'js/exception.dart'; import 'js/deprecations.dart'; import 'js/exports.dart'; +import 'js/importer/canonicalize_context.dart'; import 'js/compile.dart'; import 'js/compiler.dart'; import 'js/legacy.dart'; @@ -64,6 +65,7 @@ void main() { "dart2js\t${const String.fromEnvironment('dart-version')}\t" "(Dart Compiler)\t[Dart]"; + updateCanonicalizeContextPrototype(); updateSourceSpanPrototype(); // Legacy API diff --git a/lib/src/js/importer.dart b/lib/src/js/importer.dart index 42d5aff90..09ffcd665 100644 --- a/lib/src/js/importer.dart +++ b/lib/src/js/importer.dart @@ -4,24 +4,18 @@ import 'package:js/js.dart'; +import '../importer/canonicalize_context.dart'; import 'url.dart'; @JS() @anonymous class JSImporter { - external Object? Function(String, JSCanonicalizeContext)? get canonicalize; + external Object? Function(String, CanonicalizeContext)? get canonicalize; external Object? Function(JSUrl)? get load; - external Object? Function(String, JSCanonicalizeContext)? get findFileUrl; + external Object? Function(String, CanonicalizeContext)? get findFileUrl; external Object? get nonCanonicalScheme; } -@JS() -@anonymous -class JSCanonicalizeContext { - external bool get fromImport; - external JSUrl? get containingUrl; -} - @JS() @anonymous class JSImporterResult { diff --git a/lib/src/js/importer/canonicalize_context.dart b/lib/src/js/importer/canonicalize_context.dart index 9b7d115e1..412f21ce8 100644 --- a/lib/src/js/importer/canonicalize_context.dart +++ b/lib/src/js/importer/canonicalize_context.dart @@ -2,20 +2,15 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. -import 'package:js/js.dart'; - import '../../importer/canonicalize_context.dart'; -import '../url.dart'; import '../../util/nullable.dart'; +import '../reflection.dart'; import '../utils.dart'; -@JSExport() -class JSExportCanonicalizeContext { - final CanonicalizeContext _canonicalizeContext; - - bool get fromImport => _canonicalizeContext.fromImport; - JSUrl? get containingUrl => - _canonicalizeContext.containingUrl.andThen(dartToJSUrl); - - JSExportCanonicalizeContext(this._canonicalizeContext); -} +/// Adds JS members to Dart's `CanonicalizeContext` class. +void updateCanonicalizeContextPrototype() => + getJSClass(CanonicalizeContext(null, false)).defineGetters({ + 'fromImport': (CanonicalizeContext self) => self.fromImport, + 'containingUrl': (CanonicalizeContext self) => + self.containingUrl.andThen(dartToJSUrl), + }); diff --git a/lib/src/js/utils.dart b/lib/src/js/utils.dart index 62e6edd24..a6b269782 100644 --- a/lib/src/js/utils.dart +++ b/lib/src/js/utils.dart @@ -9,14 +9,11 @@ import 'package:node_interop/node.dart' hide module; import 'package:js/js.dart'; import 'package:js/js_util.dart'; -import '../importer/canonicalize_context.dart'; import '../syntax.dart'; import '../utils.dart'; import '../value.dart'; import 'array.dart'; import 'function.dart'; -import 'importer.dart'; -import 'importer/canonicalize_context.dart'; import 'module.dart'; import 'reflection.dart'; import 'url.dart'; @@ -200,12 +197,6 @@ Uri jsToDartUrl(JSUrl url) => Uri.parse(url.toString()); /// Converts a Dart [Uri] object to a standard JS `URL` object. JSUrl dartToJSUrl(Uri url) => JSUrl(url.toString()); -JSCanonicalizeContext dartToJSCanonicalizeContext( - CanonicalizeContext canonicalizeContext) { - return createDartExport(JSExportCanonicalizeContext(canonicalizeContext)) - as JSCanonicalizeContext; -} - /// Creates a JavaScript array containing [iterable]. /// /// While Dart arrays are notionally compatible with JS arrays, they still have diff --git a/lib/src/js/value/mixin.dart b/lib/src/js/value/mixin.dart index a41b394d2..cc55f3eb4 100644 --- a/lib/src/js/value/mixin.dart +++ b/lib/src/js/value/mixin.dart @@ -13,7 +13,8 @@ import '../utils.dart'; final JSClass mixinClass = () { var jsClass = createJSClass('sass.SassMixin', (Object self) { jsThrow(JsError( - 'It is not possible to construct a SassMixin through the JavaScript API')); + 'It is not possible to construct a SassMixin through the JavaScript ' + 'API')); }); getJSClass(SassMixin(Callable('f', '', (_) => sassNull)))