@iviva/react-tsdoc 0.1.8 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +217 -26
  2. package/bin/react-tsdoc.js +1 -1
  3. package/dist/cli/index.d.ts +1 -0
  4. package/dist/cli/index.js +38 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/core/analyzer.d.ts +18 -0
  7. package/dist/core/analyzer.js +574 -0
  8. package/dist/core/analyzer.js.map +1 -0
  9. package/dist/core/parser.d.ts +4 -0
  10. package/dist/core/parser.js +73 -0
  11. package/dist/core/parser.js.map +1 -0
  12. package/dist/core/types.d.ts +134 -0
  13. package/dist/core/types.js +10 -0
  14. package/dist/core/types.js.map +1 -0
  15. package/dist/generators/docs/component.d.ts +7 -0
  16. package/dist/generators/docs/component.js +87 -0
  17. package/dist/generators/docs/component.js.map +1 -0
  18. package/dist/generators/docs/function.d.ts +2 -0
  19. package/dist/generators/docs/function.js +38 -0
  20. package/dist/generators/docs/function.js.map +1 -0
  21. package/dist/generators/docs/hook.d.ts +2 -0
  22. package/dist/generators/docs/hook.js +36 -0
  23. package/dist/generators/docs/hook.js.map +1 -0
  24. package/dist/generators/docs/type.d.ts +2 -0
  25. package/dist/generators/docs/type.js +61 -0
  26. package/dist/generators/docs/type.js.map +1 -0
  27. package/dist/generators/markdown.d.ts +8 -0
  28. package/dist/generators/markdown.js +44 -0
  29. package/dist/generators/markdown.js.map +1 -0
  30. package/dist/generators/types/module.d.ts +4 -0
  31. package/dist/generators/types/module.js +242 -0
  32. package/dist/generators/types/module.js.map +1 -0
  33. package/dist/index.d.ts +4 -1
  34. package/dist/index.js +116 -603
  35. package/dist/index.js.map +1 -1
  36. package/dist/utils/file.d.ts +3 -0
  37. package/dist/utils/file.js +45 -0
  38. package/dist/utils/file.js.map +1 -0
  39. package/dist/utils/logger.d.ts +5 -0
  40. package/dist/utils/logger.js +28 -0
  41. package/dist/utils/logger.js.map +1 -0
  42. package/dist/utils/type-helpers.d.ts +13 -0
  43. package/dist/utils/type-helpers.js +160 -0
  44. package/dist/utils/type-helpers.js.map +1 -0
  45. package/package.json +28 -18
  46. package/.github/workflows/npm-publish.yml +0 -37
  47. package/clap.d.ts +0 -1
  48. package/package-lock.json +0 -104
  49. package/src/index.ts +0 -812
  50. package/tsconfig.json +0 -15
package/dist/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -14,628 +18,137 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
14
18
  var __importStar = (this && this.__importStar) || function (mod) {
15
19
  if (mod && mod.__esModule) return mod;
16
20
  var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
22
  __setModuleDefault(result, mod);
19
23
  return result;
20
24
  };
21
- var __importDefault = (this && this.__importDefault) || function (mod) {
22
- return (mod && mod.__esModule) ? mod : { "default": mod };
23
- };
24
25
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.main = void 0;
26
- const tsdoc = __importStar(require("@microsoft/tsdoc"));
27
- const fs = __importStar(require("fs"));
26
+ exports.generateTypeDefinition = exports.generateDocs = exports.load = void 0;
28
27
  const ts = __importStar(require("typescript"));
29
- const chalk_1 = __importDefault(require("chalk"));
30
- const clap_1 = __importDefault(require("clap"));
31
- const mkdirp_1 = __importDefault(require("mkdirp"));
32
- var ComponentFlags;
33
- (function (ComponentFlags) {
34
- ComponentFlags[ComponentFlags["None"] = 0] = "None";
35
- ComponentFlags[ComponentFlags["Export"] = 1] = "Export";
36
- ComponentFlags[ComponentFlags["Hook"] = 2] = "Hook";
37
- })(ComponentFlags || (ComponentFlags = {}));
38
- function logCompilerMessage(message) {
39
- console.error(chalk_1.default.gray(`[TypeScript] ${message}`));
40
- }
41
- function logDebug(...objects) {
42
- console.log(chalk_1.default.gray(...objects));
43
- }
44
- function logInfo(...objects) {
45
- console.log(chalk_1.default.green(...objects));
46
- }
47
- function logWarning(...objects) {
48
- console.log(chalk_1.default.redBright(...objects));
49
- }
50
- function logError(...objects) {
51
- console.log(chalk_1.default.redBright(...objects));
52
- }
53
- function indentCode(code, chars) {
54
- let lines = code.split('\n').map(line => line.trimRight());
55
- return lines.map(line => chars + line).join('\n');
56
- }
57
- class MarkdownBuilder {
58
- constructor() {
59
- this.code = "";
60
- }
61
- addTitle(title, level) {
62
- let headerChar = '#';
63
- let prefix = '';
64
- for (let i = 0; i < level; i++) {
65
- prefix += headerChar;
66
- }
67
- this.code += prefix + ' ' + title + '\n\n';
68
- }
69
- addParagraph(p) {
70
- this.code += '\n\n' + p + '\n\n';
71
- }
72
- addCode(code) {
73
- code = code.trim();
74
- if (code.startsWith('```')) {
75
- code = code.substring(3);
76
- }
77
- if (code.endsWith('```')) {
78
- code = code.substring(0, code.length - 3);
79
- }
80
- this.code += '\n\n```tsx\n' + code.trim() + '\n```\n\n';
81
- }
82
- addTable(table) {
83
- const tableFormat = (s) => {
84
- return s.replace(/\s+/g, ' ').replace(/\|/g, '\\|');
85
- };
86
- if (table.length == 0) {
87
- this.code += '\n\n';
88
- return;
89
- }
90
- let headers = Object.keys(table[0]);
91
- this.code += '|' + (headers.map(tableFormat)).join('|') + '|\n';
92
- this.code += '|' + (headers.map(h => '-')).join('|') + '|\n';
93
- for (let i in table) {
94
- let row = table[i];
95
- this.code += '|' + (headers.map(h => tableFormat(row[h]))).join('|') + '|\n';
96
- }
97
- this.code += '\n\n';
98
- }
99
- toString() {
100
- return this.code;
101
- }
102
- }
103
- function extractActualContentFromDocMess(node) {
104
- if (!node) {
105
- return "";
106
- }
107
- let result = "";
108
- if (node instanceof tsdoc.DocExcerpt) {
109
- result += node.content.toString();
110
- }
111
- for (const childNode of node.getChildNodes()) {
112
- result += extractActualContentFromDocMess(childNode);
113
- }
114
- return result;
115
- }
116
- function parseTSDocComment(comment) {
117
- let config = new tsdoc.TSDocConfiguration();
118
- config.addTagDefinition(new tsdoc.TSDocTagDefinition({
119
- tagName: '@export',
120
- syntaxKind: tsdoc.TSDocTagSyntaxKind.ModifierTag,
121
- allowMultiple: false
122
- }));
123
- config.addTagDefinition(new tsdoc.TSDocTagDefinition({
124
- tagName: '@hook',
125
- syntaxKind: tsdoc.TSDocTagSyntaxKind.ModifierTag,
126
- allowMultiple: false
127
- }));
128
- let parser = new tsdoc.TSDocParser(config);
129
- let ctx = parser.parseString(comment);
130
- let summary = extractActualContentFromDocMess(ctx.docComment.summarySection);
131
- let examples = [];
132
- let props = ComponentFlags.None;
133
- for (const block of ctx.docComment.customBlocks) {
134
- if (block.blockTag.tagName == '@example') {
135
- let example = { summary: extractActualContentFromDocMess(block.content) };
136
- examples.push(example);
137
- }
138
- }
139
- let flags = ComponentFlags.None;
140
- if (ctx.docComment.modifierTagSet.hasTagName('@export')) {
141
- flags = flags | ComponentFlags.Export;
142
- }
143
- if (ctx.docComment.modifierTagSet.hasTagName('@hook')) {
144
- flags = flags | ComponentFlags.Hook;
145
- }
146
- return [summary, examples, flags];
147
- }
148
- function generatePropDocs(inf) {
149
- let results = [];
150
- for (let i in inf.members) {
151
- let prop = inf.members[i];
152
- let propDoc = { examples: [], name: prop.name, summary: '', type: prop.type };
153
- [propDoc.summary, propDoc.examples] = parseTSDocComment(prop.comment);
154
- results.push(propDoc);
155
- }
156
- return results;
157
- }
158
- function generateHookTypeDefinition(hook) {
159
- return `export const ${hook.name}:${hook.type};`;
160
- }
161
- function generateComponentTypeDefinition(c, interfaces) {
162
- let code = "";
163
- let type = c.type || 'functional';
164
- let inf = interfaces[c.propType];
165
- if (inf) {
166
- code += inf.comment + '\n';
167
- code += inf.code + '\n';
168
- }
169
- if (c.stateType) {
170
- let stateInf = interfaces[c.stateType];
171
- if (stateInf) {
172
- code += stateInf.comment + '\n';
173
- code += stateInf.code + '\n';
174
- }
175
- }
176
- if (c.refType) {
177
- let refInf = interfaces[c.refType];
178
- if (refInf) {
179
- code += refInf.comment + '\n';
180
- code += refInf.code + '\n';
181
- }
182
- }
183
- code += c.comment + '\n';
184
- switch (type) {
185
- case 'functional':
186
- code += `export const ${c.name} : React.FunctionComponent<${c.propType}>;\n`;
187
- break;
188
- case 'class':
189
- code += `export class ${c.name} extends React.Component<${c.propType}, ${c.stateType || 'any'}> {}\n`;
190
- break;
191
- case 'forwardRef':
192
- code += `export const ${c.name}:React.ForwardRefExoticComponent<${c.propType} & React.RefAttributes<${c.refType || 'any'}>>;\n`;
193
- break;
194
- }
195
- return code;
196
- }
197
- function fillRelatedTypes(t, types, docInfo) {
198
- if (docInfo.interfaces[t]) {
199
- types[t] = 1;
200
- let inf = docInfo.interfaces[t];
201
- for (let m of inf.members) {
202
- fillRelatedTypes(m.comment, types, docInfo);
203
- }
204
- return;
205
- }
206
- if (docInfo.unions[t]) {
207
- types[t] = 1;
208
- return;
209
- }
210
- if (docInfo.functions[t]) {
211
- let f = docInfo.functions[t];
212
- types[t] = 1;
213
- fillRelatedTypes(f.return, types, docInfo);
214
- for (let p of f.parameters) {
215
- let pt = p.type;
216
- fillRelatedTypes(pt, types, docInfo);
217
- }
218
- }
219
- }
220
- function generateDocObject(docInfo) {
221
- let components = [];
222
- //let typesToExport:any = {};
223
- for (let cn in docInfo.components) {
224
- let componentDoc = { examples: [], name: cn, props: [], summary: '', flags: ComponentFlags.None };
225
- let componentInfo = docInfo.components[cn];
226
- [componentDoc.summary, componentDoc.examples, componentDoc.flags] = parseTSDocComment(componentInfo.comment);
227
- let propType = docInfo.interfaces[componentInfo.propType];
228
- if (!!propType) {
229
- componentDoc.props = generatePropDocs(propType);
230
- }
231
- //typesToExport[componentInfo.propType] = 1;
232
- components.push(componentDoc);
233
- }
234
- let hooks = [];
235
- for (let hi in docInfo.hooks) {
236
- let hook = docInfo.hooks[hi];
237
- let hookDoc = { name: hook.name, flags: ComponentFlags.None, summary: '', examples: [] };
238
- [hookDoc.summary, hookDoc.examples, hookDoc.flags] = parseTSDocComment(hook.comment);
239
- let propType = docInfo.functions[hook.type];
240
- // if (!!propType) {
241
- // typesToExport[hook.type] = 1;
242
- // }
243
- hooks.push(hookDoc);
244
- }
245
- //console.log(typesToExport);
246
- // for(let k of Object.keys(typesToExport)) {
247
- // fillRelatedTypes(k,typesToExport,docInfo);
248
- // }
249
- let types = [];
250
- for (let k of Object.keys(docInfo.interfaces)) {
251
- let inf = docInfo.interfaces[k];
252
- let typeDoc = { examples: [], name: inf.name, summary: '', type: 'interface', code: '', flags: ComponentFlags.None };
253
- typeDoc.code = inf.code;
254
- [typeDoc.summary, typeDoc.examples, typeDoc.flags] = parseTSDocComment(inf.comment);
255
- types.push(typeDoc);
256
- }
257
- for (let k of Object.keys(docInfo.functions)) {
258
- let inf = docInfo.functions[k];
259
- let typeDoc = { examples: [], name: k, summary: '', type: 'function', code: '', flags: ComponentFlags.None };
260
- typeDoc.code = inf.code;
261
- [typeDoc.summary, typeDoc.examples, typeDoc.flags] = parseTSDocComment(inf.comment);
262
- types.push(typeDoc);
263
- }
264
- for (let k of Object.keys(docInfo.unions)) {
265
- let inf = docInfo.unions[k];
266
- let typeDoc = { examples: [], name: k, summary: '', type: 'union', code: '', flags: ComponentFlags.None };
267
- typeDoc.code = inf.code;
268
- [typeDoc.summary, typeDoc.examples, typeDoc.flags] = parseTSDocComment(inf.comment);
269
- types.push(typeDoc);
270
- }
271
- return { components, hooks, types };
272
- }
273
- function extractComment(node) {
274
- let fullText = node.getSourceFile().getFullText();
275
- let comments = ts.getLeadingCommentRanges(fullText, node.pos);
276
- if (!comments)
277
- return '';
278
- return comments.map(c => fullText.slice(c.pos, c.end)).join('\n');
279
- }
280
- function getCode(node) {
281
- return node.getSourceFile().getFullText().substring(node.getStart(), node.getEnd());
282
- }
283
- function parseFunctionSignature(node, docInfo) {
284
- }
285
- function parseInterfaceDeclaration(node, docInfo) {
286
- let name = node.name.getText();
287
- let members = node.members;
288
- if (members.length == 1 && members[0].kind == ts.SyntaxKind.CallSignature) {
289
- return parseFunctionSignature(members[0], docInfo);
290
- }
291
- let docs = extractComment(node);
292
- let inf = { comment: docs, members: [], name: name, code: getCode(node) };
293
- for (let i = 0; i < members.length; i++) {
294
- let member = members[i];
295
- let name = member.name.getText();
296
- let type = member.type.getText();
297
- let mdoc = extractComment(member);
298
- inf.members.push({ comment: mdoc, name: name, type: type });
299
- }
300
- docInfo.interfaces[name] = inf;
301
- }
302
- function parseVariableDeclaration(node, docInfo) {
303
- var _a, _b, _c, _d, _e, _f;
304
- let type = (_b = (_a = node.type) === null || _a === void 0 ? void 0 : _a.typeName) === null || _b === void 0 ? void 0 : _b.getText();
305
- if (((_d = (_c = node) === null || _c === void 0 ? void 0 : _c.type) === null || _d === void 0 ? void 0 : _d.kind) == ts.SyntaxKind.CallSignature ||
306
- ((_f = (_e = node) === null || _e === void 0 ? void 0 : _e.type) === null || _f === void 0 ? void 0 : _f.kind) == ts.SyntaxKind.FunctionType) {
307
- console.log('dug');
308
- }
309
- if (!type) {
310
- return;
311
- }
312
- let name = node.name.getText();
313
- if (type == 'React.FunctionComponent') {
314
- let propType = node.type.typeArguments[0].getText();
315
- let comment = extractComment(node.parent);
316
- docInfo.components[name] = { comment, propType, name, type: 'functional' };
317
- return;
318
- }
319
- if (type == 'React.ForwardRefExoticComponent') {
320
- let cType = node.type.typeArguments[0].getText();
321
- // get prop type and ref type
322
- // assume
323
- // - props defined as following format <PropType & RefType>
324
- // - RefType always starts with `React.RefAttributes`
325
- let parts = cType.split("&", 2).map(p => p.trim());
326
- let propType = parts[0];
327
- let refType = parts[1];
328
- if (parts[0].startsWith('React.RefAttributes')) {
329
- propType = parts[1];
330
- refType = parts[0];
331
- }
332
- refType = refType
333
- .replace('React.RefAttributes<', '')
334
- .replace(">", '')
335
- .trim();
336
- let comment = extractComment(node.parent);
337
- docInfo.components[name] = { comment, propType, refType, name, type: 'forwardRef' };
338
- return;
339
- }
340
- if (name.startsWith('use')) {
341
- let comment = extractComment(node.parent);
342
- let parameters = [];
343
- docInfo.hooks[name] = { name, type, parameters, comment };
344
- }
345
- }
346
- function parseClassDeclaration(node, docInfo) {
347
- var _a, _b;
348
- let className = (_b = (_a = node) === null || _a === void 0 ? void 0 : _a.heritageClauses[0]) === null || _b === void 0 ? void 0 : _b.types[0].expression.getText();
349
- if (className == 'React.Component') {
350
- let propType = node.heritageClauses[0].types[0].typeArguments[0].getText();
351
- let stateType = node.heritageClauses[0].types[0].typeArguments[1].getText();
352
- let comment = extractComment(node);
353
- let name = node.name.getText();
354
- docInfo.components[name] = { comment, propType, name, stateType, type: 'class' };
355
- }
356
- }
357
- function parseTypeAlias(node, docInfo) {
358
- let name = node.name.getText();
359
- let type = node.type;
360
- if (type.kind == ts.SyntaxKind.FunctionType) {
361
- let returnType = type.getText();
362
- let parameters = type.parameters;
363
- let comment = extractComment(node);
364
- let code = getCode(node);
365
- let f = { parameters: [], return: returnType, comment, code };
366
- for (let p = 0; p < parameters.length; p++) {
367
- let parameter = parameters[p];
368
- let fp = { name: parameter.name.getText(), type: parameter.type.getText() };
369
- f.parameters.push(fp);
370
- }
371
- docInfo.functions[name] = f;
372
- return;
373
- }
374
- if (type.kind == ts.SyntaxKind.UnionType) {
375
- let types = type.types;
376
- let comment = extractComment(node);
377
- let code = getCode(node);
378
- let u = { items: [], comment, code };
379
- for (let p = 0; p < types.length; p++) {
380
- let txt = types[p].getText();
381
- u.items.push(txt);
382
- }
383
- docInfo.unions[name] = u;
384
- }
385
- }
386
- function walkTree(node, docInfo) {
387
- switch (node.kind) {
388
- case ts.SyntaxKind.TypeAliasDeclaration:
389
- parseTypeAlias(node, docInfo);
390
- break;
391
- case ts.SyntaxKind.InterfaceDeclaration:
392
- parseInterfaceDeclaration(node, docInfo);
393
- break;
394
- case ts.SyntaxKind.VariableDeclaration:
395
- parseVariableDeclaration(node, docInfo);
396
- break;
397
- case ts.SyntaxKind.ClassDeclaration:
398
- parseClassDeclaration(node, docInfo);
399
- break;
400
- case ts.SyntaxKind.FunctionDeclaration:
401
- case 242:
402
- parseVariableDeclaration(node, docInfo);
403
- break;
404
- }
405
- node.forEachChild((child) => walkTree(child, docInfo));
406
- }
407
- function validateProgram(program) {
408
- const compilerDiagnostics = program.getSemanticDiagnostics();
409
- if (compilerDiagnostics.length > 0) {
410
- for (const diagnostic of compilerDiagnostics) {
411
- const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
412
- if (diagnostic.file) {
413
- const location = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
414
- const formattedMessage = `${diagnostic.file.fileName}(${location.line + 1},${location.character + 1}):`
415
- + `${message}`;
416
- logCompilerMessage(formattedMessage);
417
- }
418
- else {
419
- logCompilerMessage(message);
420
- }
421
- }
422
- }
423
- else {
424
- logCompilerMessage('No compiler errors or warnings.');
425
- }
426
- }
427
- function getSources(program) {
428
- return program.getSourceFiles().filter(f => {
429
- return f.fileName.indexOf('node_modules') < 0;
430
- }).map(f => f.fileName);
431
- }
432
- function generateExportModule(docs, docInfo, options) {
433
- let code = '';
434
- if (options === null || options === void 0 ? void 0 : options.moduleName) {
435
- code += `declare module "${options.moduleName}" {\n`;
436
- }
437
- for (let i in docs.types) {
438
- let obj = docs.types[i];
439
- let comment = '';
440
- if (docInfo.interfaces[obj.name]) {
441
- comment = docInfo.interfaces[obj.name].comment;
442
- }
443
- if (docInfo.functions[obj.name]) {
444
- comment = docInfo.functions[obj.name].comment;
445
- }
446
- if (docInfo.unions[obj.name]) {
447
- comment = docInfo.unions[obj.name].comment;
448
- }
449
- if (ComponentFlags.Export === (obj.flags & ComponentFlags.Export)) {
450
- code += indentCode('\n' + comment + '\n' + 'export ' + obj.code + '\n', ' ');
451
- }
452
- }
453
- for (let i in docs.components) {
454
- let doc = docs.components[i];
455
- if (ComponentFlags.Export === (doc.flags & ComponentFlags.Export)) {
456
- let component = docInfo.components[doc.name];
457
- let componentCode = generateComponentTypeDefinition(component, docInfo.interfaces);
458
- code += indentCode(componentCode, ' ');
459
- }
460
- }
461
- for (let i in docs.hooks) {
462
- let doc = docs.hooks[i];
463
- if (ComponentFlags.Export === (doc.flags & ComponentFlags.Export)) {
464
- let hook = docInfo.hooks[doc.name];
465
- let hookCode = generateHookTypeDefinition(hook);
466
- code += indentCode(hookCode, ' ');
467
- }
468
- }
469
- code += "\n}\n";
470
- return code;
471
- }
28
+ const analyzer_1 = require("./core/analyzer");
29
+ const component_1 = require("./generators/docs/component");
30
+ const hook_1 = require("./generators/docs/hook");
31
+ const type_1 = require("./generators/docs/type");
32
+ const function_1 = require("./generators/docs/function");
33
+ const module_1 = require("./generators/types/module");
34
+ const file_1 = require("./utils/file");
35
+ const logger_1 = require("./utils/logger");
36
+ const type_helpers_1 = require("./utils/type-helpers");
472
37
  function load(root) {
473
- let options = {
38
+ const options = {
474
39
  jsx: ts.JsxEmit.React,
40
+ target: ts.ScriptTarget.ESNext,
41
+ module: ts.ModuleKind.CommonJS,
42
+ strict: true,
43
+ skipLibCheck: true,
475
44
  };
476
- logDebug('Loading', root);
477
- logDebug('Loading', root);
478
- let program = ts.createProgram([root], options);
479
- logDebug('Compiled');
480
- validateProgram(program);
481
- logDebug('Validated');
482
- let sources = getSources(program);
483
- let docInfo = { interfaces: {}, components: {}, hooks: {}, functions: {}, unions: {} };
484
- for (var i = 0; i < sources.length; i++) {
485
- let source = sources[i];
486
- logDebug('Loading', source);
487
- let sourceNode = program.getSourceFile(source);
488
- if (!sourceNode) {
45
+ (0, logger_1.logDebug)('Loading', root);
46
+ const program = ts.createProgram([root], options);
47
+ (0, logger_1.logDebug)('Compiled');
48
+ const checker = program.getTypeChecker();
49
+ (0, analyzer_1.validateProgram)(program);
50
+ (0, logger_1.logDebug)('Validated');
51
+ const sources = (0, analyzer_1.getSources)(program);
52
+ const docInfo = { interfaces: {}, components: {}, hooks: {}, functions: {}, unions: {}, enums: {}, typeAliases: {} };
53
+ for (const source of sources) {
54
+ (0, logger_1.logDebug)('Loading', source);
55
+ const sourceNode = program.getSourceFile(source);
56
+ if (!sourceNode)
489
57
  continue;
490
- }
491
58
  try {
492
- walkTree(sourceNode, docInfo);
59
+ (0, analyzer_1.walkTree)(sourceNode, docInfo, checker);
493
60
  }
494
61
  catch (error) {
495
- logError(`Error in ${source}: ${error}`);
62
+ (0, logger_1.logError)(`Error in ${source}: ${error}`);
496
63
  }
497
64
  }
498
- let docs = generateDocObject(docInfo);
499
- return [docInfo, docs];
500
- /*
501
- for(let i in docInfo.components) {
502
- let c = docInfo.components[i];
503
- let inf = docInfo.interfaces[c.propType];
504
- if (!!inf) {
505
- console.log(inf.comment);
506
- console.log(inf.code);
507
- }
508
- console.log(c.comment);
509
- console.log(`export const ${c.name} : React.FunctionComponent<${c.propType}>;`)
510
- }*/
511
- }
512
- function generateHookDoc(cdoc, docs) {
513
- let md = new MarkdownBuilder();
514
- md.addTitle(cdoc.name, 1);
515
- md.addParagraph(cdoc.summary);
516
- md.addTitle('Installation', 2);
517
- md.addCode(`import {${cdoc.name}} from 'uxp/components';`);
518
- if (cdoc.examples.length > 0) {
519
- md.addTitle('Examples', 2);
520
- for (let i in cdoc.examples) {
521
- md.addCode(cdoc.examples[i].summary);
522
- }
523
- }
524
- return md.toString();
525
- }
526
- function generateTypeDoc(cdoc, docs) {
527
- let md = new MarkdownBuilder();
528
- md.addTitle(cdoc.name, 1);
529
- md.addParagraph(cdoc.summary);
530
- md.addCode(cdoc.code);
531
- md.addTitle('Usage', 2);
532
- md.addCode(`import {${cdoc.name}} from 'uxp/components';`);
533
- if (cdoc.examples.length > 0) {
534
- md.addTitle('Examples', 2);
535
- for (let i in cdoc.examples) {
536
- md.addCode(cdoc.examples[i].summary);
537
- }
538
- }
539
- return md.toString();
540
- }
541
- function linkedType(t, docs) {
542
- if (docs.types.find(x => x.name.toUpperCase() == t.toUpperCase())) {
543
- return `[${t}](../types/${t}.md)`;
544
- }
545
- return t;
65
+ return docInfo;
546
66
  }
547
- function generateComponentDoc(cdoc, docs) {
548
- let md = new MarkdownBuilder();
549
- md.addTitle(cdoc.name, 1);
550
- md.addParagraph(cdoc.summary);
551
- md.addTitle('Installation', 2);
552
- md.addCode(`import {${cdoc.name}} from 'uxp/components';`);
553
- if (cdoc.examples.length > 0) {
554
- md.addTitle('Examples', 2);
555
- for (let i in cdoc.examples) {
556
- md.addCode(cdoc.examples[i].summary);
557
- }
558
- }
559
- if (cdoc.props.length > 0) {
560
- md.addTitle('Properties', 2);
561
- md.addTable(cdoc.props.map(p => ({ Name: p.name, Type: linkedType(p.type, docs), Description: p.summary })));
562
- for (let i in cdoc.props) {
563
- let prop = cdoc.props[i];
564
- md.addTitle(prop.name, 3);
565
- md.addParagraph('---');
566
- md.addParagraph(prop.summary);
567
- md.addTable([{ 'type': linkedType(prop.type, docs) }]);
568
- for (let j in prop.examples) {
569
- md.addCode(prop.examples[j].summary);
570
- }
571
- }
572
- }
573
- return md.toString();
574
- }
575
- function generateDocs(root, outputPath) {
576
- let [docInfo, docs] = load(root);
577
- let components = docs.components;
67
+ exports.load = load;
68
+ function generateDocs(root, outputPath, moduleName) {
69
+ var _a, _b, _c, _d, _e;
70
+ const docInfo = load(root);
578
71
  if (outputPath.endsWith('/'))
579
72
  outputPath = outputPath.substring(0, outputPath.length - 1);
580
- mkdirp_1.default.sync(outputPath + '/components/');
581
- mkdirp_1.default.sync(outputPath + '/types/');
582
- mkdirp_1.default.sync(outputPath + '/hooks/');
583
- for (let i in components) {
584
- let component = components[i];
585
- if (ComponentFlags.Export === (component.flags & ComponentFlags.Export)) {
586
- let md = generateComponentDoc(component, docs);
587
- let path = outputPath + '/components/' + component.name + '.md';
588
- console.log(chalk_1.default.gray('Writing component', component.name, 'to', path));
589
- fs.writeFileSync(path, md.toString());
590
- }
591
- }
592
- for (let i in docs.types) {
593
- let type = docs.types[i];
594
- if (ComponentFlags.Export === (type.flags & ComponentFlags.Export)) {
595
- let md = generateTypeDoc(type, docs);
596
- let path = outputPath + '/types/' + type.name + '.md';
597
- console.log(chalk_1.default.gray('Writing type', type.name, 'to', path));
598
- fs.writeFileSync(path, md.toString());
599
- }
600
- }
601
- for (let i in docs.hooks) {
602
- let hook = docs.hooks[i];
603
- if (ComponentFlags.Export === (hook.flags & ComponentFlags.Export)) {
604
- let md = generateHookDoc(hook, docs);
605
- let path = outputPath + '/hooks/' + hook.name + '.md';
606
- console.log(chalk_1.default.gray('Writing hook', hook.name, 'to', path));
607
- fs.writeFileSync(path, md.toString());
73
+ (0, file_1.createDirectories)([
74
+ `${outputPath}/components`,
75
+ `${outputPath}/types`,
76
+ `${outputPath}/hooks`,
77
+ `${outputPath}/functions`
78
+ ]);
79
+ const dependentTypes = (0, module_1.collectAllDependentTypes)(docInfo);
80
+ for (const cn in docInfo.components) {
81
+ const componentInfo = docInfo.components[cn];
82
+ if ((0, type_helpers_1.hasExportAnnotation)(componentInfo.comment)) {
83
+ const md = (0, component_1.generateComponentDocFromDocInfo)(componentInfo, docInfo, moduleName, dependentTypes);
84
+ const path = `${outputPath}/components/${componentInfo.name}.md`;
85
+ (0, logger_1.logDebug)('Writing component', componentInfo.name, 'to', path);
86
+ (0, file_1.writeFile)(path, md);
87
+ }
88
+ }
89
+ for (const typeName of dependentTypes) {
90
+ if ((_a = docInfo.interfaces) === null || _a === void 0 ? void 0 : _a[typeName]) {
91
+ const typeInfo = docInfo.interfaces[typeName];
92
+ const md = (0, type_1.generateTypeDocFromDocInfo)(typeInfo, 'interface', docInfo, moduleName, dependentTypes);
93
+ const path = `${outputPath}/types/${typeInfo.name}.md`;
94
+ (0, logger_1.logDebug)('Writing type', typeInfo.name, 'to', path);
95
+ (0, file_1.writeFile)(path, md);
96
+ }
97
+ else if ((_b = docInfo.unions) === null || _b === void 0 ? void 0 : _b[typeName]) {
98
+ const typeInfo = docInfo.unions[typeName];
99
+ const md = (0, type_1.generateTypeDocFromDocInfo)(typeInfo, 'union', docInfo, moduleName, dependentTypes);
100
+ const path = `${outputPath}/types/${typeName}.md`;
101
+ (0, logger_1.logDebug)('Writing type', typeName, 'to', path);
102
+ (0, file_1.writeFile)(path, md);
103
+ }
104
+ else if ((_c = docInfo.enums) === null || _c === void 0 ? void 0 : _c[typeName]) {
105
+ const typeInfo = docInfo.enums[typeName];
106
+ const md = (0, type_1.generateTypeDocFromDocInfo)(typeInfo, 'enum', docInfo, moduleName, dependentTypes);
107
+ const path = `${outputPath}/types/${typeInfo.name}.md`;
108
+ (0, logger_1.logDebug)('Writing type', typeInfo.name, 'to', path);
109
+ (0, file_1.writeFile)(path, md);
110
+ }
111
+ else if ((_d = docInfo.typeAliases) === null || _d === void 0 ? void 0 : _d[typeName]) {
112
+ const typeInfo = docInfo.typeAliases[typeName];
113
+ const md = (0, type_1.generateTypeDocFromDocInfo)(typeInfo, 'type', docInfo, moduleName, dependentTypes);
114
+ const path = `${outputPath}/types/${typeInfo.name}.md`;
115
+ (0, logger_1.logDebug)('Writing type', typeInfo.name, 'to', path);
116
+ (0, file_1.writeFile)(path, md);
117
+ }
118
+ else if ((_e = docInfo.functions) === null || _e === void 0 ? void 0 : _e[typeName]) {
119
+ const typeInfo = docInfo.functions[typeName];
120
+ const md = (0, function_1.generateFunctionDocFromDocInfo)(typeInfo, docInfo, moduleName, dependentTypes);
121
+ const path = `${outputPath}/types/${typeName}.md`;
122
+ (0, logger_1.logDebug)('Writing function type', typeName, 'to', path);
123
+ (0, file_1.writeFile)(path, md);
124
+ }
125
+ }
126
+ for (const hn in docInfo.hooks) {
127
+ const hookInfo = docInfo.hooks[hn];
128
+ if ((0, type_helpers_1.hasExportAnnotation)(hookInfo.comment)) {
129
+ const md = (0, hook_1.generateHookDocFromDocInfo)(hookInfo, docInfo, moduleName, dependentTypes);
130
+ const path = `${outputPath}/hooks/${hookInfo.name}.md`;
131
+ (0, logger_1.logDebug)('Writing hook', hookInfo.name, 'to', path);
132
+ (0, file_1.writeFile)(path, md);
133
+ }
134
+ }
135
+ for (const fn in docInfo.functions) {
136
+ if (!dependentTypes.has(fn)) {
137
+ const functionInfo = docInfo.functions[fn];
138
+ if ((0, type_helpers_1.hasExportAnnotation)(functionInfo.comment)) {
139
+ const md = (0, function_1.generateFunctionDocFromDocInfo)(functionInfo, docInfo, moduleName, dependentTypes);
140
+ const path = `${outputPath}/functions/${fn}.md`;
141
+ (0, logger_1.logDebug)('Writing function', fn, 'to', path);
142
+ (0, file_1.writeFile)(path, md);
143
+ }
608
144
  }
609
145
  }
610
146
  }
147
+ exports.generateDocs = generateDocs;
611
148
  function generateTypeDefinition(root, outputPath, moduleName) {
612
- let [docInfo, docs] = load(root);
613
- let moduleCode = generateExportModule(docs, docInfo, { moduleName: moduleName || 'module' });
614
- fs.writeFileSync(outputPath, moduleCode);
615
- }
616
- function main() {
617
- try {
618
- let cmd = clap_1.default
619
- .command('react-tsdoc')
620
- .description('Generate docs for React components')
621
- .version('0.0.1');
622
- cmd.command('types [input.ts] [output.t.ds]')
623
- .option('--module-name <name>')
624
- .action((actionArgs) => {
625
- let args = actionArgs.args || [];
626
- let options = actionArgs.options || {};
627
- generateTypeDefinition(args[0], args[1], options.moduleName);
628
- });
629
- cmd.command('docs [input.ts] [output-folder]')
630
- .action((actionArgs) => {
631
- let { args, options } = actionArgs;
632
- generateDocs(args[0], args[1]);
633
- });
634
- cmd.run();
635
- }
636
- catch (e) {
637
- console.error(chalk_1.default.red(e));
638
- }
149
+ const docInfo = load(root);
150
+ const moduleCode = (0, module_1.generateExportModule)(docInfo, { moduleName: moduleName || 'module' });
151
+ (0, file_1.writeFile)(outputPath, moduleCode);
639
152
  }
640
- exports.main = main;
153
+ exports.generateTypeDefinition = generateTypeDefinition;
641
154
  //# sourceMappingURL=index.js.map