Skip to content

Commit

Permalink
Fix cache for relative imports handled by importers other than the ba…
Browse files Browse the repository at this point in the history
…se importer
  • Loading branch information
ntkme committed Apr 4, 2024
1 parent 1137797 commit f4c79da
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 30 deletions.
52 changes: 37 additions & 15 deletions lib/src/async_import_cache.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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?>{};

Expand Down Expand Up @@ -153,18 +154,39 @@ 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 resolved = baseUrl?.resolveUri(url) ?? url;
var relativeResult = await putIfAbsentAsync(
_relativeCanonicalizeCache,
(
resolved,
forImport: forImport,
importer: baseImporter,
baseUrl: baseUrl,
resolveUrl: true
),
() => _canonicalize(baseImporter, resolved, 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,
resolveUrl: false));
if (relativeResult != null) return relativeResult;
}

return null;
}

return await putIfAbsentAsync(
Expand Down
51 changes: 36 additions & 15 deletions lib/src/import_cache.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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: e8b432e34cb0d75a489bc6459ba5a62a1730e8e5
//
// ignore_for_file: unused_import

Expand Down Expand Up @@ -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?>{};

Expand Down Expand Up @@ -153,17 +154,37 @@ 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 resolved = baseUrl?.resolveUri(url) ?? url;
var relativeResult = _relativeCanonicalizeCache.putIfAbsent(
(
resolved,
forImport: forImport,
importer: baseImporter,
baseUrl: baseUrl,
resolveUrl: true
),
() => _canonicalize(baseImporter, resolved, 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,
resolveUrl: false));
if (relativeResult != null) return relativeResult;
}

return null;
}

return _canonicalizeCache.putIfAbsent((url, forImport: forImport), () {
Expand Down

0 comments on commit f4c79da

Please sign in to comment.