UNPKG

5.72 kBJavaScriptView Raw
1"use strict";
2var __assign = (this && this.__assign) || function () {
3 __assign = Object.assign || function(t) {
4 for (var s, i = 1, n = arguments.length; i < n; i++) {
5 s = arguments[i];
6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7 t[p] = s[p];
8 }
9 return t;
10 };
11 return __assign.apply(this, arguments);
12};
13Object.defineProperty(exports, "__esModule", { value: true });
14exports.compileDts = void 0;
15var path = require("path");
16var ts = require("typescript");
17var logger_1 = require("./logger");
18var get_compiler_options_1 = require("./get-compiler-options");
19var get_absolute_path_1 = require("./helpers/get-absolute-path");
20var check_diagnostics_errors_1 = require("./helpers/check-diagnostics-errors");
21function compileDts(rootFiles, preferredConfigPath, followSymlinks) {
22 if (followSymlinks === void 0) { followSymlinks = true; }
23 var compilerOptions = get_compiler_options_1.getCompilerOptions(rootFiles, preferredConfigPath);
24 // currently we don't support these compiler options
25 // and removing them shouldn't affect generated code
26 // so let's just remove them for this run
27 compilerOptions.outDir = undefined;
28 compilerOptions.incremental = undefined;
29 compilerOptions.tsBuildInfoFile = undefined;
30 var dtsFiles = getDeclarationFiles(rootFiles, compilerOptions);
31 logger_1.verboseLog("dts cache:\n " + Object.keys(dtsFiles).join('\n ') + "\n");
32 var host = ts.createCompilerHost(compilerOptions);
33 if (!followSymlinks) {
34 host.realpath = function (path) { return path; };
35 }
36 host.resolveModuleNames = function (moduleNames, containingFile) {
37 return moduleNames.map(function (moduleName) {
38 var resolvedModule = ts.resolveModuleName(moduleName, containingFile, compilerOptions, host).resolvedModule;
39 if (resolvedModule && !resolvedModule.isExternalLibraryImport && resolvedModule.extension !== ts.Extension.Dts) {
40 resolvedModule.extension = ts.Extension.Dts;
41 logger_1.verboseLog("Change module from .ts to .d.ts: " + resolvedModule.resolvedFileName);
42 resolvedModule.resolvedFileName = changeExtensionToDts(resolvedModule.resolvedFileName);
43 }
44 return resolvedModule;
45 });
46 };
47 var originalGetSourceFile = host.getSourceFile;
48 host.getSourceFile = function (fileName, languageVersion, onError) {
49 var absolutePath = get_absolute_path_1.getAbsolutePath(fileName);
50 var storedValue = dtsFiles.get(absolutePath);
51 if (storedValue !== undefined) {
52 logger_1.verboseLog("dts cache match: " + absolutePath);
53 return ts.createSourceFile(fileName, storedValue, languageVersion);
54 }
55 logger_1.verboseLog("dts cache mismatch: " + absolutePath + " (" + fileName + ")");
56 return originalGetSourceFile(fileName, languageVersion, onError);
57 };
58 var rootFilesRemapping = new Map();
59 var inputFiles = rootFiles.map(function (rootFile) {
60 var rootDtsFile = changeExtensionToDts(rootFile);
61 rootFilesRemapping.set(rootFile, rootDtsFile);
62 return rootDtsFile;
63 });
64 var program = ts.createProgram(inputFiles, compilerOptions, host);
65 check_diagnostics_errors_1.checkProgramDiagnosticsErrors(program);
66 warnAboutTypeScriptFilesInProgram(program);
67 return { program: program, rootFilesRemapping: rootFilesRemapping };
68}
69exports.compileDts = compileDts;
70function changeExtensionToDts(fileName) {
71 if (fileName.slice(-5) === '.d.ts') {
72 return fileName;
73 }
74 // .ts, .tsx
75 var ext = path.extname(fileName);
76 return fileName.slice(0, -ext.length) + '.d.ts';
77}
78/**
79 * @description Compiles source files into d.ts files and returns map of absolute path to file content
80 */
81function getDeclarationFiles(rootFiles, compilerOptions) {
82 // we must pass `declaration: true` and `noEmit: false` if we want to generate declaration files
83 // see https://github.com/microsoft/TypeScript/issues/24002#issuecomment-550549393
84 compilerOptions = __assign(__assign({}, compilerOptions), { noEmit: false, declaration: true });
85 var program = ts.createProgram(rootFiles, compilerOptions);
86 var allFilesAreDeclarations = program.getSourceFiles().every(function (s) { return s.isDeclarationFile; });
87 var declarations = new Map();
88 if (allFilesAreDeclarations) {
89 // if all files are declarations we don't need to compile the project twice
90 // so let's just return empty map to speed up
91 logger_1.verboseLog('Skipping compiling the project to generate d.ts because all files in it are d.ts already');
92 return declarations;
93 }
94 check_diagnostics_errors_1.checkProgramDiagnosticsErrors(program);
95 var emitResult = program.emit(undefined, function (fileName, data) { return declarations.set(get_absolute_path_1.getAbsolutePath(fileName), data); }, undefined, true);
96 check_diagnostics_errors_1.checkDiagnosticsErrors(emitResult.diagnostics, 'Errors while emitting declarations');
97 return declarations;
98}
99function warnAboutTypeScriptFilesInProgram(program) {
100 var nonDeclarationFiles = program.getSourceFiles().filter(function (file) { return !file.isDeclarationFile; });
101 if (nonDeclarationFiles.length !== 0) {
102 logger_1.warnLog("WARNING: It seems that some files in the compilation still are not declaration files.\nFor more information see https://github.com/timocov/dts-bundle-generator/issues/53.\nIf you think this is a mistake, feel free to open new issue or just ignore this warning.\n " + nonDeclarationFiles.map(function (file) { return file.fileName; }).join('\n ') + "\n");
103 }
104}