{"name":"regexpu","version":"1.3.0","description":"A source code transpiler that enables the use of ES6 Unicode regular expressions in ES5.","homepage":"https://mths.be/regexpu","main":"regexpu.js","bin":{"regexpu":"bin/regexpu"},"keywords":["codegen","desugaring","ecmascript","es5","es6","harmony","javascript","refactoring","regex","regexp","regular expressions","rewriting","syntax","transformation","transpile","transpiler","unicode"],"license":"MIT","author":{"name":"Mathias Bynens","url":"https://mathiasbynens.be/"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/regexpu.git"},"bugs":{"url":"https://github.com/mathiasbynens/regexpu/issues"},"files":["LICENSE-MIT.txt","regexpu.js","rewrite-pattern.js","transform-tree.js","transpile-code.js","data/character-class-escape-sets.js","data/iu-mappings.json","bin/","man/"],"directories":{"bin":"bin","man":"man"},"scripts":{"build":"node scripts/iu-mappings.js && node scripts/character-class-escape-sets.js","test":"mocha tests","coverage":"istanbul cover --report html node_modules/.bin/_mocha tests/tests.js -- -u exports -R spec"},"dependencies":{"esprima":"^2.6.0","recast":"^0.10.10","regenerate":"^1.2.1","regjsgen":"^0.2.0","regjsparser":"^0.1.4"},"devDependencies":{"coveralls":"^2.11.2","istanbul":"^0.3.11","jsesc":"^0.5.0","lodash":"^3.6.0","mocha":"^2.2.1","unicode-5.1.0":"^0.1.5","unicode-8.0.0":"^0.1.5"},"man":["/tmp/npm-25516-ZkmORT_w/registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz-unpack/man/regexpu.1"],"readme":"# regexpu [![Build status](https://travis-ci.org/mathiasbynens/regexpu.svg?branch=master)](https://travis-ci.org/mathiasbynens/regexpu) [![Code coverage status](http://img.shields.io/coveralls/mathiasbynens/regexpu/master.svg)](https://coveralls.io/r/mathiasbynens/regexpu) [![Dependency status](https://gemnasium.com/mathiasbynens/regexpu.svg)](https://gemnasium.com/mathiasbynens/regexpu)\n\n_regexpu_ is a source code transpiler that enables the use of ES6 Unicode regular expressions in JavaScript-of-today (ES5). It rewrites regular expressions that make use of [the ES6 `u` flag](https://mathiasbynens.be/notes/es6-unicode-regex) into equivalent ES5-compatible regular expressions.\n\n[Here’s an online demo.](https://mothereff.in/regexpu)\n\n[Traceur v0.0.61+](https://github.com/google/traceur-compiler), [Babel v1.5.0+](https://github.com/babel/babel), and [esnext v0.12.0+](https://github.com/esnext/esnext) use _regexpu_ for their `u` regexp transpilation. The REPL demos for [Traceur](https://google.github.io/traceur-compiler/demo/repl.html#%2F%2F%20Traceur%20now%20uses%20regexpu%20%28https%3A%2F%2Fmths.be%2Fregexpu%29%20to%20transpile%20regular%0A%2F%2F%20expression%20literals%20that%20have%20the%20ES6%20%60u%60%20flag%20set%20into%20equivalent%20ES5.%0A%0A%2F%2F%20Match%20any%20symbol%20from%20U%2B1F4A9%20PILE%20OF%20POO%20to%20U%2B1F4AB%20DIZZY%20SYMBOL.%0Avar%20regex%20%3D%20%2F%5B%F0%9F%92%A9-%F0%9F%92%AB%5D%2Fu%3B%20%2F%2F%20Or%2C%20%60%2F%5Cu%7B1F4A9%7D-%5Cu%7B1F4AB%7D%2Fu%60.%0Aconsole.log%28%0A%20%20regex.test%28'%F0%9F%92%A8'%29%2C%20%2F%2F%20false%0A%20%20regex.test%28'%F0%9F%92%A9'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AA'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AB'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AC'%29%20%20%2F%2F%20false%0A%29%3B%0A%0A%2F%2F%20See%20https%3A%2F%2Fmathiasbynens.be%2Fnotes%2Fes6-unicode-regex%20for%20more%20examples%20and%0A%2F%2F%20info.%0A), [Babel](https://babeljs.io/repl/#?experimental=true&playground=true&evaluate=true&code=%2F%2F%20Babel%20now%20uses%20regexpu%20%28https%3A%2F%2Fmths.be%2Fregexpu%29%20to%20transpile%20regular%0A%2F%2F%20expression%20literals%20that%20have%20the%20ES6%20%60u%60%20flag%20set%20into%20equivalent%20ES5.%0A%0A%2F%2F%20Match%20any%20symbol%20from%20U%2B1F4A9%20PILE%20OF%20POO%20to%20U%2B1F4AB%20DIZZY%20SYMBOL.%0Avar%20regex%20%3D%20%2F%5B%F0%9F%92%A9-%F0%9F%92%AB%5D%2Fu%3B%20%2F%2F%20Or%2C%20%60%2F%5Cu%7B1F4A9%7D-%5Cu%7B1F4AB%7D%2Fu%60.%0Aconsole.log%28%0A%20%20regex.test%28'%F0%9F%92%A8'%29%2C%20%2F%2F%20false%0A%20%20regex.test%28'%F0%9F%92%A9'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AA'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AB'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AC'%29%20%20%2F%2F%20false%0A%29%3B%0A%0A%2F%2F%20See%20https%3A%2F%2Fmathiasbynens.be%2Fnotes%2Fes6-unicode-regex%20for%20more%20examples%20and%0A%2F%2F%20info.%0A), and [esnext](https://esnext.github.io/esnext/#%2F%2F%20esnext%20now%20uses%20regexpu%20%28https%3A%2F%2Fmths.be%2Fregexpu%29%20to%20transpile%20regular%0A%2F%2F%20expression%20literals%20that%20have%20the%20ES6%20%60u%60%20flag%20set%20into%20equivalent%20ES5.%0A%0A%2F%2F%20Match%20any%20symbol%20from%20U%2B1F4A9%20PILE%20OF%20POO%20to%20U%2B1F4AB%20DIZZY%20SYMBOL.%0Avar%20regex%20%3D%20%2F%5B%F0%9F%92%A9-%F0%9F%92%AB%5D%2Fu%3B%20%2F%2F%20Or%2C%20%60%2F%5Cu%7B1F4A9%7D-%5Cu%7B1F4AB%7D%2Fu%60.%0Aconsole.log%28%0A%20%20regex.test%28'%F0%9F%92%A8'%29%2C%20%2F%2F%20false%0A%20%20regex.test%28'%F0%9F%92%A9'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AA'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AB'%29%2C%20%2F%2F%20true%0A%20%20regex.test%28'%F0%9F%92%AC'%29%20%20%2F%2F%20false%0A%29%3B%0A%0A%2F%2F%20See%20https%3A%2F%2Fmathiasbynens.be%2Fnotes%2Fes6-unicode-regex%20for%20more%20examples%20and%0A%2F%2F%20info.%0A) let you try `u` regexps as well as other ES.next features.\n\n## Example\n\nConsider a file named `example-es6.js` with the following contents:\n\n```js\nvar string = 'foo💩bar';\nvar match = string.match(/foo(.)bar/u);\nconsole.log(match[1]);\n// → '💩'\n\n// This regex matches any symbol from U+1F4A9 to U+1F4AB, and nothing else.\nvar regex = /[\\u{1F4A9}-\\u{1F4AB}]/u;\n// The following regex is equivalent.\nvar alternative = /[💩-💫]/u;\nconsole.log([\n  regex.test('a'),  // false\n  regex.test('💩'), // true\n  regex.test('💪'), // true\n  regex.test('💫'), // true\n  regex.test('💬')  // false\n]);\n```\n\nLet’s transpile it:\n\n```bash\n$ regexpu -f example-es6.js > example-es5.js\n```\n\n`example-es5.js` can now be used in ES5 environments. Its contents are as follows:\n\n```js\nvar string = 'foo💩bar';\nvar 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/);\nconsole.log(match[1]);\n// → '💩'\n\n// This regex matches any symbol from U+1F4A9 to U+1F4AB, and nothing else.\nvar regex = /(?:\\uD83D[\\uDCA9-\\uDCAB])/;\n// The following regex is equivalent.\nvar alternative = /(?:\\uD83D[\\uDCA9-\\uDCAB])/;\nconsole.log([\n  regex.test('a'),  // false\n  regex.test('💩'), // true\n  regex.test('💪'), // true\n  regex.test('💫'), // true\n  regex.test('💬')  // false\n]);\n```\n\n## Known limitations\n\n1. _regexpu_ only transpiles regular expression _literals_, so things like `RegExp('…', 'u')` are not affected.\n2. _regexpu_ doesn’t polyfill [the `RegExp.prototype.unicode` getter](https://mths.be/es6#sec-get-regexp.prototype.unicode) because it’s not possible to do so without side effects.\n3. _regexpu_ doesn’t support [canonicalizing the contents of back-references in regular expressions with both the `i` and `u` flag set](https://github.com/mathiasbynens/regexpu/issues/4), since that would require transpiling/wrapping strings.\n4. _regexpu_ [doesn’t match lone low surrogates accurately](https://github.com/mathiasbynens/regexpu/issues/17). Unfortunately that is impossible to implement due to the lack of lookbehind support in JavaScript regular expressions.\n\n## Installation\n\nTo use _regexpu_ programmatically, install it as a dependency via [npm](https://www.npmjs.com/):\n\n```bash\nnpm install regexpu --save-dev\n```\n\nTo use the command-line interface, install _regexpu_ globally:\n\n```bash\nnpm install regexpu -g\n```\n\n## API\n\n### `regexpu.version`\n\nA string representing the semantic version number.\n\n### `regexpu.rewritePattern(pattern, flags)`\n\nThis function takes a string that represents a regular expression pattern as well as a string representing its flags, and returns an ES5-compatible version of the pattern.\n\n```js\nregexpu.rewritePattern('foo.bar', 'u');\n// → 'foo(?:[\\\\0-\\\\t\\\\x0B\\\\f\\\\x0E-\\\\u2027\\\\u202A-\\\\uD7FF\\\\uDC00-\\\\uFFFF]|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]|[\\\\uD800-\\\\uDBFF])bar'\n\nregexpu.rewritePattern('[\\\\u{1D306}-\\\\u{1D308}a-z]', 'u');\n// → '(?:[a-z]|\\\\uD834[\\\\uDF06-\\\\uDF08])'\n\nregexpu.rewritePattern('[\\\\u{1D306}-\\\\u{1D308}a-z]', 'ui');\n// → '(?:[a-z\\\\u017F\\\\u212A]|\\\\uD834[\\\\uDF06-\\\\uDF08])'\n```\n\n_regexpu_ can rewrite non-ES6 regular expressions too, which is useful to demonstrate how their behavior changes once the `u` and `i` flags are added:\n\n```js\n// In ES5, the dot operator only matches BMP symbols:\nregexpu.rewritePattern('foo.bar');\n// → 'foo(?:[\\\\0-\\\\t\\\\x0B\\\\f\\\\x0E-\\\\u2027\\\\u202A-\\\\uFFFF])bar'\n\n// But with the ES6 `u` flag, it matches astral symbols too:\nregexpu.rewritePattern('foo.bar', 'u');\n// → 'foo(?:[\\\\0-\\\\t\\\\x0B\\\\f\\\\x0E-\\\\u2027\\\\u202A-\\\\uD7FF\\\\uDC00-\\\\uFFFF]|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]|[\\\\uD800-\\\\uDBFF])bar'\n```\n\n`regexpu.rewritePattern` uses [regjsgen](https://github.com/d10/regjsgen), [regjsparser](https://github.com/jviereck/regjsparser), and [regenerate](https://github.com/mathiasbynens/regenerate) as internal dependencies. If you only need this function in your program, it’s better to include it directly:\n\n```js\nvar rewritePattern = require('regexpu/rewrite-pattern');\n```\n\nThis prevents the [Recast](https://github.com/benjamn/recast) and [Esprima](https://github.com/ariya/esprima) dependencies from being loaded into memory.\n\n### `regexpu.transformTree(ast)` or its alias `regexpu.transform(ast)`\n\nThis 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 ES6 `u` flag are rewritten in ES5.\n\n```js\nvar regexpu = require('regexpu');\nvar recast = require('recast');\nvar tree = recast.parse(code); // ES6 code\ntree = regexpu.transform(tree);\nvar result = recast.print(tree);\nconsole.log(result.code); // transpiled ES5 code\nconsole.log(result.map); // source map\n```\n\n`regexpu.transformTree` uses [Recast](https://github.com/benjamn/recast), [regjsgen](https://github.com/d10/regjsgen), [regjsparser](https://github.com/jviereck/regjsparser), and [regenerate](https://github.com/mathiasbynens/regenerate) as internal dependencies. If you only need this function in your program, it’s better to include it directly:\n\n```js\nvar transformTree = require('regexpu/transform-tree');\n```\n\nThis prevents the [Esprima](https://github.com/ariya/esprima) dependency from being loaded into memory.\n\n### `regexpu.transpileCode(code, options)`\n\nThis 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 ES6 `u` flag are rewritten in ES5.\n\n```js\nvar es6 = 'console.log(/foo.bar/u.test(\"foo💩bar\"));';\nvar es5 = regexpu.transpileCode(es6);\n// → 'console.log(/foo(?:[\\\\0-\\\\t\\\\x0B\\\\f\\\\x0E-\\\\u2027\\\\u202A-\\\\uD7FF\\\\uDC00-\\\\uFFFF]|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]|[\\\\uD800-\\\\uDBFF])bar/.test(\"foo💩bar\"));'\n```\n\nThe optional `options` object recognizes the following properties:\n\n* `sourceFileName`: a string representing the file name of the original ES6 source file.\n* `sourceMapName`: a string representing the desired file name of the source map.\n\nThese properties must be provided if you want to generate source maps.\n\n```js\nvar result = regexpu.transpileCode(code, {\n  'sourceFileName': 'es6.js',\n  'sourceMapName': 'es6.js.map',\n});\nconsole.log(result.code); // transpiled source code\nconsole.log(result.map); // source map\n```\n\n`regexpu.transpileCode` uses [Esprima](https://github.com/ariya/esprima), [Recast](https://github.com/benjamn/recast), [regjsgen](https://github.com/d10/regjsgen), [regjsparser](https://github.com/jviereck/regjsparser), and [regenerate](https://github.com/mathiasbynens/regenerate) as internal dependencies. If you only need this function in your program, feel free to include it directly:\n\n```js\nvar transpileCode = require('regexpu/transpile-code');\n```\n\n## Transpilers that use regexpu internally\n\nIf you’re looking for a general-purpose ES.next-to-ES5 transpiler with support for Unicode regular expressions, consider using one of these:\n\n* [Traceur](https://github.com/google/traceur-compiler) v0.0.61+\n* [Babel](https://github.com/babel/babel) v1.5.0+\n* [esnext](https://github.com/esnext/esnext) v0.12.0+\n\n## Author\n\n| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|\n| [Mathias Bynens](https://mathiasbynens.be/) |\n\n## License\n\n_regexpu_ is available under the [MIT](https://mths.be/mit) license.\n","readmeFilename":"README.md","_id":"regexpu@1.3.0","_shasum":"e534dc991a9e5846050c98de6d7dd4a55c9ea16d","_from":"https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz","_resolved":"https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz"}