diff --git a/CHANGELOG.md b/CHANGELOG.md index 78147b5a0afd..e4166c9a5e9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ## Changelog ##### Unreleased +- Added missed polyfills of [Annex B](https://tc39.es/ecma262/#sec-additional-built-in-properties) features (required mainly for some non-browser engines), [#336](https://github.com/zloirock/core-js/issues/336): + - `escape` + - `unescape` + - `String.prototype.substr` + - `Date.prototype.getYear` + - `Date.prototype.setYear` + - `Date.prototype.toGMTString` - Fixed detection of forbidden host code points in URL polyfill - Allowed `rhino` target in `core-js-compat` / `core-js-builder`, added compat data for `rhino` 1.7.13, [#942](https://github.com/zloirock/core-js/issues/942), thanks [@gausie](https://github.com/gausie) - `.at` marked as supported from FF90 diff --git a/README.md b/README.md index 5c3ffacd41e8..962bbea2e92e 100644 --- a/README.md +++ b/README.md @@ -667,14 +667,13 @@ The main part of `String` features: modules [`es.string.from-code-point`](https: Adding support of well-known [symbols](#ecmascript-symbol) `@@match`, `@@replace`, `@@search` and `@@split` and direct `.exec` calls to related `String` methods, modules [`es.string.match`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.match.js), [`es.string.replace`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.replace.js), [`es.string.search`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.search.js) and [`es.string.split`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.split.js). -Annex B HTML methods. Ugly, but it's also the part of the spec. Modules [`es.string.anchor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.anchor.js), [`es.string.big`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.big.js), [`es.string.blink`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.blink.js), [`es.string.bold`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.bold.js), [`es.string.fixed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.fixed.js), [`es.string.fontcolor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.fontcolor.js), [`es.string.fontsize`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.fontsize.js), [`es.string.italics`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.italics.js), [`es.string.link`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.link.js), [`es.string.small`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.small.js), [`es.string.strike`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.strike.js), [`es.string.sub`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.sub.js) and [`es.string.sup`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.sup.js). +Annex B methods. Modules [`es.string.anchor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.anchor.js), [`es.string.big`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.big.js), [`es.string.blink`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.blink.js), [`es.string.bold`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.bold.js), [`es.string.fixed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.fixed.js), [`es.string.fontcolor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.fontcolor.js), [`es.string.fontsize`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.fontsize.js), [`es.string.italics`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.italics.js), [`es.string.link`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.link.js), [`es.string.small`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.small.js), [`es.string.strike`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.strike.js), [`es.string.sub`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.sub.js), [`es.string.sup`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.sup.js), [`es.string.substr`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.string.substr.js), [`es.escape`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.escape.js) and [`es.unescape`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.unescape.js). `RegExp` features: modules [`es.regexp.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.regexp.constructor.js), [`es.regexp.flags`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.regexp.flags.js), [`es.regexp.sticky`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.regexp.sticky.js) and [`es.regexp.test`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.regexp.test.js). ```js class String { static fromCodePoint(...codePoints: Array): string; static raw({ raw: Array }, ...substitutions: Array): string; - split(separator: string, limit?: number): Array; includes(searchString: string, position?: number): boolean; startsWith(searchString: string, position?: number): boolean; endsWith(searchString: string, position?: number): boolean; @@ -687,7 +686,7 @@ class String { replace(template: any, replacer: any): any; // ES2015+ fix for support @@replace replaceAll(searchValue: string | RegExp, replaceString: string | (searchValue, index, this) => string): string; search(template: any): any; // ES2015+ fix for support @@search - split(template: any, limit: any): any; // ES2015+ fix for support @@split, some fixes for old engines + split(template: any, limit?: int): Array;; // ES2015+ fix for support @@split, some fixes for old engines trim(): string; trimLeft(): string; trimRight(): string; @@ -705,6 +704,7 @@ class String { small(): string; strike(): string; sub(): string; + substr(start: int, length?: int): string; sup(): string; @@iterator(): Iterator; } @@ -722,78 +722,56 @@ class RegExp { readonly attribute flags: string; // IE9+ readonly attribute sticky: boolean; } + +function escape(string: string): string; +function unescape(string: string): string; ``` [*CommonJS entry points:*](#commonjs-api) ``` core-js(-pure)/es|stable|features/string core-js(-pure)/es|stable|features/string/from-code-point core-js(-pure)/es|stable|features/string/raw -core-js(-pure)/es|stable|features/string/code-point-at -core-js(-pure)/es|stable|features/string/ends-with -core-js(-pure)/es|stable|features/string/includes -core-js(-pure)/es|stable|features/string/starts-with core-js/es|stable|features/string/match -core-js(-pure)/es|stable|features/string/match-all -core-js(-pure)/es|stable|features/string/pad-start -core-js(-pure)/es|stable|features/string/pad-end -core-js(-pure)/es|stable|features/string/repeat core-js/es|stable|features/string/replace -core-js(-pure)/es|stable|features/string/replace-all core-js/es|stable|features/string/search core-js/es|stable|features/string/split -core-js(-pure)/es|stable|features/string/trim -core-js(-pure)/es|stable|features/string/trim-start -core-js(-pure)/es|stable|features/string/trim-end -core-js(-pure)/es|stable|features/string/trim-left -core-js(-pure)/es|stable|features/string/trim-right -core-js(-pure)/es|stable|features/string/anchor -core-js(-pure)/es|stable|features/string/big -core-js(-pure)/es|stable|features/string/blink -core-js(-pure)/es|stable|features/string/bold -core-js(-pure)/es|stable|features/string/fixed -core-js(-pure)/es|stable|features/string/fontcolor -core-js(-pure)/es|stable|features/string/fontsize -core-js(-pure)/es|stable|features/string/italics -core-js(-pure)/es|stable|features/string/link -core-js(-pure)/es|stable|features/string/small -core-js(-pure)/es|stable|features/string/strike -core-js(-pure)/es|stable|features/string/sub -core-js(-pure)/es|stable|features/string/sup -core-js(-pure)/es|stable|features/string/iterator -core-js(-pure)/es|stable|features/string/virtual/includes -core-js(-pure)/es|stable|features/string/virtual/starts-with -core-js(-pure)/es|stable|features/string/virtual/ends-with -core-js(-pure)/es|stable|features/string/virtual/match-all -core-js(-pure)/es|stable|features/string/virtual/repeat -core-js(-pure)/es|stable|features/string/virtual/replace-all -core-js(-pure)/es|stable|features/string/virtual/pad-start -core-js(-pure)/es|stable|features/string/virtual/pad-end -core-js(-pure)/es|stable|features/string/virtual/code-point-at -core-js(-pure)/es|stable|features/string/virtual/trim -core-js(-pure)/es|stable|features/string/virtual/trim-start -core-js(-pure)/es|stable|features/string/virtual/trim-end -core-js(-pure)/es|stable|features/string/virtual/trim-left -core-js(-pure)/es|stable|features/string/virtual/trim-right -core-js(-pure)/es|stable|features/string/virtual/anchor -core-js(-pure)/es|stable|features/string/virtual/big -core-js(-pure)/es|stable|features/string/virtual/blink -core-js(-pure)/es|stable|features/string/virtual/bold -core-js(-pure)/es|stable|features/string/virtual/fixed -core-js(-pure)/es|stable|features/string/virtual/fontcolor -core-js(-pure)/es|stable|features/string/virtual/fontsize -core-js(-pure)/es|stable|features/string/virtual/italics -core-js(-pure)/es|stable|features/string/virtual/link -core-js(-pure)/es|stable|features/string/virtual/small -core-js(-pure)/es|stable|features/string/virtual/strike -core-js(-pure)/es|stable|features/string/virtual/sub -core-js(-pure)/es|stable|features/string/virtual/sup -core-js(-pure)/es|stable|features/string/virtual/iterator +core-js(-pure)/es|stable|features/string(/virtual)/code-point-at +core-js(-pure)/es|stable|features/string(/virtual)/ends-with +core-js(-pure)/es|stable|features/string(/virtual)/includes +core-js(-pure)/es|stable|features/string(/virtual)/starts-with +core-js(-pure)/es|stable|features/string(/virtual)/match-all +core-js(-pure)/es|stable|features/string(/virtual)/pad-start +core-js(-pure)/es|stable|features/string(/virtual)/pad-end +core-js(-pure)/es|stable|features/string(/virtual)/repeat +core-js(-pure)/es|stable|features/string(/virtual)/replace-all +core-js(-pure)/es|stable|features/string(/virtual)/trim +core-js(-pure)/es|stable|features/string(/virtual)/trim-start +core-js(-pure)/es|stable|features/string(/virtual)/trim-end +core-js(-pure)/es|stable|features/string(/virtual)/trim-left +core-js(-pure)/es|stable|features/string(/virtual)/trim-right +core-js(-pure)/es|stable|features/string(/virtual)/anchor +core-js(-pure)/es|stable|features/string(/virtual)/big +core-js(-pure)/es|stable|features/string(/virtual)/blink +core-js(-pure)/es|stable|features/string(/virtual)/bold +core-js(-pure)/es|stable|features/string(/virtual)/fixed +core-js(-pure)/es|stable|features/string(/virtual)/fontcolor +core-js(-pure)/es|stable|features/string(/virtual)/fontsize +core-js(-pure)/es|stable|features/string(/virtual)(/virtual)/italics +core-js(-pure)/es|stable|features/string(/virtual)/link +core-js(-pure)/es|stable|features/string(/virtual)/small +core-js(-pure)/es|stable|features/string(/virtual)/strike +core-js(-pure)/es|stable|features/string(/virtual)/sub +core-js(-pure)/es|stable|features/string(/virtual)/substr +core-js(-pure)/es|stable|features/string(/virtual)/sup +core-js(-pure)/es|stable|features/string(/virtual)/iterator core-js/es|stable|features/regexp core-js/es|stable|features/regexp/constructor core-js(-pure)/es|stable|features/regexp/flags core-js/es|stable|features/regexp/sticky core-js/es|stable|features/regexp/test core-js/es|stable|features/regexp/to-string +core-js/es|stable|features/escape +core-js/es|stable|features/unescape ``` [*Examples*](http://es6.zloirock.ru/#for(var%20val%20of%20'a%F0%A0%AE%B7b')%7B%0A%20%20log(val)%3B%20%2F%2F%20%3D%3E%20'a'%2C%20'%F0%A0%AE%B7'%2C%20'b'%0A%7D%0A%0Alog('foobarbaz'.includes('bar'))%3B%20%20%20%20%20%20%2F%2F%20%3D%3E%20true%0Alog('foobarbaz'.includes('bar'%2C%204))%3B%20%20%20%2F%2F%20%3D%3E%20false%0Alog('foobarbaz'.startsWith('foo'))%3B%20%20%20%20%2F%2F%20%3D%3E%20true%0Alog('foobarbaz'.startsWith('bar'%2C%203))%3B%20%2F%2F%20%3D%3E%20true%0Alog('foobarbaz'.endsWith('baz'))%3B%20%20%20%20%20%20%2F%2F%20%3D%3E%20true%0Alog('foobarbaz'.endsWith('bar'%2C%206))%3B%20%20%20%2F%2F%20%3D%3E%20true%0A%0Alog('string'.repeat(3))%3B%20%2F%2F%20%3D%3E%20'stringstringstring'%0A%0Alog('hello'.padStart(10))%3B%20%20%20%20%20%20%20%20%20%2F%2F%20%3D%3E%20'%20%20%20%20%20hello'%0Alog('hello'.padStart(10%2C%20'1234'))%3B%20%2F%2F%20%3D%3E%20'12341hello'%0Alog('hello'.padEnd(10))%3B%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%3D%3E%20'hello%20%20%20%20%20'%0Alog('hello'.padEnd(10%2C%20'1234'))%3B%20%20%20%2F%2F%20%3D%3E%20'hello12341'%0A%0Alog('%F0%A0%AE%B7'.codePointAt(0))%3B%20%2F%2F%20%3D%3E%20134071%0A%0Avar%20name%20%3D%20'Bob'%3B%0Alog(String.raw%60Hi%5Cn%24%7Bname%7D!%60)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%3D%3E%20'Hi%5C%5CnBob!'%20(ES6%20template%20string%20syntax)%0Alog(String.raw(%7B%20raw%3A%20'test'%20%7D%2C%200%2C%201%2C%202))%3B%20%2F%2F%20%3D%3E%20%2F%2F%20't0e1s2t'%0A%0Alog('foo'.bold())%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%3D%3E%20'%3Cb%3Efoo%3C%2Fb%3E'%0Alog('bar'.anchor('a%22b'))%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%3D%3E%20'%3Ca%20name%3D%22a%26quot%3Bb%22%3Ebar%3C%2Fa%3E'%0Alog('baz'.link('http%3A%2F%2Fexample.com'))%3B%20%2F%2F%20%3D%3E%20'%3Ca%20href%3D%22http%3A%2F%2Fexample.com%22%3Ebaz%3C%2Fa%3E'%0A%0Alog(RegExp(%2F.%2Fg%2C%20'm'))%3B%20%2F%2F%20%3D%3E%20%2F.%2Fm%0A%0Alog(%2Ffoo%2F.flags)%3B%20%20%20%20%2F%2F%20%3D%3E%20''%0Alog(%2Ffoo%2Fgim.flags)%3B%20%2F%2F%20%3D%3E%20'gim'%0A%0Alog(RegExp('foo'%2C%20'y').sticky)%3B%20%2F%2F%20%3D%3E%20true%0A%0Aconst%20text%20%3D%20'First%20line%5CnSecond%20line'%3B%0Aconst%20regex%20%3D%20RegExp('(%5C%5CS%2B)%20line%5C%5Cn%3F'%2C%20'y')%3B%0A%0Alog(regex.exec(text)%5B1%5D)%3B%20%2F%2F%20%3D%3E%20'First'%0Alog(regex.exec(text)%5B1%5D)%3B%20%2F%2F%20%3D%3E%20'Second'%0Alog(regex.exec(text))%3B%20%20%20%20%2F%2F%20%3D%3E%20null%0A%0Alog('foo'.match(%7B%5BSymbol.match%5D%3A%20_%20%3D%3E%201%7D))%3B%20%20%20%20%20%2F%2F%20%3D%3E%201%0Alog('foo'.replace(%7B%5BSymbol.replace%5D%3A%20_%20%3D%3E%202%7D))%3B%20%2F%2F%20%3D%3E%202%0Alog('foo'.search(%7B%5BSymbol.search%5D%3A%20_%20%3D%3E%203%7D))%3B%20%20%20%2F%2F%20%3D%3E%203%0Alog('foo'.split(%7B%5BSymbol.split%5D%3A%20_%20%3D%3E%204%7D))%3B%20%20%20%20%20%2F%2F%20%3D%3E%204%0A%0Alog(RegExp.prototype.toString.call(%7Bsource%3A%20'foo'%2C%20flags%3A%20'bar'%7D))%3B%0A%0Alog('%20%20%20hello%20%20%20'.trimLeft())%3B%20%20%2F%2F%20%3D%3E%20'hello%20%20%20'%0Alog('%20%20%20hello%20%20%20'.trimRight())%3B%20%2F%2F%20%3D%3E%20'%20%20%20hello'%0Alog('%20%20%20hello%20%20%20'.trimStart())%3B%20%2F%2F%20%3D%3E%20'hello%20%20%20'%0Alog('%20%20%20hello%20%20%20'.trimEnd())%3B%20%20%20%2F%2F%20%3D%3E%20'%20%20%20hello'%0A%0Afor%20(let%20%5B_%2C%20d%2C%20D%5D%20of%20'1111a2b3cccc'.matchAll(%2F(%5Cd)(%5CD)%2Fg))%20%7B%0A%20%20log(d%2C%20D)%3B%20%2F%2F%20%3D%3E%201%20a%2C%202%20b%2C%203%20c%0A%7D%0A%0Alog('Test%20abc%20test%20test%20abc%20test.'.replaceAll('abc'%2C%20'foo'))%3B%20%2F%2F%20-%3E%20'Test%20foo%20test%20test%20foo%20test.'): ```js @@ -948,8 +926,13 @@ core-js(-pure)/es|stable|features/math/trunc ``` #### ECMAScript: Date[⬆](#index) Modules [`es.date.to-string`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.to-string.js), ES5 features with fixes: [`es.date.now`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.now.js), [`es.date.to-iso-string`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.to-iso-string.js), [`es.date.to-json`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.to-json.js) and [`es.date.to-primitive`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.to-primitive.js). + +Annex B methods. Modules [`es.date.get-year`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.get-year.js), [`es.date.set-year`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.set-year.js) and [`es.date.to-gmt-string`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.date.to-gmt-string.js). ```js class Date { + getYear(): int; + setYear(year: int): number; + toGMTString(): string; toISOString(): string; toJSON(): string; toString(): string; @@ -962,6 +945,9 @@ class Date { core-js/es|stable|features/date core-js/es|stable|features/date/to-string core-js(-pure)/es|stable|features/date/now +core-js(-pure)/es|stable|features/date/get-year +core-js(-pure)/es|stable|features/date/set-year +core-js(-pure)/es|stable|features/date/to-gmt-string core-js(-pure)/es|stable|features/date/to-iso-string core-js(-pure)/es|stable|features/date/to-json core-js(-pure)/es|stable|features/date/to-primitive diff --git a/packages/core-js-compat/src/data.js b/packages/core-js-compat/src/data.js index 82b69d9bb950..c40ba76ecc86 100644 --- a/packages/core-js-compat/src/data.js +++ b/packages/core-js-compat/src/data.js @@ -311,6 +311,14 @@ const data = { safari: '7.1', rhino: '1.7.13', }, + 'es.date.get-year': { + chrome: '1', + firefox: '1', + ie: '3', + opera: '3', + safari: '1', + rhino: '1.7.13', + }, 'es.date.now': { chrome: '5', firefox: '2', @@ -319,6 +327,22 @@ const data = { safari: '4.0', rhino: '1.7.13', }, + 'es.date.set-year': { + chrome: '1', + firefox: '1', + ie: '3', + opera: '3', + safari: '1', + rhino: '1.7.13', + }, + 'es.date.to-gmt-string': { + chrome: '1', + firefox: '1', + ie: '3', + opera: '3', + safari: '1', + rhino: '1.7.13', + }, 'es.date.to-iso-string': { chrome: '26', firefox: '7', @@ -347,6 +371,14 @@ const data = { safari: '3.1', rhino: '1.7.13', }, + 'es.escape': { + chrome: '1', + firefox: '1', + ie: '3', + opera: '3', + safari: '1', + rhino: '1.7.13', + }, 'es.function.bind': { chrome: '7', firefox: '4', @@ -1029,6 +1061,14 @@ const data = { firefox: '40', safari: '10.0', }, + 'es.string.substr': { + chrome: '1', + ie: '4', + firefox: '1', + opera: '4', + safari: '1', + rhino: '1.7.13', + }, 'es.string.trim': { chrome: '59', edge: '15', @@ -1345,6 +1385,14 @@ const data = { firefox: '51', safari: '10.0', }, + 'es.unescape': { + chrome: '1', + firefox: '1', + ie: '3', + opera: '3', + safari: '1', + rhino: '1.7.13', + }, 'es.weak-map': { chrome: '51', edge: '15', diff --git a/packages/core-js-compat/src/modules-by-versions.js b/packages/core-js-compat/src/modules-by-versions.js index 7888a3b3902c..5ce868c70267 100644 --- a/packages/core-js-compat/src/modules-by-versions.js +++ b/packages/core-js-compat/src/modules-by-versions.js @@ -87,4 +87,12 @@ module.exports = { 'esnext.symbol.matcher', 'esnext.symbol.metadata', ], + 3.15: [ + 'es.date.get-year', + 'es.date.set-year', + 'es.date.to-gmt-string', + 'es.escape', + 'es.string.substr', + 'es.unescape', + ], }; diff --git a/packages/core-js/es/date/get-year.js b/packages/core-js/es/date/get-year.js new file mode 100644 index 000000000000..8257032ea63c --- /dev/null +++ b/packages/core-js/es/date/get-year.js @@ -0,0 +1,4 @@ +require('../../modules/es.date.get-year'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Date', 'getYear'); diff --git a/packages/core-js/es/date/index.js b/packages/core-js/es/date/index.js index 88e7a58367af..32f6b0e464ff 100644 --- a/packages/core-js/es/date/index.js +++ b/packages/core-js/es/date/index.js @@ -1,6 +1,9 @@ +require('../../modules/es.date.get-year'); require('../../modules/es.date.now'); -require('../../modules/es.date.to-json'); +require('../../modules/es.date.set-year'); +require('../../modules/es.date.to-gmt-string'); require('../../modules/es.date.to-iso-string'); +require('../../modules/es.date.to-json'); require('../../modules/es.date.to-string'); require('../../modules/es.date.to-primitive'); var path = require('../../internals/path'); diff --git a/packages/core-js/es/date/set-year.js b/packages/core-js/es/date/set-year.js new file mode 100644 index 000000000000..98b6855b13dd --- /dev/null +++ b/packages/core-js/es/date/set-year.js @@ -0,0 +1,4 @@ +require('../../modules/es.date.set-year'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Date', 'setYear'); diff --git a/packages/core-js/es/date/to-gmt-string.js b/packages/core-js/es/date/to-gmt-string.js new file mode 100644 index 000000000000..9f4e644bfbf7 --- /dev/null +++ b/packages/core-js/es/date/to-gmt-string.js @@ -0,0 +1,4 @@ +require('../../modules/es.date.to-gmt-string'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Date', 'toGMTString'); diff --git a/packages/core-js/es/escape.js b/packages/core-js/es/escape.js new file mode 100644 index 000000000000..9efe1508a45c --- /dev/null +++ b/packages/core-js/es/escape.js @@ -0,0 +1,4 @@ +require('../modules/es.escape'); +var global = require('../internals/global'); + +module.exports = global.escape; diff --git a/packages/core-js/es/string/index.js b/packages/core-js/es/string/index.js index b145d7710270..f34f568aeb6f 100644 --- a/packages/core-js/es/string/index.js +++ b/packages/core-js/es/string/index.js @@ -14,6 +14,7 @@ require('../../modules/es.string.replace-all'); require('../../modules/es.string.search'); require('../../modules/es.string.split'); require('../../modules/es.string.starts-with'); +require('../../modules/es.string.substr'); require('../../modules/es.string.trim'); require('../../modules/es.string.trim-start'); require('../../modules/es.string.trim-end'); diff --git a/packages/core-js/es/string/substr.js b/packages/core-js/es/string/substr.js new file mode 100644 index 000000000000..48c8cbcef1c4 --- /dev/null +++ b/packages/core-js/es/string/substr.js @@ -0,0 +1,4 @@ +require('../../modules/es.string.substr'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('String', 'substr'); diff --git a/packages/core-js/es/string/virtual/index.js b/packages/core-js/es/string/virtual/index.js index 206f2b29fdff..48e716546a4b 100644 --- a/packages/core-js/es/string/virtual/index.js +++ b/packages/core-js/es/string/virtual/index.js @@ -11,6 +11,7 @@ require('../../../modules/es.string.replace-all'); require('../../../modules/es.string.search'); require('../../../modules/es.string.split'); require('../../../modules/es.string.starts-with'); +require('../../../modules/es.string.substr'); require('../../../modules/es.string.trim'); require('../../../modules/es.string.trim-start'); require('../../../modules/es.string.trim-end'); diff --git a/packages/core-js/es/string/virtual/substr.js b/packages/core-js/es/string/virtual/substr.js new file mode 100644 index 000000000000..861a298ec751 --- /dev/null +++ b/packages/core-js/es/string/virtual/substr.js @@ -0,0 +1,4 @@ +require('../../../modules/es.string.substr'); +var entryVirtual = require('../../../internals/entry-virtual'); + +module.exports = entryVirtual('String').substr; diff --git a/packages/core-js/es/unescape.js b/packages/core-js/es/unescape.js new file mode 100644 index 000000000000..e8b370c129c8 --- /dev/null +++ b/packages/core-js/es/unescape.js @@ -0,0 +1,4 @@ +require('../modules/es.unescape'); +var global = require('../internals/global'); + +module.exports = global.unescape; diff --git a/packages/core-js/features/date/get-year.js b/packages/core-js/features/date/get-year.js new file mode 100644 index 000000000000..e735b23fe88c --- /dev/null +++ b/packages/core-js/features/date/get-year.js @@ -0,0 +1,3 @@ +var parent = require('../../stable/date/get-year'); + +module.exports = parent; diff --git a/packages/core-js/features/date/set-year.js b/packages/core-js/features/date/set-year.js new file mode 100644 index 000000000000..d533e7566e3a --- /dev/null +++ b/packages/core-js/features/date/set-year.js @@ -0,0 +1,3 @@ +var parent = require('../../stable/date/set-year'); + +module.exports = parent; diff --git a/packages/core-js/features/date/to-gmt-string.js b/packages/core-js/features/date/to-gmt-string.js new file mode 100644 index 000000000000..b807d99d5ffd --- /dev/null +++ b/packages/core-js/features/date/to-gmt-string.js @@ -0,0 +1,3 @@ +var parent = require('../../stable/date/to-gmt-string'); + +module.exports = parent; diff --git a/packages/core-js/features/escape.js b/packages/core-js/features/escape.js new file mode 100644 index 000000000000..af60217719dd --- /dev/null +++ b/packages/core-js/features/escape.js @@ -0,0 +1,3 @@ +var parent = require('../stable/escape'); + +module.exports = parent; diff --git a/packages/core-js/features/string/substr.js b/packages/core-js/features/string/substr.js new file mode 100644 index 000000000000..c7cbe539f66e --- /dev/null +++ b/packages/core-js/features/string/substr.js @@ -0,0 +1,3 @@ +var parent = require('../../stable/string/substr'); + +module.exports = parent; diff --git a/packages/core-js/features/string/virtual/substr.js b/packages/core-js/features/string/virtual/substr.js new file mode 100644 index 000000000000..40beb068d7a5 --- /dev/null +++ b/packages/core-js/features/string/virtual/substr.js @@ -0,0 +1,3 @@ +var parent = require('../../../stable/string/virtual/substr'); + +module.exports = parent; diff --git a/packages/core-js/features/unescape.js b/packages/core-js/features/unescape.js new file mode 100644 index 000000000000..f5d78c0e66b0 --- /dev/null +++ b/packages/core-js/features/unescape.js @@ -0,0 +1,3 @@ +var parent = require('../stable/unescape'); + +module.exports = parent; diff --git a/packages/core-js/modules/es.date.get-year.js b/packages/core-js/modules/es.date.get-year.js new file mode 100644 index 000000000000..1c4acb16ec9a --- /dev/null +++ b/packages/core-js/modules/es.date.get-year.js @@ -0,0 +1,12 @@ +'use strict'; +var $ = require('../internals/export'); + +var getFullYear = Date.prototype.getFullYear; + +// `Date.prototype.getYear` method +// https://tc39.es/ecma262/#sec-date.prototype.getyear +$({ target: 'Date', proto: true }, { + getYear: function getYear() { + return getFullYear.call(this) - 1900; + } +}); diff --git a/packages/core-js/modules/es.date.set-year.js b/packages/core-js/modules/es.date.set-year.js new file mode 100644 index 000000000000..109286a4e8a5 --- /dev/null +++ b/packages/core-js/modules/es.date.set-year.js @@ -0,0 +1,18 @@ +'use strict'; +var $ = require('../internals/export'); +var toInteger = require('../internals/to-integer'); + +var getTime = Date.prototype.getTime; +var setFullYear = Date.prototype.setFullYear; + +// `Date.prototype.setYear` method +// https://tc39.es/ecma262/#sec-date.prototype.setyear +$({ target: 'Date', proto: true }, { + setYear: function setYear(year) { + // validate + getTime.call(this); + var yi = toInteger(year); + var yyyy = 0 <= yi && yi <= 99 ? yi + 1900 : yi; + return setFullYear.call(this, yyyy); + } +}); diff --git a/packages/core-js/modules/es.date.to-gmt-string.js b/packages/core-js/modules/es.date.to-gmt-string.js new file mode 100644 index 000000000000..f2c43a2c8586 --- /dev/null +++ b/packages/core-js/modules/es.date.to-gmt-string.js @@ -0,0 +1,7 @@ +var $ = require('../internals/export'); + +// `Date.prototype.toGMTString` method +// https://tc39.es/ecma262/#sec-date.prototype.togmtstring +$({ target: 'Date', proto: true }, { + toGMTString: Date.prototype.toUTCString +}); diff --git a/packages/core-js/modules/es.escape.js b/packages/core-js/modules/es.escape.js new file mode 100644 index 000000000000..bc4677008517 --- /dev/null +++ b/packages/core-js/modules/es.escape.js @@ -0,0 +1,35 @@ +'use strict'; +var $ = require('../internals/export'); + +var raw = /[\w*+\-./@]/; + +var hex = function (code, length) { + var result = code.toString(16); + while (result.length < length) result = '0' + result; + return result; +}; + +// `escape` method +// https://tc39.es/ecma262/#sec-escape-string +$({ global: true }, { + escape: function escape(string) { + var str = String(string); + var result = ''; + var length = str.length; + var index = 0; + var chr, code; + while (index < length) { + chr = str.charAt(index++); + if (raw.test(chr)) { + result += chr; + } else { + code = chr.charCodeAt(0); + if (code < 256) { + result += '%' + hex(code, 2); + } else { + result += '%u' + hex(code, 4).toUpperCase(); + } + } + } return result; + } +}); diff --git a/packages/core-js/modules/es.string.substr.js b/packages/core-js/modules/es.string.substr.js new file mode 100644 index 000000000000..e587dea5a89a --- /dev/null +++ b/packages/core-js/modules/es.string.substr.js @@ -0,0 +1,25 @@ +'use strict'; +var $ = require('../internals/export'); +var requireObjectCoercible = require('../internals/require-object-coercible'); +var toInteger = require('../internals/to-integer'); + +var slice = ''.slice; +var max = Math.max; +var min = Math.min; + +// `String.prototype.substr` method +// https://tc39.es/ecma262/#sec-string.prototype.substr +$({ target: 'String', proto: true }, { + substr: function substr(start, length) { + var that = String(requireObjectCoercible(this)); + var size = that.length; + var intStart = toInteger(start); + var intLength, intEnd; + if (intStart === Infinity) intStart = 0; + if (intStart < 0) intStart = max(size + intStart, 0); + intLength = length === undefined ? size : toInteger(length); + if (intLength <= 0 || intLength === Infinity) return ''; + intEnd = min(intStart + intLength, size); + return intStart >= intEnd ? '' : slice.call(that, intStart, intEnd); + } +}); diff --git a/packages/core-js/modules/es.unescape.js b/packages/core-js/modules/es.unescape.js new file mode 100644 index 000000000000..510f8635a3cb --- /dev/null +++ b/packages/core-js/modules/es.unescape.js @@ -0,0 +1,39 @@ +'use strict'; +var $ = require('../internals/export'); + +var fromCharCode = String.fromCharCode; +var hex2 = /^[\da-f]{2}$/i; +var hex4 = /^[\da-f]{4}$/i; + +// `unescape` method +// https://tc39.es/ecma262/#sec-unescape-string +$({ global: true }, { + unescape: function unescape(string) { + var str = String(string); + var result = ''; + var length = str.length; + var index = 0; + var chr, slice; + while (index < length) { + chr = str.charAt(index++); + if (chr === '%') { + if (str.charAt(index) === 'u') { + slice = str.slice(index + 1, index + 5); + if (hex4.test(slice)) { + result += fromCharCode(parseInt(slice, 16)); + index += 5; + continue; + } + } else { + slice = str.slice(index, index + 2); + if (hex2.test(slice)) { + result += fromCharCode(parseInt(slice, 16)); + index += 2; + continue; + } + } + } + result += chr; + } return result; + } +}); diff --git a/packages/core-js/stable/date/get-year.js b/packages/core-js/stable/date/get-year.js new file mode 100644 index 000000000000..bed76d9b6434 --- /dev/null +++ b/packages/core-js/stable/date/get-year.js @@ -0,0 +1,3 @@ +var parent = require('../../es/date/get-year'); + +module.exports = parent; diff --git a/packages/core-js/stable/date/set-year.js b/packages/core-js/stable/date/set-year.js new file mode 100644 index 000000000000..e181bd5ae891 --- /dev/null +++ b/packages/core-js/stable/date/set-year.js @@ -0,0 +1,3 @@ +var parent = require('../../es/date/set-year'); + +module.exports = parent; diff --git a/packages/core-js/stable/date/to-gmt-string.js b/packages/core-js/stable/date/to-gmt-string.js new file mode 100644 index 000000000000..cb470a0823b3 --- /dev/null +++ b/packages/core-js/stable/date/to-gmt-string.js @@ -0,0 +1,3 @@ +var parent = require('../../es/date/to-gmt-string'); + +module.exports = parent; diff --git a/packages/core-js/stable/escape.js b/packages/core-js/stable/escape.js new file mode 100644 index 000000000000..20e332cc1978 --- /dev/null +++ b/packages/core-js/stable/escape.js @@ -0,0 +1,3 @@ +var parent = require('../es/escape'); + +module.exports = parent; diff --git a/packages/core-js/stable/string/substr.js b/packages/core-js/stable/string/substr.js new file mode 100644 index 000000000000..4e31b7e7eaca --- /dev/null +++ b/packages/core-js/stable/string/substr.js @@ -0,0 +1,3 @@ +var parent = require('../../es/string/substr'); + +module.exports = parent; diff --git a/packages/core-js/stable/string/virtual/substr.js b/packages/core-js/stable/string/virtual/substr.js new file mode 100644 index 000000000000..08eaf1900259 --- /dev/null +++ b/packages/core-js/stable/string/virtual/substr.js @@ -0,0 +1,3 @@ +var parent = require('../../../es/string/virtual/substr'); + +module.exports = parent; diff --git a/packages/core-js/stable/unescape.js b/packages/core-js/stable/unescape.js new file mode 100644 index 000000000000..014d61d33766 --- /dev/null +++ b/packages/core-js/stable/unescape.js @@ -0,0 +1,3 @@ +var parent = require('../es/unescape'); + +module.exports = parent; diff --git a/tests/commonjs.js b/tests/commonjs.js index 3b8c6faf4e8a..34fbd241cb07 100644 --- a/tests/commonjs.js +++ b/tests/commonjs.js @@ -1660,6 +1660,18 @@ for (PATH of ['core-js-pure', 'core-js']) { ok(typeof instanceValues([]) === 'function'); ok(instanceValues([]).call([1, 2, 3]).next().value === 1); + for (const key of ['es', 'stable', 'features']) { + const date = new Date(); + ok(load(`${ key }/date/get-year`)(date) === date.getFullYear() - 1900); + load(`${ key }/date/set-year`)(date, 1); + ok(date.getFullYear() === 1901); + ok(load(`${ key }/date/to-gmt-string`)(date) === date.toUTCString()); + ok(load(`${ key }/string/substr`)('12345', 1, 3) === '234'); + ok(load(`${ key }/string/virtual/substr`).call('12345', 1, 3) === '234'); + ok(load(`${ key }/escape`)('!q2ф') === '%21q2%u0444'); + ok(load(`${ key }/unescape`)('%21q2%u0444') === '!q2ф'); + } + for (const key in compat) load(`modules/${ key }`); } diff --git a/tests/compat/tests.js b/tests/compat/tests.js index 93a4a83f470a..9938ffed84f2 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -448,9 +448,18 @@ GLOBAL.tests = { return new ArrayBuffer(2).slice(1, undefined).byteLength; }], 'es.data-view': ARRAY_BUFFER_SUPPORT, + 'es.date.get-year': function () { + return Date.prototype.getYear; + }, 'es.date.now': function () { return Date.now; }, + 'es.date.set-year': function () { + return Date.prototype.setYear; + }, + 'es.date.to-gmt-string': function () { + return Date.prototype.toGMTString; + }, 'es.date.to-iso-string': function () { try { new Date(NaN).toISOString(); @@ -468,6 +477,9 @@ GLOBAL.tests = { 'es.date.to-string': function () { return new Date(NaN).toString() == 'Invalid Date'; }, + 'es.escape': function () { + return escape; + }, 'es.function.bind': function () { return Function.prototype.bind; }, @@ -933,6 +945,9 @@ GLOBAL.tests = { return ''.split(O) == 7 && execCalled && result.length === 2 && result[0] === 'a' && result[1] === 'b'; }, 'es.string.starts-with': createIsRegExpLogicTest('startsWith'), + 'es.string.substr': function () { + return ''.substr; + }, 'es.string.trim': createStringTrimMethodTest('trim'), 'es.string.trim-end': [createStringTrimMethodTest('trimEnd'), function () { return String.prototype.trimRight === String.prototype.trimEnd; @@ -1102,6 +1117,9 @@ GLOBAL.tests = { 'es.typed-array.to-string': [ARRAY_BUFFER_VIEWS_SUPPORT, function () { return Int8Array.prototype.toString == Array.prototype.toString; }], + 'es.unescape': function () { + return unescape; + }, 'es.weak-map': [SAFE_ITERATION_CLOSING_SUPPORT, function () { var key = Object.freeze({}); var called = 0; diff --git a/tests/pure/es.date.get-year.js b/tests/pure/es.date.get-year.js new file mode 100644 index 000000000000..366509a2802a --- /dev/null +++ b/tests/pure/es.date.get-year.js @@ -0,0 +1,7 @@ +import getYear from 'core-js-pure/es/date/get-year'; + +QUnit.test('Date#getYear', assert => { + assert.isFunction(getYear); + const date = new Date(); + assert.same(getYear(date), date.getFullYear() - 1900); +}); diff --git a/tests/pure/es.date.set-year.js b/tests/pure/es.date.set-year.js new file mode 100644 index 000000000000..c26baa279139 --- /dev/null +++ b/tests/pure/es.date.set-year.js @@ -0,0 +1,8 @@ +import setYear from 'core-js-pure/es/date/set-year'; + +QUnit.test('Date#setYear', assert => { + assert.isFunction(setYear); + const date = new Date(); + setYear(date, 1); + assert.same(date.getFullYear(), 1901); +}); diff --git a/tests/pure/es.date.to-gmt-string.js b/tests/pure/es.date.to-gmt-string.js new file mode 100644 index 000000000000..f2ca5b3dadfb --- /dev/null +++ b/tests/pure/es.date.to-gmt-string.js @@ -0,0 +1,7 @@ +import toGMTString from 'core-js-pure/es/date/to-gmt-string'; + +QUnit.test('Date#toGMTString', assert => { + assert.isFunction(toGMTString); + const date = new Date(); + assert.same(toGMTString(date), date.toUTCString()); +}); diff --git a/tests/pure/es.escape.js b/tests/pure/es.escape.js new file mode 100644 index 000000000000..e7213ddcfe74 --- /dev/null +++ b/tests/pure/es.escape.js @@ -0,0 +1,9 @@ +import escape from 'core-js-pure/es/escape'; + +QUnit.test('escape', assert => { + assert.isFunction(escape); + assert.arity(escape, 1); + assert.same(escape('!q2ф'), '%21q2%u0444'); + assert.same(escape(null), 'null'); + assert.same(escape(undefined), 'undefined'); +}); diff --git a/tests/pure/es.string.substr.js b/tests/pure/es.string.substr.js new file mode 100644 index 000000000000..7c5a8ddfd72f --- /dev/null +++ b/tests/pure/es.string.substr.js @@ -0,0 +1,13 @@ +import substr from 'core-js-pure/es/string/substr'; +import { STRICT } from '../helpers/constants'; + +QUnit.test('String#substr', assert => { + assert.isFunction(substr); + + assert.same(substr('12345', 1, 3), '234'); + + if (STRICT) { + assert.throws(() => substr(null, 1, 3), TypeError, 'Throws on null as `this`'); + assert.throws(() => substr(undefined, 1, 3), TypeError, 'Throws on undefined as `this`'); + } +}); diff --git a/tests/pure/es.unescape.js b/tests/pure/es.unescape.js new file mode 100644 index 000000000000..ac141e21a45b --- /dev/null +++ b/tests/pure/es.unescape.js @@ -0,0 +1,10 @@ +import unescape from 'core-js-pure/es/unescape'; + +QUnit.test('unescape', assert => { + assert.isFunction(unescape); + assert.arity(unescape, 1); + assert.same(unescape('%21q2%u0444'), '!q2ф'); + assert.same(unescape('%u044q2%21'), '%u044q2!'); + assert.same(unescape(null), 'null'); + assert.same(unescape(undefined), 'undefined'); +}); diff --git a/tests/tests/es.date.get-year.js b/tests/tests/es.date.get-year.js new file mode 100644 index 000000000000..466c6434e9c0 --- /dev/null +++ b/tests/tests/es.date.get-year.js @@ -0,0 +1,10 @@ +QUnit.test('Date#getYear', assert => { + const { getYear } = Date.prototype; + assert.isFunction(getYear); + assert.arity(getYear, 0); + assert.name(getYear, 'getYear'); + assert.looksNative(getYear); + assert.nonEnumerable(Date.prototype, 'getYear'); + const date = new Date(); + assert.same(date.getYear(), date.getFullYear() - 1900); +}); diff --git a/tests/tests/es.date.set-year.js b/tests/tests/es.date.set-year.js new file mode 100644 index 000000000000..850c554d0320 --- /dev/null +++ b/tests/tests/es.date.set-year.js @@ -0,0 +1,11 @@ +QUnit.test('Date#setYear', assert => { + const { setYear } = Date.prototype; + assert.isFunction(setYear); + assert.arity(setYear, 1); + assert.name(setYear, 'setYear'); + assert.looksNative(setYear); + assert.nonEnumerable(Date.prototype, 'setYear'); + const date = new Date(); + date.setYear(1); + assert.same(date.getFullYear(), 1901); +}); diff --git a/tests/tests/es.date.to-gmt-string.js b/tests/tests/es.date.to-gmt-string.js new file mode 100644 index 000000000000..a64b1d94223f --- /dev/null +++ b/tests/tests/es.date.to-gmt-string.js @@ -0,0 +1,11 @@ +QUnit.test('Date#toGMTString', assert => { + const { toGMTString } = Date.prototype; + assert.isFunction(toGMTString); + assert.arity(toGMTString, 0); + // assert.name(toGMTString, 'toUTCString'); // at least old WebKit + assert.looksNative(toGMTString); + assert.nonEnumerable(Date.prototype, 'toGMTString'); + // assert.same(toGMTString, Date.prototype.toUTCString); // at least old WebKit + const date = new Date(); + assert.same(date.toGMTString(), date.toUTCString()); +}); diff --git a/tests/tests/es.escape.js b/tests/tests/es.escape.js new file mode 100644 index 000000000000..4db67831eb6d --- /dev/null +++ b/tests/tests/es.escape.js @@ -0,0 +1,9 @@ +QUnit.test('escape', assert => { + assert.isFunction(escape); + assert.name(escape, 'escape'); + assert.arity(escape, 1); + assert.looksNative(escape); + assert.same(escape('!q2ф'), '%21q2%u0444'); + assert.same(escape(null), 'null'); + assert.same(escape(undefined), 'undefined'); +}); diff --git a/tests/tests/es.string.substr.js b/tests/tests/es.string.substr.js new file mode 100644 index 000000000000..359505b92593 --- /dev/null +++ b/tests/tests/es.string.substr.js @@ -0,0 +1,18 @@ +/* eslint-disable unicorn/prefer-string-slice -- required for testing */ +import { STRICT } from '../helpers/constants'; + +QUnit.test('String#substr', assert => { + const { substr } = String.prototype; + assert.isFunction(substr); + assert.arity(substr, 2); + assert.name(substr, 'substr'); + assert.looksNative(substr); + assert.nonEnumerable(String.prototype, 'substr'); + + assert.same('12345'.substr(1, 3), '234'); + + if (STRICT) { + assert.throws(() => substr.call(null, 1, 3), TypeError, 'Throws on null as `this`'); + assert.throws(() => substr.call(undefined, 1, 3), TypeError, 'Throws on undefined as `this`'); + } +}); diff --git a/tests/tests/es.unescape.js b/tests/tests/es.unescape.js new file mode 100644 index 000000000000..a26b5e133d5c --- /dev/null +++ b/tests/tests/es.unescape.js @@ -0,0 +1,10 @@ +QUnit.test('unescape', assert => { + assert.isFunction(unescape); + assert.name(unescape, 'unescape'); + assert.arity(unescape, 1); + assert.looksNative(unescape); + assert.same(unescape('%21q2%u0444'), '!q2ф'); + assert.same(unescape('%u044q2%21'), '%u044q2!'); + assert.same(unescape(null), 'null'); + assert.same(unescape(undefined), 'undefined'); +});