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..3cf557d8735 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,8 @@ { "compilerOptions": { - "module": "esnext", - "allowSyntheticDefaultImports": true + "target": "esnext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, + "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 new file mode 100644 index 00000000000..2975d730c28 --- /dev/null +++ b/test/build/config-format/typescript-cjs-using-nodejs/typescript.test.js @@ -0,0 +1,28 @@ +// 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 { 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"], + }, + ); + + 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-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-commonjs-using-nodejs/typescript.test.js b/test/build/config-format/typescript-commonjs-using-nodejs/typescript.test.js deleted file mode 100644 index 21a83159fb2..00000000000 --- a/test/build/config-format/typescript-commonjs-using-nodejs/typescript.test.js +++ /dev/null @@ -1,20 +0,0 @@ -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 - const { exitCode, stderr, stdout } = await run(__dirname, ["-c", "./webpack.config.cts"], { - env: { NODE_NO_WARNINGS: 1 }, - }); - - 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-mjs-using-nodejs/tsconfig.json b/test/build/config-format/typescript-mjs-using-nodejs/tsconfig.json index e0ba2dc7a46..3cf557d8735 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,8 @@ { "compilerOptions": { - "module": "esnext", - "allowSyntheticDefaultImports": true + "target": "esnext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": 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 8fc1009e324..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,12 +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 }, - // Fallback to `ts-node/esm` for old Node.js versions - nodeOptions: major >= 22 && minor >= 6 ? [] : ["--experimental-loader=ts-node/esm"], - }); + 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"], + }, + ); 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-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-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 4c13ab4bfc1..00000000000 --- a/test/build/config-format/typescript-using-interpret/typescript.test.js +++ /dev/null @@ -1,19 +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 }, - 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/tsconfig.json b/test/build/config-format/typescript-using-nodejs/tsconfig.json index e0ba2dc7a46..3cf557d8735 100644 --- a/test/build/config-format/typescript-using-nodejs/tsconfig.json +++ b/test/build/config-format/typescript-using-nodejs/tsconfig.json @@ -1,6 +1,8 @@ { "compilerOptions": { - "module": "esnext", - "allowSyntheticDefaultImports": true + "target": "esnext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, + "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 new file mode 100644 index 00000000000..2975d730c28 --- /dev/null +++ b/test/build/config-format/typescript-using-nodejs/typescript.test.js @@ -0,0 +1,28 @@ +// 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 { 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"], + }, + ); + + expect(stderr).toBeFalsy(); // Deprecation warning logs on stderr + expect(stdout).toBeTruthy(); + expect(exitCode).toBe(0); + expect(existsSync(resolve(__dirname, "dist/foo.bundle.js"))).toBeTruthy(); + }); +});