Skip to content

Commit

Permalink
Add JS getters to the existing CanonicalizeContext object
Browse files Browse the repository at this point in the history
  • Loading branch information
nex3 committed Apr 17, 2024
1 parent 3ddea86 commit f270359
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 46 deletions.
7 changes: 4 additions & 3 deletions lib/src/importer/js_to_dart/async.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ 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';

/// A wrapper for a potentially-asynchronous JS API importer that exposes it as
/// 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;
Expand All @@ -38,8 +39,8 @@ final class JSToDartAsyncImporter extends AsyncImporter {
}

FutureOr<Uri?> 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;

Expand Down
8 changes: 4 additions & 4 deletions lib/src/importer/js_to_dart/async_file.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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<Uri?> 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)) {
Expand Down
8 changes: 4 additions & 4 deletions lib/src/importer/js_to_dart/file.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
7 changes: 4 additions & 3 deletions lib/src/importer/js_to_dart/sync.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand Down
2 changes: 2 additions & 0 deletions lib/src/js.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -64,6 +65,7 @@ void main() {
"dart2js\t${const String.fromEnvironment('dart-version')}\t"
"(Dart Compiler)\t[Dart]";

updateCanonicalizeContextPrototype();
updateSourceSpanPrototype();

// Legacy API
Expand Down
12 changes: 3 additions & 9 deletions lib/src/js/importer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
21 changes: 8 additions & 13 deletions lib/src/js/importer/canonicalize_context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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),
});
9 changes: 0 additions & 9 deletions lib/src/js/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion lib/src/js/value/mixin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand Down

0 comments on commit f270359

Please sign in to comment.