UNPKG

3.62 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var path = require("path");
4var ts = require("typescript");
5var logger_1 = require("./logger");
6var get_compiler_options_1 = require("./get-compiler-options");
7var check_diagnostics_errors_1 = require("./check-diagnostics-errors");
8function compileDts(rootFile, preferredConfigPath, followSymlinks) {
9 if (followSymlinks === void 0) { followSymlinks = true; }
10 var compilerOptions = get_compiler_options_1.getCompilerOptions(rootFile, preferredConfigPath);
11 if (compilerOptions.outDir !== undefined) {
12 logger_1.normalLog('Compiler option `outDir` is not supported and will be removed while generating dts');
13 compilerOptions.outDir = undefined;
14 }
15 var dtsFiles = getDeclarationFiles(rootFile, compilerOptions);
16 logger_1.verboseLog("dts cache:\n " + Object.keys(dtsFiles).join('\n ') + "\n");
17 var host = ts.createCompilerHost(compilerOptions);
18 if (!followSymlinks) {
19 host.realpath = function (path) { return path; };
20 }
21 host.resolveModuleNames = function (moduleNames, containingFile) {
22 return moduleNames.map(function (moduleName) {
23 var resolvedModule = ts.resolveModuleName(moduleName, containingFile, compilerOptions, host).resolvedModule;
24 if (resolvedModule && !resolvedModule.isExternalLibraryImport && resolvedModule.extension !== ts.Extension.Dts) {
25 resolvedModule.extension = ts.Extension.Dts;
26 logger_1.verboseLog("Change module from .ts to .d.ts: " + resolvedModule.resolvedFileName);
27 resolvedModule.resolvedFileName = changeExtensionToDts(resolvedModule.resolvedFileName);
28 }
29 return resolvedModule;
30 });
31 };
32 var originalGetSourceFile = host.getSourceFile;
33 host.getSourceFile = function (fileName, languageVersion, onError) {
34 var absolutePath = getAbsolutePath(fileName);
35 if (dtsFiles[absolutePath]) {
36 logger_1.verboseLog("dts cache match: " + absolutePath);
37 return ts.createSourceFile(fileName, dtsFiles[absolutePath], languageVersion);
38 }
39 logger_1.verboseLog("dts cache mismatch: " + absolutePath + " (" + fileName + ")");
40 return originalGetSourceFile(fileName, languageVersion, onError);
41 };
42 var program = ts.createProgram([changeExtensionToDts(rootFile)], compilerOptions, host);
43 check_diagnostics_errors_1.checkProgramDiagnosticsErrors(program);
44 return program;
45}
46exports.compileDts = compileDts;
47function changeExtensionToDts(fileName) {
48 if (fileName.slice(-5) === '.d.ts') {
49 return fileName;
50 }
51 // .ts, .tsx
52 var ext = path.extname(fileName);
53 return fileName.slice(0, -ext.length) + '.d.ts';
54}
55function getAbsolutePath(fileName) {
56 if (!path.isAbsolute(fileName)) {
57 fileName = path.join(ts.sys.getCurrentDirectory(), fileName);
58 }
59 fileName = fileName.replace(/\\/g, '/');
60 return fileName;
61}
62/**
63 * @description Compiles source files into d.ts files and returns map of absolute path to file content
64 */
65function getDeclarationFiles(rootFile, compilerOptions) {
66 var program = ts.createProgram([rootFile], compilerOptions);
67 check_diagnostics_errors_1.checkProgramDiagnosticsErrors(program);
68 var declarations = {};
69 var emitResult = program.emit(undefined, function (fileName, data) {
70 declarations[getAbsolutePath(fileName)] = data;
71 }, undefined, true);
72 check_diagnostics_errors_1.checkDiagnosticsErrors(emitResult.diagnostics, 'Errors while emitting declarations');
73 return declarations;
74}