UNPKG

@rnm/tscx

Version:

A tsc wrapper with many convenient options.

76 lines 10.5 kB
import childProcess from "node:child_process"; import fs from "node:fs"; import path from "node:path"; import process from "node:process"; import { tscPath } from "./common.js"; export function getTsConfig(project) { const cmd = `node ${tscPath} --showConfig${project ? ` --project ${project}` : ""}`; const config = JSON.parse(childProcess.execSync(cmd).toString("utf8")); if (!config.compilerOptions || Object.keys(config.compilerOptions).length <= 0) { throw new Error("Tsconfig.compilerOptions is empty!"); } return config; } export function getRootDir(tsconfig) { return path.resolve(process.cwd(), tsconfig.compilerOptions?.rootDir ?? getRootDirByFiles(tsconfig.files ?? [])); } export function getOutDir(tsconfig) { const outDir = tsconfig.compilerOptions?.outDir; if (!outDir) { return undefined; } const absoluteOutDir = path.resolve(process.cwd(), outDir); if (process.cwd().startsWith(absoluteOutDir)) { throw new Error('"outDir" in tsconfig.json should not be current or parent directory'); } return absoluteOutDir; } export function getInclude(tsconfig) { return (tsconfig.include?.map((i) => path.resolve(process.cwd(), i)) ?? [ process.cwd(), ]); } /** * Get the longest common dir. https://www.typescriptlang.org/tsconfig#rootDir * @param files file paths like ['./src/index.ts', './index.ts'] * @returns absolute path */ function getRootDirByFiles(files) { if (files.length === 0) { throw new Error("Cannot get the longest common dir when the arguments is empty"); } const folders = files .map((file) => file.split(path.sep).slice(0, -1)) .reduce((prev, item) => { if (prev.length === 0) { return item; } const result = []; for (let i = 0; i < prev.length && i < item.length; i += 1) { const prevI = prev[i]; const itemI = item[i]; if (prevI && itemI && prevI === itemI) { result[i] = prevI; } else { break; } } return result; }, []); return path.join(...folders); } export function getTsConfigPath(project) { const dirOrFile1 = project ? path.resolve(process.cwd(), project) : process.cwd(); const dirOrFile2 = path.join(dirOrFile1, "tsconfig.json"); if (fs.statSync(dirOrFile1).isFile()) return dirOrFile1; if (fs.statSync(dirOrFile2).isFile()) return dirOrFile2; throw new Error(`Could not find a tsconfig.json file at ${dirOrFile1} or ${dirOrFile2}`); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNjb25maWctdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHNjb25maWctdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVN0QyxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQWdCO0lBQzFDLE1BQU0sR0FBRyxHQUFHLFFBQVEsT0FBTyxnQkFBZ0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNwRixNQUFNLE1BQU0sR0FBYSxJQUFJLENBQUMsS0FBSyxDQUNqQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDNUMsQ0FBQztJQUNGLElBQ0UsQ0FBQyxNQUFNLENBQUMsZUFBZTtRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUMvQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxRQUFrQjtJQUMzQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDYixRQUFRLENBQUMsZUFBZSxFQUFFLE9BQU87UUFDL0IsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FDMUMsQ0FBQztBQUNKLENBQUM7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QUFFO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFDeEQsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ3hELE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLFVBQVUsT0FBTyxVQUFVLEVBQUUsQ0FDeEUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcIm5vZGU6cHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IHRzY1BhdGggfSBmcm9tIFwiLi9jb21tb24udHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUc0NvbmZpZyB7XG4gIGNvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcbiAgaW5jbHVkZT86IHN0cmluZ1tdO1xuICBleGNsdWRlPzogc3RyaW5nW107XG4gIGZpbGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhwcm9qZWN0Pzogc3RyaW5nKTogVHNDb25maWcge1xuICBjb25zdCBjbWQgPSBgbm9kZSAke3RzY1BhdGh9IC0tc2hvd0NvbmZpZyR7cHJvamVjdCA/IGAgLS1wcm9qZWN0ICR7cHJvamVjdH1gIDogXCJcIn1gO1xuICBjb25zdCBjb25maWc6IFRzQ29uZmlnID0gSlNPTi5wYXJzZShcbiAgICBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY21kKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICk7XG4gIGlmIChcbiAgICAhY29uZmlnLmNvbXBpbGVyT3B0aW9ucyB8fFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZy5jb21waWxlck9wdGlvbnMpLmxlbmd0aCA8PSAwXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRzY29uZmlnLmNvbXBpbGVyT3B0aW9ucyBpcyBlbXB0eSFcIik7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3REaXIodHNjb25maWc6IFRzQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICBwcm9jZXNzLmN3ZCgpLFxuICAgIHRzY29uZmlnLmNvbXBpbGVyT3B0aW9ucz8ucm9vdERpciA/P1xuICAgICAgZ2V0Um9vdERpckJ5RmlsZXModHNjb25maWcuZmlsZXMgPz8gW10pLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0RGlyKHRzY29uZmlnOiBUc0NvbmZpZykge1xuICBjb25zdCBvdXREaXIgPSB0c2NvbmZpZy5jb21waWxlck9wdGlvbnM/Lm91dERpcjtcbiAgaWYgKCFvdXREaXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGFic29sdXRlT3V0RGlyID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIG91dERpcik7XG4gIGlmIChwcm9jZXNzLmN3ZCgpLnN0YXJ0c1dpdGgoYWJzb2x1dGVPdXREaXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1wib3V0RGlyXCIgaW4gdHNjb25maWcuanNvbiBzaG91bGQgbm90IGJlIGN1cnJlbnQgb3IgcGFyZW50IGRpcmVjdG9yeScsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYWJzb2x1dGVPdXREaXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmNsdWRlKHRzY29uZmlnOiBUc0NvbmZpZykge1xuICByZXR1cm4gKFxuICAgIHRzY29uZmlnLmluY2x1ZGU/Lm1hcCgoaSkgPT4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGkpKSA/PyBbXG4gICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgIF1cbiAgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxvbmdlc3QgY29tbW9uIGRpci4gaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI3Jvb3REaXJcbiAqIEBwYXJhbSBmaWxlcyBmaWxlIHBhdGhzIGxpa2UgWycuL3NyYy9pbmRleC50cycsICcuL2luZGV4LnRzJ11cbiAqIEByZXR1cm5zIGFic29sdXRlIHBhdGhcbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdERpckJ5RmlsZXMoZmlsZXM6IHN0cmluZ1tdKSB7XG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkNhbm5vdCBnZXQgdGhlIGxvbmdlc3QgY29tbW9uIGRpciB3aGVuIHRoZSBhcmd1bWVudHMgaXMgZW1wdHlcIixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZm9sZGVycyA9IGZpbGVzXG4gICAgLm1hcCgoZmlsZSkgPT4gZmlsZS5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpKVxuICAgIC5yZWR1Y2U8c3RyaW5nW10+KChwcmV2LCBpdGVtKSA9PiB7XG4gICAgICBpZiAocHJldi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoICYmIGkgPCBpdGVtLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IHByZXZJID0gcHJldltpXTtcbiAgICAgICAgY29uc3QgaXRlbUkgPSBpdGVtW2ldO1xuICAgICAgICBpZiAocHJldkkgJiYgaXRlbUkgJiYgcHJldkkgPT09IGl0ZW1JKSB7XG4gICAgICAgICAgcmVzdWx0W2ldID0gcHJldkk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xuXG4gIHJldHVybiBwYXRoLmpvaW4oLi4uZm9sZGVycyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZ1BhdGgocHJvamVjdD86IHN0cmluZykge1xuICBjb25zdCBkaXJPckZpbGUxID0gcHJvamVjdFxuICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHByb2plY3QpXG4gICAgOiBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBkaXJPckZpbGUyID0gcGF0aC5qb2luKGRpck9yRmlsZTEsIFwidHNjb25maWcuanNvblwiKTtcbiAgaWYgKGZzLnN0YXRTeW5jKGRpck9yRmlsZTEpLmlzRmlsZSgpKSByZXR1cm4gZGlyT3JGaWxlMTtcbiAgaWYgKGZzLnN0YXRTeW5jKGRpck9yRmlsZTIpLmlzRmlsZSgpKSByZXR1cm4gZGlyT3JGaWxlMjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDb3VsZCBub3QgZmluZCBhIHRzY29uZmlnLmpzb24gZmlsZSBhdCAke2Rpck9yRmlsZTF9IG9yICR7ZGlyT3JGaWxlMn1gLFxuICApO1xufVxuIl19