diff --git a/packages/babel-core/src/parser/util/missing-plugin-helper.ts b/packages/babel-core/src/parser/util/missing-plugin-helper.ts index 81199e7d0db1..6636002fe58d 100644 --- a/packages/babel-core/src/parser/util/missing-plugin-helper.ts +++ b/packages/babel-core/src/parser/util/missing-plugin-helper.ts @@ -201,6 +201,16 @@ const pluginNameMap = { url: "https://git.io/JvKp3", }, }, + regexpUnicodeSets: { + syntax: { + name: "@babel/plugin-syntax-unicode-sets-regex", + url: "https://git.io/J9GTd", + }, + transform: { + name: "@babel/plugin-proposal-unicode-sets-regex", + url: "https://git.io/J9GTQ", + }, + }, throwExpressions: { syntax: { name: "@babel/plugin-syntax-throw-expressions", diff --git a/packages/babel-helper-create-regexp-features-plugin/package.json b/packages/babel-helper-create-regexp-features-plugin/package.json index d40498f1609f..71b890b4582b 100644 --- a/packages/babel-helper-create-regexp-features-plugin/package.json +++ b/packages/babel-helper-create-regexp-features-plugin/package.json @@ -19,7 +19,7 @@ ], "dependencies": { "@babel/helper-annotate-as-pure": "workspace:^", - "regexpu-core": "^4.7.1" + "regexpu-core": "^5.0.1" }, "peerDependencies": { "@babel/core": "^7.0.0" diff --git a/packages/babel-helper-create-regexp-features-plugin/src/features.ts b/packages/babel-helper-create-regexp-features-plugin/src/features.ts index 51a0c21b4d08..abe72d0b4729 100644 --- a/packages/babel-helper-create-regexp-features-plugin/src/features.ts +++ b/packages/babel-helper-create-regexp-features-plugin/src/features.ts @@ -3,6 +3,8 @@ export const FEATURES = Object.freeze({ dotAllFlag: 1 << 1, unicodePropertyEscape: 1 << 2, namedCaptureGroups: 1 << 3, + unicodeSetsFlag_syntax: 1 << 4, + unicodeSetsFlag: 1 << 5, }); // We can't use a symbol because this needs to always be the same, even if diff --git a/packages/babel-helper-create-regexp-features-plugin/src/index.ts b/packages/babel-helper-create-regexp-features-plugin/src/index.ts index 3051af32ff2e..997175c320cd 100644 --- a/packages/babel-helper-create-regexp-features-plugin/src/index.ts +++ b/packages/babel-helper-create-regexp-features-plugin/src/index.ts @@ -1,29 +1,10 @@ import rewritePattern from "regexpu-core"; -import { - featuresKey, - FEATURES, - enableFeature, - runtimeKey, - hasFeature, -} from "./features"; -import { generateRegexpuOptions } from "./util"; +import { featuresKey, FEATURES, enableFeature, runtimeKey } from "./features"; +import { generateRegexpuOptions, canSkipRegexpu, transformFlags } from "./util"; import { types as t } from "@babel/core"; import annotateAsPure from "@babel/helper-annotate-as-pure"; -type RegExpFlags = "i" | "g" | "m" | "s" | "u" | "y"; - -/** - * Remove given flag from given RegExpLiteral node - * - * @param {RegExpLiteral} node - * @param {RegExpFlags} flag - * @returns {void} - */ -function pullFlag(node, flag: RegExpFlags): void { - node.flags = node.flags.replace(flag, ""); -} - declare const PACKAGE_JSON: { name: string; version: string }; // Note: Versions are represented as an integer. e.g. 7.1.5 is represented @@ -39,9 +20,13 @@ export function createRegExpFeaturePlugin({ name, feature, options = {} as any, + manipulateOptions = (() => {}) as (opts: any, parserOpts: any) => void, }) { return { name, + + manipulateOptions, + pre() { const { file } = this; const features = file.get(featuresKey) ?? 0; @@ -70,20 +55,21 @@ export function createRegExpFeaturePlugin({ const { file } = this; const features = file.get(featuresKey); const runtime = file.get(runtimeKey) ?? true; - const regexpuOptions = generateRegexpuOptions(node, features); - if (regexpuOptions === null) { - return; - } + + const regexpuOptions = generateRegexpuOptions(features); + if (canSkipRegexpu(node, regexpuOptions)) return; + const namedCaptureGroups = {}; - if (regexpuOptions.namedGroup) { + if (regexpuOptions.namedGroups === "transform") { regexpuOptions.onNamedGroup = (name, index) => { namedCaptureGroups[name] = index; }; } + node.pattern = rewritePattern(node.pattern, node.flags, regexpuOptions); if ( - regexpuOptions.namedGroup && + regexpuOptions.namedGroups === "transform" && Object.keys(namedCaptureGroups).length > 0 && runtime && !isRegExpTest(path) @@ -96,12 +82,8 @@ export function createRegExpFeaturePlugin({ path.replaceWith(call); } - if (hasFeature(features, FEATURES.unicodeFlag)) { - pullFlag(node, "u"); - } - if (hasFeature(features, FEATURES.dotAllFlag)) { - pullFlag(node, "s"); - } + + node.flags = transformFlags(regexpuOptions, node.flags); }, }, }; diff --git a/packages/babel-helper-create-regexp-features-plugin/src/util.ts b/packages/babel-helper-create-regexp-features-plugin/src/util.ts index 50b679b0efe2..b8126ad009b3 100644 --- a/packages/babel-helper-create-regexp-features-plugin/src/util.ts +++ b/packages/babel-helper-create-regexp-features-plugin/src/util.ts @@ -1,65 +1,77 @@ +import type { types as t } from "@babel/core"; import { FEATURES, hasFeature } from "./features"; type RegexpuOptions = { - useUnicodeFlag: boolean; + unicodeFlag: "transform" | false; + unicodeSetsFlag: "transform" | "parse" | false; + dotAllFlag: "transform" | false; + unicodePropertyEscapes: "transform" | false; + namedGroups: "transform" | false; onNamedGroup: (name: string, index: number) => void; - namedGroup: boolean; - unicodePropertyEscape: boolean; - dotAllFlag: boolean; - lookbehind: boolean; }; -export function generateRegexpuOptions(node, features): RegexpuOptions | null { - let useUnicodeFlag = false, - dotAllFlag = false, - unicodePropertyEscape = false, - namedGroup = false; +export function generateRegexpuOptions(toTransform: number): RegexpuOptions { + type Experimental = 1; + + const feat = ( + name: keyof typeof FEATURES, + ok: "transform" | (Stability extends 0 ? never : "parse") = "transform", + ) => { + return hasFeature(toTransform, FEATURES[name]) ? ok : false; + }; + + return { + unicodeFlag: feat("unicodeFlag"), + unicodeSetsFlag: + feat("unicodeSetsFlag") || + feat("unicodeSetsFlag_syntax", "parse"), + dotAllFlag: feat("dotAllFlag"), + unicodePropertyEscapes: feat("unicodePropertyEscape"), + namedGroups: feat("namedCaptureGroups"), + onNamedGroup: () => {}, + }; +} + +export function canSkipRegexpu( + node: t.RegExpLiteral, + options: RegexpuOptions, +): boolean { const { flags, pattern } = node; - const flagsIncludesU = flags.includes("u"); - if (flagsIncludesU) { - if (!hasFeature(features, FEATURES.unicodeFlag)) { - useUnicodeFlag = true; - } + if (flags.includes("v")) { + if (options.unicodeSetsFlag === "transform") return false; + } + + if (flags.includes("u")) { + if (options.unicodeFlag === "transform") return false; if ( - hasFeature(features, FEATURES.unicodePropertyEscape) && + options.unicodePropertyEscapes === "transform" && /\\[pP]{/.test(pattern) ) { - unicodePropertyEscape = true; + return false; } } - if (hasFeature(features, FEATURES.dotAllFlag) && flags.indexOf("s") >= 0) { - dotAllFlag = true; + if (flags.includes("s")) { + if (options.dotAllFlag === "transform") return false; } - if ( - hasFeature(features, FEATURES.namedCaptureGroups) && - /\(\?<(?![=!])/.test(pattern) - ) { - namedGroup = true; + + if (options.namedGroups === "transform" && /\(\?<(?![=!])/.test(pattern)) { + return false; } - if ( - !namedGroup && - !unicodePropertyEscape && - !dotAllFlag && - (!flagsIncludesU || useUnicodeFlag) - ) { - return null; + + return true; +} + +export function transformFlags(regexpuOptions: RegexpuOptions, flags: string) { + if (regexpuOptions.unicodeSetsFlag === "transform") { + flags = flags.replace("v", "u"); } - // Now we have to feed regexpu-core the regex - if (flagsIncludesU && flags.indexOf("s") >= 0) { - // When flags includes u, `config.unicode` will be enabled even if `u` is supported natively. - // In this case we have to enable dotAllFlag, otherwise `rewritePattern(/./su)` will return - // incorrect result - // https://github.com/mathiasbynens/regexpu-core/blob/v4.6.0/rewrite-pattern.js#L191 - dotAllFlag = true; + if (regexpuOptions.unicodeFlag === "transform") { + flags = flags.replace("u", ""); } - return { - useUnicodeFlag, - onNamedGroup: () => {}, - namedGroup, - unicodePropertyEscape, - dotAllFlag, - lookbehind: true, - }; + if (regexpuOptions.dotAllFlag === "transform") { + flags = flags.replace("s", ""); + } + return flags; } diff --git a/packages/babel-helper-create-regexp-features-plugin/test/fixtures/plugin-transform-named-capturing-groups-regex/runtime-false-not-overwritten/output.mjs b/packages/babel-helper-create-regexp-features-plugin/test/fixtures/plugin-transform-named-capturing-groups-regex/runtime-false-not-overwritten/output.mjs index f47a50b38088..ba78290372a4 100644 --- a/packages/babel-helper-create-regexp-features-plugin/test/fixtures/plugin-transform-named-capturing-groups-regex/runtime-false-not-overwritten/output.mjs +++ b/packages/babel-helper-create-regexp-features-plugin/test/fixtures/plugin-transform-named-capturing-groups-regex/runtime-false-not-overwritten/output.mjs @@ -1 +1 @@ -/([0-9]{4})/; +/(\d{4})/; diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/.npmignore b/packages/babel-plugin-proposal-unicode-sets-regex/.npmignore new file mode 100644 index 000000000000..f9806945836e --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/README.md b/packages/babel-plugin-proposal-unicode-sets-regex/README.md new file mode 100644 index 000000000000..98441062d519 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/README.md @@ -0,0 +1,19 @@ +# @babel/plugin-proposal-unicode-sets-regex + +> Compile regular expressions' unicodeSets (v) flag. + +See our website [@babel/plugin-proposal-unicode-sets-regex](https://babeljs.io/docs/en/babel-plugin-proposal-unicode-sets-regex) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/plugin-proposal-unicode-sets-regex +``` + +or using yarn: + +```sh +yarn add @babel/plugin-proposal-unicode-sets-regex --dev +``` diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/package.json b/packages/babel-plugin-proposal-unicode-sets-regex/package.json new file mode 100644 index 000000000000..0d2ce39af8a8 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/package.json @@ -0,0 +1,48 @@ +{ + "name": "@babel/plugin-proposal-unicode-sets-regex", + "version": "7.16.7", + "description": "Compile regular expressions' unicodeSets (v) flag.", + "homepage": "https://babel.dev/docs/en/next/babel-plugin-proposal-unicode-sets-regex", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "./lib/index.js", + "keywords": [ + "babel-plugin", + "regex", + "regexp", + "unicode", + "sets", + "properties", + "property", + "string", + "strings", + "regular expressions" + ], + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-plugin-proposal-unicode-sets-regex" + }, + "bugs": "https://github.com/babel/babel/issues", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "workspace:^", + "@babel/helper-plugin-utils": "workspace:^" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + }, + "devDependencies": { + "@babel/core": "workspace:^", + "@babel/helper-plugin-test-runner": "workspace:^" + }, + "author": "The Babel Team (https://babel.dev/team)", + "exports": { + ".": "./lib/index.js", + "./package.json": "./package.json" + }, + "engines": { + "node": ">=6.9.0" + } +} diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/src/index.ts b/packages/babel-plugin-proposal-unicode-sets-regex/src/index.ts new file mode 100644 index 000000000000..4aeb8e078cb7 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/src/index.ts @@ -0,0 +1,15 @@ +/* eslint-disable @babel/development/plugin-name */ +import { createRegExpFeaturePlugin } from "@babel/helper-create-regexp-features-plugin"; +import { declare } from "@babel/helper-plugin-utils"; + +export default declare(api => { + api.assertVersion(7); + + return createRegExpFeaturePlugin({ + name: "transform-unicode-sets-regex", + feature: "unicodeSetsFlag", + manipulateOptions(opts, parserOpts) { + parserOpts.plugins.push("regexpUnicodeSets"); + }, + }); +}); diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/input.js b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/input.js new file mode 100644 index 000000000000..dca7b75f2156 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/input.js @@ -0,0 +1 @@ +/[[0-7]&&[5-9]]\u{10FFFF}/v; diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/options.json b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/options.json new file mode 100644 index 000000000000..061a9addce37 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-unicode-sets-regex"] +} diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/output.js b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/output.js new file mode 100644 index 000000000000..ed4a334dc0c5 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/basic/output.js @@ -0,0 +1 @@ +/[5-7]\u{10FFFF}/u; diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/input.js b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/input.js new file mode 100644 index 000000000000..dca7b75f2156 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/input.js @@ -0,0 +1 @@ +/[[0-7]&&[5-9]]\u{10FFFF}/v; diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/options.json b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/options.json new file mode 100644 index 000000000000..2adbb9834185 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-unicode-sets-regex", "transform-unicode-regex"] +} diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/output.js b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/output.js new file mode 100644 index 000000000000..f954459ee750 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/fixtures/basic/transform-u/output.js @@ -0,0 +1 @@ +/[5-7](?:\uDBFF\uDFFF)/; diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/index.js b/packages/babel-plugin-proposal-unicode-sets-regex/test/index.js new file mode 100644 index 000000000000..21a55ce6b5e7 --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/index.js @@ -0,0 +1,3 @@ +import runner from "@babel/helper-plugin-test-runner"; + +runner(import.meta.url); diff --git a/packages/babel-plugin-proposal-unicode-sets-regex/test/package.json b/packages/babel-plugin-proposal-unicode-sets-regex/test/package.json new file mode 100644 index 000000000000..5ffd9800b97c --- /dev/null +++ b/packages/babel-plugin-proposal-unicode-sets-regex/test/package.json @@ -0,0 +1 @@ +{ "type": "module" } diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/.npmignore b/packages/babel-plugin-syntax-unicode-sets-regex/.npmignore new file mode 100644 index 000000000000..f9806945836e --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/README.md b/packages/babel-plugin-syntax-unicode-sets-regex/README.md new file mode 100644 index 000000000000..6d4bae61db39 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/README.md @@ -0,0 +1,19 @@ +# @babel/plugin-syntax-unicode-sets-regex + +> Parse regular expressions' unicodeSets (v) flag. + +See our website [@babel/plugin-syntax-unicode-sets-regex](https://babeljs.io/docs/en/babel-plugin-syntax-unicode-sets-regex) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/plugin-syntax-unicode-sets-regex +``` + +or using yarn: + +```sh +yarn add @babel/plugin-syntax-unicode-sets-regex --dev +``` diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/package.json b/packages/babel-plugin-syntax-unicode-sets-regex/package.json new file mode 100644 index 000000000000..36c137f9ff35 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/package.json @@ -0,0 +1,48 @@ +{ + "name": "@babel/plugin-syntax-unicode-sets-regex", + "version": "7.16.7", + "description": "Parse regular expressions' unicodeSets (v) flag.", + "homepage": "https://babel.dev/docs/en/next/babel-plugin-syntax-unicode-sets-regex", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "./lib/index.js", + "keywords": [ + "babel-plugin", + "regex", + "regexp", + "unicode", + "sets", + "properties", + "property", + "string", + "strings", + "regular expressions" + ], + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-plugin-syntax-unicode-sets-regex" + }, + "bugs": "https://github.com/babel/babel/issues", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "workspace:^", + "@babel/helper-plugin-utils": "workspace:^" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + }, + "devDependencies": { + "@babel/core": "workspace:^", + "@babel/helper-plugin-test-runner": "workspace:^" + }, + "author": "The Babel Team (https://babel.dev/team)", + "exports": { + ".": "./lib/index.js", + "./package.json": "./package.json" + }, + "engines": { + "node": ">=6.9.0" + } +} diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/src/index.ts b/packages/babel-plugin-syntax-unicode-sets-regex/src/index.ts new file mode 100644 index 000000000000..e1dd0209d6a1 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/src/index.ts @@ -0,0 +1,15 @@ +/* eslint-disable @babel/development/plugin-name */ +import { createRegExpFeaturePlugin } from "@babel/helper-create-regexp-features-plugin"; +import { declare } from "@babel/helper-plugin-utils"; + +export default declare(api => { + api.assertVersion(7); + + return createRegExpFeaturePlugin({ + name: "syntax-unicode-sets-regex", + feature: "unicodeSetsFlag_syntax", + manipulateOptions(opts, parserOpts) { + parserOpts.plugins.push("regexpUnicodeSets"); + }, + }); +}); diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/input.js b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/input.js new file mode 100644 index 000000000000..99787d31de93 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/input.js @@ -0,0 +1 @@ +/[[0-7]&&[5-9]]/v; diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/options.json b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/options.json new file mode 100644 index 000000000000..e22ec1766962 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["syntax-unicode-sets-regex"] +} diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/output.js b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/output.js new file mode 100644 index 000000000000..99787d31de93 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-enabled/basic/output.js @@ -0,0 +1 @@ +/[[0-7]&&[5-9]]/v; diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/basic/input.js b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/basic/input.js new file mode 100644 index 000000000000..99787d31de93 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/basic/input.js @@ -0,0 +1 @@ +/[[0-7]&&[5-9]]/v; diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/basic/options.json b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/basic/options.json new file mode 100644 index 000000000000..c451f857b0c7 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/basic/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Support for the experimental syntax 'regexpUnicodeSets' isn't currently enabled" +} diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/other-enabled/input.js b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/other-enabled/input.js new file mode 100644 index 000000000000..3478cd88850a --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/other-enabled/input.js @@ -0,0 +1 @@ +/[[0-7]&&[5-9]](?.)/v; diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/other-enabled/options.json b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/other-enabled/options.json new file mode 100644 index 000000000000..b0d199882be7 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/fixtures/plugin-missing/other-enabled/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["transform-named-capturing-groups-regex"], + "throws": "Support for the experimental syntax 'regexpUnicodeSets' isn't currently enabled" +} diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/index.js b/packages/babel-plugin-syntax-unicode-sets-regex/test/index.js new file mode 100644 index 000000000000..21a55ce6b5e7 --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/index.js @@ -0,0 +1,3 @@ +import runner from "@babel/helper-plugin-test-runner"; + +runner(import.meta.url); diff --git a/packages/babel-plugin-syntax-unicode-sets-regex/test/package.json b/packages/babel-plugin-syntax-unicode-sets-regex/test/package.json new file mode 100644 index 000000000000..5ffd9800b97c --- /dev/null +++ b/packages/babel-plugin-syntax-unicode-sets-regex/test/package.json @@ -0,0 +1 @@ +{ "type": "module" } diff --git a/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-flag/output.js b/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-flag/output.js index bb1b222ac40b..62cb86ca82ab 100644 --- a/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-flag/output.js +++ b/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-flag/output.js @@ -1,2 +1,2 @@ var a = /./u; -var b = /[\0-\u{10FFFF}]/u; +var b = /[\s\S]/u; diff --git a/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-property-escape/output.js b/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-property-escape/output.js index 9e43c1e52d1b..d050ebbd8c7a 100644 --- a/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-property-escape/output.js +++ b/packages/babel-plugin-transform-dotall-regex/test/fixtures/dotall-regex/with-unicode-property-escape/output.js @@ -1,2 +1,2 @@ -var a = /[\u3400-\u4DBF\u4E00-\u9FFF\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29\u{20000}-\u{2A6DF}\u{2A700}-\u{2B738}\u{2B740}-\u{2B81D}\u{2B820}-\u{2CEA1}\u{2CEB0}-\u{2EBE0}\u{30000}-\u{3134A}][\0-\t\x0B\f\x0E-\u2027\u202A-\u{10FFFF}]/u; -var b = /[\u3400-\u4DBF\u4E00-\u9FFF\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29\u{20000}-\u{2A6DF}\u{2A700}-\u{2B738}\u{2B740}-\u{2B81D}\u{2B820}-\u{2CEA1}\u{2CEB0}-\u{2EBE0}\u{30000}-\u{3134A}][\0-\u{10FFFF}]/u; +var a = /[\u3400-\u4DBF\u4E00-\u9FFF\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29\u{20000}-\u{2A6DF}\u{2A700}-\u{2B738}\u{2B740}-\u{2B81D}\u{2B820}-\u{2CEA1}\u{2CEB0}-\u{2EBE0}\u{30000}-\u{3134A}]./u; +var b = /[\u3400-\u4DBF\u4E00-\u9FFF\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29\u{20000}-\u{2A6DF}\u{2A700}-\u{2B738}\u{2B740}-\u{2B81D}\u{2B820}-\u{2CEA1}\u{2CEB0}-\u{2EBE0}\u{30000}-\u{3134A}][\s\S]/u; diff --git a/tsconfig.json b/tsconfig.json index 1496fefa164a..bd65ab96a03f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -63,6 +63,7 @@ "./packages/babel-plugin-proposal-record-and-tuple/src/**/*.ts", "./packages/babel-plugin-proposal-throw-expressions/src/**/*.ts", "./packages/babel-plugin-proposal-unicode-property-regex/src/**/*.ts", + "./packages/babel-plugin-proposal-unicode-sets-regex/src/**/*.ts", "./packages/babel-plugin-syntax-async-do-expressions/src/**/*.ts", "./packages/babel-plugin-syntax-decimal/src/**/*.ts", "./packages/babel-plugin-syntax-decorators/src/**/*.ts", @@ -79,6 +80,7 @@ "./packages/babel-plugin-syntax-record-and-tuple/src/**/*.ts", "./packages/babel-plugin-syntax-throw-expressions/src/**/*.ts", "./packages/babel-plugin-syntax-typescript/src/**/*.ts", + "./packages/babel-plugin-syntax-unicode-sets-regex/src/**/*.ts", "./packages/babel-plugin-transform-arrow-functions/src/**/*.ts", "./packages/babel-plugin-transform-async-to-generator/src/**/*.ts", "./packages/babel-plugin-transform-block-scoped-functions/src/**/*.ts", @@ -331,6 +333,9 @@ "@babel/plugin-proposal-unicode-property-regex": [ "./packages/babel-plugin-proposal-unicode-property-regex/src" ], + "@babel/plugin-proposal-unicode-sets-regex": [ + "./packages/babel-plugin-proposal-unicode-sets-regex/src" + ], "@babel/plugin-syntax-async-do-expressions": [ "./packages/babel-plugin-syntax-async-do-expressions/src" ], @@ -379,6 +384,9 @@ "@babel/plugin-syntax-typescript": [ "./packages/babel-plugin-syntax-typescript/src" ], + "@babel/plugin-syntax-unicode-sets-regex": [ + "./packages/babel-plugin-syntax-unicode-sets-regex/src" + ], "@babel/plugin-transform-arrow-functions": [ "./packages/babel-plugin-transform-arrow-functions/src" ], diff --git a/yarn.lock b/yarn.lock index 066d1ef8c551..18040c72cadb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -586,7 +586,7 @@ __metadata: "@babel/core": "workspace:^" "@babel/helper-annotate-as-pure": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" - regexpu-core: ^4.7.1 + regexpu-core: ^5.0.1 peerDependencies: "@babel/core": ^7.0.0 languageName: unknown @@ -1730,6 +1730,19 @@ __metadata: languageName: unknown linkType: soft +"@babel/plugin-proposal-unicode-sets-regex@workspace:packages/babel-plugin-proposal-unicode-sets-regex": + version: 0.0.0-use.local + resolution: "@babel/plugin-proposal-unicode-sets-regex@workspace:packages/babel-plugin-proposal-unicode-sets-regex" + dependencies: + "@babel/core": "workspace:^" + "@babel/helper-create-regexp-features-plugin": "workspace:^" + "@babel/helper-plugin-test-runner": "workspace:^" + "@babel/helper-plugin-utils": "workspace:^" + peerDependencies: + "@babel/core": ^7.0.0 + languageName: unknown + linkType: soft + "@babel/plugin-syntax-async-do-expressions@workspace:^, @babel/plugin-syntax-async-do-expressions@workspace:packages/babel-plugin-syntax-async-do-expressions": version: 0.0.0-use.local resolution: "@babel/plugin-syntax-async-do-expressions@workspace:packages/babel-plugin-syntax-async-do-expressions" @@ -2103,6 +2116,19 @@ __metadata: languageName: unknown linkType: soft +"@babel/plugin-syntax-unicode-sets-regex@workspace:packages/babel-plugin-syntax-unicode-sets-regex": + version: 0.0.0-use.local + resolution: "@babel/plugin-syntax-unicode-sets-regex@workspace:packages/babel-plugin-syntax-unicode-sets-regex" + dependencies: + "@babel/core": "workspace:^" + "@babel/helper-create-regexp-features-plugin": "workspace:^" + "@babel/helper-plugin-test-runner": "workspace:^" + "@babel/helper-plugin-utils": "workspace:^" + peerDependencies: + "@babel/core": ^7.0.0 + languageName: unknown + linkType: soft + "@babel/plugin-transform-arrow-functions@npm:^7.16.0": version: 7.16.0 resolution: "@babel/plugin-transform-arrow-functions@npm:7.16.0" @@ -13251,6 +13277,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"regenerate-unicode-properties@npm:^10.0.1": + version: 10.0.1 + resolution: "regenerate-unicode-properties@npm:10.0.1" + dependencies: + regenerate: ^1.4.2 + checksum: 1b638b7087d8143e5be3e20e2cda197ea0440fa0bc2cc49646b2f50c5a2b1acdc54b21e4215805a5a2dd487c686b2291accd5ad00619534098d2667e76247754 + languageName: node + linkType: hard + "regenerate-unicode-properties@npm:^9.0.0": version: 9.0.0 resolution: "regenerate-unicode-properties@npm:9.0.0" @@ -13315,6 +13350,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"regexpu-core@npm:^5.0.1": + version: 5.0.1 + resolution: "regexpu-core@npm:5.0.1" + dependencies: + regenerate: ^1.4.2 + regenerate-unicode-properties: ^10.0.1 + regjsgen: ^0.6.0 + regjsparser: ^0.8.2 + unicode-match-property-ecmascript: ^2.0.0 + unicode-match-property-value-ecmascript: ^2.0.0 + checksum: 6151a9700dad512fadb5564ad23246d54c880eb9417efa5e5c3658b910c1ff894d622dfd159af2ed527ffd44751bfe98682ae06c717155c254d8e2b4bab62785 + languageName: node + linkType: hard + "regjsgen@npm:^0.5.2": version: 0.5.2 resolution: "regjsgen@npm:0.5.2" @@ -13322,6 +13371,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"regjsgen@npm:^0.6.0": + version: 0.6.0 + resolution: "regjsgen@npm:0.6.0" + checksum: c5158ebd735e75074e41292ade1ff05d85566d205426cc61501e360c450a63baced8512ee3ae238e5c0a0e42969563c7875b08fa69d6f0402daf36bcb3e4d348 + languageName: node + linkType: hard + "regjsparser@npm:^0.7.0": version: 0.7.0 resolution: "regjsparser@npm:0.7.0" @@ -13333,6 +13389,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"regjsparser@npm:^0.8.2": + version: 0.8.3 + resolution: "regjsparser@npm:0.8.3" + dependencies: + jsesc: ~0.5.0 + bin: + regjsparser: bin/parser + checksum: b113328c3bb9c5f607e1fb42120b686f5ab3b7efc687fef1ce593effc36dfee091929ba6d7180d501d84137d977dd3b029b9129d07f76490d6fd035afdcbff5b + languageName: node + linkType: hard + "remove-bom-buffer@npm:^3.0.0": version: 3.0.0 resolution: "remove-bom-buffer@npm:3.0.0"