UNPKG

3.65 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var ts = require("typescript");
4var typescript_helpers_1 = require("./typescript-helpers");
5function generateOutput(params, options) {
6 if (options === void 0) { options = {}; }
7 var resultOutput = '';
8 if (params.typesReferences.size !== 0) {
9 var header = generateReferenceTypesDirective(Array.from(params.typesReferences));
10 resultOutput += header + "\n\n";
11 }
12 if (params.imports.size !== 0) {
13 // we need to have sorted imports of libraries to have more "stable" output
14 var sortedEntries = Array.from(params.imports.entries()).sort(function (firstEntry, secondEntry) {
15 return firstEntry[0].localeCompare(secondEntry[0]);
16 });
17 var importsArray = sortedEntries.map(function (entry) {
18 var libraryName = entry[0], libraryImports = entry[1];
19 return generateImport(libraryName, Array.from(libraryImports));
20 });
21 resultOutput += importsArray.join('\n') + "\n\n";
22 }
23 var statements = params.statements.map(function (statement) {
24 return getStatementText(statement, params.shouldStatementHasExportKeyword(statement), params.needStripDefaultKeywordForStatement(statement));
25 });
26 if (options.sortStatements) {
27 statements.sort();
28 }
29 resultOutput += statements.join('\n');
30 if (options.umdModuleName !== undefined) {
31 resultOutput += "\n\nexport as namespace " + options.umdModuleName + ";\n";
32 }
33 return resultOutput;
34}
35exports.generateOutput = generateOutput;
36function getStatementText(statement, shouldStatementHasExportKeyword, needStripDefaultKeyword) {
37 var hasStatementExportKeyword = ts.isExportAssignment(statement) || typescript_helpers_1.hasNodeModifier(statement, ts.SyntaxKind.ExportKeyword);
38 var nodeText = getTextAccordingExport(statement.getText(), hasStatementExportKeyword, shouldStatementHasExportKeyword);
39 // strip the `default` keyword from node
40 if (typescript_helpers_1.hasNodeModifier(statement, ts.SyntaxKind.DefaultKeyword) && needStripDefaultKeyword) {
41 // we need just to remove `default` from any node except class node
42 // for classes we need to replace `default` with `declare` instead
43 nodeText = nodeText.replace(/\bdefault\s/, ts.isClassDeclaration(statement) ? 'declare ' : '');
44 }
45 // add jsdoc for exported nodes only
46 if (shouldStatementHasExportKeyword) {
47 var start = statement.getStart();
48 var jsDocStart = statement.getStart(undefined, true);
49 var nodeJSDoc = statement.getSourceFile().getFullText().substring(jsDocStart, start).trim();
50 if (nodeJSDoc.length !== 0) {
51 nodeText = nodeJSDoc + "\n" + nodeText;
52 }
53 }
54 return spacesToTabs(nodeText);
55}
56function generateImport(libraryName, imports) {
57 // sort to make output more "stable"
58 return "import { " + imports.sort().join(', ') + " } from '" + libraryName + "';";
59}
60function generateReferenceTypesDirective(libraries) {
61 return libraries.sort().map(function (library) {
62 return "/// <reference types=\"" + library + "\" />";
63 }).join('\n');
64}
65function getTextAccordingExport(nodeText, isNodeExported, shouldNodeBeExported) {
66 if (shouldNodeBeExported && !isNodeExported) {
67 return 'export ' + nodeText;
68 }
69 else if (isNodeExported && !shouldNodeBeExported) {
70 return nodeText.slice('export '.length);
71 }
72 return nodeText;
73}
74function spacesToTabs(text) {
75 return text.replace(/^( )+/gm, function (substring) {
76 return '\t'.repeat(substring.length / 4);
77 });
78}