mirror of
https://github.com/denoland/deno.git
synced 2025-01-21 04:52:26 -05:00
fix: support bun specifiers in JSR publish (#24588)
Fixes https://github.com/denoland/deno/issues/26989 --------- Co-authored-by: Nathan Whitaker <nathan@deno.com>
This commit is contained in:
parent
1af2d2474e
commit
32e260d55a
11 changed files with 62 additions and 18 deletions
|
@ -6,6 +6,7 @@ use crate::args::CliLockfile;
|
||||||
use crate::args::CliOptions;
|
use crate::args::CliOptions;
|
||||||
use crate::args::DENO_DISABLE_PEDANTIC_NODE_WARNINGS;
|
use crate::args::DENO_DISABLE_PEDANTIC_NODE_WARNINGS;
|
||||||
use crate::cache;
|
use crate::cache;
|
||||||
|
use crate::cache::FetchCacher;
|
||||||
use crate::cache::GlobalHttpCache;
|
use crate::cache::GlobalHttpCache;
|
||||||
use crate::cache::ModuleInfoCache;
|
use crate::cache::ModuleInfoCache;
|
||||||
use crate::cache::ParsedSourceCache;
|
use crate::cache::ParsedSourceCache;
|
||||||
|
@ -254,6 +255,23 @@ impl ModuleGraphCreator {
|
||||||
package_configs: &[JsrPackageConfig],
|
package_configs: &[JsrPackageConfig],
|
||||||
build_fast_check_graph: bool,
|
build_fast_check_graph: bool,
|
||||||
) -> Result<ModuleGraph, AnyError> {
|
) -> Result<ModuleGraph, AnyError> {
|
||||||
|
struct PublishLoader(FetchCacher);
|
||||||
|
impl Loader for PublishLoader {
|
||||||
|
fn load(
|
||||||
|
&self,
|
||||||
|
specifier: &deno_ast::ModuleSpecifier,
|
||||||
|
options: deno_graph::source::LoadOptions,
|
||||||
|
) -> deno_graph::source::LoadFuture {
|
||||||
|
if specifier.scheme() == "bun" {
|
||||||
|
return Box::pin(std::future::ready(Ok(Some(
|
||||||
|
deno_graph::source::LoadResponse::External {
|
||||||
|
specifier: specifier.clone(),
|
||||||
|
},
|
||||||
|
))));
|
||||||
|
}
|
||||||
|
self.0.load(specifier, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
fn graph_has_external_remote(graph: &ModuleGraph) -> bool {
|
fn graph_has_external_remote(graph: &ModuleGraph) -> bool {
|
||||||
// Earlier on, we marked external non-JSR modules as external.
|
// Earlier on, we marked external non-JSR modules as external.
|
||||||
// If the graph contains any of those, it would cause type checking
|
// If the graph contains any of those, it would cause type checking
|
||||||
|
@ -271,12 +289,15 @@ impl ModuleGraphCreator {
|
||||||
for package_config in package_configs {
|
for package_config in package_configs {
|
||||||
roots.extend(package_config.config_file.resolve_export_value_urls()?);
|
roots.extend(package_config.config_file.resolve_export_value_urls()?);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let loader = self.module_graph_builder.create_graph_loader();
|
||||||
|
let mut publish_loader = PublishLoader(loader);
|
||||||
let mut graph = self
|
let mut graph = self
|
||||||
.create_graph_with_options(CreateGraphOptions {
|
.create_graph_with_options(CreateGraphOptions {
|
||||||
is_dynamic: false,
|
is_dynamic: false,
|
||||||
graph_kind: deno_graph::GraphKind::All,
|
graph_kind: deno_graph::GraphKind::All,
|
||||||
roots,
|
roots,
|
||||||
loader: None,
|
loader: Some(&mut publish_loader),
|
||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
self.graph_valid(&graph)?;
|
self.graph_valid(&graph)?;
|
||||||
|
|
|
@ -476,7 +476,7 @@ impl Diagnostic for PublishDiagnostic {
|
||||||
InvalidExternalImport { imported, .. } => Cow::Owned(vec![
|
InvalidExternalImport { imported, .. } => Cow::Owned(vec![
|
||||||
Cow::Owned(format!("the import was resolved to '{}'", imported)),
|
Cow::Owned(format!("the import was resolved to '{}'", imported)),
|
||||||
Cow::Borrowed("this specifier is not allowed to be imported on jsr"),
|
Cow::Borrowed("this specifier is not allowed to be imported on jsr"),
|
||||||
Cow::Borrowed("jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers"),
|
Cow::Borrowed("jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers"),
|
||||||
]),
|
]),
|
||||||
UnsupportedJsxTsx { .. } => Cow::Owned(vec![
|
UnsupportedJsxTsx { .. } => Cow::Owned(vec![
|
||||||
Cow::Borrowed("follow https://github.com/jsr-io/jsr/issues/24 for updates"),
|
Cow::Borrowed("follow https://github.com/jsr-io/jsr/issues/24 for updates"),
|
||||||
|
|
|
@ -47,7 +47,7 @@ impl GraphDiagnosticsCollector {
|
||||||
resolution: &ResolutionResolved| {
|
resolution: &ResolutionResolved| {
|
||||||
if visited.insert(resolution.specifier.clone()) {
|
if visited.insert(resolution.specifier.clone()) {
|
||||||
match resolution.specifier.scheme() {
|
match resolution.specifier.scheme() {
|
||||||
"file" | "data" | "node" => {}
|
"file" | "data" | "node" | "bun" => {}
|
||||||
"jsr" => {
|
"jsr" => {
|
||||||
skip_specifiers.insert(resolution.specifier.clone());
|
skip_specifiers.insert(resolution.specifier.clone());
|
||||||
|
|
||||||
|
|
|
@ -656,17 +656,21 @@ fn op_load_inner(
|
||||||
}
|
}
|
||||||
Module::Npm(_) | Module::Node(_) => None,
|
Module::Npm(_) | Module::Node(_) => None,
|
||||||
Module::External(module) => {
|
Module::External(module) => {
|
||||||
// means it's Deno code importing an npm module
|
if module.specifier.scheme() != "file" {
|
||||||
let specifier = node::resolve_specifier_into_node_modules(
|
None
|
||||||
&module.specifier,
|
} else {
|
||||||
&deno_fs::RealFs,
|
// means it's Deno code importing an npm module
|
||||||
);
|
let specifier = node::resolve_specifier_into_node_modules(
|
||||||
Some(Cow::Owned(load_from_node_modules(
|
&module.specifier,
|
||||||
&specifier,
|
&deno_fs::RealFs,
|
||||||
state.maybe_npm.as_ref(),
|
);
|
||||||
&mut media_type,
|
Some(Cow::Owned(load_from_node_modules(
|
||||||
&mut is_cjs,
|
&specifier,
|
||||||
)?))
|
state.maybe_npm.as_ref(),
|
||||||
|
&mut media_type,
|
||||||
|
&mut is_cjs,
|
||||||
|
)?))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if let Some(npm) = state
|
} else if let Some(npm) = state
|
||||||
|
|
4
tests/specs/publish/bun_specifier/__test__.jsonc
Normal file
4
tests/specs/publish/bun_specifier/__test__.jsonc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"args": "publish --token 'sadfasdf'",
|
||||||
|
"output": "bun_specifier.out"
|
||||||
|
}
|
6
tests/specs/publish/bun_specifier/bun_specifier.out
Normal file
6
tests/specs/publish/bun_specifier/bun_specifier.out
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Check file:///[WILDCARD]/mod.ts
|
||||||
|
Checking for slow types in the public API...
|
||||||
|
Check file:///[WILDCARD]/mod.ts
|
||||||
|
Publishing @foo/bar@1.0.0 ...
|
||||||
|
Successfully published @foo/bar@1.0.0
|
||||||
|
Visit http://127.0.0.1:4250/@foo/bar@1.0.0 for details
|
8
tests/specs/publish/bun_specifier/deno.json
Normal file
8
tests/specs/publish/bun_specifier/deno.json
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "@foo/bar",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"exports": {
|
||||||
|
".": "./mod.ts"
|
||||||
|
},
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
1
tests/specs/publish/bun_specifier/mod.ts
Normal file
1
tests/specs/publish/bun_specifier/mod.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import "bun:sqlite";
|
|
@ -12,7 +12,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
||||||
|
|
||||||
info: the import was resolved to 'http://localhost:4545/welcome.ts'
|
info: the import was resolved to 'http://localhost:4545/welcome.ts'
|
||||||
info: this specifier is not allowed to be imported on jsr
|
info: this specifier is not allowed to be imported on jsr
|
||||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||||
docs: https://jsr.io/go/invalid-external-import
|
docs: https://jsr.io/go/invalid-external-import
|
||||||
|
|
||||||
error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
||||||
|
@ -25,7 +25,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
||||||
|
|
||||||
info: the import was resolved to 'http://localhost:4545/echo.ts'
|
info: the import was resolved to 'http://localhost:4545/echo.ts'
|
||||||
info: this specifier is not allowed to be imported on jsr
|
info: this specifier is not allowed to be imported on jsr
|
||||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||||
docs: https://jsr.io/go/invalid-external-import
|
docs: https://jsr.io/go/invalid-external-import
|
||||||
|
|
||||||
error: Found 2 problems
|
error: Found 2 problems
|
||||||
|
|
|
@ -13,7 +13,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'http' specifier
|
||||||
|
|
||||||
info: the import was resolved to 'http://esm.sh/react-dom@18.2.0/server'
|
info: the import was resolved to 'http://esm.sh/react-dom@18.2.0/server'
|
||||||
info: this specifier is not allowed to be imported on jsr
|
info: this specifier is not allowed to be imported on jsr
|
||||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||||
docs: https://jsr.io/go/invalid-external-import
|
docs: https://jsr.io/go/invalid-external-import
|
||||||
|
|
||||||
error: Found 1 problem
|
error: Found 1 problem
|
||||||
|
|
|
@ -13,7 +13,7 @@ error[invalid-external-import]: invalid import to a non-JSR 'https' specifier
|
||||||
|
|
||||||
info: the import was resolved to 'https://deno.land/std/assert/assert.ts'
|
info: the import was resolved to 'https://deno.land/std/assert/assert.ts'
|
||||||
info: this specifier is not allowed to be imported on jsr
|
info: this specifier is not allowed to be imported on jsr
|
||||||
info: jsr only supports importing `jsr:`, `npm:`, and `data:` specifiers
|
info: jsr only supports importing `jsr:`, `npm:`, `data:`, `bun:`, and `node:` specifiers
|
||||||
docs: https://jsr.io/go/invalid-external-import
|
docs: https://jsr.io/go/invalid-external-import
|
||||||
|
|
||||||
error: Found 1 problem
|
error: Found 1 problem
|
||||||
|
|
Loading…
Add table
Reference in a new issue