dts-bundle-generator
Version:
DTS Bundle Generator
66 lines (65 loc) • 3.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var path = require("path");
var ts = require("typescript");
var logger_1 = require("./logger");
var get_compiler_options_1 = require("./get-compiler-options");
var check_diagnostics_errors_1 = require("./check-diagnostics-errors");
function compileDts(rootFile) {
var compilerOptions = get_compiler_options_1.getCompilerOptionsForFile(rootFile);
var dtsFiles = getDeclarationFiles(rootFile, compilerOptions);
logger_1.verboseLog("dts cache:\n " + Object.keys(dtsFiles).join('\n ') + "\n");
var host = ts.createCompilerHost(compilerOptions);
host.resolveModuleNames = function (moduleNames, containingFile) {
return moduleNames.map(function (moduleName) {
var resolvedModule = ts.resolveModuleName(moduleName, containingFile, compilerOptions, host).resolvedModule;
if (resolvedModule && !resolvedModule.isExternalLibraryImport && resolvedModule.extension !== ts.Extension.Dts) {
resolvedModule.extension = ts.Extension.Dts;
logger_1.verboseLog("Change module from .ts to .d.ts: " + resolvedModule.resolvedFileName);
resolvedModule.resolvedFileName = changeExtensionToDts(resolvedModule.resolvedFileName);
}
return resolvedModule;
});
};
var originalGetSourceFile = host.getSourceFile;
host.getSourceFile = function (fileName, languageVersion, onError) {
var absolutePath = getAbsolutePath(fileName);
if (dtsFiles[absolutePath]) {
logger_1.verboseLog("dts cache match: " + absolutePath);
return ts.createSourceFile(fileName, dtsFiles[absolutePath], languageVersion);
}
logger_1.verboseLog("dts cache mismatch: " + absolutePath + " (" + fileName + ")");
return originalGetSourceFile(fileName, languageVersion, onError);
};
var program = ts.createProgram([changeExtensionToDts(rootFile)], compilerOptions, host);
check_diagnostics_errors_1.checkProgramDiagnosticsErrors(program);
return program;
}
exports.compileDts = compileDts;
function changeExtensionToDts(fileName) {
if (fileName.slice(-5) === '.d.ts') {
return fileName;
}
// .ts, .tsx
var ext = path.extname(fileName);
return fileName.slice(0, -ext.length) + '.d.ts';
}
function getAbsolutePath(fileName) {
if (!path.isAbsolute(fileName)) {
fileName = path.join(ts.sys.getCurrentDirectory(), fileName);
}
fileName = fileName.replace(/\\/g, '/');
return fileName;
}
/**
* @description Compiles source files into d.ts files and returns map of absolute path to file content
*/
function getDeclarationFiles(rootFile, compilerOptions) {
var program = ts.createProgram([rootFile], compilerOptions);
check_diagnostics_errors_1.checkProgramDiagnosticsErrors(program);
var declarations = {};
program.emit(undefined, function (fileName, data) {
declarations[getAbsolutePath(fileName)] = data;
}, undefined, true);
return declarations;
}