fix(npm): remove export binding to match node (#15837)

This commit is contained in:
David Sherret 2022-09-10 11:38:11 -04:00 committed by GitHub
parent a54d5654a2
commit 3b0de03b59
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 42 additions and 21 deletions

View file

@ -814,20 +814,14 @@ pub fn translate_cjs_to_esm(
for export in &all_exports {
if export.as_str() == "default" {
if root_exports.contains("__esModule") {
source.push(format!(
"export default Deno[Deno.internal].require.bindExport(mod[\"{}\"], mod);",
export,
));
source.push(format!("export default mod[\"{}\"];", export));
had_default = true;
}
} else {
add_export(
&mut source,
export,
&format!(
"Deno[Deno.internal].require.bindExport(mod[\"{}\"], mod)",
export
),
&format!("mod[\"{}\"]", export),
&mut temp_var_count,
);
}

View file

@ -61,6 +61,14 @@ itest!(cjs_reexport_collision {
http_server: true,
});
itest!(cjs_this_in_exports {
args: "run --allow-read --unstable --quiet npm/cjs_this_in_exports/main.js",
output: "npm/cjs_this_in_exports/main.out",
envs: env_vars(),
http_server: true,
exit_code: 1,
});
itest!(translate_cjs_to_esm {
args: "run --unstable -A --quiet npm/translate_cjs_to_esm/main.js",
output: "npm/translate_cjs_to_esm/main.out",
@ -422,6 +430,7 @@ fn env_vars_no_sync_download() -> Vec<(String, String)> {
"DENO_NPM_REGISTRY".to_string(),
"http://localhost:4545/npm/registry/".to_string(),
),
("NO_COLOR".to_string(), "1".to_string()),
]
}

View file

@ -0,0 +1,11 @@
import defaultImport, { getValue } from "npm:@denotest/cjs-this-in-exports";
import * as namespaceImport from "npm:@denotest/cjs-this-in-exports";
console.log(defaultImport.getValue());
// In Node this actually fails, but it seems to work in Deno
// so I guess there's no harm in that.
console.log(namespaceImport.getValue());
// This will throw because it's lost its context.
// (same thing occurs with Node's cjs -> esm translation)
getValue();

View file

@ -0,0 +1,5 @@
1
1
error: Uncaught TypeError: this.otherMethod is not a function
at getValue (file://[WILDCARD]/@denotest/cjs-this-in-exports/1.0.0/index.js:3:17)
at file://[WILDCARD]/testdata/npm/cjs_this_in_exports/main.js:11:1

View file

@ -0,0 +1,8 @@
module.exports = {
getValue() {
return this.otherMethod();
},
otherMethod() {
return 1;
},
};

View file

@ -0,0 +1,5 @@
{
"name": "@denotest/cjs-this-in-exports",
"version": "1.0.0",
"main": "./index.js"
}

View file

@ -1 +1 @@
[Function: bound Client]
[Function: Client]

View file

@ -1,2 +1,2 @@
[Function: access]
[Function: bound createApp]
[Function: createApp]

View file

@ -13,7 +13,6 @@
ArrayPrototypePush,
ArrayPrototypeSlice,
ArrayPrototypeSplice,
FunctionPrototypeBind,
ObjectGetOwnPropertyDescriptor,
ObjectGetPrototypeOf,
ObjectPrototypeHasOwnProperty,
@ -864,15 +863,6 @@
throw new Error("not implemented");
}
function bindExport(value, mod) {
// ensure exported functions are bound to their module object
if (typeof value === "function") {
return FunctionPrototypeBind(value, mod);
} else {
return value;
}
}
/** @param specifier {string} */
function packageSpecifierSubPath(specifier) {
let parts = specifier.split("/");
@ -892,7 +882,6 @@
toRealPath,
cjsParseCache,
readPackageScope,
bindExport,
moduleExports: m,
},
};