diff --git a/experimental/babel-preset-env/package.json b/experimental/babel-preset-env/package.json index 457259164d5c..adb228578886 100644 --- a/experimental/babel-preset-env/package.json +++ b/experimental/babel-preset-env/package.json @@ -45,7 +45,7 @@ "@babel/plugin-transform-object-rest-spread": "7.0.0-beta.3", "@babel/plugin-transform-optional-catch-binding": "7.0.0-beta.3", "@babel/plugin-transform-regenerator": "7.0.0-beta.3", - "babel-plugin-transform-unicode-property-regex": "^2.0.5", + "@babel/plugin-transform-unicode-property-regex": "7.0.0-beta.3", "browserslist": "^2.4.0", "invariant": "^2.2.2", "semver": "^5.3.0" diff --git a/experimental/babel-preset-env/src/available-plugins.js b/experimental/babel-preset-env/src/available-plugins.js index fa4f07d7d9db..4ccc4717874b 100644 --- a/experimental/babel-preset-env/src/available-plugins.js +++ b/experimental/babel-preset-env/src/available-plugins.js @@ -33,5 +33,5 @@ export default { "transform-object-rest-spread": require("@babel/plugin-transform-object-rest-spread"), "transform-optional-catch-binding": require("@babel/plugin-transform-optional-catch-binding"), "transform-regenerator": require("@babel/plugin-transform-regenerator"), - "transform-unicode-property-regex": require("babel-plugin-transform-unicode-property-regex"), + "transform-unicode-property-regex": require("@babel/plugin-transform-unicode-property-regex"), }; diff --git a/packages/babel-plugin-transform-unicode-property-regex/README.md b/packages/babel-plugin-transform-unicode-property-regex/README.md new file mode 100644 index 000000000000..8f9d3c8b25dc --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/README.md @@ -0,0 +1,55 @@ +# @babel/plugin-transform-unicode-property-regex + +Compile [Unicode property escapes](https://github.com/mathiasbynens/regexpu-core/blob/master/property-escapes.md) (`\p{…}` and `\P{…}`) in Unicode regular expressions to ES5 or ES6 that works in today’s environments. + +**Note:** the Unicode property escape syntax is non-standard and may or may not reflect what eventually gets specified. + +[Here’s an online demo.](https://mothereff.in/regexpu#input=var+regex+%3D+/%5Cp%7BScript_Extensions%3DGreek%7D/u%3B&unicodePropertyEscape=1) + +## Installation + +```sh +$ npm install @babel/plugin-transform-unicode-property-regex +``` + +## Usage + +### Via `.babelrc` (recommended) + +`.babelrc` + +```json +{ + "plugins": ["transform-unicode-property-regex"] +} +``` + +### Via CLI + +```sh +$ babel --plugins transform-unicode-property-regex script.js +``` + +### Via Node.js API + +```js +require('@babel/core').transform(code, { + 'plugins': ['transform-unicode-property-regex'] +}); +``` + +To transpile to ES6/ES2015: + +```js +require('@babel/core').transform(code, { + 'plugins': [ + ['transform-unicode-property-regex', { 'useUnicodeFlag': true }] + ] +}); +``` + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](https://mathiasbynens.be/) | diff --git a/packages/babel-plugin-transform-unicode-property-regex/package.json b/packages/babel-plugin-transform-unicode-property-regex/package.json new file mode 100644 index 000000000000..3f66fad05a02 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/package.json @@ -0,0 +1,27 @@ +{ + "name": "@babel/plugin-transform-unicode-property-regex", + "version": "7.0.0-beta.3", + "description": "Compile Unicode property escapes in Unicode regular expressions to ES5.", + "homepage": "https://babeljs.io/", + "main": "lib/index.js", + "engines": { + "node": ">=4" + }, + "keywords": [ + "babel-plugin", + "regex", + "regexp", + "regular expressions", + "unicode properties", + "unicode" + ], + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-unicode-property-regex", + "bugs": "https://github.com/babel/babel/issues", + "dependencies": { + "@babel/helper-regex": "7.0.0-beta.3", + "regexpu-core": "^4.1.3" + }, + "devDependencies": { + "@babel/helper-plugin-test-runner": "7.0.0-beta.3" + } +} diff --git a/packages/babel-plugin-transform-unicode-property-regex/src/index.js b/packages/babel-plugin-transform-unicode-property-regex/src/index.js new file mode 100644 index 000000000000..0e67b36127c1 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/src/index.js @@ -0,0 +1,23 @@ +import rewritePattern from "regexpu-core"; +import * as regex from "babel-helper-regex"; + +export default function() { + return { + visitor: { + RegExpLiteral(path, state) { + const node = path.node; + if (!regex.is(node, "u")) { + return; + } + const useUnicodeFlag = state.opts.useUnicodeFlag || false; + node.pattern = rewritePattern(node.pattern, node.flags, { + unicodePropertyEscape: true, + useUnicodeFlag: useUnicodeFlag, + }); + if (!useUnicodeFlag) { + regex.pullFlag(node, "u"); + } + }, + }, + }; +} diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/emoji/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/emoji/actual.js new file mode 100644 index 000000000000..e3c39d87a483 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/emoji/actual.js @@ -0,0 +1,2 @@ +var regexEmojiModifier = /\p{Emoji_Modifier}/u; +var regexEmojiComponent = /\p{Emoji_Component}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/emoji/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/emoji/expected.js new file mode 100644 index 000000000000..76ddeafd64c5 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/emoji/expected.js @@ -0,0 +1,2 @@ +var regexEmojiModifier = /[\u{1F3FB}-\u{1F3FF}]/u; +var regexEmojiComponent = /[#\*0-9\u200D\u20E3\uFE0F\u{1F1E6}-\u{1F1FF}\u{1F3FB}-\u{1F3FF}\u{E0020}-\u{E007F}]/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/options.json b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/options.json new file mode 100644 index 000000000000..ea5a08adbf22 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["transform-unicode-property-regex", { + "useUnicodeFlag": true + }] + ] +} diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/script-extensions/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/script-extensions/actual.js new file mode 100644 index 000000000000..9edf9daa0f51 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/script-extensions/actual.js @@ -0,0 +1 @@ +var regex = /\p{Script_Extensions=Anatolian_Hieroglyphs}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/script-extensions/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/script-extensions/expected.js new file mode 100644 index 000000000000..25dfc454c4a4 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/script-extensions/expected.js @@ -0,0 +1 @@ +var regex = /[\u{14400}-\u{14646}]/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/simple/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/simple/actual.js new file mode 100644 index 000000000000..7770f8eaa4ab --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/simple/actual.js @@ -0,0 +1 @@ +var regex = /\p{ASCII_Hex_Digit}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/simple/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/simple/expected.js new file mode 100644 index 000000000000..cea790a2d483 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/simple/expected.js @@ -0,0 +1 @@ +var regex = /[0-9A-Fa-f]/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/unicode-10/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/unicode-10/actual.js new file mode 100644 index 000000000000..3af0a331cf7f --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/unicode-10/actual.js @@ -0,0 +1 @@ +var regex = /\p{Regional_Indicator}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/unicode-10/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/unicode-10/expected.js new file mode 100644 index 000000000000..6e60a4f5c0e0 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/with-unicode-flag/unicode-10/expected.js @@ -0,0 +1 @@ +var regex = /[\u{1F1E6}-\u{1F1FF}]/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/emoji/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/emoji/actual.js new file mode 100644 index 000000000000..e3c39d87a483 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/emoji/actual.js @@ -0,0 +1,2 @@ +var regexEmojiModifier = /\p{Emoji_Modifier}/u; +var regexEmojiComponent = /\p{Emoji_Component}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/emoji/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/emoji/expected.js new file mode 100644 index 000000000000..c862d0267ac0 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/emoji/expected.js @@ -0,0 +1,2 @@ +var regexEmojiModifier = /(?:\uD83C[\uDFFB-\uDFFF])/; +var regexEmojiComponent = /(?:[#\*0-9\u200D\u20E3\uFE0F]|\uD83C[\uDDE6-\uDDFF\uDFFB-\uDFFF]|\uDB40[\uDC20-\uDC7F])/; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/options.json b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/options.json new file mode 100644 index 000000000000..1545da15df34 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + ["transform-unicode-property-regex"] + ] +} diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/script-extensions/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/script-extensions/actual.js new file mode 100644 index 000000000000..9edf9daa0f51 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/script-extensions/actual.js @@ -0,0 +1 @@ +var regex = /\p{Script_Extensions=Anatolian_Hieroglyphs}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/script-extensions/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/script-extensions/expected.js new file mode 100644 index 000000000000..f9bb33a754b4 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/script-extensions/expected.js @@ -0,0 +1 @@ +var regex = /(?:\uD811[\uDC00-\uDE46])/; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/simple/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/simple/actual.js new file mode 100644 index 000000000000..7770f8eaa4ab --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/simple/actual.js @@ -0,0 +1 @@ +var regex = /\p{ASCII_Hex_Digit}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/simple/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/simple/expected.js new file mode 100644 index 000000000000..5b17db1764fa --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/simple/expected.js @@ -0,0 +1 @@ +var regex = /[0-9A-Fa-f]/; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/unicode-10/actual.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/unicode-10/actual.js new file mode 100644 index 000000000000..3af0a331cf7f --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/unicode-10/actual.js @@ -0,0 +1 @@ +var regex = /\p{Regional_Indicator}/u; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/unicode-10/expected.js b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/unicode-10/expected.js new file mode 100644 index 000000000000..8339aeeff199 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/fixtures/without-unicode-flag/unicode-10/expected.js @@ -0,0 +1 @@ +var regex = /(?:\uD83C[\uDDE6-\uDDFF])/; diff --git a/packages/babel-plugin-transform-unicode-property-regex/test/index.js b/packages/babel-plugin-transform-unicode-property-regex/test/index.js new file mode 100644 index 000000000000..8c71ab59f548 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-property-regex/test/index.js @@ -0,0 +1,2 @@ +import runner from "@babel/helper-plugin-test-runner"; +runner(__dirname); diff --git a/packages/babel-preset-stage-3/package.json b/packages/babel-preset-stage-3/package.json index d9f74a9d7fa6..370f54468e3e 100644 --- a/packages/babel-preset-stage-3/package.json +++ b/packages/babel-preset-stage-3/package.json @@ -13,6 +13,6 @@ "@babel/plugin-transform-class-properties": "7.0.0-beta.3", "@babel/plugin-transform-object-rest-spread": "7.0.0-beta.3", "@babel/plugin-transform-optional-catch-binding": "7.0.0-beta.3", - "babel-plugin-transform-unicode-property-regex": "^2.0.5" + "@babel/plugin-transform-unicode-property-regex": "7.0.0-beta.3" } } diff --git a/packages/babel-preset-stage-3/src/index.js b/packages/babel-preset-stage-3/src/index.js index cf63eb5a08ab..4c1a21cc5bd2 100644 --- a/packages/babel-preset-stage-3/src/index.js +++ b/packages/babel-preset-stage-3/src/index.js @@ -3,7 +3,7 @@ import transformAsyncGeneratorFunctions from "@babel/plugin-transform-async-gene import transformClassProperties from "@babel/plugin-transform-class-properties"; import transformObjectRestSpread from "@babel/plugin-transform-object-rest-spread"; import transformOptionalCatchBinding from "@babel/plugin-transform-optional-catch-binding"; -import transformUnicodePropertyRegex from "babel-plugin-transform-unicode-property-regex"; +import transformUnicodePropertyRegex from "@babel/plugin-transform-unicode-property-regex"; export default function() { return { diff --git a/packages/babel-standalone/package.json b/packages/babel-standalone/package.json index 6ffbcf860806..86f015a9f43f 100644 --- a/packages/babel-standalone/package.json +++ b/packages/babel-standalone/package.json @@ -78,7 +78,7 @@ "@babel/plugin-transform-regenerator": "7.0.0-beta.3", "@babel/plugin-transform-runtime": "7.0.0-beta.3", "@babel/plugin-transform-strict-mode": "7.0.0-beta.3", - "babel-plugin-transform-unicode-property-regex": "^2.0.5", + "@babel/plugin-transform-unicode-property-regex": "7.0.0-beta.3", "@babel/preset-es2015": "7.0.0-beta.3", "@babel/preset-es2016": "7.0.0-beta.3", "@babel/preset-es2017": "7.0.0-beta.3", diff --git a/packages/babel-standalone/src/index.js b/packages/babel-standalone/src/index.js index 6e33f20ebebf..684c000dbd27 100644 --- a/packages/babel-standalone/src/index.js +++ b/packages/babel-standalone/src/index.js @@ -205,7 +205,7 @@ registerPlugins({ "transform-regenerator": require("@babel/plugin-transform-regenerator"), "transform-runtime": require("@babel/plugin-transform-runtime"), "transform-strict-mode": require("@babel/plugin-transform-strict-mode"), - "transform-unicode-property-regex": require("babel-plugin-transform-unicode-property-regex"), + "transform-unicode-property-regex": require("@babel/plugin-transform-unicode-property-regex"), }); // All the presets we should bundle