regexpu

regexpu is a source code transpiler that enables the use of ES2015 Unicode regular expressions in JavaScript-of-today (ES5). It rewrites regular expressions that make use of the ES2015 u flag into equivalent ES5-compatible regular expressions.
Here’s an online demo.
Traceur v0.0.61+, Babel v1.5.0+, esnext v0.12.0+, and Bublé v0.12.0+ use regexpu for their u regexp transpilation. The REPL demos for Traceur, Babel, esnext, and Bublé let you try u regexps as well as other ES.next features.
Example
Consider a file named example-es2015.js with the following contents:
var string = 'foo💩bar';
var match = string.match(/foo(.)bar/u);
console.log(match[1]);
var regex = /[\u{1F4A9}-\u{1F4AB}]/u;
var alternative = /[💩-💫]/u;
console.log([
regex.test('a'),
regex.test('💩'),
regex.test('💪'),
regex.test('💫'),
regex.test('💬')
]);
Let’s transpile it:
$ regexpu < example-es2015.js > example-es5.js
example-es5.js can now be used in ES5 environments. Its contents are as follows:
var string = 'foo💩bar';
var match = string.match(/foo((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))bar/);
console.log(match[1]);
var regex = /(?:\uD83D[\uDCA9-\uDCAB])/;
var alternative = /(?:\uD83D[\uDCA9-\uDCAB])/;
console.log([
regex.test('a'),
regex.test('💩'),
regex.test('💪'),
regex.test('💫'),
regex.test('💬')
]);
Known limitations
Installation
To use regexpu programmatically, install it as a dependency via npm:
npm install regexpu --save-dev
To use the command-line interface, install regexpu globally:
npm install regexpu -g
API
regexpu.version
A string representing the semantic version number.
regexpu.rewritePattern(pattern, flags, options)
This is an alias for the rewritePattern function exported by regexpu-core. Please refer to that project’s documentation for more information.
regexpu.rewritePattern uses regjsgen, regjsparser, and regenerate as internal dependencies. If you only need this function in your program, it’s better to include it directly:
const rewritePattern = require('regexpu').rewritePattern;
const rewritePattern = require('regexpu-core');
This prevents the Recast and Esprima dependencies from being loaded into memory.
regexpu.transformTree(ast, options) or its alias regexpu.transform(ast, options)
This function accepts an abstract syntax tree representing some JavaScript code, and returns a transformed version of the tree in which any regular expression literals that use the ES2015 u flag are rewritten in ES5.
const regexpu = require('regexpu');
const recast = require('recast');
const tree = recast.parse(code);
const transformedTree = regexpu.transform(tree);
const result = recast.print(transformedTree);
console.log(result.code);
console.log(result.map);
The optional options object is passed to regexpu-core’s rewritePattern. For a description of the available options, see its documentation.
regexpu.transformTree uses Recast, regjsgen, regjsparser, and regenerate as internal dependencies. If you only need this function in your program, it’s better to include it directly:
const transformTree = require('regexpu/transform-tree');
This prevents the Esprima dependency from being loaded into memory.
regexpu.transpileCode(code, options)
This function accepts a string representing some JavaScript code, and returns a transpiled version of this code tree in which any regular expression literals that use the ES2015 u flag are rewritten in ES5.
const es2015 = 'console.log(/foo.bar/u.test("foo💩bar"));';
const es5 = regexpu.transpileCode(es2015);
The optional options object recognizes the following properties:
The sourceFileName and sourceMapName properties must be provided if you want to generate source maps.
const result = regexpu.transpileCode(code, {
'sourceFileName': 'es2015.js',
'sourceMapName': 'es2015.js.map',
});
console.log(result.code);
console.log(result.map);
regexpu.transpileCode uses Esprima, Recast, regjsgen, regjsparser, and regenerate as internal dependencies. If you only need this function in your program, feel free to include it directly:
const transpileCode = require('regexpu/transpile-code');
Transpilers that use regexpu internally
If you’re looking for a general-purpose ES.next-to-ES5 transpiler with support for Unicode regular expressions, consider using one of these:
For maintainers
How to publish a new release
-
On the main branch, bump the version number in package.json:
npm version patch -m 'Release v%s'
Instead of patch, use minor or major as needed.
Note that this produces a Git commit + tag.
-
Push the release commit and tag:
git push && git push --tags
Our CI then automatically publishes the new release to npm.
Author
License
regexpu is available under the MIT license.