UNPKG

6.36 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.generateOutput = void 0;
4var ts = require("typescript");
5var typescript_1 = require("./helpers/typescript");
6var package_version_1 = require("./helpers/package-version");
7function generateOutput(params, options) {
8 if (options === void 0) { options = {}; }
9 var resultOutput = '';
10 if (!options.noBanner) {
11 resultOutput += "// Generated by dts-bundle-generator v" + package_version_1.packageVersion() + "\n\n";
12 }
13 if (params.typesReferences.size !== 0) {
14 var header = generateReferenceTypesDirective(Array.from(params.typesReferences));
15 resultOutput += header + "\n\n";
16 }
17 if (params.imports.size !== 0) {
18 // we need to have sorted imports of libraries to have more "stable" output
19 var sortedEntries = Array.from(params.imports.entries()).sort(function (firstEntry, secondEntry) {
20 return firstEntry[0].localeCompare(secondEntry[0]);
21 });
22 var importsArray = [];
23 for (var _i = 0, sortedEntries_1 = sortedEntries; _i < sortedEntries_1.length; _i++) {
24 var _a = sortedEntries_1[_i], libraryName = _a[0], libraryImports = _a[1];
25 importsArray.push.apply(importsArray, generateImports(libraryName, libraryImports));
26 }
27 if (importsArray.length !== 0) {
28 resultOutput += importsArray.join('\n') + "\n\n";
29 }
30 }
31 var statements = params.statements.map(function (statement) { return getStatementText(statement, params); });
32 if (options.sortStatements) {
33 statements.sort(compareStatementText);
34 }
35 resultOutput += statements.map(statementTextToString).join('\n');
36 if (params.renamedExports.length !== 0) {
37 resultOutput += "\n\nexport {\n\t" + params.renamedExports.sort().join(',\n\t') + ",\n};";
38 }
39 if (options.umdModuleName !== undefined) {
40 resultOutput += "\n\nexport as namespace " + options.umdModuleName + ";";
41 }
42 // this is used to prevent importing non-exported nodes
43 // see https://stackoverflow.com/questions/52583603/intentional-that-export-shuts-off-automatic-export-of-all-symbols-from-a-ty
44 resultOutput += "\n\nexport {};\n";
45 return resultOutput;
46}
47exports.generateOutput = generateOutput;
48function statementTextToString(s) {
49 if (s.leadingComment === undefined) {
50 return s.text;
51 }
52 return s.leadingComment + "\n" + s.text;
53}
54function compareStatementText(a, b) {
55 if (a.text > b.text) {
56 return 1;
57 }
58 else if (a.text < b.text) {
59 return -1;
60 }
61 return 0;
62}
63function needAddDeclareKeyword(statement, nodeText) {
64 // for some reason TypeScript allows to do not write `declare` keyword for ClassDeclaration, FunctionDeclaration and VariableDeclaration
65 // if it already has `export` keyword - so we need to add it
66 // to avoid TS1046: Top-level declarations in .d.ts files must start with either a 'declare' or 'export' modifier.
67 if (ts.isClassDeclaration(statement) && /^class\b/.test(nodeText)) {
68 return true;
69 }
70 if (ts.isFunctionDeclaration(statement) && /^function\b/.test(nodeText)) {
71 return true;
72 }
73 if (ts.isVariableStatement(statement) && /^(const|let|var)\b/.test(nodeText)) {
74 return true;
75 }
76 return false;
77}
78function getStatementText(statement, helpers) {
79 var shouldStatementHasExportKeyword = helpers.shouldStatementHasExportKeyword(statement);
80 var needStripDefaultKeyword = helpers.needStripDefaultKeywordForStatement(statement);
81 var hasStatementExportKeyword = ts.isExportAssignment(statement) || typescript_1.hasNodeModifier(statement, ts.SyntaxKind.ExportKeyword);
82 var nodeText = getTextAccordingExport(statement.getText(), hasStatementExportKeyword, shouldStatementHasExportKeyword);
83 if (ts.isEnumDeclaration(statement)
84 && typescript_1.hasNodeModifier(statement, ts.SyntaxKind.ConstKeyword)
85 && helpers.needStripConstFromConstEnum(statement)) {
86 nodeText = nodeText.replace(/\bconst\s/, '');
87 }
88 // strip the `default` keyword from node
89 if (typescript_1.hasNodeModifier(statement, ts.SyntaxKind.DefaultKeyword) && needStripDefaultKeyword) {
90 // we need just to remove `default` from any node except class node
91 // for classes we need to replace `default` with `declare` instead
92 nodeText = nodeText.replace(/\bdefault\s/, ts.isClassDeclaration(statement) ? 'declare ' : '');
93 }
94 if (needAddDeclareKeyword(statement, nodeText)) {
95 nodeText = "declare " + nodeText;
96 }
97 var result = {
98 text: spacesToTabs(nodeText),
99 };
100 // add jsdoc for exported nodes only
101 if (shouldStatementHasExportKeyword) {
102 var start = statement.getStart();
103 var jsDocStart = statement.getStart(undefined, true);
104 var nodeJSDoc = statement.getSourceFile().getFullText().substring(jsDocStart, start).trim();
105 if (nodeJSDoc.length !== 0) {
106 result.leadingComment = spacesToTabs(nodeJSDoc);
107 }
108 }
109 return result;
110}
111function generateImports(libraryName, imports) {
112 var fromEnding = "from '" + libraryName + "';";
113 var result = [];
114 // sort to make output more "stable"
115 Array.from(imports.starImports).sort().forEach(function (importName) { return result.push("import * as " + importName + " " + fromEnding); });
116 Array.from(imports.defaultImports).sort().forEach(function (importName) { return result.push("import " + importName + " " + fromEnding); });
117 if (imports.namedImports.size !== 0) {
118 result.push("import { " + Array.from(imports.namedImports).sort().join(', ') + " } " + fromEnding);
119 }
120 return result;
121}
122function generateReferenceTypesDirective(libraries) {
123 return libraries.sort().map(function (library) {
124 return "/// <reference types=\"" + library + "\" />";
125 }).join('\n');
126}
127function getTextAccordingExport(nodeText, isNodeExported, shouldNodeBeExported) {
128 if (shouldNodeBeExported && !isNodeExported) {
129 return 'export ' + nodeText;
130 }
131 else if (isNodeExported && !shouldNodeBeExported) {
132 return nodeText.slice('export '.length);
133 }
134 return nodeText;
135}
136function spacesToTabs(text) {
137 return text.replace(/^( )+/gm, function (substring) {
138 return '\t'.repeat(substring.length / 4);
139 });
140}