mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
moduleDetection: auto makes cjs files parse as modules, module: node sets moduleDetection: force (#49268)
This commit is contained in:
parent
5b86612f68
commit
67673f324d
@ -2834,12 +2834,14 @@ namespace ts {
|
||||
}
|
||||
|
||||
function setCommonJsModuleIndicator(node: Node) {
|
||||
if (file.externalModuleIndicator) {
|
||||
if (file.externalModuleIndicator && file.externalModuleIndicator !== true) {
|
||||
return false;
|
||||
}
|
||||
if (!file.commonJsModuleIndicator) {
|
||||
file.commonJsModuleIndicator = node;
|
||||
bindSourceFileAsExternalModule();
|
||||
if (!file.externalModuleIndicator) {
|
||||
bindSourceFileAsExternalModule();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2747,7 +2747,7 @@ namespace ts {
|
||||
return hasExportAssignmentSymbol(moduleSymbol);
|
||||
}
|
||||
// JS files have a synthetic default if they do not contain ES2015+ module syntax (export = is not valid in js) _and_ do not have an __esModule marker
|
||||
return !file.externalModuleIndicator && !resolveExportByName(moduleSymbol, escapeLeadingUnderscores("__esModule"), /*sourceNode*/ undefined, dontResolveAlias);
|
||||
return typeof file.externalModuleIndicator !== "object" && !resolveExportByName(moduleSymbol, escapeLeadingUnderscores("__esModule"), /*sourceNode*/ undefined, dontResolveAlias);
|
||||
}
|
||||
|
||||
function getTargetOfImportClause(node: ImportClause, dontResolveAlias: boolean): Symbol | undefined {
|
||||
|
||||
@ -6302,8 +6302,9 @@ namespace ts {
|
||||
*/
|
||||
function isFileForcedToBeModuleByFormat(file: SourceFile): true | undefined {
|
||||
// Excludes declaration files - they still require an explicit `export {}` or the like
|
||||
// for back compat purposes.
|
||||
return file.impliedNodeFormat === ModuleKind.ESNext && !file.isDeclarationFile ? true : undefined;
|
||||
// for back compat purposes. The only non-declaration files _not_ forced to be a module are `.js` files
|
||||
// that aren't esm-mode (meaning not in a `type: module` scope).
|
||||
return (file.impliedNodeFormat === ModuleKind.ESNext || (fileExtensionIsOneOf(file.fileName, [Extension.Cjs, Extension.Cts]))) && !file.isDeclarationFile ? true : undefined;
|
||||
}
|
||||
|
||||
export function getSetExternalModuleIndicator(options: CompilerOptions): (file: SourceFile) => void {
|
||||
@ -6312,7 +6313,7 @@ namespace ts {
|
||||
case ModuleDetectionKind.Force:
|
||||
// All non-declaration files are modules, declaration files still do the usual isFileProbablyExternalModule
|
||||
return (file: SourceFile) => {
|
||||
file.externalModuleIndicator = !file.isDeclarationFile || isFileProbablyExternalModule(file);
|
||||
file.externalModuleIndicator = isFileProbablyExternalModule(file) || !file.isDeclarationFile || undefined;
|
||||
};
|
||||
case ModuleDetectionKind.Legacy:
|
||||
// Files are modules if they have imports, exports, or import.meta
|
||||
@ -6372,7 +6373,8 @@ namespace ts {
|
||||
}
|
||||
|
||||
export function getEmitModuleDetectionKind(options: CompilerOptions) {
|
||||
return options.moduleDetection || ModuleDetectionKind.Auto;
|
||||
return options.moduleDetection ||
|
||||
(getEmitModuleKind(options) === ModuleKind.Node16 || getEmitModuleKind(options) === ModuleKind.NodeNext ? ModuleDetectionKind.Force : ModuleDetectionKind.Auto);
|
||||
}
|
||||
|
||||
export function hasJsonModuleEmitEnabled(options: CompilerOptions) {
|
||||
|
||||
@ -3,5 +3,7 @@
|
||||
import("./foo").then(x => x); // should error, ask for extension
|
||||
|
||||
//// [bar.cjs]
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// Extensionless relative path dynamic import in a cjs module
|
||||
import("./foo").then(x => x); // should error, ask for extension
|
||||
|
||||
@ -34,6 +34,8 @@ module.exports = a;
|
||||
const a = {};
|
||||
module.exports = a;
|
||||
//// [file.js]
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// cjs format file
|
||||
const a = {};
|
||||
module.exports = a;
|
||||
|
||||
@ -34,6 +34,8 @@ module.exports = a;
|
||||
const a = {};
|
||||
module.exports = a;
|
||||
//// [file.js]
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// cjs format file
|
||||
const a = {};
|
||||
module.exports = a;
|
||||
|
||||
@ -0,0 +1,13 @@
|
||||
//// [tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportlessJsModuleDetectionAuto.ts] ////
|
||||
|
||||
//// [foo.cjs]
|
||||
// this file is a module despite having no imports
|
||||
//// [bar.js]
|
||||
// however this file is _not_ a module
|
||||
|
||||
//// [foo.cjs]
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// this file is a module despite having no imports
|
||||
//// [bar.js]
|
||||
// however this file is _not_ a module
|
||||
@ -0,0 +1,5 @@
|
||||
=== tests/cases/conformance/node/allowJs/foo.cjs ===
|
||||
// this file is a module despite having no imports
|
||||
No type information for this code.=== tests/cases/conformance/node/allowJs/bar.js ===
|
||||
// however this file is _not_ a module
|
||||
No type information for this code.
|
||||
@ -0,0 +1,5 @@
|
||||
=== tests/cases/conformance/node/allowJs/foo.cjs ===
|
||||
// this file is a module despite having no imports
|
||||
No type information for this code.=== tests/cases/conformance/node/allowJs/bar.js ===
|
||||
// however this file is _not_ a module
|
||||
No type information for this code.
|
||||
@ -0,0 +1,13 @@
|
||||
//// [tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportlessJsModuleDetectionAuto.ts] ////
|
||||
|
||||
//// [foo.cjs]
|
||||
// this file is a module despite having no imports
|
||||
//// [bar.js]
|
||||
// however this file is _not_ a module
|
||||
|
||||
//// [foo.cjs]
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// this file is a module despite having no imports
|
||||
//// [bar.js]
|
||||
// however this file is _not_ a module
|
||||
@ -0,0 +1,5 @@
|
||||
=== tests/cases/conformance/node/allowJs/foo.cjs ===
|
||||
// this file is a module despite having no imports
|
||||
No type information for this code.=== tests/cases/conformance/node/allowJs/bar.js ===
|
||||
// however this file is _not_ a module
|
||||
No type information for this code.
|
||||
@ -0,0 +1,5 @@
|
||||
=== tests/cases/conformance/node/allowJs/foo.cjs ===
|
||||
// this file is a module despite having no imports
|
||||
No type information for this code.=== tests/cases/conformance/node/allowJs/bar.js ===
|
||||
// however this file is _not_ a module
|
||||
No type information for this code.
|
||||
@ -14,5 +14,7 @@ interface GlobalThing { a: number }
|
||||
const a: GlobalThing = { a: 0 };
|
||||
|
||||
//// [usage.js]
|
||||
"use strict";
|
||||
/// <reference types="pkg" />
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const a = { a: 0 };
|
||||
|
||||
@ -14,5 +14,7 @@ interface GlobalThing { a: number }
|
||||
const a: GlobalThing = { a: 0 };
|
||||
|
||||
//// [usage.js]
|
||||
"use strict";
|
||||
/// <reference types="pkg" />
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const a = { a: 0 };
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
// @module: node16,nodenext
|
||||
// @allowJs: true
|
||||
// @outDir: ./out
|
||||
// @moduleDetection: auto
|
||||
// @filename: foo.cjs
|
||||
// this file is a module despite having no imports
|
||||
// @filename: bar.js
|
||||
// however this file is _not_ a module
|
||||
Loading…
x
Reference in New Issue
Block a user