From de06be9b462f07e5155acf23e4f71b449cb804fd Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Wed, 3 Apr 2024 01:17:21 +0700 Subject: [PATCH] start experimental building built-in definitions from entries definitions --- .gitignore | 1 + scripts/build-entries/entries-definitions.mjs | 299 +++++++++++++++++- scripts/build-entries/index.mjs | 37 ++- 3 files changed, 331 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index a550faf95c9d..75fdbd442cab 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ node_modules/ /packages/core-js-bundle/minified.js.map /packages/core-js-bundle/postinstall.js /packages/core-js-compat/LICENSE +/packages/core-js-compat/built-in-definitions.json /packages/core-js-compat/data.json /packages/core-js-compat/entries.json /packages/core-js-compat/external.json diff --git a/scripts/build-entries/entries-definitions.mjs b/scripts/build-entries/entries-definitions.mjs index 57f381acf72b..45d0f1733f32 100644 --- a/scripts/build-entries/entries-definitions.mjs +++ b/scripts/build-entries/entries-definitions.mjs @@ -153,6 +153,7 @@ export const features = { modules: [/^(?:es|esnext)\.aggregate-error\./], template: $namespace, name: 'AggregateError', + injectOn: 'global', }, 'array/index': { modules: [/^(?:es|esnext)\.array\./], @@ -320,12 +321,14 @@ export const features = { template: $static, namespace: 'Array', name: 'from', + injectOn: 'static', }, 'array/from-async': { modules: ['esnext.array.from-async'], template: $static, namespace: 'Array', name: 'fromAsync', + injectOn: 'static', }, 'array/includes': { modules: ['es.array.includes'], @@ -356,6 +359,7 @@ export const features = { template: $static, namespace: 'Array', name: 'isTemplateObject', + injectOn: 'static', }, 'array/iterator': { modules: ['es.array.iterator'], @@ -420,6 +424,7 @@ export const features = { template: $static, namespace: 'Array', name: 'of', + injectOn: 'static', }, 'array/push': { modules: ['es.array.push'], @@ -598,12 +603,16 @@ export const features = { modules: ['es.array-buffer.constructor', ...ArrayBufferPrototypeMethods], template: $namespace, name: 'ArrayBuffer', + injectOn: 'global', + globalModeOnly: true, }, 'array-buffer/is-view': { modules: ['es.array-buffer.is-view'], template: $static, namespace: 'ArrayBuffer', name: 'isView', + injectOn: 'static', + globalModeOnly: true, }, 'array-buffer/detached': { modules: ['es.array-buffer.detached'], @@ -630,6 +639,7 @@ export const features = { modules: ['esnext.async-disposable-stack.constructor'], template: $namespace, name: 'AsyncDisposableStack', + injectOn: 'global', }, 'async-iterator/index': { modules: [/^(?:es|esnext)\.async-iterator\./], @@ -640,12 +650,14 @@ export const features = { modules: ['esnext.async-iterator.constructor', ...AsyncIteratorPrototypeMethods], template: $namespace, name: 'AsyncIterator', + injectOn: 'global', }, 'async-iterator/from': { modules: ['esnext.async-iterator.from', ...AsyncIteratorPrototypeMethods], template: $static, namespace: 'AsyncIterator', name: 'from', + injectOn: 'static', }, 'async-iterator/drop': { modules: ['esnext.async-iterator.drop'], @@ -788,22 +800,36 @@ export const features = { modules: [/^(?:es|esnext)\.data-view\./], template: $namespace, name: 'DataView', + injectOn: 'global', + globalModeOnly: true, }, 'data-view/get-float16': { modules: ['esnext.data-view.get-float16'], template: $justImport, + name: 'getFloat16', + injectOn: 'instance', + globalModeOnly: true, }, 'data-view/get-uint8-clamped': { modules: ['esnext.data-view.get-uint8-clamped'], template: $justImport, + name: 'getUint8Clamped', + injectOn: 'instance', + globalModeOnly: true, }, 'data-view/set-float16': { modules: ['esnext.data-view.set-float16'], template: $justImport, + name: 'setFloat16', + injectOn: 'instance', + globalModeOnly: true, }, 'data-view/set-uint8-clamped': { modules: ['esnext.data-view.set-uint8-clamped'], template: $justImport, + name: 'setUint8Clamped', + injectOn: 'instance', + globalModeOnly: true, }, 'date/index': { modules: [/^(?:es|esnext)\.date\./], @@ -831,6 +857,7 @@ export const features = { modules: ['esnext.disposable-stack.constructor'], template: $namespace, name: 'DisposableStack', + injectOn: 'global', }, 'dom-collections/index': { modules: [/^web\.dom-collections\./], @@ -865,6 +892,7 @@ export const features = { modules: [/^web\.dom-exception\./], template: $namespace, name: 'DOMException', + injectOn: 'global', }, 'error/index': { modules: [/^(?:es|esnext)\.error\./], @@ -872,7 +900,7 @@ export const features = { }, 'error/constructor': { modules: [/^(?:es|esnext)\.error\./], - template: $path, + template: $path, // !!!!!!! }, 'function/index': { modules: [/^(?:es|esnext)\.function\./], @@ -899,254 +927,304 @@ export const features = { modules: ['es.array.at', 'es.string.at'], template: $instanceArrayString, name: 'at', + injectOn: 'instance', }, 'instance/code-point-at': { modules: ['es.string.code-point-at'], template: $instanceString, name: 'codePointAt', + injectOn: 'instance', }, 'instance/concat': { modules: ['es.array.concat'], template: $instanceArray, name: 'concat', + injectOn: 'instance', }, 'instance/copy-within': { modules: ['es.array.copy-within'], template: $instanceArray, name: 'copyWithin', + injectOn: 'instance', }, 'instance/demethodize': { modules: ['esnext.function.demethodize'], template: $instanceFunction, name: 'demethodize', + injectOn: 'instance', }, 'instance/ends-with': { modules: ['es.string.ends-with'], template: $instanceString, name: 'endsWith', + injectOn: 'instance', }, 'instance/entries': { modules: ['es.array.entries', 'web.dom-collections.entries'], template: $instanceArray, templateStable: $instanceArrayDOMIterables, name: 'entries', + injectOn: 'instance', }, 'instance/fill': { modules: ['es.array.fill'], template: $instanceArray, name: 'fill', + injectOn: 'instance', }, 'instance/filter': { modules: ['es.array.filter'], template: $instanceArray, name: 'filter', + injectOn: 'instance', }, 'instance/filter-reject': { modules: ['esnext.array.filter-reject'], template: $instanceArray, name: 'filterReject', + injectOn: 'instance', }, 'instance/find': { modules: ['es.array.find'], template: $instanceArray, name: 'find', + injectOn: 'instance', }, 'instance/find-index': { modules: ['es.array.find-index'], template: $instanceArray, name: 'findIndex', + injectOn: 'instance', }, 'instance/find-last': { modules: ['es.array.find-last'], template: $instanceArray, name: 'findLast', + injectOn: 'instance', }, 'instance/find-last-index': { modules: ['es.array.find-last-index'], template: $instanceArray, name: 'findLastIndex', + injectOn: 'instance', }, 'instance/flags': { modules: ['es.regexp.flags'], template: $instanceRegExpFlags, name: 'flags', + injectOn: 'instance', }, 'instance/flat': { modules: ['es.array.flat'], template: $instanceArray, name: 'flat', + injectOn: 'instance', }, 'instance/flat-map': { modules: ['es.array.flat-map'], template: $instanceArray, name: 'flatMap', + injectOn: 'instance', }, 'instance/for-each': { modules: ['web.dom-collections.for-each'], template: $instanceDOMIterables, name: 'forEach', + injectOn: 'instance', }, 'instance/includes': { modules: ['es.array.includes', 'es.string.includes'], template: $instanceArrayString, name: 'includes', + injectOn: 'instance', }, 'instance/index-of': { modules: ['es.array.index-of'], template: $instanceArray, name: 'indexOf', + injectOn: 'instance', }, 'instance/is-well-formed': { modules: ['es.string.is-well-formed'], template: $instanceString, name: 'isWellFormed', + injectOn: 'instance', }, 'instance/keys': { modules: ['es.array.keys', 'web.dom-collections.keys'], template: $instanceArray, templateStable: $instanceArrayDOMIterables, name: 'keys', + injectOn: 'instance', }, 'instance/last-index-of': { modules: ['es.array.last-index-of'], template: $instanceArray, name: 'lastIndexOf', + injectOn: 'instance', }, 'instance/map': { modules: ['es.array.map'], template: $instanceArray, name: 'map', + injectOn: 'instance', }, 'instance/match-all': { modules: ['es.string.match-all'], template: $instanceString, name: 'matchAll', + injectOn: 'instance', }, 'instance/pad-end': { modules: ['es.string.pad-end'], template: $instanceString, name: 'padEnd', + injectOn: 'instance', }, 'instance/pad-start': { modules: ['es.string.pad-start'], template: $instanceString, name: 'padStart', + injectOn: 'instance', }, 'instance/push': { modules: ['es.array.push'], template: $instanceArray, name: 'push', + injectOn: 'instance', }, 'instance/reduce': { modules: ['es.array.reduce'], template: $instanceArray, name: 'reduce', + injectOn: 'instance', }, 'instance/reduce-right': { modules: ['es.array.reduce-right'], template: $instanceArray, name: 'reduceRight', + injectOn: 'instance', }, 'instance/repeat': { modules: ['es.string.repeat'], template: $instanceString, name: 'repeat', + injectOn: 'instance', }, 'instance/replace-all': { modules: ['es.string.replace-all'], template: $instanceString, name: 'replaceAll', + injectOn: 'instance', }, 'instance/reverse': { modules: ['es.array.reverse'], template: $instanceArray, name: 'reverse', + injectOn: 'instance', }, 'instance/slice': { modules: ['es.array.slice'], template: $instanceArray, name: 'slice', + injectOn: 'instance', }, 'instance/sort': { modules: ['es.array.sort'], template: $instanceArray, name: 'sort', + injectOn: 'instance', }, 'instance/splice': { modules: ['es.array.splice'], template: $instanceArray, name: 'splice', + injectOn: 'instance', }, 'instance/starts-with': { modules: ['es.string.starts-with'], template: $instanceString, name: 'startsWith', + injectOn: 'instance', }, 'instance/to-reversed': { modules: ['es.array.to-reversed'], template: $instanceArray, name: 'toReversed', + injectOn: 'instance', }, 'instance/to-sorted': { modules: ['es.array.to-sorted'], template: $instanceArray, name: 'toSorted', + injectOn: 'instance', }, 'instance/to-spliced': { modules: ['es.array.to-spliced'], template: $instanceArray, name: 'toSpliced', + injectOn: 'instance', }, 'instance/to-well-formed': { modules: ['es.string.to-well-formed'], template: $instanceString, name: 'toWellFormed', + injectOn: 'instance', }, 'instance/trim': { modules: ['es.string.trim'], template: $instanceString, name: 'trim', + injectOn: 'instance', }, 'instance/trim-end': { modules: ['es.string.trim-end'], template: $instanceString, name: 'trimEnd', + injectOn: 'instance', }, 'instance/trim-left': { modules: ['es.string.trim-left'], template: $instanceString, name: 'trimLeft', + injectOn: 'instance', }, 'instance/trim-right': { modules: ['es.string.trim-right'], template: $instanceString, name: 'trimRight', + injectOn: 'instance', }, 'instance/trim-start': { modules: ['es.string.trim-start'], template: $instanceString, name: 'trimStart', + injectOn: 'instance', }, 'instance/unique-by': { modules: ['esnext.array.unique-by'], template: $instanceArray, name: 'uniqueBy', + injectOn: 'instance', }, 'instance/unshift': { modules: ['es.array.unshift'], template: $instanceArray, name: 'unshift', + injectOn: 'instance', }, 'instance/values': { modules: ['es.array.values', 'web.dom-collections.values'], template: $instanceArray, templateStable: $instanceArrayDOMIterables, name: 'values', + injectOn: 'instance', }, 'instance/with': { modules: ['es.array.with'], template: $instanceArray, name: 'with', + injectOn: 'instance', }, 'iterator/index': { modules: [/^(?:es|esnext)\.iterator\./], @@ -1157,12 +1235,14 @@ export const features = { modules: ['esnext.iterator.constructor', ...IteratorPrototypeMethods], template: $namespace, name: 'Iterator', + injectOn: 'global', }, 'iterator/from': { modules: ['esnext.iterator.from', ...IteratorPrototypeMethods], template: $static, namespace: 'Iterator', name: 'from', + injectOn: 'static', }, 'iterator/drop': { modules: ['esnext.iterator.drop'], @@ -1253,6 +1333,7 @@ export const features = { template: $static, namespace: 'Iterator', name: 'range', + injectOn: 'static', }, 'iterator/reduce': { modules: ['esnext.iterator.reduce'], @@ -1324,24 +1405,28 @@ export const features = { template: $static, namespace: 'JSON', name: 'isRawJSON', + injectOn: 'static', }, 'json/parse': { modules: ['esnext.json.parse'], template: $static, namespace: 'JSON', name: 'parse', + injectOn: 'static', }, 'json/raw-json': { modules: ['esnext.json.raw-json'], template: $static, namespace: 'JSON', name: 'rawJSON', + injectOn: 'static', }, 'json/stringify': { modules: ['es.json.stringify'], template: $patchableStatic, namespace: 'JSON', name: 'stringify', + injectOn: 'static', }, 'map/index': { modules: [/^(?:es|esnext)\.map\./], @@ -1352,6 +1437,7 @@ export const features = { modules: [...MapWithPrototype], template: $namespace, name: 'Map', + injectOn: 'global', }, 'map/emplace': { modules: ['esnext.map.emplace'], @@ -1371,12 +1457,14 @@ export const features = { template: $static, namespace: 'Map', name: 'from', + injectOn: 'static', }, 'map/group-by': { modules: ['es.map.group-by', ...MapWithPrototype], template: $static, namespace: 'Map', name: 'groupBy', + injectOn: 'static', }, 'map/of': { modules: ['esnext.map.of', ...MapWithPrototype], @@ -1384,6 +1472,7 @@ export const features = { template: $static, namespace: 'Map', name: 'of', + injectOn: 'static', }, 'math/index': { modules: [/^(?:es|esnext)\.math\./], @@ -1395,114 +1484,133 @@ export const features = { template: $static, namespace: 'Math', name: 'acosh', + injectOn: 'static', }, 'math/asinh': { modules: ['es.math.asinh'], template: $static, namespace: 'Math', name: 'asinh', + injectOn: 'static', }, 'math/atanh': { modules: ['es.math.atanh'], template: $static, namespace: 'Math', name: 'atanh', + injectOn: 'static', }, 'math/cbrt': { modules: ['es.math.cbrt'], template: $static, namespace: 'Math', name: 'cbrt', + injectOn: 'static', }, 'math/clz32': { modules: ['es.math.clz32'], template: $static, namespace: 'Math', name: 'clz32', + injectOn: 'static', }, 'math/cosh': { modules: ['es.math.cosh'], template: $static, namespace: 'Math', name: 'cosh', + injectOn: 'static', }, 'math/expm1': { modules: ['es.math.expm1'], template: $static, namespace: 'Math', name: 'expm1', + injectOn: 'static', }, 'math/fround': { modules: ['es.math.fround'], template: $static, namespace: 'Math', name: 'fround', + injectOn: 'static', }, 'math/f16round': { modules: ['esnext.math.f16round'], template: $static, namespace: 'Math', name: 'f16round', + injectOn: 'static', }, 'math/hypot': { modules: ['es.math.hypot'], template: $static, namespace: 'Math', name: 'hypot', + injectOn: 'static', }, 'math/imul': { modules: ['es.math.imul'], template: $static, namespace: 'Math', name: 'imul', + injectOn: 'static', }, 'math/log10': { modules: ['es.math.log10'], template: $static, namespace: 'Math', name: 'log10', + injectOn: 'static', }, 'math/log1p': { modules: ['es.math.log1p'], template: $static, namespace: 'Math', name: 'log1p', + injectOn: 'static', }, 'math/log2': { modules: ['es.math.log2'], template: $static, namespace: 'Math', name: 'log2', + injectOn: 'static', }, 'math/sign': { modules: ['es.math.sign'], template: $static, namespace: 'Math', name: 'sign', + injectOn: 'static', }, 'math/sinh': { modules: ['es.math.sinh'], template: $static, namespace: 'Math', name: 'sinh', + injectOn: 'static', }, 'math/sum-precise': { modules: ['esnext.math.sum-precise'], template: $static, namespace: 'Math', name: 'sumPrecise', + injectOn: 'static', }, 'math/tanh': { modules: ['es.math.tanh'], template: $static, namespace: 'Math', name: 'tanh', + injectOn: 'static', }, 'math/trunc': { modules: ['es.math.trunc'], template: $static, namespace: 'Math', name: 'trunc', + injectOn: 'static', }, 'number/index': { modules: [/^(?:es|esnext)\.number\./], @@ -1513,66 +1621,79 @@ export const features = { modules: ['es.number.constructor'], template: $namespace, name: 'Number', + injectOn: 'global', + globalModeOnly: true, }, 'number/epsilon': { modules: ['es.number.epsilon'], template: $static, namespace: 'Number', name: 'EPSILON', + injectOn: 'static', }, 'number/is-finite': { modules: ['es.number.is-finite'], template: $static, namespace: 'Number', name: 'isFinite', + injectOn: 'static', }, 'number/is-integer': { modules: ['es.number.is-integer'], template: $static, namespace: 'Number', name: 'isInteger', + injectOn: 'static', }, 'number/is-nan': { modules: ['es.number.is-nan'], template: $static, namespace: 'Number', name: 'isNaN', + injectOn: 'static', }, 'number/is-safe-integer': { modules: ['es.number.is-safe-integer'], template: $static, namespace: 'Number', name: 'isSafeInteger', + injectOn: 'static', }, 'number/max-safe-integer': { modules: ['es.number.max-safe-integer'], template: $static, namespace: 'Number', name: 'MAX_SAFE_INTEGER', + injectOn: 'static', }, 'number/min-safe-integer': { modules: ['es.number.min-safe-integer'], template: $static, namespace: 'Number', name: 'MIN_SAFE_INTEGER', + injectOn: 'static', }, 'number/parse-float': { modules: ['es.number.parse-float'], template: $static, namespace: 'Number', name: 'parseFloat', + injectOn: 'static', }, 'number/parse-int': { modules: ['es.number.parse-int'], template: $static, namespace: 'Number', name: 'parseInt', + injectOn: 'static', }, 'number/to-exponential': { modules: ['es.number.to-exponential'], template: $prototype, namespace: 'Number', name: 'toExponential', + injectOn: 'instance', + globalModeOnly: true, }, 'number/virtual/to-exponential': { modules: ['es.number.to-exponential'], @@ -1585,6 +1706,8 @@ export const features = { template: $prototype, namespace: 'Number', name: 'toFixed', + injectOn: 'instance', + globalModeOnly: true, }, 'number/virtual/to-fixed': { modules: ['es.number.to-fixed'], @@ -1602,6 +1725,7 @@ export const features = { template: $static, namespace: 'Object', name: 'assign', + injectOn: 'static', }, 'object/create': { modules: [], @@ -1609,6 +1733,7 @@ export const features = { template: $patchableStatic, namespace: 'Object', name: 'create', + injectOn: 'static', }, 'object/define-property': { modules: [], @@ -1616,6 +1741,7 @@ export const features = { template: $patchableStatic, namespace: 'Object', name: 'defineProperty', + injectOn: 'static', }, 'object/define-properties': { modules: [], @@ -1623,12 +1749,15 @@ export const features = { template: $patchableStatic, namespace: 'Object', name: 'defineProperties', + injectOn: 'static', }, 'object/define-getter': { modules: ['es.object.define-getter'], template: $prototype, namespace: 'Object', name: '__defineGetter__', + injectOn: 'instance', + globalModeOnly: true, }, 'object/virtual/define-getter': { modules: ['es.object.define-getter'], @@ -1641,6 +1770,8 @@ export const features = { template: $prototype, namespace: 'Object', name: '__defineSetter__', + injectOn: 'instance', + globalModeOnly: true, }, 'object/virtual/define-setter': { modules: ['es.object.define-setter'], @@ -1653,96 +1784,113 @@ export const features = { template: $static, namespace: 'Object', name: 'entries', + injectOn: 'static', }, 'object/freeze': { modules: ['es.object.freeze'], template: $static, namespace: 'Object', name: 'freeze', + injectOn: 'static', }, 'object/from-entries': { modules: ['es.object.from-entries'], template: $static, namespace: 'Object', name: 'fromEntries', + injectOn: 'static', }, 'object/get-own-property-descriptor': { modules: ['es.object.get-own-property-descriptor'], template: $patchableStatic, namespace: 'Object', name: 'getOwnPropertyDescriptor', + injectOn: 'static', }, 'object/get-own-property-descriptors': { modules: ['es.object.get-own-property-descriptors'], template: $static, namespace: 'Object', name: 'getOwnPropertyDescriptors', + injectOn: 'static', }, 'object/get-own-property-names': { modules: ['es.object.get-own-property-names'], template: $patchableStatic, namespace: 'Object', name: 'getOwnPropertyNames', + injectOn: 'static', }, 'object/get-own-property-symbols': { modules: ['es.object.get-own-property-symbols'], template: $static, namespace: 'Object', name: 'getOwnPropertySymbols', + injectOn: 'static', }, 'object/get-prototype-of': { modules: ['es.object.get-prototype-of'], template: $static, namespace: 'Object', name: 'getPrototypeOf', + injectOn: 'static', }, 'object/group-by': { modules: ['es.object.group-by'], template: $static, namespace: 'Object', name: 'groupBy', + injectOn: 'static', }, 'object/has-own': { modules: ['es.object.has-own'], template: $static, namespace: 'Object', name: 'hasOwn', + injectOn: 'static', }, 'object/is': { modules: ['es.object.is'], template: $static, namespace: 'Object', name: 'is', + injectOn: 'static', }, 'object/is-extensible': { modules: ['es.object.is-extensible'], template: $static, namespace: 'Object', name: 'isExtensible', + injectOn: 'static', }, 'object/is-frozen': { modules: ['es.object.is-frozen'], template: $static, namespace: 'Object', name: 'isFrozen', + injectOn: 'static', }, 'object/is-sealed': { modules: ['es.object.is-sealed'], template: $static, namespace: 'Object', name: 'isSealed', + injectOn: 'static', }, 'object/keys': { modules: ['es.object.keys'], template: $static, namespace: 'Object', name: 'keys', + injectOn: 'static', }, 'object/lookup-getter': { modules: ['es.object.lookup-getter'], template: $prototype, namespace: 'Object', name: '__lookupGetter__', + injectOn: 'instance', + globalModeOnly: true, }, 'object/virtual/lookup-getter': { modules: ['es.object.lookup-getter'], @@ -1755,6 +1903,8 @@ export const features = { template: $prototype, namespace: 'Object', name: '__lookupSetter__', + injectOn: 'instance', + globalModeOnly: true, }, 'object/virtual/lookup-setter': { modules: ['es.object.lookup-setter'], @@ -1767,22 +1917,28 @@ export const features = { template: $static, namespace: 'Object', name: 'preventExtensions', + injectOn: 'static', }, 'object/proto': { modules: ['es.object.proto'], template: $justImport, + name: '__proto__', + injectOn: 'instance', + globalModeOnly: true, }, 'object/seal': { modules: ['es.object.seal'], template: $static, namespace: 'Object', name: 'seal', + injectOn: 'static', }, 'object/set-prototype-of': { modules: ['es.object.set-prototype-of'], template: $static, namespace: 'Object', name: 'setPrototypeOf', + injectOn: 'static', }, 'object/to-string': { modules: ['es.object.to-string'], @@ -1801,6 +1957,7 @@ export const features = { template: $static, namespace: 'Object', name: 'values', + injectOn: 'static', }, 'promise/index': { modules: [/^(?:es|esnext)\.promise\./], @@ -1811,24 +1968,28 @@ export const features = { modules: [...PromiseWithPrototype], template: $namespace, name: 'Promise', + injectOn: 'global', }, 'promise/all': { modules: ['es.promise.all'], template: $staticWithContext, namespace: 'Promise', name: 'all', + injectOn: 'static', }, 'promise/all-settled': { modules: ['es.promise.all-settled'], template: $staticWithContext, namespace: 'Promise', name: 'allSettled', + injectOn: 'static', }, 'promise/any': { modules: ['es.promise.any'], template: $staticWithContext, namespace: 'Promise', name: 'any', + injectOn: 'static', }, 'promise/catch': { modules: ['es.promise.catch'], @@ -1847,6 +2008,8 @@ export const features = { template: $prototype, namespace: 'Promise', name: 'finally', + injectOn: 'instance', + globalModeOnly: true, }, 'promise/virtual/finally': { modules: ['es.promise.finally'], @@ -1859,30 +2022,35 @@ export const features = { template: $staticWithContext, namespace: 'Promise', name: 'race', + injectOn: 'static', }, 'promise/reject': { modules: ['es.promise.reject'], template: $staticWithContext, namespace: 'Promise', name: 'reject', + injectOn: 'static', }, 'promise/resolve': { modules: ['es.promise.resolve'], template: $staticWithContext, namespace: 'Promise', name: 'resolve', + injectOn: 'static', }, 'promise/try': { modules: ['esnext.promise.try'], template: $staticWithContext, namespace: 'Promise', name: 'try', + injectOn: 'static', }, 'promise/with-resolvers': { modules: ['es.promise.with-resolvers'], template: $staticWithContext, namespace: 'Promise', name: 'withResolvers', + injectOn: 'static', }, 'reflect/index': { modules: [/^(?:es|esnext)\.reflect\./], @@ -1894,78 +2062,91 @@ export const features = { template: $static, namespace: 'Reflect', name: 'apply', + injectOn: 'static', }, 'reflect/construct': { modules: ['es.reflect.construct'], template: $static, namespace: 'Reflect', name: 'construct', + injectOn: 'static', }, 'reflect/define-property': { modules: ['es.reflect.define-property'], template: $static, namespace: 'Reflect', name: 'defineProperty', + injectOn: 'static', }, 'reflect/delete-property': { modules: ['es.reflect.delete-property'], template: $static, namespace: 'Reflect', name: 'deleteProperty', + injectOn: 'static', }, 'reflect/get-own-property-descriptor': { modules: ['es.reflect.get-own-property-descriptor'], template: $static, namespace: 'Reflect', name: 'getOwnPropertyDescriptor', + injectOn: 'static', }, 'reflect/get-prototype-of': { modules: ['es.reflect.get-prototype-of'], template: $static, namespace: 'Reflect', name: 'getPrototypeOf', + injectOn: 'static', }, 'reflect/get': { modules: ['es.reflect.get'], template: $static, namespace: 'Reflect', name: 'get', + injectOn: 'static', }, 'reflect/has': { modules: ['es.reflect.has'], template: $static, namespace: 'Reflect', name: 'has', + injectOn: 'static', }, 'reflect/is-extensible': { modules: ['es.reflect.is-extensible'], template: $static, namespace: 'Reflect', name: 'isExtensible', + injectOn: 'static', }, 'reflect/own-keys': { modules: ['es.reflect.own-keys'], template: $static, namespace: 'Reflect', name: 'ownKeys', + injectOn: 'static', }, 'reflect/prevent-extensions': { modules: ['es.reflect.prevent-extensions'], template: $static, namespace: 'Reflect', name: 'preventExtensions', + injectOn: 'static', }, 'reflect/set-prototype-of': { modules: ['es.reflect.set-prototype-of'], template: $static, namespace: 'Reflect', name: 'setPrototypeOf', + injectOn: 'static', }, 'reflect/set': { modules: ['es.reflect.set'], template: $static, namespace: 'Reflect', name: 'set', + injectOn: 'static', }, 'regexp/index': { modules: [/^(?:es|esnext)\.regexp\./, /^es\.string\.(?:match|replace|search|split)$/], @@ -1974,22 +2155,30 @@ export const features = { 'regexp/constructor': { modules: [/^es\.regexp\.(?:constructor|dot-all|sticky)$/], template: $justImport, + injectOn: 'global', + globalModeOnly: true, }, 'regexp/escape': { modules: ['esnext.regexp.escape'], template: $static, namespace: 'RegExp', name: 'escape', + injectOn: 'static', }, 'regexp/exec': { modules: ['es.regexp.exec'], template: $prototype, namespace: 'RegExp', name: 'exec', + injectOn: 'instance', + globalModeOnly: true, }, 'regexp/dot-all': { modules: ['es.regexp.dot-all', 'es.regexp.constructor'], template: $justImport, + name: 'dotAll', + injectOn: 'instance', + globalModeOnly: true, }, 'regexp/flags': { modules: ['es.regexp.flags'], @@ -2015,12 +2204,17 @@ export const features = { 'regexp/sticky': { modules: ['es.regexp.sticky', 'es.regexp.constructor'], template: $justImport, + name: 'sticky', + injectOn: 'instance', + globalModeOnly: true, }, 'regexp/test': { modules: ['es.regexp.test'], template: $prototype, namespace: 'RegExp', name: 'test', + injectOn: 'instance', + globalModeOnly: true, }, 'regexp/to-string': { modules: ['es.regexp.to-string'], @@ -2035,6 +2229,7 @@ export const features = { modules: [...SetWithPrototype], template: $namespace, name: 'Set', + injectOn: 'global', }, 'set/difference': { modules: ['es.set.difference'], @@ -2054,6 +2249,7 @@ export const features = { template: $static, namespace: 'Set', name: 'from', + injectOn: 'static', }, 'set/intersection': { modules: ['es.set.intersection'], @@ -2109,6 +2305,7 @@ export const features = { template: $static, namespace: 'Set', name: 'of', + injectOn: 'static', }, 'set/symmetric-difference': { modules: ['es.set.symmetric-difference'], @@ -2144,6 +2341,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'anchor', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/anchor': { modules: ['es.string.anchor'], @@ -2168,6 +2367,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'big', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/big': { modules: ['es.string.big'], @@ -2180,6 +2381,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'blink', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/blink': { modules: ['es.string.blink'], @@ -2192,6 +2395,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'bold', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/bold': { modules: ['es.string.bold'], @@ -2216,12 +2421,14 @@ export const features = { template: $static, namespace: 'String', name: 'cooked', + injectOn: 'static', }, 'string/dedent': { modules: ['esnext.string.dedent'], template: $static, namespace: 'String', name: 'dedent', + injectOn: 'static', }, 'string/ends-with': { modules: ['es.string.ends-with'], @@ -2240,6 +2447,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'fixed', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/fixed': { modules: ['es.string.fixed'], @@ -2252,6 +2461,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'fontcolor', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/fontcolor': { modules: ['es.string.fontcolor'], @@ -2264,6 +2475,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'fontsize', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/fontsize': { modules: ['es.string.fontsize'], @@ -2306,6 +2519,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'italics', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/italics': { modules: ['es.string.italics'], @@ -2328,6 +2543,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'link', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/link': { modules: ['es.string.link'], @@ -2340,6 +2557,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'match', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/match': { modules: ['es.string.match'], @@ -2388,6 +2607,7 @@ export const features = { template: $static, namespace: 'String', name: 'raw', + injectOn: 'static', }, 'string/repeat': { modules: ['es.string.repeat'], @@ -2406,6 +2626,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'replace', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/replace': { modules: ['es.string.replace'], @@ -2430,6 +2652,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'search', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/search': { modules: ['es.string.search'], @@ -2442,6 +2666,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'small', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/small': { modules: ['es.string.small'], @@ -2454,6 +2680,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'split', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/split': { modules: ['es.string.split'], @@ -2478,6 +2706,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'strike', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/strike': { modules: ['es.string.strike'], @@ -2490,6 +2720,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'sub', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/sub': { modules: ['es.string.sub'], @@ -2502,6 +2734,8 @@ export const features = { template: $prototype, namespace: 'String', name: 'sup', + injectOn: 'instance', + globalModeOnly: true, }, 'string/virtual/sup': { modules: ['es.string.sup'], @@ -2590,6 +2824,7 @@ export const features = { modules: [/^(?:es|esnext)\.suppressed-error\./], template: $namespace, name: 'SuppressedError', + injectOn: 'global', }, 'symbol/index': { modules: [/^(?:es|esnext)\.symbol\./], @@ -2600,136 +2835,161 @@ export const features = { modules: ['es.symbol.constructor', 'es.symbol.description'], template: $namespace, name: 'Symbol', + injectOn: 'global', }, 'symbol/async-dispose': { modules: ['esnext.symbol.async-dispose', 'esnext.async-iterator.async-dispose'], template: $static, namespace: 'Symbol', name: 'asyncDispose', + injectOn: 'static', }, 'symbol/async-iterator': { modules: ['es.symbol.async-iterator'], template: $static, namespace: 'Symbol', name: 'asyncIterator', + injectOn: 'static', }, 'symbol/custom-matcher': { modules: ['esnext.symbol.custom-matcher'], template: $static, namespace: 'Symbol', name: 'customMatcher', + injectOn: 'static', }, 'symbol/description': { modules: ['es.symbol.description'], template: $justImport, + name: 'description', + injectOn: 'instance', + globalModeOnly: true, }, 'symbol/dispose': { modules: ['esnext.symbol.dispose', 'esnext.iterator.dispose'], template: $static, namespace: 'Symbol', name: 'dispose', + injectOn: 'static', }, 'symbol/for': { modules: ['es.symbol.for'], template: $static, namespace: 'Symbol', name: 'for', + injectOn: 'static', }, 'symbol/has-instance': { modules: ['es.symbol.has-instance', 'es.function.has-instance'], template: $static, namespace: 'Symbol', name: 'hasInstance', + injectOn: 'static', }, 'symbol/is-concat-spreadable': { modules: ['es.symbol.is-concat-spreadable'], template: $static, namespace: 'Symbol', name: 'isConcatSpreadable', + injectOn: 'static', }, 'symbol/is-registered-symbol': { modules: ['esnext.symbol.is-registered-symbol'], template: $static, namespace: 'Symbol', name: 'isRegisteredSymbol', + injectOn: 'static', }, 'symbol/is-well-known-symbol': { modules: ['esnext.symbol.is-well-known-symbol'], template: $static, namespace: 'Symbol', name: 'isWellKnownSymbol', + injectOn: 'static', }, 'symbol/iterator': { modules: ['es.symbol.iterator', 'es.array.iterator', 'es.string.iterator', 'web.dom-collections.iterator'], template: $static, namespace: 'Symbol', name: 'iterator', + injectOn: 'static', }, 'symbol/key-for': { modules: ['es.symbol.key-for'], template: $static, namespace: 'Symbol', name: 'keyFor', + injectOn: 'static', }, 'symbol/match': { modules: ['es.symbol.match'], template: $static, namespace: 'Symbol', name: 'match', + injectOn: 'static', }, 'symbol/match-all': { modules: ['es.symbol.match-all'], template: $static, namespace: 'Symbol', name: 'matchAll', + injectOn: 'static', }, 'symbol/metadata': { modules: ['esnext.symbol.metadata', 'esnext.function.metadata'], template: $static, namespace: 'Symbol', name: 'metadata', + injectOn: 'static', }, 'symbol/replace': { modules: ['es.symbol.replace'], template: $static, namespace: 'Symbol', name: 'replace', + injectOn: 'static', }, 'symbol/search': { modules: ['es.symbol.search'], template: $static, namespace: 'Symbol', name: 'search', + injectOn: 'static', }, 'symbol/species': { modules: ['es.symbol.species'], template: $static, namespace: 'Symbol', name: 'species', + injectOn: 'static', }, 'symbol/split': { modules: ['es.symbol.split'], template: $static, namespace: 'Symbol', name: 'split', + injectOn: 'static', }, 'symbol/to-primitive': { modules: ['es.symbol.to-primitive', 'es.date.to-primitive'], template: $static, namespace: 'Symbol', name: 'toPrimitive', + injectOn: 'static', }, 'symbol/to-string-tag': { modules: ['es.symbol.to-string-tag', 'es.object.to-string', 'es.json.to-string-tag', 'es.math.to-string-tag'], template: $static, namespace: 'Symbol', name: 'toStringTag', + injectOn: 'static', }, 'symbol/unscopables': { modules: ['es.symbol.unscopables'], template: $static, namespace: 'Symbol', name: 'unscopables', + injectOn: 'static', }, 'typed-array/index': { modules: [/^(?:es|esnext)\.typed-array\./], @@ -2739,60 +2999,69 @@ export const features = { modules: ['es.typed-array.float32-array', ...TypedArrayMethods], template: $namespace, name: 'Float32Array', + injectOn: 'global', }, 'typed-array/float64-array': { modules: ['es.typed-array.float64-array', ...TypedArrayMethods], template: $namespace, name: 'Float64Array', + injectOn: 'global', }, 'typed-array/int8-array': { modules: ['es.typed-array.int8-array', ...TypedArrayMethods], template: $namespace, name: 'Int8Array', + injectOn: 'global', }, 'typed-array/int16-array': { modules: ['es.typed-array.int16-array', ...TypedArrayMethods], template: $namespace, name: 'Int16Array', + injectOn: 'global', }, 'typed-array/int32-array': { modules: ['es.typed-array.int32-array', ...TypedArrayMethods], template: $namespace, name: 'Int32Array', + injectOn: 'global', }, 'typed-array/uint8-array': { modules: ['es.typed-array.uint8-array', ...Uint8ArrayPrototypeMethods], template: $namespace, name: 'Uint8Array', + injectOn: 'global', }, 'typed-array/uint8-clamped-array': { modules: ['es.typed-array.uint8-clamped-array', ...TypedArrayMethods], template: $namespace, name: 'Uint8ClampedArray', + injectOn: 'global', }, 'typed-array/uint16-array': { modules: ['es.typed-array.uint16-array', ...TypedArrayMethods], template: $namespace, name: 'Uint16Array', + injectOn: 'global', }, 'typed-array/uint32-array': { modules: ['es.typed-array.uint32-array', ...TypedArrayMethods], template: $namespace, name: 'Uint32Array', + injectOn: 'global', }, - 'typed-array/from': { + 'typed-array/from': { // !!!!!! modules: ['es.typed-array.from'], template: $justImport, }, - 'typed-array/from-base64': { + 'typed-array/from-base64': { // !!!!!! modules: ['esnext.uint8-array.from-base64'], template: $justImport, }, - 'typed-array/from-hex': { + 'typed-array/from-hex': { // !!!!!! modules: ['esnext.uint8-array.from-hex'], template: $justImport, }, - 'typed-array/of': { + 'typed-array/of': { // !!!!!! modules: ['es.typed-array.of'], template: $justImport, }, @@ -2949,18 +3218,21 @@ export const features = { modules: ['web.url.constructor', 'web.url.to-json', /^web\.url-search-params?\./], template: $namespace, name: 'URL', + injectOn: 'global', }, 'url/can-parse': { modules: ['web.url.can-parse'], template: $static, namespace: 'URL', name: 'canParse', + injectOn: 'static', }, 'url/parse': { modules: ['web.url.parse'], template: $static, namespace: 'URL', name: 'parse', + injectOn: 'static', }, 'url/to-json': { // <- ??? modules: ['web.url.to-json'], @@ -2983,6 +3255,7 @@ export const features = { modules: [/^web\.url-search-params\./], template: $namespace, name: 'URLSearchParams', + injectOn: 'global', }, 'weak-map/index': { modules: [/^(?:es|esnext)\.weak-map\./], @@ -2993,6 +3266,7 @@ export const features = { modules: [...WeakMapWithPrototype], template: $namespace, name: 'WeakMap', + injectOn: 'global', }, 'weak-map/emplace': { modules: ['esnext.weak-map.emplace'], @@ -3012,6 +3286,7 @@ export const features = { template: $static, namespace: 'WeakMap', name: 'from', + injectOn: 'static', }, 'weak-map/of': { modules: ['esnext.weak-map.of', ...WeakMapWithPrototype], @@ -3019,6 +3294,7 @@ export const features = { template: $static, namespace: 'WeakMap', name: 'of', + injectOn: 'static', }, 'weak-set/index': { modules: [/^(?:es|esnext)\.weak-set\./], @@ -3029,6 +3305,7 @@ export const features = { modules: [...WeakSetWithPrototype], template: $namespace, name: 'WeakSet', + injectOn: 'global', }, 'weak-set/from': { modules: ['esnext.weak-set.from', ...WeakSetWithPrototype], @@ -3036,6 +3313,7 @@ export const features = { template: $static, namespace: 'WeakSet', name: 'from', + injectOn: 'static', }, 'weak-set/of': { modules: ['esnext.weak-set.of', ...WeakSetWithPrototype], @@ -3043,56 +3321,67 @@ export const features = { template: $static, namespace: 'WeakSet', name: 'of', + injectOn: 'static', }, atob: { modules: ['web.atob'], template: $namespace, name: 'atob', + injectOn: 'global', }, btoa: { modules: ['web.btoa'], template: $namespace, name: 'btoa', + injectOn: 'global', }, 'clear-immediate': { modules: ['web.clear-immediate'], template: $namespace, name: 'clearImmediate', + injectOn: 'global', }, 'global-this': { modules: ['es.global-this'], template: $namespace, name: 'globalThis', + injectOn: 'global', }, 'parse-float': { modules: ['es.parse-float'], template: $namespace, name: 'parseFloat', + injectOn: 'global', }, 'parse-int': { modules: ['es.parse-int'], template: $namespace, name: 'parseInt', + injectOn: 'global', }, 'queue-microtask': { modules: ['web.queue-microtask'], template: $namespace, name: 'queueMicrotask', + injectOn: 'global', }, self: { modules: ['web.self'], template: $namespace, name: 'self', + injectOn: 'global', }, 'set-immediate': { modules: ['web.set-immediate'], template: $namespace, name: 'setImmediate', + injectOn: 'global', }, 'structured-clone': { modules: ['web.structured-clone'], template: $namespace, name: 'structuredClone', + injectOn: 'global', }, 'get-iterator': { modules: ['es.array.iterator', 'es.string.iterator', 'web.dom-collections.iterator'], diff --git a/scripts/build-entries/index.mjs b/scripts/build-entries/index.mjs index 2e57d859724d..82ba80f8b8b6 100644 --- a/scripts/build-entries/index.mjs +++ b/scripts/build-entries/index.mjs @@ -34,6 +34,13 @@ const exportsFields = { './modules/*.js': './modules/*.js', }; +// use Object.create(null) because of cases like __proto__ +const builtInDefinitions = { + BuiltIns: Object.create(null), + StaticProperties: Object.create(null), + InstanceProperties: Object.create(null), +}; + const entriesMap = AllModules.reduce((memo, it) => { memo[`core-js/modules/${ it }`] = [it]; return memo; @@ -51,6 +58,7 @@ async function buildEntry(entry, options) { entryFromNamespace, subset = entryFromNamespace ?? 'full', template, templateStable, templateActual, templateFull, filter, modules, enforceEntryCreation, necessaryModules, + buildBuiltInDefinitions, injectOn, globalModeOnly = false, rawEntry, name, namespace, } = options; switch (subset) { @@ -106,6 +114,29 @@ async function buildEntry(entry, options) { } entriesMap[`core-js/${ entry }`.replace(/\/index$/, '')] = modules; + + if (buildBuiltInDefinitions && injectOn) { + let definitionTarget; + + switch (injectOn) { + case 'global': + definitionTarget = builtInDefinitions.BuiltIns; + break; + case 'static': + definitionTarget = (builtInDefinitions.StaticProperties[namespace] ??= Object.create(null)); + break; + case 'instance': + definitionTarget = builtInDefinitions.InstanceProperties; + } + + if (Object.hasOwn(definitionTarget, name)) throw new Error(`${ name } already defined`); + + definitionTarget[name] = { + entry: rawEntry, + modules, + globalModeOnly, + }; + } } async function writeExportsField(path) { @@ -119,7 +150,7 @@ for (const [entry, definition] of Object.entries(features)) { await buildEntry(`es/${ entry }`, { ...definition, entryFromNamespace: 'es' }); await buildEntry(`stable/${ entry }`, { ...definition, entryFromNamespace: 'stable' }); await buildEntry(`actual/${ entry }`, { ...definition, entryFromNamespace: 'actual' }); - await buildEntry(`full/${ entry }`, { ...definition, entryFromNamespace: 'full' }); + await buildEntry(`full/${ entry }`, { ...definition, entryFromNamespace: 'full', buildBuiltInDefinitions: true, rawEntry: entry }); } for (const [name, definition] of Object.entries(proposals)) { @@ -146,3 +177,7 @@ await writeExportsField('./packages/core-js-pure/package.json'); await writeJson('packages/core-js-compat/entries.json', entriesMap, { spaces: ' ' }); echo(chalk.green('entries data rebuilt')); + +await writeJson('packages/core-js-compat/built-in-definitions.json', builtInDefinitions, { spaces: ' ' }); + +echo(chalk.green('built-in definitions rebuilt'));