diff --git a/src/compiler/transformers/module/esnextAnd2015.ts b/src/compiler/transformers/module/esnextAnd2015.ts
index 5e755e5083cb3..d0f3d41366f1a 100644
--- a/src/compiler/transformers/module/esnextAnd2015.ts
+++ b/src/compiler/transformers/module/esnextAnd2015.ts
@@ -72,7 +72,7 @@ namespace ts {
// Though an error in es2020 modules, in node-flavor es2020 modules, we can helpfully transform this to a synthetic `require` call
// To give easy access to a synchronous `require` in node-flavor esm. We do the transform even in scenarios where we error, but `import.meta.url`
// is available, just because the output is reasonable for a node-like runtime.
- return getEmitScriptTarget(compilerOptions) >= ModuleKind.ES2020 ? visitImportEqualsDeclaration(node as ImportEqualsDeclaration) : undefined;
+ return getEmitModuleKind(compilerOptions) >= ModuleKind.Node16 ? visitImportEqualsDeclaration(node as ImportEqualsDeclaration) : undefined;
case SyntaxKind.ExportAssignment:
return visitExportAssignment(node as ExportAssignment);
case SyntaxKind.ExportDeclaration:
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).js b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).js
new file mode 100644
index 0000000000000..88039269e3c9d
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).js
@@ -0,0 +1,21 @@
+//// [tests/cases/compiler/moduleNodeImportRequireEmit.ts] ////
+
+//// [package.json]
+{
+ "type": "module"
+}
+//// [mod.d.ts]
+declare module "foo";
+//// [index.ts]
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+foo;
+
+//// [index.js]
+import { createRequire as _createRequire } from "module";
+const __require = _createRequire(import.meta.url);
+///
+// This should emit a call to createRequire(import.meta.url)
+const foo = __require("foo");
+foo;
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).symbols b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).symbols
new file mode 100644
index 0000000000000..2e268ad6c1eb9
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).symbols
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+foo;
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : Symbol("foo", Decl(mod.d.ts, 0, 0))
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).types b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).types
new file mode 100644
index 0000000000000..1e48fb60be700
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2016).types
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : any
+
+foo;
+>foo : any
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : any
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).js b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).js
new file mode 100644
index 0000000000000..88039269e3c9d
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).js
@@ -0,0 +1,21 @@
+//// [tests/cases/compiler/moduleNodeImportRequireEmit.ts] ////
+
+//// [package.json]
+{
+ "type": "module"
+}
+//// [mod.d.ts]
+declare module "foo";
+//// [index.ts]
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+foo;
+
+//// [index.js]
+import { createRequire as _createRequire } from "module";
+const __require = _createRequire(import.meta.url);
+///
+// This should emit a call to createRequire(import.meta.url)
+const foo = __require("foo");
+foo;
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).symbols b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).symbols
new file mode 100644
index 0000000000000..2e268ad6c1eb9
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).symbols
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+foo;
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : Symbol("foo", Decl(mod.d.ts, 0, 0))
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).types b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).types
new file mode 100644
index 0000000000000..1e48fb60be700
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es2020).types
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : any
+
+foo;
+>foo : any
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : any
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).js b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).js
new file mode 100644
index 0000000000000..dd4ca3864fd48
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).js
@@ -0,0 +1,21 @@
+//// [tests/cases/compiler/moduleNodeImportRequireEmit.ts] ////
+
+//// [package.json]
+{
+ "type": "module"
+}
+//// [mod.d.ts]
+declare module "foo";
+//// [index.ts]
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+foo;
+
+//// [index.js]
+import { createRequire as _createRequire } from "module";
+var __require = _createRequire(import.meta.url);
+///
+// This should emit a call to createRequire(import.meta.url)
+var foo = __require("foo");
+foo;
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).symbols b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).symbols
new file mode 100644
index 0000000000000..2e268ad6c1eb9
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).symbols
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+foo;
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : Symbol("foo", Decl(mod.d.ts, 0, 0))
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).types b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).types
new file mode 100644
index 0000000000000..1e48fb60be700
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=es5).types
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : any
+
+foo;
+>foo : any
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : any
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).js b/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).js
new file mode 100644
index 0000000000000..88039269e3c9d
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).js
@@ -0,0 +1,21 @@
+//// [tests/cases/compiler/moduleNodeImportRequireEmit.ts] ////
+
+//// [package.json]
+{
+ "type": "module"
+}
+//// [mod.d.ts]
+declare module "foo";
+//// [index.ts]
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+foo;
+
+//// [index.js]
+import { createRequire as _createRequire } from "module";
+const __require = _createRequire(import.meta.url);
+///
+// This should emit a call to createRequire(import.meta.url)
+const foo = __require("foo");
+foo;
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).symbols b/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).symbols
new file mode 100644
index 0000000000000..2e268ad6c1eb9
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).symbols
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+foo;
+>foo : Symbol(foo, Decl(index.ts, 0, 0))
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : Symbol("foo", Decl(mod.d.ts, 0, 0))
+
diff --git a/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).types b/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).types
new file mode 100644
index 0000000000000..1e48fb60be700
--- /dev/null
+++ b/tests/baselines/reference/moduleNodeImportRequireEmit(target=esnext).types
@@ -0,0 +1,13 @@
+=== tests/cases/compiler/index.ts ===
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+>foo : any
+
+foo;
+>foo : any
+
+=== tests/cases/compiler/mod.d.ts ===
+declare module "foo";
+>"foo" : any
+
diff --git a/tests/cases/compiler/moduleNodeImportRequireEmit.ts b/tests/cases/compiler/moduleNodeImportRequireEmit.ts
new file mode 100644
index 0000000000000..8687a9db8fd1f
--- /dev/null
+++ b/tests/cases/compiler/moduleNodeImportRequireEmit.ts
@@ -0,0 +1,13 @@
+// @target: es5,es2016,es2020,esnext
+// @module: nodenext
+// @filename: package.json
+{
+ "type": "module"
+}
+// @filename: mod.d.ts
+declare module "foo";
+// @filename: index.ts
+///
+// This should emit a call to createRequire(import.meta.url)
+import foo = require("foo");
+foo;
\ No newline at end of file