Skip to content

Commit

Permalink
fix: allow npm: specifiers in import.meta.resolve (#21716)
Browse files Browse the repository at this point in the history
Closes #21298.

"npm:" specifiers are matched against import map entries
and if no match is found they are passed through.
  • Loading branch information
bartlomieju committed Dec 28, 2023
1 parent f85d65e commit 576b20a
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 8 deletions.
3 changes: 2 additions & 1 deletion cli/tests/testdata/run/import_meta/importmap.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 6,7 @@
"1": "https://example.com/PASS-1",
"null": "https://example.com/PASS-null",
"undefined": "https://example.com/PASS-undefined",
"[object Object]": "https://example.com/PASS-object"
"[object Object]": "https://example.com/PASS-object",
"npm:preact": "https://example.com/preact"
}
}
5 changes: 3 additions & 2 deletions cli/tests/testdata/run/import_meta/main.out
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 7,6 @@ Resolving without a value from import map https://example.com/PASS-undefined
Resolving 1 from import map https://example.com/PASS-1
Resolving null from import map https://example.com/PASS-null
Resolving object from import map https://example.com/PASS-object
TypeError: "npm:" specifiers are currently not supported in import.meta.resolve()
at file:///[WILDCARD]testdata/run/import_meta/main.ts:36:15
Resolving npm:cowsay npm:cowsay
Resolving npm:cowsay@1 npm:cowsay@1
Resolving npm:preact from import map https://example.com/preact
17 changes: 12 additions & 5 deletions cli/tests/testdata/run/import_meta/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 32,15 @@ assertThrows(() => {
assertThrows(() => {
import.meta.resolve("://malformed/url?asdf");
}, TypeError);
try {
import.meta.resolve("npm:cowsay");
} catch (e) {
console.log(e);
}
console.log(
"Resolving npm:cowsay",
import.meta.resolve("npm:cowsay"),
);
console.log(
"Resolving npm:cowsay@1",
import.meta.resolve("npm:cowsay@1"),
);
console.log(
"Resolving npm:preact from import map",
import.meta.resolve("npm:preact"),
);
4 changes: 4 additions & 0 deletions runtime/web_worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 5,7 @@ use crate::ops;
use crate::permissions::PermissionsContainer;
use crate::shared::runtime;
use crate::tokio_util::create_and_run_current_thread;
use crate::worker::import_meta_resolve_callback;
use crate::worker::FormatJsErrorFn;
use crate::BootstrapOptions;
use deno_broadcast_channel::InMemoryBroadcastChannel;
Expand Down Expand Up @@ -536,6 537,9 @@ impl WebWorker {
inspector: options.maybe_inspector_server.is_some(),
feature_checker: Some(options.feature_checker.clone()),
op_metrics_factory_fn,
import_meta_resolve_callback: Some(Box::new(
import_meta_resolve_callback,
)),
..Default::default()
});

Expand Down
15 changes: 15 additions & 0 deletions runtime/worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 50,18 @@ use crate::BootstrapOptions;

pub type FormatJsErrorFn = dyn Fn(&JsError) -> String Sync Send;

pub fn import_meta_resolve_callback(
loader: &dyn deno_core::ModuleLoader,
specifier: String,
referrer: String,
) -> Result<ModuleSpecifier, AnyError> {
loader.resolve(
&specifier,
&referrer,
deno_core::ResolutionKind::DynamicImport,
)
}

#[derive(Clone, Default)]
pub struct ExitCode(Arc<AtomicI32>);

Expand Down Expand Up @@ -447,6 459,9 @@ impl MainWorker {
wait_for_inspector_disconnect_callback: Some(
wait_for_inspector_disconnect_callback,
),
import_meta_resolve_callback: Some(Box::new(
import_meta_resolve_callback,
)),
..Default::default()
});

Expand Down

0 comments on commit 576b20a

Please sign in to comment.