From ed21ba31d1128d6b0a36aed549095ba365d5404b Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 21 Sep 2021 03:29:29 +0700 Subject: [PATCH] fix `String.prototype.substr` feature detection and compat data --- CHANGELOG.md | 1 + packages/core-js-compat/src/data.mjs | 2 +- packages/core-js/modules/es.string.substr.js | 5 ++++- tests/compat/tests.js | 3 ++- tests/pure/es.string.substr.js | 2 ++ tests/tests/es.string.substr.js | 2 ++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ef156b55ed..5f5f0a580832 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Changelog ##### Unreleased +- Fixed `String.prototype.substr` feature detection and compat data - Families of `.at` and `.findLast` methods marked as supported in Safari TP ##### 3.18.0 - 2021.09.20 diff --git a/packages/core-js-compat/src/data.mjs b/packages/core-js-compat/src/data.mjs index 1a7c0a60a06f..0125f48fef10 100644 --- a/packages/core-js-compat/src/data.mjs +++ b/packages/core-js-compat/src/data.mjs @@ -1080,7 +1080,7 @@ export const data = { }, 'es.string.substr': { chrome: '1', - ie: '4', + ie: '9', firefox: '1', opera: '4', safari: '1', diff --git a/packages/core-js/modules/es.string.substr.js b/packages/core-js/modules/es.string.substr.js index 7fca67e273e7..6ef88300144f 100644 --- a/packages/core-js/modules/es.string.substr.js +++ b/packages/core-js/modules/es.string.substr.js @@ -8,9 +8,12 @@ var slice = ''.slice; var max = Math.max; var min = Math.min; +// eslint-disable-next-line unicorn/prefer-string-slice -- required for testing +var FORCED = !''.substr || 'ab'.substr(-1) !== 'b'; + // `String.prototype.substr` method // https://tc39.es/ecma262/#sec-string.prototype.substr -$({ target: 'String', proto: true }, { +$({ target: 'String', proto: true, forced: FORCED }, { substr: function substr(start, length) { var that = toString(requireObjectCoercible(this)); var size = that.length; diff --git a/tests/compat/tests.js b/tests/compat/tests.js index 75b37344293b..3d4e4d81021e 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -985,7 +985,8 @@ GLOBAL.tests = { }, 'es.string.starts-with': createIsRegExpLogicTest('startsWith'), 'es.string.substr': function () { - return ''.substr; + // eslint-disable-next-line unicorn/prefer-string-slice -- required for testing + return 'ab'.substr(-1) === 'b'; }, 'es.string.trim': createStringTrimMethodTest('trim'), 'es.string.trim-end': [createStringTrimMethodTest('trimEnd'), function () { diff --git a/tests/pure/es.string.substr.js b/tests/pure/es.string.substr.js index 65b0cdcee580..cbadb47eb4a3 100644 --- a/tests/pure/es.string.substr.js +++ b/tests/pure/es.string.substr.js @@ -6,6 +6,8 @@ QUnit.test('String#substr', assert => { assert.same(substr('12345', 1, 3), '234'); + assert.same(substr('ab', -1), 'b'); + /* eslint-disable es/no-symbol -- safe */ if (typeof Symbol === 'function') { assert.throws(() => substr(Symbol(), 1, 3), 'throws on symbol context'); diff --git a/tests/tests/es.string.substr.js b/tests/tests/es.string.substr.js index 37d96af7ac6e..831a272b752b 100644 --- a/tests/tests/es.string.substr.js +++ b/tests/tests/es.string.substr.js @@ -11,6 +11,8 @@ QUnit.test('String#substr', assert => { assert.same('12345'.substr(1, 3), '234'); + assert.same('ab'.substr(-1), 'b'); + if (typeof Symbol === 'function' && !Symbol.sham) { assert.throws(() => substr.call(Symbol(), 1, 3), 'throws on symbol context'); }