scripts/esbuild/resolveTSConfig.js (47 lines of code) (raw):
const { readFileSync } = require("fs");
const merge = require("lodash.merge");
const { dirname, resolve } = require("path");
const ts = require("typescript");
function resolveModulePath(path) {
try {
return require.resolve(path);
} catch (e) {
return undefined;
}
}
function resolveTSConfig(opts) {
let configPath =
opts.configPath ??
ts.findConfigFile(
opts.searchPath ?? process.cwd(),
ts.sys.fileExists,
opts.configName,
);
if (!configPath) {
throw new Error("No config file found");
}
if (configPath.startsWith(".")) {
configPath = require.resolve(configPath);
}
const config = ts.readConfigFile(configPath, (path) =>
readFileSync(path, "utf-8"),
);
if (config.config.extends) {
const parentConfig = resolveTSConfig({
...opts,
configPath:
resolveModulePath(config.config.extends) ??
resolve(dirname(configPath), config.config.extends),
}).config;
config.config = merge(parentConfig, config.config);
}
if (config.error) {
throw config.error;
} else {
return {
config: config.config,
configPath,
};
}
}
module.exports = { resolveTSConfig };