Skip to content
A simple TypeScript decorator to add performance timing to class methods
TypeScript JavaScript
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.gitignore
.npmignore
.travis.yml
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
README.md
index.js
jest.config.js
package.json
tsconfig.json
yarn.lock

README.md

Debog

npm david-dm Build Status

A simple TypeScript decorator to add performance timing to your class methods.

minified size minzipped size

Installation

$ yarn add debog

Requirements

This library uses TypeScript decorators. Ensure experimentalDecorators is enabled in your tsconfig.json file.

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

Usage

Import debog into a TypeScript file and append your classes with the decorator. Pass the names of any methods you want to profile. debog automatically waits for async methods to resolve before timing!

import debog from 'debog'

@debog('longMethod', 'shortMethod', 'asyncMethod')
export default class MyClass {
  longMethod = () => {
    let output = 0
    for (let i = 0; i < 100000; i++) {
      output += i
    }
    return output
  }

  shortMethod = () => {
    let output = 0
    for (let i = 0; i < 10; i++) {
      output += i
    }
    return output
  }

  asyncMethod = async () => new Promise(resolve => {
    setTimeout(resolve, 1000)
  })
}

const example = new MyClass()
example.shortMethod() // logs "shortMethod took 0ms"
example.longMethod() // logs "longMethod took 3ms"
example.asyncMethod() // logs "asyncMethod took 1000ms"

You can alternatively restrict output until a certain threshold is reached. For example, to log when a method takes longer than 5ms:

import debog from 'debog'

@debog(5, 'waitMethod', 'instantMethod')
export default class MyClass {
  waitMethod = async () => new Promise(resolve => {
    setTimeout(resolve, 10)
  })

  instantMethod = () => {
    return 42
  }
}

const example = new MyClass()
await example.waitMethod() // logs "waitMethod took 10ms"
example.instantMethod() // logs nothing

Output

You are not restricted to using console.log as output. In fact, you can output any timing call to any destination you want such as statsd, prometheus, etc.

Simply override the exposed logger attribute.

import debog from 'debog'

debog.logger = (timing: number, methodName: string) => {
  // process information
  // default: console.log(`%c%d took %sms`, 'color: red', method, timing)
}

API

This library exports one default decorator function, defined as:

interface Debog {
  (...params: [number | string, ...string[]]): any
  logger(timing: number, methodName: string): void
}

License

MIT

You can’t perform that action at this time.