diff --git a/packages/core-js-compat/src/data.mjs b/packages/core-js-compat/src/data.mjs index 953a2d4c2cba..66b4717adbc6 100644 --- a/packages/core-js-compat/src/data.mjs +++ b/packages/core-js-compat/src/data.mjs @@ -2186,6 +2186,8 @@ export const data = { // TODO: Remove from `core-js@4` 'esnext.reflect.metadata': { }, + 'esnext.regexp.escape': { + }, 'esnext.set.add-all': { }, 'esnext.set.delete-all': { diff --git a/packages/core-js-compat/src/modules-by-versions.mjs b/packages/core-js-compat/src/modules-by-versions.mjs index 87792be11537..f4c435e9fc89 100644 --- a/packages/core-js-compat/src/modules-by-versions.mjs +++ b/packages/core-js-compat/src/modules-by-versions.mjs @@ -220,4 +220,7 @@ export default { 'esnext.data-view.set-uint8-clamped', 'esnext.math.f16round', ], + 3.33: [ + 'esnext.regexp.escape', + ], }; diff --git a/packages/core-js/full/regexp/escape.js b/packages/core-js/full/regexp/escape.js new file mode 100644 index 000000000000..983d260785e5 --- /dev/null +++ b/packages/core-js/full/regexp/escape.js @@ -0,0 +1,5 @@ +'use strict'; +require('../../modules/esnext.regexp.escape'); +var path = require('../../internals/path'); + +module.exports = path.RegExp.escape; diff --git a/packages/core-js/full/regexp/index.js b/packages/core-js/full/regexp/index.js index 427bbc1ac183..46616ce395d4 100644 --- a/packages/core-js/full/regexp/index.js +++ b/packages/core-js/full/regexp/index.js @@ -1,4 +1,5 @@ 'use strict'; var parent = require('../../actual/regexp'); +require('../../modules/esnext.regexp.escape'); module.exports = parent; diff --git a/packages/core-js/modules/esnext.regexp.escape.js b/packages/core-js/modules/esnext.regexp.escape.js new file mode 100644 index 000000000000..5d5e81dc8c61 --- /dev/null +++ b/packages/core-js/modules/esnext.regexp.escape.js @@ -0,0 +1,20 @@ +'use strict'; +var $ = require('../internals/export'); +var uncurryThis = require('../internals/function-uncurry-this'); +var toString = require('../internals/to-string'); +var WHITESPACES = require('../internals/whitespaces'); + +var charCodeAt = uncurryThis(''.charCodeAt); +var replace = uncurryThis(''.replace); +var NEED_ESCAPING = RegExp('[!"#$%&\'()*+,\\-./:;<=>?@[\\\\\\]^`{|}~' + WHITESPACES + ']', 'g'); + +// `RegExp.escape` method +// https://github.com/tc39/proposal-regex-escaping +$({ target: 'RegExp', stat: true, forced: true }, { + escape: function escape(S) { + var str = toString(S); + var firstCode = charCodeAt(str, 0); + // escape first DecimalDigit + return (firstCode > 47 && firstCode < 58 ? '\\x3' : '') + replace(str, NEED_ESCAPING, '\\$&'); + } +}); diff --git a/packages/core-js/proposals/regexp-escaping.js b/packages/core-js/proposals/regexp-escaping.js new file mode 100644 index 000000000000..d77c2ca3a650 --- /dev/null +++ b/packages/core-js/proposals/regexp-escaping.js @@ -0,0 +1,3 @@ +'use strict'; +// https://github.com/tc39/proposal-regex-escaping +require('../modules/esnext.regexp.escape'); diff --git a/packages/core-js/stage/2.js b/packages/core-js/stage/2.js index 33fd477221b9..68141057a3b7 100644 --- a/packages/core-js/stage/2.js +++ b/packages/core-js/stage/2.js @@ -5,6 +5,7 @@ require('../proposals/array-is-template-object'); require('../proposals/async-iterator-helpers'); require('../proposals/iterator-range'); require('../proposals/map-upsert-stage-2'); +require('../proposals/regexp-escaping'); require('../proposals/string-dedent'); require('../proposals/symbol-predicates-v2'); // TODO: Obsolete versions, remove from `core-js@4`