@travetto/transformer
Version:
Functionality for AST transformations, with transformer registration, and general utils
53 lines (48 loc) • 1.52 kB
text/typescript
const exclude = new Set([
'parent', 'checker', 'end', 'pos', 'id', 'source', 'sourceFile', 'getSourceFile',
'statements', 'stringIndexInfo', 'numberIndexInfo', 'instantiations', 'thisType',
'members', 'properties', 'outerTypeParameters', 'exports', 'transformFlags', 'flowNode',
'nextContainer', 'modifierFlagsCache', 'declaredProperties'
]);
const TypedObject: { keys<T = unknown, K extends keyof T = keyof T>(o: T): K[] } & ObjectConstructor = Object;
/**
* Utilities for logging typescript nodes
*/
export class LogUtil {
/**
* Clean up `ts.Node` contents for logging
*/
static collapseNodes(all: unknown[]): unknown[] {
return all.map(x => this.collapseNode(x));
}
/**
* Clean up `ts.Node` contents for logging
*/
static collapseNode(x: unknown, cache: Set<unknown> = new Set()): unknown {
if (!x || !(typeof x === 'object' || typeof x === 'function')) {
return x;
}
if (cache.has(x)) {
return;
} else {
cache.add(x);
}
if (Array.isArray(x)) {
return x.map(v => this.collapseNode(v, cache));
} else {
const ox = x;
const out: Record<string, unknown> = {};
for (const key of TypedObject.keys(ox)) {
if (Object.getPrototypeOf(ox[key]) === Function.prototype || exclude.has(key) || ox[key] === undefined) {
continue;
}
try {
out[key] = this.collapseNode(ox[key], cache);
} catch {
return undefined;
}
}
return out;
}
}
}