getdocs2ts
Version:
This is a utility that transforms code documented with getdocs-style doc comments into TypeScript definition files
150 lines • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types = require("./types");
function functionParamsDef(env, params) {
env.append("(");
let dummyNameCounter = 0;
params.forEach((param, i) => {
if (i > 0)
env.append(", ");
if (param.rest) {
env.append("...");
}
if (param.name)
env.append(param.name);
else {
env.append("p");
if (params.length > 1)
env.append((++dummyNameCounter).toString());
}
if (param.optional) {
if (params.slice(i).filter(p => !(p.rest || p.optional)).length == 0) {
// only optional and rest parameters follow
env.append("?: ");
typeDef(env, param);
}
else {
env.append(": ");
typeDef(env, unionWith(param, exports.undefinedType));
}
}
else {
env.append(": ");
typeDef(env, param);
}
});
env.append(")");
}
exports.functionParamsDef = functionParamsDef;
function unionWith(t, ...ts) {
if (types.isOther(t) && t.type == "union") {
return { type: "union", typeParams: (t.typeParams || []).concat(ts) };
}
return { type: "union", typeParams: [t].concat(ts) };
}
exports.unionWith = unionWith;
exports.undefinedType = { type: "undefined" };
exports.nullType = { type: "null" };
function functionReturnDef(env, type) {
if (type) {
typeDef(env, type.optional ? unionWith(type, exports.nullType, exports.undefinedType) : type);
}
else {
env.append("void");
}
}
exports.functionReturnDef = functionReturnDef;
function functionDef(env, item) {
functionParamsDef(env, item.params || []);
env.append(" => ");
functionReturnDef(env, item.returns);
}
exports.functionDef = functionDef;
function objectDef(env, item) {
env.append("{ ");
let first = true;
for (let name in item.properties) {
const prop = item.properties[name];
if (!first)
env.append(", ");
first = false;
env.append(name);
if (prop.optional) {
env.append("?: ");
typeDef(env, unionWith(prop, exports.nullType));
}
else {
env.append(": ");
typeDef(env, prop);
}
}
env.append(" }");
}
exports.objectDef = objectDef;
function unionDef(env, typeParams, addParens = false) {
if (typeParams.length == 0) {
env.append("never");
}
else if (typeParams.length == 1) {
typeDef(env, typeParams[0], addParens);
}
else {
if (addParens)
env.append("(");
for (let i = 0; i < typeParams.length; i++) {
if (i > 0)
env.append(" | ");
typeDef(env, typeParams[i], true);
}
if (addParens)
env.append(")");
}
}
function otherDef(env, type) {
env.append(env.resolveTypeName(type.type));
if (type.typeParams) {
env.append("<");
for (let i = 0; i < type.typeParams.length; i++) {
if (i > 0)
env.append(", ");
typeDef(env, type.typeParams[i]);
}
env.append(">");
}
}
function typeDef(env, item, addParens = false) {
if (types.isFunction(item)) {
if (addParens)
env.append("(");
functionDef(env, item);
if (addParens)
env.append(")");
}
else if (types.isArray(item)) {
const elemType = item.typeParams[0];
typeDef(env, elemType, true);
env.append("[]");
}
else if (types.isObject(item)) {
objectDef(env, item);
}
else if (item.type == "union") {
unionDef(env, item.typeParams || [], addParens);
}
else if (item.type == "Object" && item.typeParams && item.typeParams.length == 1) {
const valueType = item.typeParams[0];
env.append("{ [name: string]: ");
typeDef(env, valueType);
env.append(" }");
}
else if (item.type == "constructor" && item.typeParams && item.typeParams.length == 1) {
env.append("{ new(...args: any[]): ");
typeDef(env, item.typeParams[0]);
env.append(" }");
}
else {
otherDef(env, item);
}
}
exports.typeDef = typeDef;
//# sourceMappingURL=gentype.js.map