From 639b4a5ea73c94f49385bd7ebb3eeacfbdb278be Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 15:22:30 +0300 Subject: [PATCH 1/7] ci: node.js@24 and rewrite ts tests --- .github/workflows/nodejs.yml | 4 +-- .../main.ts | 0 .../package.json | 0 .../tsconfig.json | 0 .../typescript.test.js | 12 ++++----- .../webpack.config.cts | 7 +++--- .../tsconfig.json | 9 ------- .../main.ts | 0 .../package.json | 0 .../tsconfig.json | 0 .../typescript.test.js | 10 ++++---- .../webpack.config.mts | 0 .../typescript-ts-node-loader/main.ts | 1 + .../typescript-ts-node-loader/package.json | 6 +++++ .../typescript-ts-node-loader/tsconfig.json | 6 +++++ .../typescript.test.js | 14 +++++------ .../webpack.config.ts | 0 .../main.ts | 0 .../tsconfig.json | 0 .../typescript.test.js | 8 ++++-- .../webpack.config.ts | 0 .../main.ts | 0 .../typescript-using-interpret/package.json | 3 +++ .../tsconfig.json | 0 .../typescript.test.js | 4 ++- .../webpack.config.ts} | 1 - .../typescript-using-nodejs/main.ts | 1 + .../typescript-using-nodejs/package.json | 6 +++++ .../typescript-using-nodejs/tsconfig.json | 6 +++++ .../typescript.test.js | 25 +++++++++++++++++++ .../typescript-using-nodejs/webpack.config.ts | 14 +++++++++++ test/build/config-format/typescript/main.ts | 1 - 32 files changed, 100 insertions(+), 38 deletions(-) rename test/build/config-format/{typescript-esnext-mjs => typescript-cjs-using-nodejs}/main.ts (100%) rename test/build/config-format/{typescript-esnext-mjs => typescript-cjs-using-nodejs}/package.json (100%) rename test/build/config-format/{typescript-esnext-mjs => typescript-cjs-using-nodejs}/tsconfig.json (100%) rename test/build/config-format/{typescript-commonjs-using-nodejs => typescript-cjs-using-nodejs}/typescript.test.js (52%) rename test/build/config-format/{typescript-commonjs-using-typescript => typescript-cjs-using-nodejs}/webpack.config.cts (66%) delete mode 100644 test/build/config-format/typescript-commonjs-using-nodejs/tsconfig.json rename test/build/config-format/{typescript-esnext => typescript-mjs-using-nodejs}/main.ts (100%) rename test/build/config-format/{typescript-esnext => typescript-mjs-using-nodejs}/package.json (100%) rename test/build/config-format/{typescript-esnext => typescript-mjs-using-nodejs}/tsconfig.json (100%) rename test/build/config-format/{typescript-esnext-mjs => typescript-mjs-using-nodejs}/typescript.test.js (61%) rename test/build/config-format/{typescript-esnext-mjs => typescript-mjs-using-nodejs}/webpack.config.mts (100%) create mode 100644 test/build/config-format/typescript-ts-node-loader/main.ts create mode 100644 test/build/config-format/typescript-ts-node-loader/package.json create mode 100644 test/build/config-format/typescript-ts-node-loader/tsconfig.json rename test/build/config-format/{typescript-esnext => typescript-ts-node-loader}/typescript.test.js (59%) rename test/build/config-format/{typescript-esnext => typescript-ts-node-loader}/webpack.config.ts (100%) rename test/build/config-format/{typescript-commonjs-using-nodejs => typescript-ts-node-require}/main.ts (100%) rename test/build/config-format/{typescript-commonjs-using-typescript => typescript-ts-node-require}/tsconfig.json (100%) rename test/build/config-format/{typescript => typescript-ts-node-require}/typescript.test.js (64%) rename test/build/config-format/{typescript => typescript-ts-node-require}/webpack.config.ts (100%) rename test/build/config-format/{typescript-commonjs-using-typescript => typescript-using-interpret}/main.ts (100%) create mode 100644 test/build/config-format/typescript-using-interpret/package.json rename test/build/config-format/{typescript => typescript-using-interpret}/tsconfig.json (100%) rename test/build/config-format/{typescript-commonjs-using-typescript => typescript-using-interpret}/typescript.test.js (84%) rename test/build/config-format/{typescript-commonjs-using-nodejs/webpack.config.cts => typescript-using-interpret/webpack.config.ts} (82%) create mode 100644 test/build/config-format/typescript-using-nodejs/main.ts create mode 100644 test/build/config-format/typescript-using-nodejs/package.json create mode 100644 test/build/config-format/typescript-using-nodejs/tsconfig.json create mode 100644 test/build/config-format/typescript-using-nodejs/typescript.test.js create mode 100644 test/build/config-format/typescript-using-nodejs/webpack.config.ts delete mode 100644 test/build/config-format/typescript/main.ts diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 738b7a42ebc..d18a2a3a8b6 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -58,14 +58,14 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [18.x, 20.x, 22.x, 23.x] + node-version: [18.x, 20.x, 22.x, 24.x] shard: ["1/4", "2/4", "3/4", "4/4"] webpack-version: [latest] dev-server-version: [latest] exclude: # Node.js v23.7.0 is broken on windows - os: windows-latest - node-version: 23.x + node-version: 24.x steps: - uses: actions/checkout@v4 diff --git a/test/build/config-format/typescript-esnext-mjs/main.ts b/test/build/config-format/typescript-cjs-using-nodejs/main.ts similarity index 100% rename from test/build/config-format/typescript-esnext-mjs/main.ts rename to test/build/config-format/typescript-cjs-using-nodejs/main.ts diff --git a/test/build/config-format/typescript-esnext-mjs/package.json b/test/build/config-format/typescript-cjs-using-nodejs/package.json similarity index 100% rename from test/build/config-format/typescript-esnext-mjs/package.json rename to test/build/config-format/typescript-cjs-using-nodejs/package.json diff --git a/test/build/config-format/typescript-esnext-mjs/tsconfig.json b/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json similarity index 100% rename from test/build/config-format/typescript-esnext-mjs/tsconfig.json rename to test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json diff --git a/test/build/config-format/typescript-commonjs-using-nodejs/typescript.test.js b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js similarity index 52% rename from test/build/config-format/typescript-commonjs-using-nodejs/typescript.test.js rename to test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js index 21a83159fb2..2762a6b134c 100644 --- a/test/build/config-format/typescript-commonjs-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js @@ -1,18 +1,18 @@ +// eslint-disable-next-line n/no-unpublished-require const { run } = require("../../../utils/test-utils"); const { existsSync } = require("fs"); const { resolve } = require("path"); describe("webpack cli", () => { - it("should support typescript file", async () => { - // This test is for https://nodejs.org/api/typescript.html#modules-typescript - // By default this feature enabled only since v23.6.0 - // For old Node.js version it uses `typescript` - // For v23.6.0+ Node.js version it uses built-in feature + it("should support typescript esnext file", async () => { + const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.cts"], { env: { NODE_NO_WARNINGS: 1 }, + // Fallback to `ts-node/esm` for old Node.js versions + nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], }); - expect(stderr).toBeFalsy(); + expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr expect(stdout).toBeTruthy(); expect(exitCode).toBe(0); expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); diff --git a/test/build/config-format/typescript-commonjs-using-typescript/webpack.config.cts b/test/build/config-format/typescript-cjs-using-nodejs/webpack.config.cts similarity index 66% rename from test/build/config-format/typescript-commonjs-using-typescript/webpack.config.cts rename to test/build/config-format/typescript-cjs-using-nodejs/webpack.config.cts index 2bdd9c19605..8a5fa76c872 100644 --- a/test/build/config-format/typescript-commonjs-using-typescript/webpack.config.cts +++ b/test/build/config-format/typescript-cjs-using-nodejs/webpack.config.cts @@ -1,6 +1,5 @@ /* eslint-disable node/no-unsupported-features/es-syntax */ -/** eslint-disable **/ -import * as path from "path"; +const path = require("path"); // cspell:ignore elopment const mode: string = "dev" + "elopment"; @@ -8,9 +7,9 @@ const config = { mode, entry: "./main.ts", output: { - path: path.resolve(__dirname, "dist"), + path: path.resolve("dist"), filename: "foo.bundle.js", }, }; -export = config; +module.exports = config; diff --git a/test/build/config-format/typescript-commonjs-using-nodejs/tsconfig.json b/test/build/config-format/typescript-commonjs-using-nodejs/tsconfig.json deleted file mode 100644 index 9f2cb9118f1..00000000000 --- a/test/build/config-format/typescript-commonjs-using-nodejs/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "allowImportingTsExtensions": true, - "rewriteRelativeImportExtensions": true, - "verbatimModuleSyntax": true, - "module": "commonjs" - } -} diff --git a/test/build/config-format/typescript-esnext/main.ts b/test/build/config-format/typescript-mjs-using-nodejs/main.ts similarity index 100% rename from test/build/config-format/typescript-esnext/main.ts rename to test/build/config-format/typescript-mjs-using-nodejs/main.ts diff --git a/test/build/config-format/typescript-esnext/package.json b/test/build/config-format/typescript-mjs-using-nodejs/package.json similarity index 100% rename from test/build/config-format/typescript-esnext/package.json rename to test/build/config-format/typescript-mjs-using-nodejs/package.json diff --git a/test/build/config-format/typescript-esnext/tsconfig.json b/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json similarity index 100% rename from test/build/config-format/typescript-esnext/tsconfig.json rename to test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json diff --git a/test/build/config-format/typescript-esnext-mjs/typescript.test.js b/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js similarity index 61% rename from test/build/config-format/typescript-esnext-mjs/typescript.test.js rename to test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js index 2e1f038cac3..8fc1009e324 100644 --- a/test/build/config-format/typescript-esnext-mjs/typescript.test.js +++ b/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js @@ -5,14 +5,14 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const env = { ...process.env }; - + const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.mts"], { - nodeOptions: ["--experimental-loader=ts-node/esm"], - env, + env: { NODE_NO_WARNINGS: 1 }, + // Fallback to `ts-node/esm` for old Node.js versions + nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], }); - expect(stderr).not.toBeFalsy(); // Deprecation warning logs on stderr + expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr expect(stdout).toBeTruthy(); expect(exitCode).toBe(0); expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); diff --git a/test/build/config-format/typescript-esnext-mjs/webpack.config.mts b/test/build/config-format/typescript-mjs-using-nodejs/webpack.config.mts similarity index 100% rename from test/build/config-format/typescript-esnext-mjs/webpack.config.mts rename to test/build/config-format/typescript-mjs-using-nodejs/webpack.config.mts diff --git a/test/build/config-format/typescript-ts-node-loader/main.ts b/test/build/config-format/typescript-ts-node-loader/main.ts new file mode 100644 index 00000000000..dc6a7ea6788 --- /dev/null +++ b/test/build/config-format/typescript-ts-node-loader/main.ts @@ -0,0 +1 @@ +console.log("Rimuru Tempest"); diff --git a/test/build/config-format/typescript-ts-node-loader/package.json b/test/build/config-format/typescript-ts-node-loader/package.json new file mode 100644 index 00000000000..2921f73c914 --- /dev/null +++ b/test/build/config-format/typescript-ts-node-loader/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "engines": { + "node": ">=18.12.0" + } +} diff --git a/test/build/config-format/typescript-ts-node-loader/tsconfig.json b/test/build/config-format/typescript-ts-node-loader/tsconfig.json new file mode 100644 index 00000000000..e0ba2dc7a46 --- /dev/null +++ b/test/build/config-format/typescript-ts-node-loader/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "module": "esnext", + "allowSyntheticDefaultImports": true + } +} diff --git a/test/build/config-format/typescript-esnext/typescript.test.js b/test/build/config-format/typescript-ts-node-loader/typescript.test.js similarity index 59% rename from test/build/config-format/typescript-esnext/typescript.test.js rename to test/build/config-format/typescript-ts-node-loader/typescript.test.js index d003afc4e31..b68006eabf5 100644 --- a/test/build/config-format/typescript-esnext/typescript.test.js +++ b/test/build/config-format/typescript-ts-node-loader/typescript.test.js @@ -5,16 +5,16 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const env = { ...process.env }; - - env.WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG = true; - + const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - nodeOptions: ["--experimental-loader=ts-node/esm"], - env, + env: { NODE_NO_WARNINGS: 1 }, + nodeOptions: + major >= 22 && minor >= 6 + ? ["--no-experimental-strip-types", "--experimental-loader=ts-node/esm"] + : ["--experimental-loader=ts-node/esm"], }); - expect(stderr).not.toBeFalsy(); // Deprecation warning logs on stderr + expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr expect(stdout).toBeTruthy(); expect(exitCode).toBe(0); expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); diff --git a/test/build/config-format/typescript-esnext/webpack.config.ts b/test/build/config-format/typescript-ts-node-loader/webpack.config.ts similarity index 100% rename from test/build/config-format/typescript-esnext/webpack.config.ts rename to test/build/config-format/typescript-ts-node-loader/webpack.config.ts diff --git a/test/build/config-format/typescript-commonjs-using-nodejs/main.ts b/test/build/config-format/typescript-ts-node-require/main.ts similarity index 100% rename from test/build/config-format/typescript-commonjs-using-nodejs/main.ts rename to test/build/config-format/typescript-ts-node-require/main.ts diff --git a/test/build/config-format/typescript-commonjs-using-typescript/tsconfig.json b/test/build/config-format/typescript-ts-node-require/tsconfig.json similarity index 100% rename from test/build/config-format/typescript-commonjs-using-typescript/tsconfig.json rename to test/build/config-format/typescript-ts-node-require/tsconfig.json diff --git a/test/build/config-format/typescript/typescript.test.js b/test/build/config-format/typescript-ts-node-require/typescript.test.js similarity index 64% rename from test/build/config-format/typescript/typescript.test.js rename to test/build/config-format/typescript-ts-node-require/typescript.test.js index 6bb1ea5a8b0..f16d0bc6de0 100644 --- a/test/build/config-format/typescript/typescript.test.js +++ b/test/build/config-format/typescript-ts-node-require/typescript.test.js @@ -4,9 +4,13 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript file", async () => { + const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - // For `nyc`, remove it when we drop `nyc` usage - nodeOptions: ["--require=ts-node/register"], + env: { NODE_NO_WARNINGS: 1 }, + nodeOptions: + major >= 22 && minor >= 6 + ? ["--no-experimental-strip-types", "--require=ts-node/register"] + : ["--require=ts-node/register"], }); expect(stderr).toBeFalsy(); diff --git a/test/build/config-format/typescript/webpack.config.ts b/test/build/config-format/typescript-ts-node-require/webpack.config.ts similarity index 100% rename from test/build/config-format/typescript/webpack.config.ts rename to test/build/config-format/typescript-ts-node-require/webpack.config.ts diff --git a/test/build/config-format/typescript-commonjs-using-typescript/main.ts b/test/build/config-format/typescript-using-interpret/main.ts similarity index 100% rename from test/build/config-format/typescript-commonjs-using-typescript/main.ts rename to test/build/config-format/typescript-using-interpret/main.ts diff --git a/test/build/config-format/typescript-using-interpret/package.json b/test/build/config-format/typescript-using-interpret/package.json new file mode 100644 index 00000000000..5bbefffbabe --- /dev/null +++ b/test/build/config-format/typescript-using-interpret/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/test/build/config-format/typescript/tsconfig.json b/test/build/config-format/typescript-using-interpret/tsconfig.json similarity index 100% rename from test/build/config-format/typescript/tsconfig.json rename to test/build/config-format/typescript-using-interpret/tsconfig.json diff --git a/test/build/config-format/typescript-commonjs-using-typescript/typescript.test.js b/test/build/config-format/typescript-using-interpret/typescript.test.js similarity index 84% rename from test/build/config-format/typescript-commonjs-using-typescript/typescript.test.js rename to test/build/config-format/typescript-using-interpret/typescript.test.js index 7c163d4ce28..4c13ab4bfc1 100644 --- a/test/build/config-format/typescript-commonjs-using-typescript/typescript.test.js +++ b/test/build/config-format/typescript-using-interpret/typescript.test.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line n/no-unpublished-require const { run } = require("../../../utils/test-utils"); const { existsSync } = require("fs"); const { resolve } = require("path"); @@ -5,7 +6,8 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); - const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.cts"], { + const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { + env: { NODE_NO_WARNINGS: 1 }, nodeOptions: major >= 22 && minor >= 6 ? ["--no-experimental-strip-types"] : [], }); diff --git a/test/build/config-format/typescript-commonjs-using-nodejs/webpack.config.cts b/test/build/config-format/typescript-using-interpret/webpack.config.ts similarity index 82% rename from test/build/config-format/typescript-commonjs-using-nodejs/webpack.config.cts rename to test/build/config-format/typescript-using-interpret/webpack.config.ts index da5fde8a943..4a2e87818e2 100644 --- a/test/build/config-format/typescript-commonjs-using-nodejs/webpack.config.cts +++ b/test/build/config-format/typescript-using-interpret/webpack.config.ts @@ -1,4 +1,3 @@ -/* eslint-disable node/no-unsupported-features/es-syntax */ /** eslint-disable **/ const path = require("path"); diff --git a/test/build/config-format/typescript-using-nodejs/main.ts b/test/build/config-format/typescript-using-nodejs/main.ts new file mode 100644 index 00000000000..dc6a7ea6788 --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/main.ts @@ -0,0 +1 @@ +console.log("Rimuru Tempest"); diff --git a/test/build/config-format/typescript-using-nodejs/package.json b/test/build/config-format/typescript-using-nodejs/package.json new file mode 100644 index 00000000000..2921f73c914 --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "engines": { + "node": ">=18.12.0" + } +} diff --git a/test/build/config-format/typescript-using-nodejs/tsconfig.json b/test/build/config-format/typescript-using-nodejs/tsconfig.json new file mode 100644 index 00000000000..e0ba2dc7a46 --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "module": "esnext", + "allowSyntheticDefaultImports": true + } +} diff --git a/test/build/config-format/typescript-using-nodejs/typescript.test.js b/test/build/config-format/typescript-using-nodejs/typescript.test.js new file mode 100644 index 00000000000..38f8f834a1a --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -0,0 +1,25 @@ +// eslint-disable-next-line n/no-unpublished-require +const { run } = require("../../../utils/test-utils"); +const { existsSync } = require("fs"); +const { resolve } = require("path"); + +describe("webpack cli", () => { + it("should support typescript esnext file", async () => { + const [major, minor] = process.versions.node.split(".").map(Number); + const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { + env: { NODE_NO_WARNINGS: 1 }, + // Fallback to `ts-node/esm` for old Node.js versions + nodeOptions: + major >= 22 && minor >= 6 + ? ["--no-experimental-strip-types"] + : ["--experimental-loader=ts-node/esm"], + }); + + console.log(stderr); + + expect(stderr).toBeFalsy(); + expect(stdout).toBeTruthy(); + expect(exitCode).toBe(0); + expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); + }); +}); diff --git a/test/build/config-format/typescript-using-nodejs/webpack.config.ts b/test/build/config-format/typescript-using-nodejs/webpack.config.ts new file mode 100644 index 00000000000..4fc182ff2d8 --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/webpack.config.ts @@ -0,0 +1,14 @@ +import * as path from "path"; + +// cspell:ignore elopment +const mode: string = "dev" + "elopment"; +const config = { + mode, + entry: "./main.ts", + output: { + path: path.resolve("dist"), + filename: "foo.bundle.js", + }, +}; + +export default config; diff --git a/test/build/config-format/typescript/main.ts b/test/build/config-format/typescript/main.ts deleted file mode 100644 index 41d13d1a9a1..00000000000 --- a/test/build/config-format/typescript/main.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Main typescript file"); From bee4c6a0b416eeadf47126648fd0436dfc5a2021 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 15:33:48 +0300 Subject: [PATCH 2/7] test: fix --- .../typescript-ts-node-loader/typescript.test.js | 6 +++++- .../typescript-using-nodejs/typescript.test.js | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/test/build/config-format/typescript-ts-node-loader/typescript.test.js b/test/build/config-format/typescript-ts-node-loader/typescript.test.js index b68006eabf5..7ed58e1a1e2 100644 --- a/test/build/config-format/typescript-ts-node-loader/typescript.test.js +++ b/test/build/config-format/typescript-ts-node-loader/typescript.test.js @@ -7,7 +7,11 @@ describe("webpack cli", () => { it("should support typescript esnext file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, nodeOptions: major >= 22 && minor >= 6 ? ["--no-experimental-strip-types", "--experimental-loader=ts-node/esm"] diff --git a/test/build/config-format/typescript-using-nodejs/typescript.test.js b/test/build/config-format/typescript-using-nodejs/typescript.test.js index 38f8f834a1a..f67a5a15458 100644 --- a/test/build/config-format/typescript-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -7,7 +7,11 @@ describe("webpack cli", () => { it("should support typescript esnext file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, // Fallback to `ts-node/esm` for old Node.js versions nodeOptions: major >= 22 && minor >= 6 From e241bd8b7750ab8bc30e77182291d7e44b5fdbbd Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 15:50:42 +0300 Subject: [PATCH 3/7] test: fix --- .../typescript-using-nodejs/typescript.test.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/test/build/config-format/typescript-using-nodejs/typescript.test.js b/test/build/config-format/typescript-using-nodejs/typescript.test.js index f67a5a15458..98a09d627e3 100644 --- a/test/build/config-format/typescript-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -5,22 +5,14 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const [major, minor] = process.versions.node.split(".").map(Number); + const [major] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { - NODE_NO_WARNINGS: 1, - // Due nyc logic - WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, - }, + env: { NODE_NO_WARNINGS: 1 }, // Fallback to `ts-node/esm` for old Node.js versions - nodeOptions: - major >= 22 && minor >= 6 - ? ["--no-experimental-strip-types"] - : ["--experimental-loader=ts-node/esm"], + // We don't use Node.js@22 because it doesn't allow to load typescript files where we have `package.json` in root + nodeOptions: major >= 24 ? [] : ["--experimental-loader=ts-node/esm"], }); - console.log(stderr); - expect(stderr).toBeFalsy(); expect(stdout).toBeTruthy(); expect(exitCode).toBe(0); From 103dad4fe461d9ae78d0d48b28e5389189bb3dd1 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 16:03:03 +0300 Subject: [PATCH 4/7] test: fix --- .../config-format/typescript-using-nodejs/package.json | 6 ------ .../typescript-using-nodejs/typescript.test.js | 5 ++--- .../config-format/typescript-using-nodejs/webpack.config.ts | 4 ++-- 3 files changed, 4 insertions(+), 11 deletions(-) delete mode 100644 test/build/config-format/typescript-using-nodejs/package.json diff --git a/test/build/config-format/typescript-using-nodejs/package.json b/test/build/config-format/typescript-using-nodejs/package.json deleted file mode 100644 index 2921f73c914..00000000000 --- a/test/build/config-format/typescript-using-nodejs/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "module", - "engines": { - "node": ">=18.12.0" - } -} diff --git a/test/build/config-format/typescript-using-nodejs/typescript.test.js b/test/build/config-format/typescript-using-nodejs/typescript.test.js index 98a09d627e3..bca1418984b 100644 --- a/test/build/config-format/typescript-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -1,16 +1,15 @@ -// eslint-disable-next-line n/no-unpublished-require const { run } = require("../../../utils/test-utils"); const { existsSync } = require("fs"); const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const [major] = process.versions.node.split(".").map(Number); + const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { env: { NODE_NO_WARNINGS: 1 }, // Fallback to `ts-node/esm` for old Node.js versions // We don't use Node.js@22 because it doesn't allow to load typescript files where we have `package.json` in root - nodeOptions: major >= 24 ? [] : ["--experimental-loader=ts-node/esm"], + nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], }); expect(stderr).toBeFalsy(); diff --git a/test/build/config-format/typescript-using-nodejs/webpack.config.ts b/test/build/config-format/typescript-using-nodejs/webpack.config.ts index 4fc182ff2d8..01c5deec071 100644 --- a/test/build/config-format/typescript-using-nodejs/webpack.config.ts +++ b/test/build/config-format/typescript-using-nodejs/webpack.config.ts @@ -1,4 +1,4 @@ -import * as path from "path"; +const path = require("path"); // cspell:ignore elopment const mode: string = "dev" + "elopment"; @@ -11,4 +11,4 @@ const config = { }, }; -export default config; +module.exports = config; From 27f1065e0728bdf8518cd65fab416fa94dbf0028 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 16:13:26 +0300 Subject: [PATCH 5/7] test: fix --- .../typescript-cjs-using-nodejs/typescript.test.js | 6 +++++- .../typescript-mjs-using-nodejs/typescript.test.js | 6 +++++- .../typescript-ts-node-require/typescript.test.js | 6 +++++- .../typescript-using-interpret/typescript.test.js | 6 +++++- .../typescript-using-nodejs/typescript.test.js | 6 +++++- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js index 2762a6b134c..66ba3e0caa8 100644 --- a/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js @@ -7,7 +7,11 @@ describe("webpack cli", () => { it("should support typescript esnext file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.cts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, // Fallback to `ts-node/esm` for old Node.js versions nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], }); diff --git a/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js b/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js index 8fc1009e324..a464d1065a2 100644 --- a/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js @@ -7,7 +7,11 @@ describe("webpack cli", () => { it("should support typescript esnext file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.mts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, // Fallback to `ts-node/esm` for old Node.js versions nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], }); diff --git a/test/build/config-format/typescript-ts-node-require/typescript.test.js b/test/build/config-format/typescript-ts-node-require/typescript.test.js index f16d0bc6de0..8f5d2885407 100644 --- a/test/build/config-format/typescript-ts-node-require/typescript.test.js +++ b/test/build/config-format/typescript-ts-node-require/typescript.test.js @@ -6,7 +6,11 @@ describe("webpack cli", () => { it("should support typescript file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, nodeOptions: major >= 22 && minor >= 6 ? ["--no-experimental-strip-types", "--require=ts-node/register"] diff --git a/test/build/config-format/typescript-using-interpret/typescript.test.js b/test/build/config-format/typescript-using-interpret/typescript.test.js index 4c13ab4bfc1..f9eb715f9a1 100644 --- a/test/build/config-format/typescript-using-interpret/typescript.test.js +++ b/test/build/config-format/typescript-using-interpret/typescript.test.js @@ -7,7 +7,11 @@ describe("webpack cli", () => { it("should support typescript file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, nodeOptions: major >= 22 && minor >= 6 ? ["--no-experimental-strip-types"] : [], }); diff --git a/test/build/config-format/typescript-using-nodejs/typescript.test.js b/test/build/config-format/typescript-using-nodejs/typescript.test.js index bca1418984b..146f9399692 100644 --- a/test/build/config-format/typescript-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -6,7 +6,11 @@ describe("webpack cli", () => { it("should support typescript esnext file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { NODE_NO_WARNINGS: 1 }, + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, // Fallback to `ts-node/esm` for old Node.js versions // We don't use Node.js@22 because it doesn't allow to load typescript files where we have `package.json` in root nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], From bf8e90489016984445dc5865e76c9003e2e30c59 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 16:26:41 +0300 Subject: [PATCH 6/7] test: fix --- .../typescript-cjs-using-nodejs/tsconfig.json | 7 +++++-- .../typescript-mjs-using-nodejs/tsconfig.json | 7 +++++-- .../config-format/typescript-using-nodejs/tsconfig.json | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json b/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json index e0ba2dc7a46..9f2cb9118f1 100644 --- a/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json @@ -1,6 +1,9 @@ { "compilerOptions": { - "module": "esnext", - "allowSyntheticDefaultImports": true + "target": "esnext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, + "verbatimModuleSyntax": true, + "module": "commonjs" } } diff --git a/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json b/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json index e0ba2dc7a46..aeedf8af0c1 100644 --- a/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json @@ -1,6 +1,9 @@ { "compilerOptions": { - "module": "esnext", - "allowSyntheticDefaultImports": true + "target": "esnext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, + "verbatimModuleSyntax": true, + "module": "esnext" } } diff --git a/test/build/config-format/typescript-using-nodejs/tsconfig.json b/test/build/config-format/typescript-using-nodejs/tsconfig.json index e0ba2dc7a46..9f2cb9118f1 100644 --- a/test/build/config-format/typescript-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-using-nodejs/tsconfig.json @@ -1,6 +1,9 @@ { "compilerOptions": { - "module": "esnext", - "allowSyntheticDefaultImports": true + "target": "esnext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, + "verbatimModuleSyntax": true, + "module": "commonjs" } } From e98048425191a08f8948faa81122d3bf839cb682 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 13 May 2025 18:23:28 +0300 Subject: [PATCH 7/7] test: fix --- .../typescript-cjs-using-nodejs/tsconfig.json | 3 +-- .../typescript.test.js | 22 +++++++++------- .../webpack.config.ts} | 1 - .../typescript-mjs-using-nodejs/tsconfig.json | 1 - .../typescript.test.js | 22 +++++++++------- .../webpack.config.ts} | 5 ++-- .../typescript.test.js | 6 +---- .../typescript-using-interpret/main.ts | 1 - .../typescript-using-interpret/package.json | 3 --- .../typescript-using-interpret/tsconfig.json | 5 ---- .../typescript.test.js | 23 ---------------- .../webpack.config.ts | 15 ----------- .../typescript-using-nodejs/package.json | 6 +++++ .../typescript-using-nodejs/tsconfig.json | 3 +-- .../typescript.test.js | 26 +++++++++++-------- .../typescript-using-nodejs/webpack.config.ts | 4 +-- 16 files changed, 54 insertions(+), 92 deletions(-) rename test/build/config-format/{typescript-mjs-using-nodejs/webpack.config.mts => typescript-cjs-using-nodejs/webpack.config.ts} (80%) rename test/build/config-format/{typescript-cjs-using-nodejs/webpack.config.cts => typescript-mjs-using-nodejs/webpack.config.ts} (63%) delete mode 100644 test/build/config-format/typescript-using-interpret/main.ts delete mode 100644 test/build/config-format/typescript-using-interpret/package.json delete mode 100644 test/build/config-format/typescript-using-interpret/tsconfig.json delete mode 100644 test/build/config-format/typescript-using-interpret/typescript.test.js delete mode 100644 test/build/config-format/typescript-using-interpret/webpack.config.ts create mode 100644 test/build/config-format/typescript-using-nodejs/package.json diff --git a/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json b/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json index 9f2cb9118f1..3cf557d8735 100644 --- a/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-cjs-using-nodejs/tsconfig.json @@ -3,7 +3,6 @@ "target": "esnext", "allowImportingTsExtensions": true, "rewriteRelativeImportExtensions": true, - "verbatimModuleSyntax": true, - "module": "commonjs" + "module": "esnext" } } diff --git a/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js index 66ba3e0caa8..2975d730c28 100644 --- a/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js @@ -5,16 +5,20 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const [major, minor] = process.versions.node.split(".").map(Number); - const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.cts"], { - env: { - NODE_NO_WARNINGS: 1, - // Due nyc logic - WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + const [major] = process.versions.node.split(".").map(Number); + const { exitCode, stderr, stdout } = await run( + __dirname, + ["-c", "./webpack.config.ts", "--disable-interpret"], + { + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, + // Fallback to `ts-node/esm` for old Node.js versions + nodeOptions: major >= 24 ? [] : ["--experimental-loader=ts-node/esm"], }, - // Fallback to `ts-node/esm` for old Node.js versions - nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], - }); + ); expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr expect(stdout).toBeTruthy(); diff --git a/test/build/config-format/typescript-mjs-using-nodejs/webpack.config.mts b/test/build/config-format/typescript-cjs-using-nodejs/webpack.config.ts similarity index 80% rename from test/build/config-format/typescript-mjs-using-nodejs/webpack.config.mts rename to test/build/config-format/typescript-cjs-using-nodejs/webpack.config.ts index 8788aa61995..4fc182ff2d8 100644 --- a/test/build/config-format/typescript-mjs-using-nodejs/webpack.config.mts +++ b/test/build/config-format/typescript-cjs-using-nodejs/webpack.config.ts @@ -1,4 +1,3 @@ -/* eslint-disable node/no-unsupported-features/es-syntax */ import * as path from "path"; // cspell:ignore elopment diff --git a/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json b/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json index aeedf8af0c1..3cf557d8735 100644 --- a/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json @@ -3,7 +3,6 @@ "target": "esnext", "allowImportingTsExtensions": true, "rewriteRelativeImportExtensions": true, - "verbatimModuleSyntax": true, "module": "esnext" } } diff --git a/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js b/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js index a464d1065a2..2975d730c28 100644 --- a/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-mjs-using-nodejs/typescript.test.js @@ -5,16 +5,20 @@ const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const [major, minor] = process.versions.node.split(".").map(Number); - const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.mts"], { - env: { - NODE_NO_WARNINGS: 1, - // Due nyc logic - WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + const [major] = process.versions.node.split(".").map(Number); + const { exitCode, stderr, stdout } = await run( + __dirname, + ["-c", "./webpack.config.ts", "--disable-interpret"], + { + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, + // Fallback to `ts-node/esm` for old Node.js versions + nodeOptions: major >= 24 ? [] : ["--experimental-loader=ts-node/esm"], }, - // Fallback to `ts-node/esm` for old Node.js versions - nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], - }); + ); expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr expect(stdout).toBeTruthy(); diff --git a/test/build/config-format/typescript-cjs-using-nodejs/webpack.config.cts b/test/build/config-format/typescript-mjs-using-nodejs/webpack.config.ts similarity index 63% rename from test/build/config-format/typescript-cjs-using-nodejs/webpack.config.cts rename to test/build/config-format/typescript-mjs-using-nodejs/webpack.config.ts index 8a5fa76c872..4fc182ff2d8 100644 --- a/test/build/config-format/typescript-cjs-using-nodejs/webpack.config.cts +++ b/test/build/config-format/typescript-mjs-using-nodejs/webpack.config.ts @@ -1,5 +1,4 @@ -/* eslint-disable node/no-unsupported-features/es-syntax */ -const path = require("path"); +import * as path from "path"; // cspell:ignore elopment const mode: string = "dev" + "elopment"; @@ -12,4 +11,4 @@ const config = { }, }; -module.exports = config; +export default config; diff --git a/test/build/config-format/typescript-ts-node-require/typescript.test.js b/test/build/config-format/typescript-ts-node-require/typescript.test.js index 8f5d2885407..f16d0bc6de0 100644 --- a/test/build/config-format/typescript-ts-node-require/typescript.test.js +++ b/test/build/config-format/typescript-ts-node-require/typescript.test.js @@ -6,11 +6,7 @@ describe("webpack cli", () => { it("should support typescript file", async () => { const [major, minor] = process.versions.node.split(".").map(Number); const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { - NODE_NO_WARNINGS: 1, - // Due nyc logic - WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, - }, + env: { NODE_NO_WARNINGS: 1 }, nodeOptions: major >= 22 && minor >= 6 ? ["--no-experimental-strip-types", "--require=ts-node/register"] diff --git a/test/build/config-format/typescript-using-interpret/main.ts b/test/build/config-format/typescript-using-interpret/main.ts deleted file mode 100644 index 41d13d1a9a1..00000000000 --- a/test/build/config-format/typescript-using-interpret/main.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Main typescript file"); diff --git a/test/build/config-format/typescript-using-interpret/package.json b/test/build/config-format/typescript-using-interpret/package.json deleted file mode 100644 index 5bbefffbabe..00000000000 --- a/test/build/config-format/typescript-using-interpret/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/test/build/config-format/typescript-using-interpret/tsconfig.json b/test/build/config-format/typescript-using-interpret/tsconfig.json deleted file mode 100644 index 391488ab17f..00000000000 --- a/test/build/config-format/typescript-using-interpret/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs" - } -} diff --git a/test/build/config-format/typescript-using-interpret/typescript.test.js b/test/build/config-format/typescript-using-interpret/typescript.test.js deleted file mode 100644 index f9eb715f9a1..00000000000 --- a/test/build/config-format/typescript-using-interpret/typescript.test.js +++ /dev/null @@ -1,23 +0,0 @@ -// eslint-disable-next-line n/no-unpublished-require -const { run } = require("../../../utils/test-utils"); -const { existsSync } = require("fs"); -const { resolve } = require("path"); - -describe("webpack cli", () => { - it("should support typescript file", async () => { - const [major, minor] = process.versions.node.split(".").map(Number); - const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { - NODE_NO_WARNINGS: 1, - // Due nyc logic - WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, - }, - nodeOptions: major >= 22 && minor >= 6 ? ["--no-experimental-strip-types"] : [], - }); - - expect(stderr).toBeFalsy(); - expect(stdout).toBeTruthy(); - expect(exitCode).toBe(0); - expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); - }); -}); diff --git a/test/build/config-format/typescript-using-interpret/webpack.config.ts b/test/build/config-format/typescript-using-interpret/webpack.config.ts deleted file mode 100644 index 4a2e87818e2..00000000000 --- a/test/build/config-format/typescript-using-interpret/webpack.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** eslint-disable **/ -const path = require("path"); - -// cspell:ignore elopment -const mode: string = "dev" + "elopment"; -const config = { - mode, - entry: "./main.ts", - output: { - path: path.resolve(__dirname, "dist"), - filename: "foo.bundle.js", - }, -}; - -module.exports = config; diff --git a/test/build/config-format/typescript-using-nodejs/package.json b/test/build/config-format/typescript-using-nodejs/package.json new file mode 100644 index 00000000000..2921f73c914 --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "engines": { + "node": ">=18.12.0" + } +} diff --git a/test/build/config-format/typescript-using-nodejs/tsconfig.json b/test/build/config-format/typescript-using-nodejs/tsconfig.json index 9f2cb9118f1..3cf557d8735 100644 --- a/test/build/config-format/typescript-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-using-nodejs/tsconfig.json @@ -3,7 +3,6 @@ "target": "esnext", "allowImportingTsExtensions": true, "rewriteRelativeImportExtensions": true, - "verbatimModuleSyntax": true, - "module": "commonjs" + "module": "esnext" } } diff --git a/test/build/config-format/typescript-using-nodejs/typescript.test.js b/test/build/config-format/typescript-using-nodejs/typescript.test.js index 146f9399692..2975d730c28 100644 --- a/test/build/config-format/typescript-using-nodejs/typescript.test.js +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -1,22 +1,26 @@ +// eslint-disable-next-line n/no-unpublished-require const { run } = require("../../../utils/test-utils"); const { existsSync } = require("fs"); const { resolve } = require("path"); describe("webpack cli", () => { it("should support typescript esnext file", async () => { - const [major, minor] = process.versions.node.split(".").map(Number); - const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.ts"], { - env: { - NODE_NO_WARNINGS: 1, - // Due nyc logic - WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + const [major] = process.versions.node.split(".").map(Number); + const { exitCode, stderr, stdout } = await run( + __dirname, + ["-c", "./webpack.config.ts", "--disable-interpret"], + { + env: { + NODE_NO_WARNINGS: 1, + // Due nyc logic + WEBPACK_CLI_FORCE_LOAD_ESM_CONFIG: true, + }, + // Fallback to `ts-node/esm` for old Node.js versions + nodeOptions: major >= 24 ? [] : ["--experimental-loader=ts-node/esm"], }, - // Fallback to `ts-node/esm` for old Node.js versions - // We don't use Node.js@22 because it doesn't allow to load typescript files where we have `package.json` in root - nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], - }); + ); - expect(stderr).toBeFalsy(); + expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr expect(stdout).toBeTruthy(); expect(exitCode).toBe(0); expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); diff --git a/test/build/config-format/typescript-using-nodejs/webpack.config.ts b/test/build/config-format/typescript-using-nodejs/webpack.config.ts index 01c5deec071..4fc182ff2d8 100644 --- a/test/build/config-format/typescript-using-nodejs/webpack.config.ts +++ b/test/build/config-format/typescript-using-nodejs/webpack.config.ts @@ -1,4 +1,4 @@ -const path = require("path"); +import * as path from "path"; // cspell:ignore elopment const mode: string = "dev" + "elopment"; @@ -11,4 +11,4 @@ const config = { }, }; -module.exports = config; +export default config;