Skip to content

baendlorel/rollup-plugin-conditional-compilation

Repository files navigation

Conditional Compilation

npm version npm downloads License: MIT Codacy Badge

A simple plugin that allows you to include or exclude code blocks based on compile-time conditions. Same as #if, #else, #elif , #endif in C/C++, it looks like this:

// #if DEBUG
console.log('user', userData); // when DEBUG is false, this line will be removed
// #endif

Note: You should modify the plugin options to ensure NOT to strip comments so quickly, since we work with them. For example, with @rollup/plugin-typescript, set removeComments: false.

More Rollup Plugins you might be interested in:

Fixed Issues in v1.0.6

  1. Added configurable ecmaVersion and sourceType options to pass to Acorn. Previously, sourceType is fixed in this plugin and prevented parsing ES module files; this is now configurable.
  2. Fixed an issue where variables was required; variables is now optional.

Installation

npm install --save-dev rollup-plugin-conditional-compilation
pnpm add -D rollup-plugin-conditional-compilation

Usage (rollup.config.js)

import conditional from 'rollup-plugin-conditional-compilation';
export default {
  ...other configs,
  plugins: [
    // Recommended: run `conditional` before the TypeScript transformer so the
    // plugin operates on the original source comments.
    conditional({ variables: { DEBUG: false, FEATURE_X: true } }),
    typescript({
      ...,
      removeComments: false, // !!IMPORTANT!! Don't strip comments so quickly!
    }),
  ],
};

Syntax

  • Single-line directives only: // #if <expression>, // #else, // #elif <expression> and // #endif.
  • The <expression> is evaluated at build time with the keys from variables available as identifiers.
    • You can write literally ANY JavaScript expressions in it, because it is evaluated as an IIFE (Immediately Invoked Function Expression).
    • Supported directives: #if, #else, #elif, #endif (similar to C/C++ style conditional compilation).
  • Since it is if/else , it follows the syntax of if/else statements

Example

Remove testing methods in your class when compiling for production:

class User {
  private name: string;
  private identifier: string;

  // #if DEBUG
  // This method will be removed in production build
  _getTestData() {
    return SomeImportantDataForTesting;
  }
  // #endif
}

If variables.DEBUG === false, compiled output becomes:

console.log('always');

Behaviors

  • AST Parsing: Using Acorn with { ecmaVersion: "latest", sourceType: "module" } by default to parse the code, so it supports the latest JavaScript syntax and ES modules.

  • Directive Style: Only // comments are scanned for directives; block comments (/* ... */) are ignored.

    • Reason 1: block comments can span multiple lines with * ahead and may contain nested comments, making parsing more complex and error-prone.
    • Reason 2: For consistency and simplicity.
  • Precise Evaluation: Expressions are executed using the Function constructor — do not pass untrusted input or rely on side effects.

License

MIT

About

Conditional Compilation macros like #if #endif in C++.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published