rollup-plugin-jscc
Conditional compilation and compile-time variable replacement for Rollup.
rollup-plugin-jscc is not a transpiler, it is a wrapper of jscc, a tiny and powerful, language agnostic file preprocessor that uses JavaScript to transform text based on expressions at compile time.
With jscc, you have:
- Conditional inclusion/exclusion of blocks, based on compile-time variables*
- Compile-time variables with all the power of JavaScript expressions
- Replacement of variables in the sources, by its value at compile-time
- Sourcemap support, useful for JavaScript sources.
- TypeScript v3 definitions
* This feature allows you the conditional declaration of ES6 imports (See the example).
Since jscc is a preprocessor, rollup-plugin-jscc is implemented as a file loader, so it runs before any transpiler and is invisible to them. This behavior allows you to use it in a wide range of file types but, if necessary, it can be used as a Rollup transformer instead of a loader.
NOTE
v1.0.0 is a complete rewrite and there some changes, please read the specs in jscc wiki.
Also, removal of non-jscc comments is not included, but you can use rollup-plugin-cleanup, which brings compaction and normalization of lines in addition to the conditional removal of JS comments.
Install
npm i rollup-plugin-jscc -D
# or
yarn add rollup-plugin-jscc -D
rollup-plugin-jscc requires node.js v6 or later.
Usage
rollup.config.js
import { rollup } from 'rollup';
import jscc from 'rollup-plugin-jscc';
export default {
input: 'src/main.js',
plugins: [
jscc({
values: { _APPNAME: 'My App', _DEBUG: 1 },
}),
],
//...
}
in your source:
/*#if _DEBUG
import mylib from 'mylib-debug';
//#else */
import mylib from 'mylib';
//#endif
mylib.log('Starting $_APPNAME v$_VERSION...');
output:
import mylib from 'mylib-debug';
mylib.log('Starting My App v1.0.0...');
That's it.
* jscc has two predefined memvars: _FILE
and _VERSION
, in addition to giving access to the environment variables through the nodejs proccess.env
object.
Options
Plain JavaScript object, with all properties optional.
Name | Type | Description |
---|---|---|
escapeQuotes | string | String with the type of quotes to escape in the output of strings: 'single', 'double' or 'both'. Default nothing. |
keepLines | boolean | Preserves the empty lines of directives and blocks that were removed. Use this option with sourceMap:false if you are interested only in keeping the line numbering.Default false |
mapHires | boolean | Make a hi-res source-map, if sourceMap:true (the default).Default true |
prefixes | string | RegExp | Array<string|RegExp> |
The start of a directive. That is the characters before the '#', usually the start of comments. Default ['//', '/*', '<!--'] (with one optional space after them). |
sourcemap | boolean | Must include a sourcemap? Should be the same value as the property sourcemap of the Rollup output.Default true |
mapContent | boolean | Include the original source in the sourcemap, if sourceMap:true (the default).Default true |
values | object | Plain object defining the variables used by jscc during the preprocessing. Default {} |
extensions | string | Array<string> | Array of strings that specifies the file extensions to process. Default ['js', 'jsx', 'ts', 'tsx', 'tag'] |
include | string | Array<string> | minimatch or array of minimatch patterns for paths that must be included in the processing. |
exclude | string | Array<string> | minimatch or array of minimatch patterns for paths that should be ignored. |
Directives
Please see the jscc wiki to know about directives used by jscc.
What's New
- Only CommonJS version with dependency on jscc v1.1.0
- The minimum supported version of node.js is 6
- The predefined extensions were extended to include those of React and TypeScript.
RegEx
andDate
values now outputs its literal content in replacements.- Objects containing
NaN
now outputsNaN
in replacements. Infinite
and-Infinity
in JSON objects are replaced withNumber.MAX_VALUE
andNumber.MIN_VALUE
, respectively.- Added TypeScript v3 definitions.
Support my Work
I'm a full-stack developer with more than 20 year of experience and I try to share most of my work for free and help others, but this takes a significant amount of time, effort and coffee so, if you like my work, please consider...
Of course, feedback, PRs, and stars are also welcome 🙃
Thanks for your support!