From 98e421f1f93659d359099f55f40b65d5bd23d057 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 6 May 2021 02:09:03 +0300 Subject: [PATCH] add `Symbol.metadata` --- README.md | 12 ++++++++++++ packages/core-js-compat/src/data.js | 2 ++ packages/core-js-compat/src/modules-by-versions.js | 3 +++ packages/core-js/features/symbol/index.js | 1 + packages/core-js/features/symbol/metadata.js | 4 ++++ packages/core-js/modules/esnext.symbol.metadata.js | 5 +++++ packages/core-js/proposals/decorators.js | 2 ++ packages/core-js/proposals/pattern-matching.js | 1 + packages/core-js/stage/2.js | 1 + tests/commonjs.js | 3 ++- tests/compat/tests.js | 3 +++ tests/pure/esnext.symbol.metadata.js | 6 ++++++ tests/tests/esnext.symbol.metadata.js | 13 +++++++++++++ 13 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 packages/core-js/features/symbol/metadata.js create mode 100644 packages/core-js/modules/esnext.symbol.metadata.js create mode 100644 packages/core-js/proposals/decorators.js create mode 100644 tests/pure/esnext.symbol.metadata.js create mode 100644 tests/tests/esnext.symbol.metadata.js diff --git a/README.md b/README.md index 9058f7368c56..ae29dedc6aff 100644 --- a/README.md +++ b/README.md @@ -2049,6 +2049,18 @@ Object.hasOwn({ foo: 42 }, 'foo'); // => true Object.hasOwn({ foo: 42 }, 'bar'); // => false Object.hasOwn({}, 'toString'); // => false ```` +##### [`Symbol.metadata` for decorators proposal](https://github.com/tc39/proposal-decorators)[⬆](#index) +Module [`esnext.symbol.metadata`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.metadata.js). +```js +class Symbol { + static metadata: @@metadata; +} +``` +[*CommonJS entry points:*](#commonjs-api) +```js +core-js/proposals/decorators +core-js(-pure)/features/symbol/metadata +``` #### Stage 1 proposals[⬆](#index) [*CommonJS entry points:*](#commonjs-api) diff --git a/packages/core-js-compat/src/data.js b/packages/core-js-compat/src/data.js index 05c0a85b84fd..dc862a1df801 100644 --- a/packages/core-js-compat/src/data.js +++ b/packages/core-js-compat/src/data.js @@ -1504,6 +1504,8 @@ const data = { }, 'esnext.symbol.dispose': { }, + 'esnext.symbol.metadata': { + }, 'esnext.symbol.observable': { }, 'esnext.symbol.pattern-match': { diff --git a/packages/core-js-compat/src/modules-by-versions.js b/packages/core-js-compat/src/modules-by-versions.js index a2adbbe6da2e..3112d33e6d6c 100644 --- a/packages/core-js-compat/src/modules-by-versions.js +++ b/packages/core-js-compat/src/modules-by-versions.js @@ -83,4 +83,7 @@ module.exports = { 3.11: [ 'esnext.object.has-own', ], + 3.12: [ + 'esnext.symbol.metadata', + ], }; diff --git a/packages/core-js/features/symbol/index.js b/packages/core-js/features/symbol/index.js index 36b052ae697c..0335e1bd496d 100644 --- a/packages/core-js/features/symbol/index.js +++ b/packages/core-js/features/symbol/index.js @@ -1,6 +1,7 @@ var parent = require('../../es/symbol'); require('../../modules/esnext.symbol.async-dispose'); require('../../modules/esnext.symbol.dispose'); +require('../../modules/esnext.symbol.metadata'); require('../../modules/esnext.symbol.observable'); require('../../modules/esnext.symbol.pattern-match'); // TODO: Remove from `core-js@4` diff --git a/packages/core-js/features/symbol/metadata.js b/packages/core-js/features/symbol/metadata.js new file mode 100644 index 000000000000..11fa49f80da5 --- /dev/null +++ b/packages/core-js/features/symbol/metadata.js @@ -0,0 +1,4 @@ +require('../../modules/esnext.symbol.metadata'); +var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped'); + +module.exports = WrappedWellKnownSymbolModule.f('metadata'); diff --git a/packages/core-js/modules/esnext.symbol.metadata.js b/packages/core-js/modules/esnext.symbol.metadata.js new file mode 100644 index 000000000000..f01a84594e45 --- /dev/null +++ b/packages/core-js/modules/esnext.symbol.metadata.js @@ -0,0 +1,5 @@ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.metadata` well-known symbol +// https://github.com/tc39/proposal-decorators +defineWellKnownSymbol('metadata'); diff --git a/packages/core-js/proposals/decorators.js b/packages/core-js/proposals/decorators.js new file mode 100644 index 000000000000..346fc5ca5596 --- /dev/null +++ b/packages/core-js/proposals/decorators.js @@ -0,0 +1,2 @@ +// https://github.com/tc39/proposal-decorators +require('../modules/esnext.symbol.metadata'); diff --git a/packages/core-js/proposals/pattern-matching.js b/packages/core-js/proposals/pattern-matching.js index d5fce70789a2..b8b6967c3bdf 100644 --- a/packages/core-js/proposals/pattern-matching.js +++ b/packages/core-js/proposals/pattern-matching.js @@ -1 +1,2 @@ +// https://github.com/tc39/proposal-pattern-matching require('../modules/esnext.symbol.pattern-match'); diff --git a/packages/core-js/stage/2.js b/packages/core-js/stage/2.js index 6dc701aecc11..2c02017c2308 100644 --- a/packages/core-js/stage/2.js +++ b/packages/core-js/stage/2.js @@ -1,6 +1,7 @@ require('../proposals/accessible-object-hasownproperty'); require('../proposals/array-find-from-last'); require('../proposals/array-is-template-object'); +require('../proposals/decorators'); require('../proposals/iterator-helpers'); require('../proposals/map-upsert'); require('../proposals/set-methods'); diff --git a/tests/commonjs.js b/tests/commonjs.js index ce5daf872a22..2195599c6122 100644 --- a/tests/commonjs.js +++ b/tests/commonjs.js @@ -55,7 +55,6 @@ for (PATH of ['core-js-pure', 'core-js']) { }, 1, 2)(3) === 6); load('features/function/name'); load('features/function/has-instance'); - ok(Function[load('features/symbol/has-instance')](it => it)); ok('bind' in load('features/function')); ok(load('features/array/is-array')([])); ok(typeof load('features/array/is-template-object') === 'function'); @@ -299,6 +298,7 @@ for (PATH of ['core-js-pure', 'core-js']) { ok(load('features/symbol/iterator')); ok(load('features/symbol/match')); ok(load('features/symbol/match-all')); + ok(load('features/symbol/metadata')); ok(load('features/symbol/replace')); ok(load('features/symbol/search')); ok(load('features/symbol/species')); @@ -972,6 +972,7 @@ for (PATH of ['core-js-pure', 'core-js']) { load('proposals/array-unique'); load('proposals/collection-methods'); load('proposals/collection-of-from'); + load('proposals/decorators'); load('proposals/efficient-64-bit-arithmetic'); load('proposals/global-this'); load('proposals/iterator-helpers'); diff --git a/tests/compat/tests.js b/tests/compat/tests.js index 32b18d13ba99..df69b3b39c44 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -1431,6 +1431,9 @@ GLOBAL.tests = { 'esnext.symbol.dispose': function () { return Symbol.dispose; }, + 'esnext.symbol.metadata': function () { + return Symbol.metadata; + }, 'esnext.symbol.observable': function () { return Symbol.observable; }, diff --git a/tests/pure/esnext.symbol.metadata.js b/tests/pure/esnext.symbol.metadata.js new file mode 100644 index 000000000000..031ff548ebcb --- /dev/null +++ b/tests/pure/esnext.symbol.metadata.js @@ -0,0 +1,6 @@ +import Symbol from 'core-js-pure/features/symbol'; + +QUnit.test('Symbol.metadata', assert => { + assert.ok('metadata' in Symbol, 'Symbol.metadata available'); + assert.ok(Object(Symbol.metadata) instanceof Symbol, 'Symbol.metadata is symbol'); +}); diff --git a/tests/tests/esnext.symbol.metadata.js b/tests/tests/esnext.symbol.metadata.js new file mode 100644 index 000000000000..b1296499f56d --- /dev/null +++ b/tests/tests/esnext.symbol.metadata.js @@ -0,0 +1,13 @@ +import { DESCRIPTORS } from '../helpers/constants'; + +QUnit.test('Symbol.metadata', assert => { + assert.ok('metadata' in Symbol, 'Symbol.metadata available'); + assert.nonEnumerable(Symbol, 'metadata'); + assert.ok(Object(Symbol.metadata) instanceof Symbol, 'Symbol.metadata is symbol'); + if (DESCRIPTORS) { + const descriptor = Object.getOwnPropertyDescriptor(Symbol, 'metadata'); + assert.ok(!descriptor.enumerble, 'non-enumerable'); + assert.ok(!descriptor.writable, 'non-writable'); + assert.ok(!descriptor.configurable, 'non-configurable'); + } +});