From 2680b09b0d2a76eaa0b25c97390f1809a85ebfaa Mon Sep 17 00:00:00 2001 From: David Sherret Date: Mon, 22 Jul 2024 15:46:37 -0400 Subject: [PATCH] fix(publish): warn about missing license file (#24677) Part of https://github.com/denoland/deno/issues/24676 , but just a warning for now. --- cli/tools/registry/diagnostics.rs | 22 +++++- cli/tools/registry/mod.rs | 68 +++++++++++++++++++ tests/integration/publish_tests.rs | 2 + .../specs/jsr/excluded_export_module/LICENSE | 0 tests/specs/jsr/no_unused_params/LICENSE | 0 tests/specs/jsr/no_unused_params/publish.out | 1 + tests/specs/publish/allow_slow_types/LICENSE | 0 .../banned_triple_slash_directives/LICENSE | 0 .../specs/publish/bare_node_builtins/LICENSE | 0 .../bare_node_builtins/bare_node_builtins.out | 1 + .../bare_node_builtins/no_warnings.out | 1 + tests/specs/publish/byonm_dep/LICENSE | 0 tests/specs/publish/byonm_dep/deno.jsonc | 2 +- tests/specs/publish/byonm_dep/publish.out | 1 + .../publish/byonm_with_package_json/LICENSE | 0 tests/specs/publish/config_file_jsonc/LICENSE | 0 .../publish/config_flag/successful/LICENSE | 0 tests/specs/publish/dry_run/LICENSE | 0 .../specs/publish/dry_run_gitignored/LICENSE | 0 .../specs/publish/excluded_deno_jsonc/LICENSE | 0 .../specs/publish/excluded_deno_jsonc/mod.out | 1 + tests/specs/publish/has_slow_types/LICENSE | 0 tests/specs/publish/invalid_import/LICENSE | 0 .../invalid_import_esm_sh_suggestion/LICENSE | 0 tests/specs/publish/invalid_path/LICENSE | 0 .../publish/javascript_decl_file/LICENSE | 0 .../javascript_missing_decl_file/LICENSE | 0 tests/specs/publish/jsr_jsonc/LICENSE | 0 .../specs/publish/missing_constraint/LICENSE | 0 .../LICENSE | 0 .../publish/missing_license/__test__.jsonc | 4 ++ tests/specs/publish/missing_license/deno.json | 5 ++ tests/specs/publish/missing_license/mod.out | 12 ++++ tests/specs/publish/missing_license/mod.ts | 3 + tests/specs/publish/no_check/LICENSE | 0 .../no_check_surfaces_syntax_error/LICENSE | 0 tests/specs/publish/no_token/LICENSE | 0 tests/specs/publish/node_specifier/LICENSE | 0 tests/specs/publish/npm_workspace/add/LICENSE | 0 tests/specs/publish/npm_workspace/publish.out | 2 + .../publish/npm_workspace/subtract/LICENSE | 0 .../LICENSE | 0 tests/specs/publish/package_json/LICENSE | 0 .../publish/prefer_fast_check_graph/LICENSE | 0 tests/specs/publish/sloppy_imports/LICENSE | 0 tests/specs/publish/successful/LICENSE | 0 tests/specs/publish/symlink/LICENSE | 0 .../unanalyzable_dynamic_import/LICENSE | 0 .../specs/publish/unsupported_jsx_tsx/LICENSE | 0 tests/specs/publish/workspace/bar/LICENSE | 0 tests/specs/publish/workspace/foo/LICENSE | 0 tests/testdata/publish/successful/LICENSE | 0 52 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 tests/specs/jsr/excluded_export_module/LICENSE create mode 100644 tests/specs/jsr/no_unused_params/LICENSE create mode 100644 tests/specs/publish/allow_slow_types/LICENSE create mode 100644 tests/specs/publish/banned_triple_slash_directives/LICENSE create mode 100644 tests/specs/publish/bare_node_builtins/LICENSE create mode 100644 tests/specs/publish/byonm_dep/LICENSE create mode 100644 tests/specs/publish/byonm_with_package_json/LICENSE create mode 100644 tests/specs/publish/config_file_jsonc/LICENSE create mode 100644 tests/specs/publish/config_flag/successful/LICENSE create mode 100644 tests/specs/publish/dry_run/LICENSE create mode 100644 tests/specs/publish/dry_run_gitignored/LICENSE create mode 100644 tests/specs/publish/excluded_deno_jsonc/LICENSE create mode 100644 tests/specs/publish/has_slow_types/LICENSE create mode 100644 tests/specs/publish/invalid_import/LICENSE create mode 100644 tests/specs/publish/invalid_import_esm_sh_suggestion/LICENSE create mode 100644 tests/specs/publish/invalid_path/LICENSE create mode 100644 tests/specs/publish/javascript_decl_file/LICENSE create mode 100644 tests/specs/publish/javascript_missing_decl_file/LICENSE create mode 100644 tests/specs/publish/jsr_jsonc/LICENSE create mode 100644 tests/specs/publish/missing_constraint/LICENSE create mode 100644 tests/specs/publish/missing_constraint_jsx_import_source/LICENSE create mode 100644 tests/specs/publish/missing_license/__test__.jsonc create mode 100644 tests/specs/publish/missing_license/deno.json create mode 100644 tests/specs/publish/missing_license/mod.out create mode 100644 tests/specs/publish/missing_license/mod.ts create mode 100644 tests/specs/publish/no_check/LICENSE create mode 100644 tests/specs/publish/no_check_surfaces_syntax_error/LICENSE create mode 100644 tests/specs/publish/no_token/LICENSE create mode 100644 tests/specs/publish/node_specifier/LICENSE create mode 100644 tests/specs/publish/npm_workspace/add/LICENSE create mode 100644 tests/specs/publish/npm_workspace/subtract/LICENSE create mode 100644 tests/specs/publish/npm_workspace_jsr_pkg_with_npm_dep/LICENSE create mode 100644 tests/specs/publish/package_json/LICENSE create mode 100644 tests/specs/publish/prefer_fast_check_graph/LICENSE create mode 100644 tests/specs/publish/sloppy_imports/LICENSE create mode 100644 tests/specs/publish/successful/LICENSE create mode 100644 tests/specs/publish/symlink/LICENSE create mode 100644 tests/specs/publish/unanalyzable_dynamic_import/LICENSE create mode 100644 tests/specs/publish/unsupported_jsx_tsx/LICENSE create mode 100644 tests/specs/publish/workspace/bar/LICENSE create mode 100644 tests/specs/publish/workspace/foo/LICENSE create mode 100644 tests/testdata/publish/successful/LICENSE diff --git a/cli/tools/registry/diagnostics.rs b/cli/tools/registry/diagnostics.rs index 34f08b6666..54b2811941 100644 --- a/cli/tools/registry/diagnostics.rs +++ b/cli/tools/registry/diagnostics.rs @@ -119,6 +119,10 @@ pub enum PublishDiagnostic { range: SourceRange, }, SyntaxError(ParseDiagnostic), + MissingLicense { + /// This only exists because diagnostics require a location. + expected_path: PathBuf, + }, } impl PublishDiagnostic { @@ -168,6 +172,8 @@ impl Diagnostic for PublishDiagnostic { MissingConstraint { .. } => DiagnosticLevel::Error, BannedTripleSlashDirectives { .. } => DiagnosticLevel::Error, SyntaxError { .. } => DiagnosticLevel::Error, + // todo(#24676): make this an error in Deno 1.46 + MissingLicense { .. } => DiagnosticLevel::Warning, } } @@ -187,6 +193,7 @@ impl Diagnostic for PublishDiagnostic { Cow::Borrowed("banned-triple-slash-directives") } SyntaxError { .. } => Cow::Borrowed("syntax-error"), + MissingLicense { .. } => Cow::Borrowed("missing-license"), } } @@ -208,6 +215,7 @@ impl Diagnostic for PublishDiagnostic { MissingConstraint { specifier, .. } => Cow::Owned(format!("specifier '{}' is missing a version constraint", specifier)), BannedTripleSlashDirectives { .. } => Cow::Borrowed("triple slash directives that modify globals are not allowed"), SyntaxError(diagnostic) => diagnostic.message(), + MissingLicense { .. } => Cow::Borrowed("missing license file"), } } @@ -275,6 +283,9 @@ impl Diagnostic for PublishDiagnostic { text_info: Cow::Borrowed(text_info), }, SyntaxError(diagnostic) => diagnostic.location(), + MissingLicense { expected_path } => DiagnosticLocation::Path { + path: expected_path.clone(), + }, } } @@ -355,6 +366,7 @@ impl Diagnostic for PublishDiagnostic { }], }), SyntaxError(diagnostic) => diagnostic.snippet(), + MissingLicense { .. } => None, } } @@ -388,6 +400,9 @@ impl Diagnostic for PublishDiagnostic { Cow::Borrowed("remove the triple slash directive"), ), SyntaxError(diagnostic) => diagnostic.hint(), + MissingLicense { .. } => Some( + Cow::Borrowed("add a LICENSE file to the package and ensure it is not ignored from being published"), + ), } } @@ -424,7 +439,8 @@ impl Diagnostic for PublishDiagnostic { | UnsupportedJsxTsx { .. } | ExcludedModule { .. } | MissingConstraint { .. } - | BannedTripleSlashDirectives { .. } => None, + | BannedTripleSlashDirectives { .. } + | MissingLicense { .. } => None, } } @@ -474,6 +490,7 @@ impl Diagnostic for PublishDiagnostic { Cow::Borrowed("or set their 'lib' compiler option appropriately"), ]), SyntaxError(diagnostic) => diagnostic.info(), + MissingLicense { .. } => Cow::Borrowed(&[]), } } @@ -507,6 +524,9 @@ impl Diagnostic for PublishDiagnostic { "https://jsr.io/go/banned-triple-slash-directives", )), SyntaxError(diagnostic) => diagnostic.docs_url(), + MissingLicense { .. } => { + Some(Cow::Borrowed("https://jsr.io/go/missing-license")) + } } } } diff --git a/cli/tools/registry/mod.rs b/cli/tools/registry/mod.rs index 2e781cceea..1c4e1bea76 100644 --- a/cli/tools/registry/mod.rs +++ b/cli/tools/registry/mod.rs @@ -462,6 +462,13 @@ impl PublishPreparer { &publish_paths, &diagnostics_collector, ); + + if !has_license_file(publish_paths.iter().map(|p| &p.specifier)) { + diagnostics_collector.push(PublishDiagnostic::MissingLicense { + expected_path: root_dir.join("LICENSE"), + }); + } + tar::create_gzipped_tarball( &publish_paths, LazyGraphSourceParser::new(&source_cache, &graph), @@ -1187,6 +1194,36 @@ async fn check_if_git_repo_dirty(cwd: &Path) -> Option { } } +fn has_license_file<'a>( + mut specifiers: impl Iterator, +) -> bool { + let allowed_license_files = { + let files = HashSet::from([ + "license", + "license.md", + "license.txt", + "licence", + "licence.md", + "licence.txt", + ]); + if cfg!(debug_assertions) { + for file in &files { + assert_eq!(*file, file.to_lowercase()); + } + } + files + }; + specifiers.any(|specifier| { + specifier + .path() + .rsplit_once('/') + .map(|(_, file)| { + allowed_license_files.contains(file.to_lowercase().as_str()) + }) + .unwrap_or(false) + }) +} + #[allow(clippy::print_stderr)] fn ring_bell() { // ASCII code for the bell character. @@ -1195,6 +1232,10 @@ fn ring_bell() { #[cfg(test)] mod tests { + use deno_ast::ModuleSpecifier; + + use crate::tools::registry::has_license_file; + use super::tar::PublishableTarball; use super::tar::PublishableTarballFile; use super::verify_version_manifest; @@ -1296,4 +1337,31 @@ mod tests { assert!(verify_version_manifest(meta_bytes, &package).is_err()); } + + #[test] + fn test_has_license_files() { + fn has_license_file_str(expected: &[&str]) -> bool { + let specifiers = expected + .iter() + .map(|s| ModuleSpecifier::parse(s).unwrap()) + .collect::>(); + has_license_file(specifiers.iter()) + } + + assert!(has_license_file_str(&["file:///LICENSE"])); + assert!(has_license_file_str(&["file:///license"])); + assert!(has_license_file_str(&["file:///LICENSE.txt"])); + assert!(has_license_file_str(&["file:///LICENSE.md"])); + assert!(has_license_file_str(&["file:///LICENCE"])); + assert!(has_license_file_str(&["file:///LICENCE.txt"])); + assert!(has_license_file_str(&["file:///LICENCE.md"])); + assert!(has_license_file_str(&[ + "file:///other", + "file:///test/LICENCE.md" + ]),); + assert!(!has_license_file_str(&[ + "file:///other", + "file:///test/tLICENSE" + ]),); + } } diff --git a/tests/integration/publish_tests.rs b/tests/integration/publish_tests.rs index 1bff2094d1..013bf39732 100644 --- a/tests/integration/publish_tests.rs +++ b/tests/integration/publish_tests.rs @@ -398,6 +398,7 @@ fn allow_dirty() { })); temp_dir.join("main.ts").write(""); + temp_dir.join("LICENSE").write(""); let cmd = Command::new("git") .arg("init") @@ -418,6 +419,7 @@ Checking for slow types in the public API... Uncommitted changes: +?? LICENSE ?? deno.json ?? main.ts diff --git a/tests/specs/jsr/excluded_export_module/LICENSE b/tests/specs/jsr/excluded_export_module/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/jsr/no_unused_params/LICENSE b/tests/specs/jsr/no_unused_params/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/jsr/no_unused_params/publish.out b/tests/specs/jsr/no_unused_params/publish.out index a8eff6eb38..4eeb6059c4 100644 --- a/tests/specs/jsr/no_unused_params/publish.out +++ b/tests/specs/jsr/no_unused_params/publish.out @@ -2,6 +2,7 @@ Check file:///[WILDLINE]/main.ts Checking for slow types in the public API... Check file:///[WILDLINE]/main.ts Simulating publish of @scope/package@0.0.0 with files: + file:///[WILDLINE]/LICENSE ([WILDLINE]) file:///[WILDLINE]/__test__.jsonc ([WILDLINE]) file:///[WILDLINE]/deno.json ([WILDLINE]) file:///[WILDLINE]/main.out ([WILDLINE]) diff --git a/tests/specs/publish/allow_slow_types/LICENSE b/tests/specs/publish/allow_slow_types/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/banned_triple_slash_directives/LICENSE b/tests/specs/publish/banned_triple_slash_directives/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/bare_node_builtins/LICENSE b/tests/specs/publish/bare_node_builtins/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/bare_node_builtins/bare_node_builtins.out b/tests/specs/publish/bare_node_builtins/bare_node_builtins.out index d512918afb..27b7710315 100644 --- a/tests/specs/publish/bare_node_builtins/bare_node_builtins.out +++ b/tests/specs/publish/bare_node_builtins/bare_node_builtins.out @@ -6,6 +6,7 @@ Check file:///[WILDLINE]/mod.ts Checking for slow types in the public API... Check file:///[WILDLINE]/mod.ts Simulating publish of @foo/bar@1.0.0 with files: + file:///[WILDLINE]/LICENSE ([WILDLINE]) file:///[WILDLINE]/deno.json (87B) file:///[WILDLINE]/mod.ts (121B) Warning Aborting due to --dry-run diff --git a/tests/specs/publish/bare_node_builtins/no_warnings.out b/tests/specs/publish/bare_node_builtins/no_warnings.out index f9a11f37c4..0351a2cb8d 100644 --- a/tests/specs/publish/bare_node_builtins/no_warnings.out +++ b/tests/specs/publish/bare_node_builtins/no_warnings.out @@ -1,5 +1,6 @@ Checking for slow types in the public API... Simulating publish of @foo/bar@1.0.0 with files: + file:///[WILDLINE]/LICENSE ([WILDLINE]) file:///[WILDLINE]/deno.json (87B) file:///[WILDLINE]/mod.ts (121B) Warning Aborting due to --dry-run diff --git a/tests/specs/publish/byonm_dep/LICENSE b/tests/specs/publish/byonm_dep/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/byonm_dep/deno.jsonc b/tests/specs/publish/byonm_dep/deno.jsonc index 37a2377308..b561d56527 100644 --- a/tests/specs/publish/byonm_dep/deno.jsonc +++ b/tests/specs/publish/byonm_dep/deno.jsonc @@ -5,7 +5,7 @@ "publish": { // this was previously causing issues because it would cause // external modules in the node_modules directory to be ignored - "include": ["mod.ts"] + "include": ["LICENSE", "mod.ts"] }, "unstable": ["byonm", "sloppy-imports"] } diff --git a/tests/specs/publish/byonm_dep/publish.out b/tests/specs/publish/byonm_dep/publish.out index 64cf909218..9cf76aacf0 100644 --- a/tests/specs/publish/byonm_dep/publish.out +++ b/tests/specs/publish/byonm_dep/publish.out @@ -2,6 +2,7 @@ Check file:///[WILDLINE]/mod.ts Checking for slow types in the public API... Check file:///[WILDLINE]/mod.ts Simulating publish of @scope/package@0.0.0 with files: + file:///[WILDLINE]/LICENSE ([WILDLINE]) file:///[WILDLINE]/deno.jsonc ([WILDLINE]) file:///[WILDLINE]/mod.ts ([WILDLINE]) Warning Aborting due to --dry-run diff --git a/tests/specs/publish/byonm_with_package_json/LICENSE b/tests/specs/publish/byonm_with_package_json/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/config_file_jsonc/LICENSE b/tests/specs/publish/config_file_jsonc/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/config_flag/successful/LICENSE b/tests/specs/publish/config_flag/successful/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/dry_run/LICENSE b/tests/specs/publish/dry_run/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/dry_run_gitignored/LICENSE b/tests/specs/publish/dry_run_gitignored/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/excluded_deno_jsonc/LICENSE b/tests/specs/publish/excluded_deno_jsonc/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/excluded_deno_jsonc/mod.out b/tests/specs/publish/excluded_deno_jsonc/mod.out index 7c8db25a23..2cac3a6f66 100644 --- a/tests/specs/publish/excluded_deno_jsonc/mod.out +++ b/tests/specs/publish/excluded_deno_jsonc/mod.out @@ -1,6 +1,7 @@ Check file:///[WILDLINE]mod.ts Checking for slow types in the public API... Simulating publish of @scope/pkg@1.0.0 with files: + file:///[WILDLINE]/LICENSE ([WILDLINE]) file:///[WILDLINE]/deno.jsonc (74B) file:///[WILDLINE]/mod.ts (22B) Warning Aborting due to --dry-run diff --git a/tests/specs/publish/has_slow_types/LICENSE b/tests/specs/publish/has_slow_types/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/invalid_import/LICENSE b/tests/specs/publish/invalid_import/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/invalid_import_esm_sh_suggestion/LICENSE b/tests/specs/publish/invalid_import_esm_sh_suggestion/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/invalid_path/LICENSE b/tests/specs/publish/invalid_path/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/javascript_decl_file/LICENSE b/tests/specs/publish/javascript_decl_file/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/javascript_missing_decl_file/LICENSE b/tests/specs/publish/javascript_missing_decl_file/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/jsr_jsonc/LICENSE b/tests/specs/publish/jsr_jsonc/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/missing_constraint/LICENSE b/tests/specs/publish/missing_constraint/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/missing_constraint_jsx_import_source/LICENSE b/tests/specs/publish/missing_constraint_jsx_import_source/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/missing_license/__test__.jsonc b/tests/specs/publish/missing_license/__test__.jsonc new file mode 100644 index 0000000000..774d5a534e --- /dev/null +++ b/tests/specs/publish/missing_license/__test__.jsonc @@ -0,0 +1,4 @@ +{ + "args": "publish --token 'sadfasdf'", + "output": "mod.out" +} diff --git a/tests/specs/publish/missing_license/deno.json b/tests/specs/publish/missing_license/deno.json new file mode 100644 index 0000000000..fe4300ad63 --- /dev/null +++ b/tests/specs/publish/missing_license/deno.json @@ -0,0 +1,5 @@ +{ + "name": "@scope/pkg", + "version": "1.0.0", + "exports": "./mod.ts" +} diff --git a/tests/specs/publish/missing_license/mod.out b/tests/specs/publish/missing_license/mod.out new file mode 100644 index 0000000000..721fefd9c6 --- /dev/null +++ b/tests/specs/publish/missing_license/mod.out @@ -0,0 +1,12 @@ +Check file:///[WILDLINE]/missing_license/mod.ts +Checking for slow types in the public API... +Check file:///[WILDLINE]/missing_license/mod.ts +warning[missing-license]: missing license file + --> [WILDLINE]LICENSE + = hint: add a LICENSE file to the package and ensure it is not ignored from being published + + docs: https://jsr.io/go/missing-license + +Publishing @scope/pkg@1.0.0 ... +Successfully published @scope/pkg@1.0.0 +Visit http://127.0.0.1:4250/@scope/pkg@1.0.0 for details diff --git a/tests/specs/publish/missing_license/mod.ts b/tests/specs/publish/missing_license/mod.ts new file mode 100644 index 0000000000..8d9b8a22a1 --- /dev/null +++ b/tests/specs/publish/missing_license/mod.ts @@ -0,0 +1,3 @@ +export function add(a: number, b: number): number { + return a + b; +} diff --git a/tests/specs/publish/no_check/LICENSE b/tests/specs/publish/no_check/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/no_check_surfaces_syntax_error/LICENSE b/tests/specs/publish/no_check_surfaces_syntax_error/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/no_token/LICENSE b/tests/specs/publish/no_token/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/node_specifier/LICENSE b/tests/specs/publish/node_specifier/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/npm_workspace/add/LICENSE b/tests/specs/publish/npm_workspace/add/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/npm_workspace/publish.out b/tests/specs/publish/npm_workspace/publish.out index 25f81a7e9e..87394cafc6 100644 --- a/tests/specs/publish/npm_workspace/publish.out +++ b/tests/specs/publish/npm_workspace/publish.out @@ -6,10 +6,12 @@ Check file:///[WILDLINE]/npm_workspace/add/index.ts Check file:///[WILDLINE]/npm_workspace/subtract/index.ts [UNORDERED_START] Simulating publish of @scope/add@1.0.0 with files: + file:///[WILDLINE]/npm_workspace/add/LICENSE ([WILDLINE]) file:///[WILDLINE]/npm_workspace/add/index.ts ([WILDLINE]) file:///[WILDLINE]/npm_workspace/add/jsr.json ([WILDLINE]) file:///[WILDLINE]/npm_workspace/add/package.json ([WILDLINE]) Simulating publish of @scope/subtract@1.0.0 with files: + file:///[WILDLINE]/npm_workspace/subtract/LICENSE ([WILDLINE]) file:///[WILDLINE]/npm_workspace/subtract/index.ts ([WILDLINE]) file:///[WILDLINE]/npm_workspace/subtract/jsr.json ([WILDLINE]) file:///[WILDLINE]/npm_workspace/subtract/package.json ([WILDLINE]) diff --git a/tests/specs/publish/npm_workspace/subtract/LICENSE b/tests/specs/publish/npm_workspace/subtract/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/npm_workspace_jsr_pkg_with_npm_dep/LICENSE b/tests/specs/publish/npm_workspace_jsr_pkg_with_npm_dep/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/package_json/LICENSE b/tests/specs/publish/package_json/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/prefer_fast_check_graph/LICENSE b/tests/specs/publish/prefer_fast_check_graph/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/sloppy_imports/LICENSE b/tests/specs/publish/sloppy_imports/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/successful/LICENSE b/tests/specs/publish/successful/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/symlink/LICENSE b/tests/specs/publish/symlink/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/unanalyzable_dynamic_import/LICENSE b/tests/specs/publish/unanalyzable_dynamic_import/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/unsupported_jsx_tsx/LICENSE b/tests/specs/publish/unsupported_jsx_tsx/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/workspace/bar/LICENSE b/tests/specs/publish/workspace/bar/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/specs/publish/workspace/foo/LICENSE b/tests/specs/publish/workspace/foo/LICENSE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/testdata/publish/successful/LICENSE b/tests/testdata/publish/successful/LICENSE new file mode 100644 index 0000000000..e69de29bb2