|
| 1 | +#[cfg(feature = "deserialize_bundler_options")] |
| 2 | +use serde_json::Value; |
1 | 3 | use std::{collections::HashMap, fmt::Debug, path::PathBuf};
|
2 | 4 |
|
3 | 5 | #[cfg(feature = "deserialize_bundler_options")]
|
@@ -74,8 +76,7 @@ pub struct BundlerOptions {
|
74 | 76 | pub resolve: Option<ResolveOptions>,
|
75 | 77 | #[cfg_attr(
|
76 | 78 | feature = "deserialize_bundler_options",
|
77 |
| - serde(deserialize_with = "deserialize_treeshake", default), |
78 |
| - schemars(with = "Option<bool>") |
| 79 | + serde(deserialize_with = "deserialize_treeshake", default) |
79 | 80 | )]
|
80 | 81 | pub treeshake: TreeshakeOptions,
|
81 | 82 | pub experimental: Option<ExperimentalOptions>,
|
@@ -105,11 +106,24 @@ fn deserialize_treeshake<'de, D>(deserializer: D) -> Result<TreeshakeOptions, D:
|
105 | 106 | where
|
106 | 107 | D: Deserializer<'de>,
|
107 | 108 | {
|
108 |
| - let deserialized = Option::<bool>::deserialize(deserializer)?; |
109 |
| - match deserialized { |
110 |
| - Some(false) => Ok(TreeshakeOptions::False), |
111 |
| - Some(true) | None => Ok(TreeshakeOptions::Option(types::treeshake::InnerOptions { |
112 |
| - module_side_effects: types::treeshake::ModuleSideEffects::Boolean(true), |
113 |
| - })), |
| 109 | + let value = Option::<Value>::deserialize(deserializer)?; |
| 110 | + match value { |
| 111 | + Some(Value::Bool(false)) => Ok(TreeshakeOptions::Boolean(false)), |
| 112 | + None | Some(Value::Bool(true)) => { |
| 113 | + Ok(TreeshakeOptions::Option(types::treeshake::InnerOptions { |
| 114 | + module_side_effects: types::treeshake::ModuleSideEffects::Boolean(true), |
| 115 | + })) |
| 116 | + } |
| 117 | + Some(Value::Object(obj)) => { |
| 118 | + let module_side_effects = obj.get("moduleSideEffects").map_or_else( |
| 119 | + || Ok(types::treeshake::ModuleSideEffects::Boolean(true)), |
| 120 | + |v| match v { |
| 121 | + Value::Bool(b) => Ok(types::treeshake::ModuleSideEffects::Boolean(*b)), |
| 122 | + _ => Err(serde::de::Error::custom("moduleSideEffects should be a `true` or `false`")), |
| 123 | + }, |
| 124 | + )?; |
| 125 | + Ok(TreeshakeOptions::Option(types::treeshake::InnerOptions { module_side_effects })) |
| 126 | + } |
| 127 | + _ => Err(serde::de::Error::custom("treeshake should be a boolean or an object")), |
114 | 128 | }
|
115 | 129 | }
|
0 commit comments