UNPKG

getdocs2ts

Version:

This is a utility that transforms code documented with getdocs-style doc comments into TypeScript definition files

150 lines 4.42 kB
"use strict"; 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