Skip to content

Commit dabb677

Browse files
authored
fix(publish): improve error message when missing exports (#26945)
1 parent 429f392 commit dabb677

File tree

6 files changed

+56
-32
lines changed

6 files changed

+56
-32
lines changed

cli/tools/registry/mod.rs

+33-32
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use std::sync::Arc;
1212
use base64::prelude::BASE64_STANDARD;
1313
use base64::Engine;
1414
use deno_ast::ModuleSpecifier;
15+
use deno_config::deno_json::ConfigFile;
1516
use deno_config::workspace::JsrPackageConfig;
1617
use deno_config::workspace::PackageJsonDepResolution;
1718
use deno_config::workspace::Workspace;
@@ -95,8 +96,9 @@ pub async fn publish(
9596
match cli_options.start_dir.maybe_deno_json() {
9697
Some(deno_json) => {
9798
debug_assert!(!deno_json.is_package());
99+
error_missing_exports_field(deno_json)?;
98100
bail!(
99-
"Missing 'name', 'version' and 'exports' field in '{}'.",
101+
"Missing 'name' or 'exports' field in '{}'.",
100102
deno_json.specifier
101103
);
102104
}
@@ -416,9 +418,6 @@ impl PublishPreparer {
416418
graph: Arc<deno_graph::ModuleGraph>,
417419
diagnostics_collector: &PublishDiagnosticsCollector,
418420
) -> Result<Rc<PreparedPublishPackage>, AnyError> {
419-
static SUGGESTED_ENTRYPOINTS: [&str; 4] =
420-
["mod.ts", "mod.js", "index.ts", "index.js"];
421-
422421
let deno_json = &package.config_file;
423422
let config_path = deno_json.specifier.to_file_path().unwrap();
424423
let root_dir = config_path.parent().unwrap().to_path_buf();
@@ -428,34 +427,6 @@ impl PublishPreparer {
428427
deno_json.specifier
429428
)
430429
})?;
431-
if deno_json.json.exports.is_none() {
432-
let mut suggested_entrypoint = None;
433-
434-
for entrypoint in SUGGESTED_ENTRYPOINTS {
435-
if root_dir.join(entrypoint).exists() {
436-
suggested_entrypoint = Some(entrypoint);
437-
break;
438-
}
439-
}
440-
441-
let exports_content = format!(
442-
r#"{{
443-
"name": "{}",
444-
"version": "{}",
445-
"exports": "{}"
446-
}}"#,
447-
package.name,
448-
version,
449-
suggested_entrypoint.unwrap_or("<path_to_entrypoint>")
450-
);
451-
452-
bail!(
453-
"You did not specify an entrypoint to \"{}\" package in {}. Add `exports` mapping in the configuration file, eg:\n{}",
454-
package.name,
455-
deno_json.specifier,
456-
exports_content
457-
);
458-
}
459430
let Some(name_no_at) = package.name.strip_prefix('@') else {
460431
bail!("Invalid package name, use '@<scope_name>/<package_name> format");
461432
};
@@ -1287,6 +1258,36 @@ fn has_license_file<'a>(
12871258
})
12881259
}
12891260

1261+
fn error_missing_exports_field(deno_json: &ConfigFile) -> Result<(), AnyError> {
1262+
static SUGGESTED_ENTRYPOINTS: [&str; 4] =
1263+
["mod.ts", "mod.js", "index.ts", "index.js"];
1264+
let mut suggested_entrypoint = None;
1265+
1266+
for entrypoint in SUGGESTED_ENTRYPOINTS {
1267+
if deno_json.dir_path().join(entrypoint).exists() {
1268+
suggested_entrypoint = Some(entrypoint);
1269+
break;
1270+
}
1271+
}
1272+
1273+
let exports_content = format!(
1274+
r#"{{
1275+
"name": "{}",
1276+
"version": "{}",
1277+
"exports": "{}"
1278+
}}"#,
1279+
deno_json.json.name.as_deref().unwrap_or("@scope/name"),
1280+
deno_json.json.name.as_deref().unwrap_or("0.0.0"),
1281+
suggested_entrypoint.unwrap_or("<path_to_entrypoint>")
1282+
);
1283+
1284+
bail!(
1285+
"You did not specify an entrypoint in {}. Add `exports` mapping in the configuration file, eg:\n{}",
1286+
deno_json.specifier,
1287+
exports_content
1288+
);
1289+
}
1290+
12901291
#[allow(clippy::print_stderr)]
12911292
fn ring_bell() {
12921293
// ASCII code for the bell character.

tests/specs/publish/missing_exports/LICENSE

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"args": "publish --token 'sadfasdf'",
3+
"output": "publish.out",
4+
"exitCode": 1
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "@foo/bar",
3+
"version": "1.0.0",
4+
"imports": {
5+
"@std/http": "./std_http.ts"
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function add(a: number, b: number): number {
2+
return a + b;
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Warning "exports" field should be specified when specifying a "name".
2+
at file:///[WILDLINE]/deno.json
3+
error: You did not specify an entrypoint in file:///[WILDLINE]/deno.json. Add `exports` mapping in the configuration file, eg:
4+
{
5+
"name": "@foo/bar",
6+
"version": "@foo/bar",
7+
"exports": "mod.ts"
8+
}

0 commit comments

Comments
 (0)