trace-runner.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import path from 'path';
  2. import picocolors from 'picocolors';
  3. type Formatter = (result: string) => string;
  4. export function traceSync<T>(prefix: string, fn: () => T, timeFormatter: Formatter = picocolors.blue): T {
  5. const start = Bun.nanoseconds();
  6. const result = fn();
  7. const end = Bun.nanoseconds();
  8. console.log(`${timeFormatter(`[${((end - start) / 1e6).toFixed(3)}ms]`)} ${prefix}`);
  9. return result;
  10. }
  11. traceSync.skip = <T>(_prefix: string, fn: () => T): T => fn();
  12. export const traceAsync = async <T>(prefix: string, fn: () => Promise<T>, timeFormatter: Formatter = picocolors.blue): Promise<T> => {
  13. const start = Bun.nanoseconds();
  14. const result = await fn();
  15. const end = Bun.nanoseconds();
  16. console.log(`${timeFormatter(`[${((end - start) / 1e6).toFixed(3)}ms]`)} ${prefix}`);
  17. return result;
  18. };
  19. export interface TaskResult {
  20. readonly start: number,
  21. readonly end: number,
  22. readonly taskName: string
  23. }
  24. export const task = <T>(importMetaPath: string, fn: () => Promise<T>, customname: string | null = null) => {
  25. const taskName = customname ?? path.basename(importMetaPath, path.extname(importMetaPath));
  26. return async () => {
  27. console.log(`🏃 [${taskName}] Start executing`);
  28. const start = Bun.nanoseconds();
  29. await fn();
  30. const end = Bun.nanoseconds();
  31. console.log(`✅ [${taskName}] ${picocolors.blue(`[${((end - start) / 1e6).toFixed(3)}ms]`)} Executed successfully`);
  32. return { start, end, taskName } as TaskResult;
  33. };
  34. };