"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const utils_1 = require("./utils"); function getConfigFile(compiler, colors, loader, loaderOptions, compilerCompatible, log, compilerDetailsLogMessage) { const configFilePath = findConfigFile(compiler, path.dirname(loader.resourcePath), loaderOptions.configFile); let configFileError; let configFile; if (configFilePath !== undefined) { if (compilerCompatible) { log.logInfo(`${compilerDetailsLogMessage} and ${configFilePath}`); } else { log.logInfo(`ts-loader: Using config file at ${configFilePath}`); } configFile = compiler.readConfigFile(configFilePath, compiler.sys.readFile); if (configFile.error !== undefined) { configFileError = utils_1.formatErrors([configFile.error], loaderOptions, colors, compiler, { file: configFilePath }, loader.context)[0]; } } else { if (compilerCompatible) { log.logInfo(compilerDetailsLogMessage); } configFile = { config: { compilerOptions: {}, files: [] } }; } if (configFileError === undefined) { configFile.config.compilerOptions = Object.assign({}, configFile.config.compilerOptions, loaderOptions.compilerOptions); } return { configFilePath, configFile, configFileError }; } exports.getConfigFile = getConfigFile; /** * Find a tsconfig file by name or by path. * By name, the tsconfig.json is found using the same method as `tsc`, starting in the current * directory and continuing up the parent directory chain. * By path, the file will be found by resolving the given path relative to the requesting entry file. * * @param compiler The TypeScript compiler instance * @param requestDirPath The directory in which the entry point requesting the tsconfig.json lies * @param configFile The tsconfig file name to look for or a path to that file * @return The absolute path to the tsconfig file, undefined if none was found. */ function findConfigFile(compiler, requestDirPath, configFile) { // If `configFile` is an absolute path, return it right away if (path.isAbsolute(configFile)) { return compiler.sys.fileExists(configFile) ? configFile : undefined; } // If `configFile` is a relative path, resolve it. // We define a relative path as: starts with // one or two dots + a common directory delimiter if (configFile.match(/^\.\.?(\/|\\)/) !== null) { const resolvedPath = path.resolve(requestDirPath, configFile); return compiler.sys.fileExists(resolvedPath) ? resolvedPath : undefined; // If `configFile` is a file name, find it in the directory tree } else { while (true) { const fileName = path.join(requestDirPath, configFile); if (compiler.sys.fileExists(fileName)) { return fileName; } const parentPath = path.dirname(requestDirPath); if (parentPath === requestDirPath) { break; } requestDirPath = parentPath; } return undefined; } } function getConfigParseResult(compiler, configFile, basePath) { const configParseResult = compiler.parseJsonConfigFileContent(configFile.config, compiler.sys, basePath); return configParseResult; } exports.getConfigParseResult = getConfigParseResult;