UNPKG

@commitlint/load

Version:

Load shared commitlint configuration

78 lines 3.13 kB
import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; import { cosmiconfig, defaultLoadersSync, defaultLoaders, } from "cosmiconfig"; import { TypeScriptLoader } from "cosmiconfig-typescript-loader"; const moduleName = "commitlint"; const searchStrategy = "global"; export async function loadConfig(cwd, configPath) { let tsLoaderInstance; const tsLoader = (...args) => { if (!tsLoaderInstance) { tsLoaderInstance = TypeScriptLoader(); } return tsLoaderInstance(...args); }; // If dynamic await is supported (Node >= v20.8.0) or directory uses ESM, support // async js/cjs loaders (dynamic import). Otherwise, use synchronous js/cjs loaders. const loaders = isDynamicAwaitSupported() || isEsmModule(cwd) ? defaultLoaders : defaultLoadersSync; const explorer = cosmiconfig(moduleName, { searchStrategy, searchPlaces: [ // cosmiconfig overrides default searchPlaces if any new search place is added (For e.g. `*.ts` files), // we need to manually merge default searchPlaces from https://github.com/davidtheclark/cosmiconfig#searchplaces "package.json", "package.yaml", `.${moduleName}rc`, `.${moduleName}rc.json`, `.${moduleName}rc.yaml`, `.${moduleName}rc.yml`, `.${moduleName}rc.js`, `.${moduleName}rc.cjs`, `.${moduleName}rc.mjs`, `${moduleName}.config.js`, `${moduleName}.config.cjs`, `${moduleName}.config.mjs`, // files supported by TypescriptLoader `.${moduleName}rc.ts`, `.${moduleName}rc.cts`, `${moduleName}.config.ts`, `${moduleName}.config.cts`, ], loaders: { ".ts": tsLoader, ".cts": tsLoader, ".cjs": loaders[".cjs"], ".js": loaders[".js"], }, }); const explicitPath = configPath ? path.resolve(cwd, configPath) : undefined; const explore = explicitPath ? explorer.load : explorer.search; const searchPath = explicitPath ? explicitPath : cwd; const local = await explore(searchPath); if (local) { return local; } return null; } // See the following issues for more context, contributing to failing Jest tests: // - Issue: https://github.com/nodejs/node/issues/40058 // - Resolution: https://github.com/nodejs/node/pull/48510 (Node v20.8.0) export const isDynamicAwaitSupported = () => { const [major, minor] = process.version .replace("v", "") .split(".") .map((val) => parseInt(val)); return major >= 20 && minor >= 8; }; // Is the given directory set up to use ESM (ECMAScript Modules)? export const isEsmModule = (cwd) => { const packagePath = path.join(cwd, "package.json"); if (!existsSync(packagePath)) { return false; } const packageJSON = readFileSync(packagePath, { encoding: "utf-8" }); return JSON.parse(packageJSON)?.type === "module"; }; //# sourceMappingURL=load-config.js.map