UNPKG

14.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const ts = require("typescript");
4var TSHelpers;
5(function (TSHelpers) {
6 function GetTypeTextFromDeclaration(declaration) {
7 if (declaration.type == null) {
8 return "???";
9 }
10 return declaration.type.getText();
11 }
12 TSHelpers.GetTypeTextFromDeclaration = GetTypeTextFromDeclaration;
13 function GetReturnTypeTextFromDeclaration(declaration, typeChecker) {
14 const signature = typeChecker.getSignatureFromDeclaration(declaration);
15 if (signature == null) {
16 return "???";
17 }
18 const type = typeChecker.getReturnTypeOfSignature(signature);
19 return typeChecker.typeToString(type);
20 }
21 TSHelpers.GetReturnTypeTextFromDeclaration = GetReturnTypeTextFromDeclaration;
22 /**
23 * Returns the string part of `export * from "./module";`
24 */
25 function GetExportDeclarationImportString(declaration) {
26 const stringLiteralNode = declaration.getChildren().find(x => ts.isStringLiteral(x));
27 if (stringLiteralNode == null || !ts.isStringLiteral(stringLiteralNode)) {
28 return undefined;
29 }
30 return stringLiteralNode.text;
31 }
32 TSHelpers.GetExportDeclarationImportString = GetExportDeclarationImportString;
33 /**
34 * Returns `ts.SourceFile` from `ts.ExportDeclaration`.
35 */
36 function GetSourceFileFromExport(declaration, program) {
37 const declarationSourceFile = declaration.getSourceFile();
38 const importString = GetExportDeclarationImportString(declaration);
39 if (importString == null) {
40 return undefined;
41 }
42 // TODO: Resolve custom paths with custom paths.
43 // const compilerPaths = program.getCompilerOptions().paths;
44 const resolvedModule = GetResolvedModule(declarationSourceFile, importString);
45 if (resolvedModule == null) {
46 return undefined;
47 }
48 return program.getSourceFile(resolvedModule.resolvedFileName);
49 }
50 TSHelpers.GetSourceFileFromExport = GetSourceFileFromExport;
51 /**
52 * Returns Symbol from declaration.
53 */
54 function GetSymbolFromDeclaration(declaration, typeChecker) {
55 const symbol = typeChecker.getSymbolAtLocation(declaration);
56 if (symbol != null) {
57 return symbol;
58 }
59 /**
60 * HACK: It's the only way to get symbol from declaration.
61 * Remove this when TypeScript compiler will support getting symbols.
62 */
63 return declaration.symbol;
64 }
65 TSHelpers.GetSymbolFromDeclaration = GetSymbolFromDeclaration;
66 function IsTypeWithTypeArguments(type) {
67 return type.typeArguments != null;
68 }
69 TSHelpers.IsTypeWithTypeArguments = IsTypeWithTypeArguments;
70 function IsTypeUnionOrIntersectionType(type) {
71 return Boolean(type.flags & ts.TypeFlags.UnionOrIntersection);
72 }
73 TSHelpers.IsTypeUnionOrIntersectionType = IsTypeUnionOrIntersectionType;
74 function IsTypeUnionType(type) {
75 return Boolean(type.flags & ts.TypeFlags.Union);
76 }
77 TSHelpers.IsTypeUnionType = IsTypeUnionType;
78 function IsTypeIntersectionType(type) {
79 return Boolean(type.flags & ts.TypeFlags.Intersection);
80 }
81 TSHelpers.IsTypeIntersectionType = IsTypeIntersectionType;
82 function GetResolvedModule(sourceFile, moduleNameText) {
83 return sourceFile && sourceFile.resolvedModules && sourceFile.resolvedModules.get(moduleNameText);
84 }
85 TSHelpers.GetResolvedModule = GetResolvedModule;
86 /**
87 * Source: @microsoft/api-extractor (MIT)
88 * Github: https://goo.gl/tLoJUe
89 */
90 function FollowSymbolAliases(symbol, typeChecker) {
91 let current = symbol;
92 while (true) {
93 if (!(current.flags & ts.SymbolFlags.Alias)) {
94 break;
95 }
96 const currentAlias = typeChecker.getAliasedSymbol(current);
97 if (!currentAlias || currentAlias === current) {
98 break;
99 }
100 current = currentAlias;
101 }
102 return current;
103 }
104 TSHelpers.FollowSymbolAliases = FollowSymbolAliases;
105})(TSHelpers = exports.TSHelpers || (exports.TSHelpers = {}));
106//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBR2pDLElBQWlCLFNBQVMsQ0E4R3pCO0FBOUdELFdBQWlCLFNBQVM7SUFHdEIsb0NBQTJDLFdBQW9DO1FBQzNFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBTmUsb0NBQTBCLDZCQU16QyxDQUFBO0lBRUQsMENBQWlELFdBQW9DLEVBQUUsV0FBMkI7UUFDOUcsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3RCxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBUmUsMENBQWdDLG1DQVEvQyxDQUFBO0lBRUQ7O09BRUc7SUFDSCwwQ0FBaUQsV0FBaUM7UUFDOUUsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMs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LENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksWUFBWSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLEtBQUssQ0FBQztZQUNWLENBQUM7WUFDRCxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzNCLENBQUM7UUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFmZSw2QkFBbUIsc0JBZWxDLENBQUE7QUFDTCxDQUFDLEVBOUdnQixTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQThHekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIFRTSGVscGVycyB7XG4gICAgZXhwb3J0IHR5cGUgRGVjbGFyYXRpb25XaXRoVHlwZU5vZGUgPSB0cy5EZWNsYXJhdGlvbiAmIHsgdHlwZT86IHRzLlR5cGVOb2RlIH07XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gR2V0VHlwZVRleHRGcm9tRGVjbGFyYXRpb24oZGVjbGFyYXRpb246IERlY2xhcmF0aW9uV2l0aFR5cGVOb2RlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiPz8/XCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24udHlwZS5nZXRUZXh0KCk7XG4gICAgfVxuXG4gICAgZXhwb3J0IGZ1bmN0aW9uIEdldFJldHVyblR5cGVUZXh0RnJvbURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiB0cy5TaWduYXR1cmVEZWNsYXJhdGlvbiwgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdHlwZUNoZWNrZXIuZ2V0U2lnbmF0dXJlRnJvbURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKTtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI/Pz9cIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZUNoZWNrZXIuZ2V0UmV0dXJuVHlwZU9mU2lnbmF0dXJlKHNpZ25hdHVyZSk7XG5cbiAgICAgICAgcmV0dXJuIHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcGFydCBvZiBgZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlXCI7YFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBHZXRFeHBvcnREZWNsYXJhdGlvbkltcG9ydFN0cmluZyhkZWNsYXJhdGlvbjogdHMuRXhwb3J0RGVjbGFyYXRpb24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBzdHJpbmdMaXRlcmFsTm9kZSA9IGRlY2xhcmF0aW9uLmdldENoaWxkcmVuKCkuZmluZCh4ID0+IHRzLmlzU3RyaW5nTGl0ZXJhbCh4KSk7XG4gICAgICAgIGlmIChzdHJpbmdMaXRlcmFsTm9kZSA9PSBudWxsIHx8ICF0cy5pc1N0cmluZ0xpdGVyYWwoc3RyaW5nTGl0ZXJhbE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZ0xpdGVyYWxOb2RlLnRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHMuU291cmNlRmlsZWAgZnJvbSBgdHMuRXhwb3J0RGVjbGFyYXRpb25gLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBHZXRTb3VyY2VGaWxlRnJvbUV4cG9ydChkZWNsYXJhdGlvbjogdHMuRXhwb3J0RGVjbGFyYXRpb24sIHByb2dyYW06IHRzLlByb2dyYW0pOiB0cy5Tb3VyY2VGaWxlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Tb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICAgICAgICBjb25zdCBpbXBvcnRTdHJpbmcgPSBHZXRFeHBvcnREZWNsYXJhdGlvbkltcG9ydFN0cmluZyhkZWNsYXJhdGlvbik7XG4gICAgICAgIGlmIChpbXBvcnRTdHJpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IFJlc29sdmUgY3VzdG9tIHBhdGhzIHdpdGggY3VzdG9tIHBhdGhzLlxuICAgICAgICAvLyBjb25zdCBjb21waWxlclBhdGhzID0gcHJvZ3JhbS5nZXRDb21waWxlck9wdGlvbnMoKS5wYXRocztcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRNb2R1bGUgPSBHZXRSZXNvbHZlZE1vZHVsZShkZWNsYXJhdGlvblNvdXJjZUZpbGUsIGltcG9ydFN0cmluZyk7XG4gICAgICAgIGlmIChyZXNvbHZlZE1vZHVsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRNb2R1bGUucmVzb2x2ZWRGaWxlTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBTeW1ib2wgZnJvbSBkZWNsYXJhdGlvbi5cbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gR2V0U3ltYm9sRnJvbURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiB0cy5EZWNsYXJhdGlvbiwgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sOiB0cy5TeW1ib2wgfCB1bmRlZmluZWQgPSB0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGRlY2xhcmF0aW9uKTtcbiAgICAgICAgaWYgKHN5bWJvbCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ltYm9sO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhBQ0s6IEl0J3MgdGhlIG9ubHkgd2F5IHRvIGdldCBzeW1ib2wgZnJvbSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICogUmVtb3ZlIHRoaXMgd2hlbiBUeXBlU2NyaXB0IGNvbXBpbGVyIHdpbGwgc3VwcG9ydCBnZXR0aW5nIHN5bWJvbHMuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gKGRlY2xhcmF0aW9uIGFzIGFueSkuc3ltYm9sO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIFR5cGVXaXRoVHlwZUFyZ3VtZW50cyA9IHRzLlR5cGUgJiB7IHR5cGVBcmd1bWVudHM6IHRzLlR5cGVbXSB9O1xuXG4gICAgZXhwb3J0IGZ1bmN0aW9uIElzVHlwZVdpdGhUeXBlQXJndW1lbnRzKHR5cGU6IHRzLlR5cGUpOiB0eXBlIGlzIFR5cGVXaXRoVHlwZUFyZ3VtZW50cyB7XG4gICAgICAgIHJldHVybiAodHlwZSBhcyBUeXBlV2l0aFR5cGVBcmd1bWVudHMpLnR5cGVBcmd1bWVudHMgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gSXNUeXBlVW5pb25PckludGVyc2VjdGlvblR5cGUodHlwZTogdHMuVHlwZSk6IHR5cGUgaXMgdHMuVW5pb25PckludGVyc2VjdGlvblR5cGUge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0eXBlLmZsYWdzICYgdHMuVHlwZUZsYWdzLlVuaW9uT3JJbnRlcnNlY3Rpb24pO1xuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiBJc1R5cGVVbmlvblR5cGUodHlwZTogdHMuVHlwZSk6IHR5cGUgaXMgdHMuVW5pb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odHlwZS5mbGFncyAmIHRzLlR5cGVGbGFncy5Vbmlvbik7XG4gICAgfVxuXG4gICAgZXhwb3J0IGZ1bmN0aW9uIElzVHlwZUludGVyc2VjdGlvblR5cGUodHlwZTogdHMuVHlwZSk6IHR5cGUgaXMgdHMuSW50ZXJzZWN0aW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHR5cGUuZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuSW50ZXJzZWN0aW9uKTtcbiAgICB9XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gR2V0UmVzb2x2ZWRNb2R1bGUoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbW9kdWxlTmFtZVRleHQ6IHN0cmluZyk6IHRzLlJlc29sdmVkTW9kdWxlRnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBzb3VyY2VGaWxlICYmIChzb3VyY2VGaWxlIGFzIGFueSkucmVzb2x2ZWRNb2R1bGVzICYmIChzb3VyY2VGaWxlIGFzIGFueSkucmVzb2x2ZWRNb2R1bGVzLmdldChtb2R1bGVOYW1lVGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU291cmNlOiBAbWljcm9zb2Z0L2FwaS1leHRyYWN0b3IgKE1JVClcbiAgICAgKiBHaXRodWI6IGh0dHBzOi8vZ29vLmdsL3RMb0pVZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBGb2xsb3dTeW1ib2xBbGlhc2VzKHN5bWJvbDogdHMuU3ltYm9sLCB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIpOiB0cy5TeW1ib2wge1xuICAgICAgICBsZXQgY3VycmVudDogdHMuU3ltYm9sID0gc3ltYm9sO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIShjdXJyZW50LmZsYWdzICYgdHMuU3ltYm9sRmxhZ3MuQWxpYXMpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QWxpYXM6IHRzLlN5bWJvbCA9IHR5cGVDaGVja2VyLmdldEFsaWFzZWRTeW1ib2woY3VycmVudCk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRBbGlhcyB8fCBjdXJyZW50QWxpYXMgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50QWxpYXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG59XG4iXX0=
\No newline at end of file