in lib/index.ts [142:220]
function getResult(): dom.NamespaceMember[] {
if (typeof obj === 'function') {
const funcType = getParameterListAndReturnType(obj, parseFunctionBody(obj));
const ns = dom.create.namespace(name);
let primaryDecl: dom.NamespaceMember;
if (isClasslike(obj)) {
const cls = dom.create.class(name);
getClassPrototypeMembers(obj).forEach(m => cls.members.push(m));
cls.members.push(dom.create.constructor(funcType[0]));
cls.members.sort(declarationComparer);
primaryDecl = cls;
} else {
const parsedFunction = parseFunctionBody(obj);
const info = getParameterListAndReturnType(obj, parsedFunction);
primaryDecl = dom.create.function(name, info[0], info[1]);
}
// Get clodule/fundule members
const keys = getKeysOfObject(obj);
for (const k of keys) {
getTopLevelDeclarations(k!, obj[k!]).forEach(p => {
if (primaryDecl.kind === "class") {
// Transform certain declarations into static members
switch (p.kind) {
case 'const':
primaryDecl.members.push(create.property(p.name, p.type, dom.DeclarationFlags.Static));
break;
case 'function':
primaryDecl.members.push(
create.method(p.name, p.parameters, p.returnType, dom.DeclarationFlags.Static));
break;
default:
ns.members.push(p);
break;
}
} else {
ns.members.push(p);
}
});
ns.members.sort(declarationComparer);
}
return ns.members.length > 0 ? [primaryDecl, ns] : [primaryDecl];
} else if (typeof obj === 'object') {
// If we can immediately resolve this to a simple declaration, just do so
const simpleType = getTypeOfValue(obj);
if (typeof simpleType === 'string' || simpleType.kind === 'name' || simpleType.kind === 'array') {
const result = dom.create.const(name, simpleType);
if (simpleType === 'string') {
const preview = `"${simpleType.substr(0, 100)}${simpleType.length > 100 ? '...' : ''}"`;
result.comment = "Value of string: " + preview;
}
return [result];
}
// If anything in here is classlike or functionlike, write it as a namespace.
// Otherwise, write as a 'const'
const keys = getKeysOfObject(obj);
let constituentTypes = ValueTypes.None;
for (const k of keys) {
constituentTypes = constituentTypes | getValueTypes((<any> obj)[k!]);
}
if (constituentTypes & (ValueTypes.Class | ValueTypes.Function)) {
const ns = dom.create.namespace(name);
for (const k of keys) {
const decls = getTopLevelDeclarations(k!, (<any> obj)[k!]);
decls.forEach(d => ns.members.push(d));
}
ns.members.sort(declarationComparer);
return [ns];
} else {
return [dom.create.const(name, simpleType)];
}
} else if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {
return [create.const(name, <dom.Type> (typeof obj))];
} else {
return [create.const(name, dom.type.any)];
}
}