trace-runner.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // @ts-check
  2. const path = require('path');
  3. const { performance } = require('perf_hooks');
  4. /**
  5. * @template T
  6. * @param {string} prefix
  7. * @param {() => T} fn
  8. * @returns {T}
  9. */
  10. const traceSync = (prefix, fn) => {
  11. const start = performance.now();
  12. const result = fn();
  13. const end = performance.now();
  14. console.log(`${prefix}: ${(end - start).toFixed(3)}ms`);
  15. return result;
  16. };
  17. module.exports.traceSync = traceSync;
  18. /**
  19. * @template T
  20. * @param {string} prefix
  21. * @param {() => Promise<T>} fn
  22. * @returns {Promise<T>}
  23. */
  24. const traceAsync = async (prefix, fn) => {
  25. const start = performance.now();
  26. const result = await fn();
  27. const end = performance.now();
  28. console.log(`${prefix}: ${(end - start).toFixed(3)}ms`);
  29. return result;
  30. };
  31. module.exports.traceAsync = traceAsync;
  32. /**
  33. * @template T
  34. * @param {string} __filename
  35. * @param {() => Promise<T>} fn
  36. * @returns {Promise<T>}
  37. */
  38. module.exports.runner = async (__filename, fn) => {
  39. return traceAsync(`⌛ [${path.basename(__filename, path.extname(__filename))}]`, fn);
  40. };
  41. /**
  42. * @template T
  43. * @param {string} __filename
  44. * @param {() => Promise<T>} fn
  45. */
  46. module.exports.task = (__filename, fn) => {
  47. const taskName = path.basename(__filename, path.extname(__filename));
  48. return () => {
  49. console.log(`🏃 [${taskName}] Start executing`);
  50. return traceAsync(`✅ [${taskName}] Executed successfully`, fn);
  51. };
  52. };