UNPKG

3.93 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 // for some reason TypeScript allows to do not write `declare` keyword for ClassDeclaration
46 // if it already has `export` keyword - so we need to add it
47 if (ts.isClassDeclaration(statement) && /^class\b/.test(nodeText)) {
48 nodeText = "declare " + nodeText;
49 }
50 // add jsdoc for exported nodes only
51 if (shouldStatementHasExportKeyword) {
52 var start = statement.getStart();
53 var jsDocStart = statement.getStart(undefined, true);
54 var nodeJSDoc = statement.getSourceFile().getFullText().substring(jsDocStart, start).trim();
55 if (nodeJSDoc.length !== 0) {
56 nodeText = nodeJSDoc + "\n" + nodeText;
57 }
58 }
59 return spacesToTabs(nodeText);
60}
61function generateImport(libraryName, imports) {
62 // sort to make output more "stable"
63 return "import { " + imports.sort().join(', ') + " } from '" + libraryName + "';";
64}
65function generateReferenceTypesDirective(libraries) {
66 return libraries.sort().map(function (library) {
67 return "/// <reference types=\"" + library + "\" />";
68 }).join('\n');
69}
70function getTextAccordingExport(nodeText, isNodeExported, shouldNodeBeExported) {
71 if (shouldNodeBeExported && !isNodeExported) {
72 return 'export ' + nodeText;
73 }
74 else if (isNodeExported && !shouldNodeBeExported) {
75 return nodeText.slice('export '.length);
76 }
77 return nodeText;
78}
79function spacesToTabs(text) {
80 return text.replace(/^( )+/gm, function (substring) {
81 return '\t'.repeat(substring.length / 4);
82 });
83}