mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 07:14:47 -05:00
fix(node): handle cjs exports with escaped chars (#27438)
Closes https://github.com/denoland/deno/issues/27422
This commit is contained in:
parent
26425a137b
commit
e6869d7fa6
5 changed files with 34 additions and 11 deletions
|
@ -162,7 +162,7 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv>
|
||||||
add_export(
|
add_export(
|
||||||
&mut source,
|
&mut source,
|
||||||
export,
|
export,
|
||||||
&format!("mod[\"{}\"]", escape_for_double_quote_string(export)),
|
&format!("mod[{}]", to_double_quote_string(export)),
|
||||||
&mut temp_var_count,
|
&mut temp_var_count,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -561,8 +561,8 @@ fn add_export(
|
||||||
"const __deno_export_{temp_var_count}__ = {initializer};"
|
"const __deno_export_{temp_var_count}__ = {initializer};"
|
||||||
));
|
));
|
||||||
source.push(format!(
|
source.push(format!(
|
||||||
"export {{ __deno_export_{temp_var_count}__ as \"{}\" }};",
|
"export {{ __deno_export_{temp_var_count}__ as {} }};",
|
||||||
escape_for_double_quote_string(name)
|
to_double_quote_string(name)
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
source.push(format!("export const {name} = {initializer};"));
|
source.push(format!("export const {name} = {initializer};"));
|
||||||
|
@ -620,14 +620,9 @@ fn not_found(path: &str, referrer: &Path) -> AnyError {
|
||||||
std::io::Error::new(std::io::ErrorKind::NotFound, msg).into()
|
std::io::Error::new(std::io::ErrorKind::NotFound, msg).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn escape_for_double_quote_string(text: &str) -> Cow<str> {
|
fn to_double_quote_string(text: &str) -> String {
|
||||||
// this should be rare, so doing a scan first before allocating is ok
|
// serde can handle this for us
|
||||||
if text.chars().any(|c| matches!(c, '"' | '\\')) {
|
serde_json::to_string(text).unwrap()
|
||||||
// don't bother making this more complex for perf because it's rare
|
|
||||||
Cow::Owned(text.replace('\\', "\\\\").replace('"', "\\\""))
|
|
||||||
} else {
|
|
||||||
Cow::Borrowed(text)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -665,4 +660,13 @@ mod tests {
|
||||||
Some(("@some-package/core".to_string(), "./actions".to_string()))
|
Some(("@some-package/core".to_string(), "./actions".to_string()))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_to_double_quote_string() {
|
||||||
|
assert_eq!(to_double_quote_string("test"), "\"test\"");
|
||||||
|
assert_eq!(
|
||||||
|
to_double_quote_string("\r\n\t\"test"),
|
||||||
|
"\"\\r\\n\\t\\\"test\""
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"args": "run -A main.js",
|
||||||
|
"output": "output.out"
|
||||||
|
}
|
2
tests/specs/node/cjs_key_escaped_whitespace/main.js
Normal file
2
tests/specs/node/cjs_key_escaped_whitespace/main.js
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
const bang = await import("./module.cjs");
|
||||||
|
console.log("imported:", bang);
|
6
tests/specs/node/cjs_key_escaped_whitespace/module.cjs
Normal file
6
tests/specs/node/cjs_key_escaped_whitespace/module.cjs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module.exports = {
|
||||||
|
"\nx": "test",
|
||||||
|
"\ty": "test",
|
||||||
|
"\rz": "test",
|
||||||
|
'"a': "test",
|
||||||
|
};
|
7
tests/specs/node/cjs_key_escaped_whitespace/output.out
Normal file
7
tests/specs/node/cjs_key_escaped_whitespace/output.out
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
imported: [Module: null prototype] {
|
||||||
|
"\ty": "test",
|
||||||
|
"\nx": "test",
|
||||||
|
"\rz": "test",
|
||||||
|
'"a': "test",
|
||||||
|
default: { "\nx": "test", "\ty": "test", "\rz": "test", '"a': "test" }
|
||||||
|
}
|
Loading…
Reference in a new issue