|
|
@@ -30,7 +30,7 @@ export interface Span {
|
|
|
readonly traceAsyncFn: <T>(fn: (span: Span) => T | Promise<T>) => Promise<T>,
|
|
|
readonly tracePromise: <T>(promise: Promise<T>) => Promise<T>,
|
|
|
readonly traceChildSync: <T>(name: string, fn: (span: Span) => T) => T,
|
|
|
- readonly traceChildAsync: <T>(name: string, fn: (span: Span) => T | Promise<T>) => Promise<T>,
|
|
|
+ readonly traceChildAsync: <T>(name: string, fn: (span: Span) => Promise<T>) => Promise<T>,
|
|
|
readonly traceChildPromise: <T>(name: string, promise: Promise<T>) => Promise<T>,
|
|
|
readonly traceResult: TraceResult
|
|
|
}
|
|
|
@@ -85,9 +85,7 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span
|
|
|
span.stop();
|
|
|
}
|
|
|
},
|
|
|
- get traceResult() {
|
|
|
- return curTraceResult;
|
|
|
- },
|
|
|
+ traceResult: curTraceResult,
|
|
|
async tracePromise<T>(promise: Promise<T>): Promise<T> {
|
|
|
try {
|
|
|
return await promise;
|
|
|
@@ -95,44 +93,44 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span
|
|
|
span.stop();
|
|
|
}
|
|
|
},
|
|
|
- traceChildSync<T>(name: string, fn: (span: Span) => T): T {
|
|
|
- return traceChild(name).traceSyncFn(fn);
|
|
|
- },
|
|
|
- traceChildAsync<T>(name: string, fn: (span: Span) => T | Promise<T>): Promise<T> {
|
|
|
- return traceChild(name).traceAsyncFn(fn);
|
|
|
- },
|
|
|
- traceChildPromise<T>(name: string, promise: Promise<T>): Promise<T> {
|
|
|
- return traceChild(name).tracePromise(promise);
|
|
|
- }
|
|
|
+ traceChildSync: <T>(name: string, fn: (span: Span) => T): T => traceChild(name).traceSyncFn(fn),
|
|
|
+ traceChildAsync: <T>(name: string, fn: (span: Span) => T | Promise<T>): Promise<T> => traceChild(name).traceAsyncFn(fn),
|
|
|
+ traceChildPromise: <T>(name: string, promise: Promise<T>): Promise<T> => traceChild(name).tracePromise(promise)
|
|
|
};
|
|
|
|
|
|
// eslint-disable-next-line sukka/no-redundant-variable -- self reference
|
|
|
return span;
|
|
|
};
|
|
|
|
|
|
-export const task = <T>(importMetaPath: string, fn: (span: Span) => T, customname?: string) => {
|
|
|
- const taskName = customname ?? path.basename(importMetaPath, path.extname(importMetaPath));
|
|
|
+export const task = (importMetaMain: boolean, importMetaPath: string) => <T>(fn: (span: Span) => Promise<T>, customName?: string) => {
|
|
|
+ const taskName = customName ?? path.basename(importMetaPath, path.extname(importMetaPath));
|
|
|
+
|
|
|
+ const dummySpan = createSpan(taskName);
|
|
|
+
|
|
|
+ if (importMetaMain) {
|
|
|
+ fn(dummySpan);
|
|
|
+ }
|
|
|
+
|
|
|
return async (span?: Span) => {
|
|
|
if (span) {
|
|
|
return span.traceChildAsync(taskName, fn);
|
|
|
}
|
|
|
- return fn(createSpan(taskName));
|
|
|
+ return fn(dummySpan);
|
|
|
};
|
|
|
};
|
|
|
|
|
|
-const isSpan = (obj: any): obj is Span => {
|
|
|
- return typeof obj === 'object' && obj && spanTag in obj;
|
|
|
-};
|
|
|
-
|
|
|
-export const universalify = <A extends any[], R>(taskname: string, fn: (this: void, ...args: A) => R) => {
|
|
|
- return (...args: A) => {
|
|
|
- const lastArg = args[args.length - 1];
|
|
|
- if (isSpan(lastArg)) {
|
|
|
- return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args));
|
|
|
- }
|
|
|
- return fn(...args);
|
|
|
- };
|
|
|
-};
|
|
|
+// const isSpan = (obj: any): obj is Span => {
|
|
|
+// return typeof obj === 'object' && obj && spanTag in obj;
|
|
|
+// };
|
|
|
+// export const universalify = <A extends any[], R>(taskname: string, fn: (this: void, ...args: A) => R) => {
|
|
|
+// return (...args: A) => {
|
|
|
+// const lastArg = args[args.length - 1];
|
|
|
+// if (isSpan(lastArg)) {
|
|
|
+// return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args));
|
|
|
+// }
|
|
|
+// return fn(...args);
|
|
|
+// };
|
|
|
+// };
|
|
|
|
|
|
export const printTraceResult = (traceResult: TraceResult = rootTraceResult) => {
|
|
|
printStats(traceResult.children);
|
|
|
@@ -140,8 +138,7 @@ export const printTraceResult = (traceResult: TraceResult = rootTraceResult) =>
|
|
|
};
|
|
|
|
|
|
function printTree(initialTree: TraceResult, printNode: (node: TraceResult, branch: string) => string) {
|
|
|
- function printBranch(tree: TraceResult, branch: string) {
|
|
|
- const isGraphHead = branch.length === 0;
|
|
|
+ function printBranch(tree: TraceResult, branch: string, isGraphHead: boolean, isChildOfLastBranch: boolean) {
|
|
|
const children = tree.children;
|
|
|
|
|
|
let branchHead = '';
|
|
|
@@ -159,7 +156,6 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran
|
|
|
let baseBranch = branch;
|
|
|
|
|
|
if (!isGraphHead) {
|
|
|
- const isChildOfLastBranch = branch.endsWith('└─');
|
|
|
baseBranch = branch.slice(0, -2) + (isChildOfLastBranch ? ' ' : '│ ');
|
|
|
}
|
|
|
|
|
|
@@ -167,11 +163,12 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran
|
|
|
const lastBranch = `${baseBranch}└─`;
|
|
|
|
|
|
children.forEach((child, index) => {
|
|
|
- printBranch(child, children.length - 1 === index ? lastBranch : nextBranch);
|
|
|
+ const last = children.length - 1 === index;
|
|
|
+ printBranch(child, last ? lastBranch : nextBranch, false, last);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- printBranch(initialTree, '');
|
|
|
+ printBranch(initialTree, '', true, false);
|
|
|
}
|
|
|
|
|
|
function printStats(stats: TraceResult[]): void {
|