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

esbuild-plugin-ifdef

v1.0.1

Published

This esbuild plugin lets you use `//#ifdef` comments in JavaScript & TypeScript, so you can conditionally add code to files.

Downloads

1,429

Readme

esbuild-plugin-ifdef

This esbuild plugin lets you use //#ifdef comments in JavaScript & TypeScript, so you can conditionally add code to files.

Installation

yarn add esbuild-plugin-ifdef

Usage

This adds //#ifdef comments to JavaScript & TypeScript which let you conditionally add code to files.

For example:

//#ifdef LOD_FEATURE_FLAG
function getLODistance() {
  // When LOD_FEATURE_FLAG is true, this code is included.
  return runLongFunctionCode();
}
//#endif

//#ifdef !LOD_FEATURE_FLAG
function getLODistance() {
  // When LOD_FEATURE_FLAG is falsy, this code is included.
  return 0;
}
//#endif

This is useful for cases where treeshaking doesn't work or interferes with scoping. For example, this code does not work with tree shaking:

if (true) {
  function getLODistance() {
    // When LOD_FEATURE_FLAG is true, this code is included.
    return runLongFunctionCode();
  }
} else {
  function getLODistance() {
    return 0;
  }
}

// This code doesn't work! getLODDistance() is undefined because it's only accessible from inside the if/else scope.
getLODDistance();

Configuration

Pass esbuild-plugin-ifdef an object. If the value is a boolean, true means the code inside //#ifdef KEY_IN_OBJECT will be included, otherwise it will be removed before tree shaking/parsing.

const { build } = require("esbuild");
const ifdef = require("esbuild-plugin-ifdef");

const define = {
  "process.env.LOD_FEATURE_FLAG": true,
};

build({
  entryPoints: ["input.js"],
  outfile: "output.js",
  bundle: true,
  define,
  plugins: [ifdef(define)],
}).catch(() => process.exit(1));

Arguments:

export function ifdef(
  // Environment variables to include
  // Suggestion: use the same `define` object.
  env: Object,
  // By default, esbuild runs plugins on node_modules.
  // You probably don't want to run this on node_modules for both performance and security reasons.
  // This filters the list of files to run on to exclude node_modules and include only the directories in the top level of your project.
  baseDir: string = process.cwd(),
  exclude: string[] = ["dist", "vendor", "node_modules", ".git"]
);

It will automatically ignore "process.env" from any keys passed in, so you can write:

//#ifdef LOD_FEATURE_FLAG

Instead of:

//#ifdef process.env.LOD_FEATURE_FLAG

To keep the parsing really simple, #ifndef is not implemented. However, you can prepend a "!" instead.

//#ifdef !CONDITION