From fe97e9110a46a9d863587ca06bb0fe93d2bb7e35 Mon Sep 17 00:00:00 2001 From: Maciej Lamberski Date: Thu, 25 Sep 2025 17:42:34 +0200 Subject: [PATCH 1/2] fix(resolve-extends): add import attribute for JSON config files --- @commitlint/resolve-extends/src/index.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/@commitlint/resolve-extends/src/index.ts b/@commitlint/resolve-extends/src/index.ts index 8c6942db27..476a8fe9eb 100644 --- a/@commitlint/resolve-extends/src/index.ts +++ b/@commitlint/resolve-extends/src/index.ts @@ -9,10 +9,24 @@ import resolveFrom_ from "resolve-from"; import { validateConfig } from "@commitlint/config-validator"; import type { ParserPreset, UserConfig } from "@commitlint/types"; +// Check if Node.js version supports 'with' syntax (22+) +// Node.js < 22 supports 'assert' +// Node.js >= 22 uses 'with' (assert was removed in 22) +const supportsWithSyntax = () => { + const [major] = process.version.replace("v", "").split(".").map(Number); + return major >= 22; +}; + const dynamicImport = async (id: string): Promise => { - const imported = await import( - path.isAbsolute(id) ? pathToFileURL(id).toString() : id - ); + const fileUrl = path.isAbsolute(id) ? pathToFileURL(id).toString() : id; + const isJsonFile = fileUrl.endsWith(".json"); + + const imported = isJsonFile + ? supportsWithSyntax() + ? await import(fileUrl, { with: { type: "json" } }) + : await import(fileUrl, { assert: { type: "json" } }) + : await import(fileUrl); + return ("default" in imported && imported.default) || imported; }; From 38aea4dbbc5e9cb7deec435d9d7697f626610356 Mon Sep 17 00:00:00 2001 From: Maciej Lamberski Date: Mon, 29 Sep 2025 19:54:54 +0200 Subject: [PATCH 2/2] fix(resolve-extends): use require() for JSON files instead of import attributes --- @commitlint/resolve-extends/src/index.ts | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/@commitlint/resolve-extends/src/index.ts b/@commitlint/resolve-extends/src/index.ts index 476a8fe9eb..b44bd3956a 100644 --- a/@commitlint/resolve-extends/src/index.ts +++ b/@commitlint/resolve-extends/src/index.ts @@ -1,3 +1,4 @@ +import { createRequire } from "node:module"; import fs from "node:fs"; import path from "node:path"; import { pathToFileURL, fileURLToPath } from "node:url"; @@ -9,24 +10,15 @@ import resolveFrom_ from "resolve-from"; import { validateConfig } from "@commitlint/config-validator"; import type { ParserPreset, UserConfig } from "@commitlint/types"; -// Check if Node.js version supports 'with' syntax (22+) -// Node.js < 22 supports 'assert' -// Node.js >= 22 uses 'with' (assert was removed in 22) -const supportsWithSyntax = () => { - const [major] = process.version.replace("v", "").split(".").map(Number); - return major >= 22; -}; - const dynamicImport = async (id: string): Promise => { - const fileUrl = path.isAbsolute(id) ? pathToFileURL(id).toString() : id; - const isJsonFile = fileUrl.endsWith(".json"); - - const imported = isJsonFile - ? supportsWithSyntax() - ? await import(fileUrl, { with: { type: "json" } }) - : await import(fileUrl, { assert: { type: "json" } }) - : await import(fileUrl); + if (id.endsWith(".json")) { + const require = createRequire(import.meta.url); + return require(id); + } + const imported = await import( + path.isAbsolute(id) ? pathToFileURL(id).toString() : id + ); return ("default" in imported && imported.default) || imported; };