Mark snippets and the bundler target's main file as having side effects

This is a less extreme version of #1208, which only marks snippets and the main file on the bundler target as having side effects instead of all files.

This means that the shim file which contains the vast majority of the JS code is still properly marked as having no side effects, allowing bundlers to get rid of things like unused `new TextEncoder` calls which could theoretically have side effects but don't.

Fixes #972.
master
Liam Murphy 2 years ago
parent e3582b7002
commit ad1778031f
No known key found for this signature in database
GPG Key ID: 0A01FCF4B19F9B8D
  1. 6
      src/manifest/mod.rs
  2. 2
      src/manifest/npm/esmodules.rs
  3. 7
      tests/all/manifest.rs
  4. 8
      tests/all/utils/manifest.rs

@ -723,10 +723,10 @@ impl CrateData {
url: repo_url,
}),
files: data.files,
module: data.main,
module: data.main.clone(),
homepage: data.homepage,
types: data.dts_file,
side_effects: false,
side_effects: vec![format!("./{}", data.main), "./snippets/*".to_owned()],
keywords: data.keywords,
dependencies,
})
@ -758,7 +758,7 @@ impl CrateData {
module: data.main,
homepage: data.homepage,
types: data.dts_file,
side_effects: false,
side_effects: vec!["./snippets/*".to_owned()],
keywords: data.keywords,
dependencies,
})

@ -22,7 +22,7 @@ pub struct ESModulesPackage {
#[serde(skip_serializing_if = "Option::is_none")]
pub types: Option<String>,
#[serde(rename = "sideEffects")]
pub side_effects: bool,
pub side_effects: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keywords: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]

@ -93,7 +93,10 @@ fn it_creates_a_package_json_default_path() {
);
assert_eq!(pkg.module, "js_hello_world.js");
assert_eq!(pkg.types, "js_hello_world.d.ts");
assert_eq!(pkg.side_effects, false);
assert_eq!(
pkg.side_effects,
vec!["./js_hello_world.js", "./snippets/*"]
);
let actual_files: HashSet<String> = pkg.files.into_iter().collect();
let expected_files: HashSet<String> = [
@ -255,7 +258,7 @@ fn it_creates_a_package_json_with_correct_files_when_out_name_is_provided() {
);
assert_eq!(pkg.module, "index.js");
assert_eq!(pkg.types, "index.d.ts");
assert_eq!(pkg.side_effects, false);
assert_eq!(pkg.side_effects, vec!["./index.js", "./snippets/*"]);
let actual_files: HashSet<String> = pkg.files.into_iter().collect();
let expected_files: HashSet<String> =

@ -21,8 +21,8 @@ pub struct NpmPackage {
pub browser: String,
#[serde(default = "default_none")]
pub types: String,
#[serde(default = "default_false", rename = "sideEffects")]
pub side_effects: bool,
#[serde(default = "Vec::new", rename = "sideEffects")]
pub side_effects: Vec<String>,
pub homepage: Option<String>,
pub keywords: Option<Vec<String>>,
pub dependencies: Option<HashMap<String, String>>,
@ -32,10 +32,6 @@ fn default_none() -> String {
"".to_string()
}
fn default_false() -> bool {
false
}
#[derive(Deserialize)]
pub struct Repository {
#[serde(rename = "type")]

Loading…
Cancel
Save