UNPKG

11.2 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.addOptionalInformation = exports.addComment = exports.buildTypeReferenceNode = exports.buildTupleTypeNode = exports.buildUnionTypeNode = exports.buildTypeLiteralNode = exports.buildIndexSignatureNode = exports.buildPropertySignature = exports.buildTypeAliasNode = exports.buildInterfaceNode = exports.buildNamespaceNode = exports.buildBooleanLiteralTypeNode = exports.buildNumericLiteralTypeNode = exports.buildStringLiteralTypeNode = exports.buildSimpleArrayNode = exports.buildStringKeyword = exports.buildUnknownKeyword = exports.buildNeverKeyword = exports.buildAnyKeyword = exports.buildKeyword = void 0;
4var tslib_1 = require("tslib");
5var ts = tslib_1.__importStar(require("typescript"));
6var config_1 = tslib_1.__importDefault(require("./config"));
7var validateIdentifier_1 = require("./validateIdentifier");
8function buildTypeNameIdentifier(name) {
9 return ts.createIdentifier(validateIdentifier_1.toValidIdentifier(name, config_1.default.target));
10}
11function buildPropertyNameIdentifier(name) {
12 if (/^\d/.test(name)) {
13 name = '$' + name;
14 }
15 if (validateIdentifier_1.checkInvalidCharacter(name, config_1.default.target)) {
16 return ts.createIdentifier(name);
17 }
18 else {
19 return ts.createStringLiteral(name);
20 }
21}
22function buildKeyword(kind) {
23 return ts.createKeywordTypeNode(kind);
24}
25exports.buildKeyword = buildKeyword;
26function buildAnyKeyword() {
27 return buildKeyword(ts.SyntaxKind.AnyKeyword);
28}
29exports.buildAnyKeyword = buildAnyKeyword;
30function buildNeverKeyword() {
31 return buildKeyword(ts.SyntaxKind.NeverKeyword);
32}
33exports.buildNeverKeyword = buildNeverKeyword;
34function buildUnknownKeyword() {
35 return buildKeyword(ts.SyntaxKind.UnknownKeyword);
36}
37exports.buildUnknownKeyword = buildUnknownKeyword;
38function buildStringKeyword() {
39 return buildKeyword(ts.SyntaxKind.StringKeyword);
40}
41exports.buildStringKeyword = buildStringKeyword;
42function buildSimpleArrayNode(element) {
43 return ts.createArrayTypeNode(element);
44}
45exports.buildSimpleArrayNode = buildSimpleArrayNode;
46function buildStringLiteralTypeNode(s) {
47 return ts.createLiteralTypeNode(ts.createStringLiteral(s));
48}
49exports.buildStringLiteralTypeNode = buildStringLiteralTypeNode;
50function buildNumericLiteralTypeNode(n) {
51 return ts.createLiteralTypeNode(ts.createNumericLiteral(n));
52}
53exports.buildNumericLiteralTypeNode = buildNumericLiteralTypeNode;
54function buildBooleanLiteralTypeNode(b) {
55 return ts.createLiteralTypeNode(b ? ts.createTrue() : ts.createFalse());
56}
57exports.buildBooleanLiteralTypeNode = buildBooleanLiteralTypeNode;
58function buildNamespaceNode(name, statements, root) {
59 var modifiers = root
60 ? [ts.createModifier(ts.SyntaxKind.DeclareKeyword)]
61 : undefined;
62 return ts.createModuleDeclaration(undefined, modifiers, buildTypeNameIdentifier(name), ts.createModuleBlock(statements), ts.NodeFlags.Namespace |
63 ts.NodeFlags.ExportContext |
64 ts.NodeFlags.ContextFlags);
65}
66exports.buildNamespaceNode = buildNamespaceNode;
67function buildInterfaceNode(id, members, root) {
68 var name = getLastTypeName(id);
69 var modifiers = root
70 ? [ts.createModifier(ts.SyntaxKind.DeclareKeyword)]
71 : [ts.createModifier(ts.SyntaxKind.ExportKeyword)];
72 return ts.createInterfaceDeclaration(undefined, modifiers, buildTypeNameIdentifier(name), undefined, undefined, members);
73}
74exports.buildInterfaceNode = buildInterfaceNode;
75function buildTypeAliasNode(id, type, root) {
76 var name = getLastTypeName(id);
77 var modifiers = root
78 ? [ts.createModifier(ts.SyntaxKind.DeclareKeyword)]
79 : [ts.createModifier(ts.SyntaxKind.ExportKeyword)];
80 return ts.createTypeAliasDeclaration(undefined, modifiers, buildTypeNameIdentifier(name), undefined, type);
81}
82exports.buildTypeAliasNode = buildTypeAliasNode;
83function buildPropertySignature(schema, propertyName, valueType, required, isPattern) {
84 var content = schema.content;
85 var modifiers = 'readOnly' in content && content.readOnly
86 ? [ts.createModifier(ts.SyntaxKind.ReadonlyKeyword)]
87 : undefined;
88 var questionToken = required == null || required.indexOf(propertyName) < 0
89 ? ts.createToken(ts.SyntaxKind.QuestionToken)
90 : undefined;
91 if (isPattern) {
92 return ts.createIndexSignature(undefined, modifiers, [
93 ts.createParameter([], [], undefined, ts.createIdentifier('pattern'), undefined, ts.createTypeReferenceNode('string', []), undefined),
94 ], valueType);
95 }
96 return ts.createPropertySignature(modifiers, buildPropertyNameIdentifier(propertyName), questionToken, valueType, undefined);
97}
98exports.buildPropertySignature = buildPropertySignature;
99function buildIndexSignatureNode(name, indexType, valueType) {
100 return ts.createIndexSignature(undefined, undefined, [
101 ts.createParameter(undefined, undefined, undefined, buildTypeNameIdentifier(name), undefined, indexType, undefined),
102 ], valueType);
103}
104exports.buildIndexSignatureNode = buildIndexSignatureNode;
105function buildTypeLiteralNode(elements) {
106 return ts.createTypeLiteralNode(elements);
107}
108exports.buildTypeLiteralNode = buildTypeLiteralNode;
109function buildUnionTypeNode(types, builder, terminate) {
110 var node = ts.createUnionTypeNode(types.map(builder));
111 if (terminate) {
112 return node;
113 }
114 return ts.createParenthesizedType(node);
115}
116exports.buildUnionTypeNode = buildUnionTypeNode;
117function buildTupleTypeNode(types, minItems, maxItems) {
118 var nodes = [];
119 var itemCount = maxItems != null ? maxItems : Math.max(types.length, minItems || 0);
120 for (var i = 0; i < itemCount; i++) {
121 var node = i < types.length ? types[i] : buildAnyKeyword();
122 if (minItems == null || i >= minItems) {
123 node = ts.createOptionalTypeNode(node);
124 }
125 nodes.push(node);
126 }
127 if (maxItems == null) {
128 nodes.push(ts.createRestTypeNode(ts.createArrayTypeNode(buildAnyKeyword())));
129 }
130 return ts.createTupleTypeNode(nodes);
131}
132exports.buildTupleTypeNode = buildTupleTypeNode;
133function buildTypeReferenceNode(schema, currentSchema) {
134 var typeName = getTypename(schema.id, currentSchema);
135 if (typeName.length === 0) {
136 throw new Error('TypeName array must not be empty.');
137 }
138 var node = buildTypeNameIdentifier(typeName[0]);
139 for (var i = 1; i < typeName.length; i++) {
140 node = ts.createQualifiedName(node, buildTypeNameIdentifier(typeName[i]));
141 }
142 return ts.createTypeReferenceNode(node, undefined);
143}
144exports.buildTypeReferenceNode = buildTypeReferenceNode;
145function getTypename(id, baseSchema) {
146 var e_1, _a;
147 var result = id.toNames();
148 var baseId = baseSchema.id;
149 if (baseId) {
150 var baseTypes = baseId.toNames().slice(0, -1);
151 try {
152 for (var baseTypes_1 = tslib_1.__values(baseTypes), baseTypes_1_1 = baseTypes_1.next(); !baseTypes_1_1.done; baseTypes_1_1 = baseTypes_1.next()) {
153 var type = baseTypes_1_1.value;
154 if (result.length === 1) {
155 break;
156 }
157 if (result[0] === type) {
158 result.shift();
159 }
160 else {
161 break;
162 }
163 }
164 }
165 catch (e_1_1) { e_1 = { error: e_1_1 }; }
166 finally {
167 try {
168 if (baseTypes_1_1 && !baseTypes_1_1.done && (_a = baseTypes_1.return)) _a.call(baseTypes_1);
169 }
170 finally { if (e_1) throw e_1.error; }
171 }
172 }
173 return result;
174}
175function addComment(node, schema, terminate) {
176 var e_2, _a;
177 var comments = getComment(schema);
178 if (comments.length === 0) {
179 return node;
180 }
181 else if (!terminate && comments.length === 1) {
182 return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, " " + comments[0] + " ", false);
183 }
184 else {
185 var result = '*\n';
186 try {
187 for (var comments_1 = tslib_1.__values(comments), comments_1_1 = comments_1.next(); !comments_1_1.done; comments_1_1 = comments_1.next()) {
188 var comment = comments_1_1.value;
189 result += ' * ' + comment + '\n';
190 }
191 }
192 catch (e_2_1) { e_2 = { error: e_2_1 }; }
193 finally {
194 try {
195 if (comments_1_1 && !comments_1_1.done && (_a = comments_1.return)) _a.call(comments_1);
196 }
197 finally { if (e_2) throw e_2.error; }
198 }
199 result += ' ';
200 return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, result, true);
201 }
202}
203exports.addComment = addComment;
204function getComment(schema) {
205 var e_3, _a;
206 var content = schema.content;
207 var comments = [];
208 function protectComment(str) {
209 return str.replace(/\*\//g, '*\u200B/');
210 }
211 function appendComment(value) {
212 if (value == null) {
213 return;
214 }
215 var s = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
216 var lines = s.split('\n').map(function (line) { return protectComment(line); });
217 comments = comments.concat.apply(comments, tslib_1.__spread(lines));
218 }
219 if ('$comment' in content) {
220 appendComment(content.$comment);
221 }
222 appendComment(content.title);
223 appendComment(content.description);
224 if ('example' in content || 'examples' in content) {
225 appendComment('example:');
226 if ('example' in content) {
227 appendComment(content.example);
228 }
229 if ('examples' in content) {
230 if (content.examples) {
231 try {
232 for (var _b = tslib_1.__values(content.examples), _c = _b.next(); !_c.done; _c = _b.next()) {
233 var e = _c.value;
234 appendComment(e);
235 }
236 }
237 catch (e_3_1) { e_3 = { error: e_3_1 }; }
238 finally {
239 try {
240 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
241 }
242 finally { if (e_3) throw e_3.error; }
243 }
244 }
245 }
246 }
247 return comments;
248}
249function addOptionalInformation(node, schema, terminate) {
250 var format = schema.content.format;
251 var pattern = schema.content.pattern;
252 if (!format && !pattern) {
253 return node;
254 }
255 var comment = '';
256 if (format) {
257 comment += ' ' + format;
258 }
259 if (pattern) {
260 comment += ' ' + pattern;
261 }
262 if (!terminate) {
263 comment += ' ';
264 }
265 var kind = terminate
266 ? ts.SyntaxKind.SingleLineCommentTrivia
267 : ts.SyntaxKind.MultiLineCommentTrivia;
268 return ts.addSyntheticTrailingComment(node, kind, comment, false);
269}
270exports.addOptionalInformation = addOptionalInformation;
271function getLastTypeName(id) {
272 var names = id.toNames();
273 if (names.length > 0) {
274 return names[names.length - 1];
275 }
276 else {
277 return '';
278 }
279}
280//# sourceMappingURL=astBuilder.js.map
\No newline at end of file