react-tsdoc
Version:
CLI to extract information from React Typescript component files with TSDoc for documentation generation purposes
155 lines (154 loc) • 6.47 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTypeSignature = void 0;
var ts_morph_1 = require("ts-morph");
/**
* Gets type data for a param
*
* @node - The property signature to check the type of
*/
var getTypeSignature = function (node) {
var _a;
if (!node)
return undefined;
var kind = (node === null || node === void 0 ? void 0 : node.getKind()) === ts_morph_1.SyntaxKind.PropertySignature
? (_a = node.getTypeNode()) === null || _a === void 0 ? void 0 : _a.getKind()
: node.getKind();
switch (kind) {
case (ts_morph_1.SyntaxKind.TypeReference): // foo
return {
name: node.getType().getText().toString()
};
case (ts_morph_1.SyntaxKind.LiteralType): // 'foobarbaz'
return {
name: 'literal',
value: node.getType().getText().toString()
};
case (ts_morph_1.SyntaxKind.StringKeyword): // string
return { name: 'string' };
case (ts_morph_1.SyntaxKind.NumberKeyword): // number
return { name: 'number' };
case (ts_morph_1.SyntaxKind.BooleanKeyword): // boolean
return { name: 'boolean' };
case (ts_morph_1.SyntaxKind.AnyKeyword): // any
return { name: 'any' };
case (ts_morph_1.SyntaxKind.VoidKeyword): // void
return { name: 'void' };
case (ts_morph_1.SyntaxKind.UnionType): { // foo | bar
var elements_1 = [];
var typeNode_1 = node.getKind() === ts_morph_1.SyntaxKind.UnionType
? node
: node.getTypeNode();
typeNode_1.getTypeNodes()
.forEach(function (childNode) {
return elements_1.push((0, exports.getTypeSignature)(childNode));
});
return {
name: 'union',
raw: node.getType().getText(),
elements: elements_1
};
}
case (ts_morph_1.SyntaxKind.ArrayType): { // foo[]
var elements_2 = [];
var typeNode_2 = node.getKind() === ts_morph_1.SyntaxKind.ArrayType
? node
: node.getTypeNode();
typeNode_2.forEachChild(function (childNode) {
return elements_2.push((0, exports.getTypeSignature)(childNode));
});
return {
name: 'Array',
raw: node.getType().getText(),
elements: elements_2,
};
}
case (ts_morph_1.SyntaxKind.TupleType): { // [foo, bar, baz]
var elements_3 = [];
var typeNode_3 = node.getKind() === ts_morph_1.SyntaxKind.TupleType
? node
: node.getTypeNode();
typeNode_3.forEachChild(function (childNode) {
elements_3.push((0, exports.getTypeSignature)(childNode));
});
return {
name: 'tuple',
raw: node.getType().getText(),
elements: elements_3
};
}
case (ts_morph_1.SyntaxKind.FunctionType): { // (foo: string) => void
var args_1 = [];
var typeNode_4 = node.getKind() === ts_morph_1.SyntaxKind.FunctionType
? node
: node.getTypeNode();
typeNode_4.forEachChild(function (childNode) {
var _a;
if (childNode.getKind() === ts_morph_1.SyntaxKind.Parameter) {
args_1.push({
name: (_a = childNode.getFirstChildByKind(ts_morph_1.SyntaxKind.Identifier)) === null || _a === void 0 ? void 0 : _a.getText(),
type: (0, exports.getTypeSignature)(childNode.getTypeNode())
});
}
});
return {
name: 'signature',
type: 'function',
raw: node.getType().getText(),
signature: {
arguments: args_1,
// @ts-ignore
return: (0, exports.getTypeSignature)(node.getTypeNode().getLastChild())
}
};
}
case (ts_morph_1.SyntaxKind.TypeLiteral): // {foo: bar} OR {[foo: string]: bar}
var properties_1 = [];
var typeNode = node.getKind() === ts_morph_1.SyntaxKind.TypeLiteral
? node
: node.getTypeNode();
// @ts-ignore
typeNode.forEachChild(function (childNode) {
var _a;
if (childNode.getKind() === ts_morph_1.SyntaxKind.PropertySignature) {
properties_1.push({
key: (_a = childNode.getFirstChildByKind(ts_morph_1.SyntaxKind.Identifier)) === null || _a === void 0 ? void 0 : _a.getText(),
value: __assign(__assign({}, (0, exports.getTypeSignature)(childNode.getLastChild())), {
// @ts-ignore
required: !childNode.hasQuestionToken() })
});
}
if (childNode.getKind() === ts_morph_1.SyntaxKind.IndexSignature) {
var parameter = childNode.getFirstChildByKind(ts_morph_1.SyntaxKind.Parameter);
properties_1.push({
key: {
name: parameter.getType().getText()
},
value: __assign(__assign({}, (0, exports.getTypeSignature)(childNode.getLastChild())), { required: !parameter.hasQuestionToken() })
});
}
});
return {
name: 'signature',
type: 'object',
raw: node.getType().getText(),
signature: {
properties: properties_1
}
};
default: // unknown type
return { name: 'unknown' };
}
};
exports.getTypeSignature = getTypeSignature;
;