Skip to content

Commit efbcce6

Browse files
authored
Merge pull request #4586 from NomicFoundation/esm-ts-support
Add experimental support for using ESM modules with TypeScript
2 parents 441415f + c706084 commit efbcce6

File tree

4 files changed

+33
-8
lines changed

4 files changed

+33
-8
lines changed

.changeset/shaggy-hornets-exercise.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"hardhat": patch
3+
---
4+
5+
Added experimental support for using ESM modules with TypeScript

packages/hardhat-core/src/builtin-tasks/test.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import { HARDHAT_NETWORK_NAME } from "../internal/constants";
77
import { subtask, task } from "../internal/core/config/config-env";
88
import { HardhatError } from "../internal/core/errors";
99
import { ERRORS } from "../internal/core/errors-list";
10-
import { isRunningWithTypescript } from "../internal/core/typescript-support";
10+
import {
11+
isJavascriptFile,
12+
isRunningWithTypescript,
13+
isTypescriptFile,
14+
} from "../internal/core/typescript-support";
1115
import { getForkCacheDirPath } from "../internal/hardhat-network/provider/utils/disk-cache";
1216
import { showForkRecommendationsBannerIfNecessary } from "../internal/hardhat-network/provider/utils/fork-recomendations-banner";
1317
import { pluralize } from "../internal/util/strings";
@@ -40,15 +44,16 @@ subtask(TASK_TEST_GET_TEST_FILES)
4044

4145
const jsFiles = await getAllFilesMatching(
4246
config.paths.tests,
43-
(f) => f.endsWith(".js") || f.endsWith(".cjs") || f.endsWith(".mjs")
47+
isJavascriptFile
4448
);
4549

4650
if (!isRunningWithTypescript(config)) {
4751
return jsFiles;
4852
}
4953

50-
const tsFiles = await getAllFilesMatching(config.paths.tests, (f) =>
51-
f.endsWith(".ts")
54+
const tsFiles = await getAllFilesMatching(
55+
config.paths.tests,
56+
isTypescriptFile
5257
);
5358

5459
return [...jsFiles, ...tsFiles];

packages/hardhat-core/src/internal/core/project-structure.ts

+7
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import { ERRORS } from "./errors-list";
1010
const JS_CONFIG_FILENAME = "hardhat.config.js";
1111
const CJS_CONFIG_FILENAME = "hardhat.config.cjs";
1212
const TS_CONFIG_FILENAME = "hardhat.config.ts";
13+
const CTS_CONFIG_FILENAME = "hardhat.config.cts";
1314

1415
export function isCwdInsideProject() {
1516
return (
1617
findUp.sync(TS_CONFIG_FILENAME) !== null ||
18+
findUp.sync(CTS_CONFIG_FILENAME) !== null ||
1719
findUp.sync(CJS_CONFIG_FILENAME) !== null ||
1820
findUp.sync(JS_CONFIG_FILENAME) !== null
1921
);
@@ -25,6 +27,11 @@ export function getUserConfigPath() {
2527
return tsConfigPath;
2628
}
2729

30+
const ctsConfigPath = findUp.sync(CTS_CONFIG_FILENAME);
31+
if (ctsConfigPath !== null) {
32+
return ctsConfigPath;
33+
}
34+
2835
const cjsConfigPath = findUp.sync(CJS_CONFIG_FILENAME);
2936
if (cjsConfigPath !== null) {
3037
return cjsConfigPath;

packages/hardhat-core/src/internal/core/typescript-support.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ let cachedIsTypescriptSupported: boolean | undefined;
1313
*/
1414
export function willRunWithTypescript(configPath?: string): boolean {
1515
const config = resolveConfigPath(configPath);
16-
return isTypescriptFile(config);
16+
return isNonEsmTypescriptFile(config);
1717
}
1818

1919
/**
2020
* Returns true if an Hardhat is already running with typescript.
2121
*/
2222
export function isRunningWithTypescript(config: HardhatConfig): boolean {
23-
return isTypescriptFile(config.paths.configFile);
23+
return isNonEsmTypescriptFile(config.paths.configFile);
2424
}
2525

2626
export function isTypescriptSupported() {
@@ -80,6 +80,14 @@ export function loadTsNode(
8080
require(tsNodeRequirement);
8181
}
8282

83-
function isTypescriptFile(path: string): boolean {
84-
return path.endsWith(".ts");
83+
function isNonEsmTypescriptFile(path: string): boolean {
84+
return /\.(ts|cts)$/i.test(path);
85+
}
86+
87+
export function isTypescriptFile(path: string): boolean {
88+
return /\.(ts|cts|mts)$/i.test(path);
89+
}
90+
91+
export function isJavascriptFile(path: string): boolean {
92+
return /\.(js|cjs|mjs)$/i.test(path);
8593
}

0 commit comments

Comments
 (0)