feat(publish): exclude and include (#22055)

This commit is contained in:
Luca Casonato 2024-01-24 21:30:08 +01:00 committed by GitHub
parent fb24b004ba
commit 176118a046
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 66 additions and 13 deletions

4
Cargo.lock generated
View file

@ -1172,9 +1172,9 @@ dependencies = [
[[package]] [[package]]
name = "deno_config" name = "deno_config"
version = "0.8.2" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb5634c4d8f29f62bc4516a3dc474c1a06a6ce1388a139df08cb2020244e7de7" checksum = "aca0a5b9d2693efb14c8c80d66a052464f24cbf6b3473648037e282c0c616917"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"glob", "glob",

View file

@ -55,7 +55,7 @@ winres.workspace = true
[dependencies] [dependencies]
deno_ast = { workspace = true, features = ["bundler", "cjs", "codegen", "dep_graph", "module_specifier", "proposal", "react", "sourcemap", "transforms", "typescript", "view", "visit"] } 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_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_core = { workspace = true, features = ["include_js_files_for_snapshotting"] }
deno_doc = { version = "=0.94.1", features = ["html"] } deno_doc = { version = "=0.94.1", features = ["html"] }
deno_emit = "=0.34.0" deno_emit = "=0.34.0"

View file

@ -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": { "bench": {
"description": "Configuration for deno bench", "description": "Configuration for deno bench",
"type": "object", "type": "object",

View file

@ -130,6 +130,9 @@ fn ignores_directories() {
"name": "@foo/bar", "name": "@foo/bar",
"version": "1.0.0", "version": "1.0.0",
"exclude": [ "ignore" ], "exclude": [ "ignore" ],
"publish": {
"exclude": [ "ignore2" ]
},
"exports": "./main_included.ts" "exports": "./main_included.ts"
})); }));
@ -137,6 +140,7 @@ fn ignores_directories() {
temp_dir.join(".git"), temp_dir.join(".git"),
temp_dir.join("node_modules"), temp_dir.join("node_modules"),
temp_dir.join("ignore"), temp_dir.join("ignore"),
temp_dir.join("ignore2"),
]; ];
for ignored_dir in ignored_dirs { for ignored_dir in ignored_dirs {
ignored_dir.create_dir_all(); ignored_dir.create_dir_all();
@ -163,6 +167,35 @@ fn ignores_directories() {
assert_not_contains!(output, "ignored.ts"); 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 { fn publish_context_builder() -> TestContextBuilder {
TestContextBuilder::new() TestContextBuilder::new()
.use_http_server() .use_http_server()

View file

@ -131,9 +131,7 @@ async fn prepare_publish(
let Some((scope, package_name)) = name.split_once('/') else { let Some((scope, package_name)) = name.split_once('/') else {
bail!("Invalid package name, use '@<scope_name>/<package_name> format"); bail!("Invalid package name, use '@<scope_name>/<package_name> format");
}; };
let exclude_patterns = deno_json let file_patterns = deno_json.to_publish_config()?.map(|c| c.files);
.to_files_config()
.map(|files| files.map(|f| f.exclude).unwrap_or_default())?;
let diagnostics_collector = diagnostics_collector.clone(); let diagnostics_collector = diagnostics_collector.clone();
let tarball = deno_core::unsync::spawn_blocking(move || { let tarball = deno_core::unsync::spawn_blocking(move || {
@ -143,7 +141,7 @@ async fn prepare_publish(
&*source_cache, &*source_cache,
&diagnostics_collector, &diagnostics_collector,
&unfurler, &unfurler,
&exclude_patterns, file_patterns,
) )
.context("Failed to create a tarball") .context("Failed to create a tarball")
}) })

View file

@ -1,6 +1,7 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
use bytes::Bytes; use bytes::Bytes;
use deno_config::glob::FilePatterns;
use deno_core::anyhow; use deno_core::anyhow;
use deno_core::anyhow::Context; use deno_core::anyhow::Context;
use deno_core::error::AnyError; use deno_core::error::AnyError;
@ -13,7 +14,6 @@ use std::path::PathBuf;
use tar::Header; use tar::Header;
use crate::util::import_map::ImportMapUnfurler; use crate::util::import_map::ImportMapUnfurler;
use deno_config::glob::PathOrPatternSet;
use super::diagnostics::PublishDiagnostic; use super::diagnostics::PublishDiagnostic;
use super::diagnostics::PublishDiagnosticsCollector; use super::diagnostics::PublishDiagnosticsCollector;
@ -37,7 +37,7 @@ pub fn create_gzipped_tarball(
source_cache: &dyn deno_graph::ParsedSourceStore, source_cache: &dyn deno_graph::ParsedSourceStore,
diagnostics_collector: &PublishDiagnosticsCollector, diagnostics_collector: &PublishDiagnosticsCollector,
unfurler: &ImportMapUnfurler, unfurler: &ImportMapUnfurler,
exclude_patterns: &PathOrPatternSet, file_patterns: Option<FilePatterns>,
) -> Result<PublishableTarball, AnyError> { ) -> Result<PublishableTarball, AnyError> {
let mut tar = TarGzArchive::new(); let mut tar = TarGzArchive::new();
let mut diagnostics = vec![]; let mut diagnostics = vec![];
@ -47,11 +47,13 @@ pub fn create_gzipped_tarball(
while let Some(entry) = iterator.next() { while let Some(entry) = iterator.next() {
let entry = entry?; let entry = entry?;
if exclude_patterns.matches_path(entry.path()) { if let Some(file_patterns) = &file_patterns {
if entry.file_type().is_dir() { if !file_patterns.matches_path(entry.path()) {
iterator.skip_current_dir(); if entry.file_type().is_dir() {
iterator.skip_current_dir();
}
continue;
} }
continue;
} }
if entry.file_type().is_file() { if entry.file_type().is_file() {