diff --git a/Cargo.lock b/Cargo.lock index b062f4c2ee..e11182fc77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,9 +1172,9 @@ dependencies = [ [[package]] name = "deno_config" -version = "0.8.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5634c4d8f29f62bc4516a3dc474c1a06a6ce1388a139df08cb2020244e7de7" +checksum = "aca0a5b9d2693efb14c8c80d66a052464f24cbf6b3473648037e282c0c616917" dependencies = [ "anyhow", "glob", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 93258021ba..14ba2757df 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -55,7 +55,7 @@ winres.workspace = true [dependencies] deno_ast = { workspace = true, features = ["bundler", "cjs", "codegen", "dep_graph", "module_specifier", "proposal", "react", "sourcemap", "transforms", "typescript", "view", "visit"] } deno_cache_dir = "=0.6.1" -deno_config = "=0.8.2" +deno_config = "=0.9.1" deno_core = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_doc = { version = "=0.94.1", features = ["html"] } deno_emit = "=0.34.0" diff --git a/cli/schemas/config-file.v1.json b/cli/schemas/config-file.v1.json index 8e4bc75a48..58293ce8b4 100644 --- a/cli/schemas/config-file.v1.json +++ b/cli/schemas/config-file.v1.json @@ -487,6 +487,26 @@ } } }, + "publish": { + "description": "Configuration for deno publish", + "type": "object", + "properties": { + "include": { + "type": "array", + "description": "List of files, directories or globs that will be included in the published package.", + "items": { + "type": "string" + } + }, + "exclude": { + "type": "array", + "description": "List of files, directories or globs that will be excluded from the published package.", + "items": { + "type": "string" + } + } + } + }, "bench": { "description": "Configuration for deno bench", "type": "object", diff --git a/cli/tests/integration/publish_tests.rs b/cli/tests/integration/publish_tests.rs index f04f9c6824..92c65681a2 100644 --- a/cli/tests/integration/publish_tests.rs +++ b/cli/tests/integration/publish_tests.rs @@ -130,6 +130,9 @@ fn ignores_directories() { "name": "@foo/bar", "version": "1.0.0", "exclude": [ "ignore" ], + "publish": { + "exclude": [ "ignore2" ] + }, "exports": "./main_included.ts" })); @@ -137,6 +140,7 @@ fn ignores_directories() { temp_dir.join(".git"), temp_dir.join("node_modules"), temp_dir.join("ignore"), + temp_dir.join("ignore2"), ]; for ignored_dir in ignored_dirs { ignored_dir.create_dir_all(); @@ -163,6 +167,35 @@ fn ignores_directories() { assert_not_contains!(output, "ignored.ts"); } +#[test] +fn includes_directories() { + let context = publish_context_builder().build(); + let temp_dir = context.temp_dir().path(); + temp_dir.join("deno.json").write_json(&json!({ + "name": "@foo/bar", + "version": "1.0.0", + "exports": "./main.ts", + "publish": { + "include": [ "deno.json", "main.ts" ] + } + })); + + temp_dir.join("main.ts").write(""); + temp_dir.join("ignored.ts").write(""); + + let output = context + .new_command() + .arg("publish") + .arg("--log-level=debug") + .arg("--token") + .arg("sadfasdf") + .run(); + output.assert_exit_code(0); + let output = output.combined_output(); + assert_contains!(output, "main.ts"); + assert_not_contains!(output, "ignored.ts"); +} + fn publish_context_builder() -> TestContextBuilder { TestContextBuilder::new() .use_http_server() diff --git a/cli/tools/registry/mod.rs b/cli/tools/registry/mod.rs index 96f2d0f13b..990f910a83 100644 --- a/cli/tools/registry/mod.rs +++ b/cli/tools/registry/mod.rs @@ -131,9 +131,7 @@ async fn prepare_publish( let Some((scope, package_name)) = name.split_once('/') else { bail!("Invalid package name, use '@/ format"); }; - let exclude_patterns = deno_json - .to_files_config() - .map(|files| files.map(|f| f.exclude).unwrap_or_default())?; + let file_patterns = deno_json.to_publish_config()?.map(|c| c.files); let diagnostics_collector = diagnostics_collector.clone(); let tarball = deno_core::unsync::spawn_blocking(move || { @@ -143,7 +141,7 @@ async fn prepare_publish( &*source_cache, &diagnostics_collector, &unfurler, - &exclude_patterns, + file_patterns, ) .context("Failed to create a tarball") }) diff --git a/cli/tools/registry/tar.rs b/cli/tools/registry/tar.rs index 9bd7f098ee..c3fafa4b21 100644 --- a/cli/tools/registry/tar.rs +++ b/cli/tools/registry/tar.rs @@ -1,6 +1,7 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. use bytes::Bytes; +use deno_config::glob::FilePatterns; use deno_core::anyhow; use deno_core::anyhow::Context; use deno_core::error::AnyError; @@ -13,7 +14,6 @@ use std::path::PathBuf; use tar::Header; use crate::util::import_map::ImportMapUnfurler; -use deno_config::glob::PathOrPatternSet; use super::diagnostics::PublishDiagnostic; use super::diagnostics::PublishDiagnosticsCollector; @@ -37,7 +37,7 @@ pub fn create_gzipped_tarball( source_cache: &dyn deno_graph::ParsedSourceStore, diagnostics_collector: &PublishDiagnosticsCollector, unfurler: &ImportMapUnfurler, - exclude_patterns: &PathOrPatternSet, + file_patterns: Option, ) -> Result { let mut tar = TarGzArchive::new(); let mut diagnostics = vec![]; @@ -47,11 +47,13 @@ pub fn create_gzipped_tarball( while let Some(entry) = iterator.next() { let entry = entry?; - if exclude_patterns.matches_path(entry.path()) { - if entry.file_type().is_dir() { - iterator.skip_current_dir(); + if let Some(file_patterns) = &file_patterns { + if !file_patterns.matches_path(entry.path()) { + if entry.file_type().is_dir() { + iterator.skip_current_dir(); + } + continue; } - continue; } if entry.file_type().is_file() {