npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

estrace

v5.1.0

Published

trace functions of EcmaScript modules

Downloads

1,795

Readme

ESTrace License NPM version Build Status Coverage Status

Trace functions in Node.js EcmaScript Modules. For CommonJS use njsTrace.

Install

npm i estrace

Run

Loaders used to get things done, run with --loader flag:

NODE_OPTIONS="'--loader estrace --no-warnings'" node lint.js

Perf

When you want to see report of the most hot function calls count use:

NODE_OPTIONS="'--loader estrace/perf --no-warnings'" node example/perf.js

Example

Let's suppose you want to trace lint.js:

const checkFile = (a) => a;
lint();

function lint(runners) {
    const files = getFiles(runners);
    const checkedFiles = checkFiles(files);
    
    return checkedFiles;
}

function getFiles(runners) {
    const files = [];
    
    for (const run of runners) {
        files.push(...run());
    }
    
    return files;
}

function lintFiles(files) {
    const linted = [];
    
    for (const file of files) {
        linted.push(checkFile(file));
    }
    
    return linted;
}

You will see something like this

coderaiser@cloudcmd:~/estrace$ node --loader estrace example/lint.js
..💣 lint([]) 16.05mb file:///Users/coderaiser/estrace/example/lint.js:5
....💣 getFiles([]) 16.05mb file:///Users/coderaiser/estrace/example/lint.js:12
....💥 getFiles 16.06mb file:///Users/coderaiser/estrace/example/lint.js:12
....💣 lintFiles([]) 16.06mb file:///Users/coderaiser/estrace/example/lint.js:22
....💥 lintFiles 16.06mb file:///Users/coderaiser/estrace/example/lint.js:22
..💥 lint 16.06mb file:///Users/coderaiser/estrace/example/lint.js:5

How ESTrace works?

Let's suppost you have a function: const fn = (a) => a. EStrace will replace it with:

const fn = (a) => {
    try {
        var __estrace_context = __estrace.enter('<anonymous:2>', 'file://hello.js:2', arguments);
        return a;
    } finally {
        __estrace.exit('<anonymous:2>', 'file://hello.js:2', __estrace_context);
    }
};

And you cat get more information about the way your code works.

Ignore function

When you need to ignore a function, just add __estrace.ignore() before function:

export /* __estrace.ignore() */
function enter() {}

And ESTrace won't touch it.

Using as plugin

First of all ESTrace is plugin for 🐊Putout and it can be used independely:

import putout from 'putout';
import {estracePlugin} from 'estrace/plugin';

const source = `
    const fn = (a) => a;
`;

const {code} = putout(source, {
    plugins: [estracePlugin],
});

console.log(code);

Passing file url

If you need to pass url, you can with help of rules :

const {code} = putout(source, {
    rules: {
        'estrace/trace': ['on', {
            url: 'file://hello.js',
        }],
    },
    plugins: [estracePlugin],
});

Exclude functions

When you need to exclude some kinds of functions, you can use universal cross-plugin way:

const {code} = putout(source, {
    rules: {
        'estrace/trace': ['on', {
            url: 'file://hello.js',
            exclude: [
                'ArrowFunctionExpression',
            ],
        }],
    },
    plugins: [estracePlugin],
});

Overriding plugin name

If for some reason you need to override the name of a plugin, you can use default import and name it in a way you like.

import putout from 'putout';
import funnyTracer from 'estrace/plugin';

const source = `
    const fn = (a) => a;
`;

const {code} = putout(source, {
    rules: {
        'funnyTracer/trace': ['on', {
            url: 'file://hello.js',
        }],
    },
    plugins: [
        ['funnyTracer', funnyTracer],
    ],
});

console.log(code);

Supported function types:

FunctionDeclaration (named):

function hello() {
    return 'world';
}

FunctionExpression (anonymous):

hello(function(word) {
    return `hello ${word}`;
});

ArrowFunctionExpression (arrow):

hello((word) => {
    return `hello ${word}`;
});

ClassMethod (method):

class Hello {
    hello(word) {
        return `hello ${word}`;
    }
}

License

MIT