From eecf9d3b721668fcecb7ea8abb1412c2ff48721d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=AA=E3=81=A4=E3=81=8D?= Date: Wed, 3 Apr 2024 11:58:35 -0700 Subject: [PATCH] Fix cache for relative imports handled by importers other than the base importer --- lib/src/async_import_cache.dart | 50 +++++++++++++++++++++++---------- lib/src/import_cache.dart | 47 +++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 30 deletions(-) diff --git a/lib/src/async_import_cache.dart b/lib/src/async_import_cache.dart index 0deb6285f..6ec367ccb 100644 --- a/lib/src/async_import_cache.dart +++ b/lib/src/async_import_cache.dart @@ -56,15 +56,16 @@ final class AsyncImportCache { /// /// 1. The URL passed to [canonicalize] (the same as in [_canonicalizeCache]). /// 2. Whether the canonicalization is for an `@import` rule. - /// 3. The `baseImporter` passed to [canonicalize]. + /// 3. The `importer` passed to [canonicalize]. /// 4. The `baseUrl` passed to [canonicalize]. /// /// The map's values are the same as the return value of [canonicalize]. final _relativeCanonicalizeCache = <( Uri, { bool forImport, - AsyncImporter baseImporter, - Uri? baseUrl + AsyncImporter importer, + Uri? baseUrl, + bool resolveUrl }), AsyncCanonicalizeResult?>{}; @@ -153,18 +154,37 @@ final class AsyncImportCache { "in the browser."; } - if (baseImporter != null && url.scheme == '') { - var relativeResult = await putIfAbsentAsync( - _relativeCanonicalizeCache, - ( - url, - forImport: forImport, - baseImporter: baseImporter, - baseUrl: baseUrl - ), - () => _canonicalize(baseImporter, baseUrl?.resolveUri(url) ?? url, - baseUrl, forImport)); - if (relativeResult != null) return relativeResult; + if (url.scheme == '') { + if (baseImporter != null) { + var relativeResult = await putIfAbsentAsync( + _relativeCanonicalizeCache, + ( + url, + forImport: forImport, + importer: baseImporter, + baseUrl: baseUrl, + resolveUrl: true + ), + () => _canonicalize(baseImporter, url, baseUrl, forImport, + resolveUrl: true)); + if (relativeResult != null) return relativeResult; + } + + for (var importer in _importers) { + var relativeResult = await putIfAbsentAsync( + _relativeCanonicalizeCache, + ( + url, + forImport: forImport, + importer: importer, + baseUrl: baseUrl, + resolveUrl: false + ), + () => _canonicalize(importer, url, baseUrl, forImport)); + if (relativeResult != null) return relativeResult; + } + + return null; } return await putIfAbsentAsync( diff --git a/lib/src/import_cache.dart b/lib/src/import_cache.dart index e34f0a7ee..02a27ae3f 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: d157b83599dbc07a80ac6cb5ffdf5dde03b60376 +// Checksum: f83796dbd79b1f054b3dd8ab959030a725b7e8fc // // ignore_for_file: unused_import @@ -58,15 +58,16 @@ final class ImportCache { /// /// 1. The URL passed to [canonicalize] (the same as in [_canonicalizeCache]). /// 2. Whether the canonicalization is for an `@import` rule. - /// 3. The `baseImporter` passed to [canonicalize]. + /// 3. The `importer` passed to [canonicalize]. /// 4. The `baseUrl` passed to [canonicalize]. /// /// The map's values are the same as the return value of [canonicalize]. final _relativeCanonicalizeCache = <( Uri, { bool forImport, - Importer baseImporter, - Uri? baseUrl + Importer importer, + Uri? baseUrl, + bool resolveUrl }), CanonicalizeResult?>{}; @@ -153,17 +154,33 @@ final class ImportCache { "in the browser."; } - if (baseImporter != null && url.scheme == '') { - var relativeResult = _relativeCanonicalizeCache.putIfAbsent( - ( - url, - forImport: forImport, - baseImporter: baseImporter, - baseUrl: baseUrl - ), - () => _canonicalize(baseImporter, baseUrl?.resolveUri(url) ?? url, - baseUrl, forImport)); - if (relativeResult != null) return relativeResult; + if (url.scheme == '') { + if (baseImporter != null) { + var relativeResult = _relativeCanonicalizeCache.putIfAbsent( + ( + url, + forImport: forImport, + importer: baseImporter, + baseUrl: baseUrl, + resolveUrl: true + ), + () => _canonicalize(baseImporter, url, baseUrl, forImport, + resolveUrl: true)); + if (relativeResult != null) return relativeResult; + } + + for (var importer in _importers) { + var relativeResult = _relativeCanonicalizeCache.putIfAbsent(( + url, + forImport: forImport, + importer: importer, + baseUrl: baseUrl, + resolveUrl: false + ), () => _canonicalize(importer, url, baseUrl, forImport)); + if (relativeResult != null) return relativeResult; + } + + return null; } return _canonicalizeCache.putIfAbsent((url, forImport: forImport), () {