Skip to content

Commit ce0913b

Browse files
committed
fix incorrect Symbol.{ dispose, asyncDispose } descriptors from NodeJS 20.4 / transpilers helpers / userland code
1 parent d9b3fdc commit ce0913b

File tree

9 files changed

+56
-9
lines changed

9 files changed

+56
-9
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,13 @@
3939
- `DataView.prototype.setUint8Clamped`
4040
- Used strict mode in some missed cases, [#1269](https://github.com/zloirock/core-js/issues/1269)
4141
- Fixed [a Chromium 117 bug](https://bugs.chromium.org/p/v8/issues/detail?id=14222) in `value` argument of `URLSearchParams.prototype.{ has, delete }`
42+
- Fixed incorrect `Symbol.{ dispose, asyncDispose }` descriptors from [NodeJS 20.4](https://github.com/nodejs/node/issues/48699) / transpilers helpers / userland code
4243
- Fixed forced polyfilling of some iterator helpers that should return wrapped iterator in the pure version
4344
- Fixed and exposed [`AsyncIteratorPrototype` `core-js/configurator` option](https://github.com/zloirock/core-js#asynciterator-helpers), [#1268](https://github.com/zloirock/core-js/issues/1268)
4445
- Compat data improvements:
4546
- Sync [`Iterator` helpers proposal](https://github.com/tc39/proposal-iterator-helpers) features marked as [supported](https://chromestatus.com/feature/5102502917177344) from V8 ~ Chrome 117
4647
- [`Array` grouping proposal](https://github.com/tc39/proposal-array-grouping) features marked as [supported](https://chromestatus.com/feature/5714791975878656) from V8 ~ Chrome 117
47-
- [NodeJS 20.4.0 add `Symbol.{ dispose, asyncDispose }`](https://github.com/nodejs/node/pull/48518), but [with incorrect property descriptors](https://github.com/nodejs/node/issues/48699)
48+
- Mark `Symbol.{ dispose, asyncDispose }` as supported from NodeJS 20.5.0 (as mentioned above, NodeJS 20.4.0 add it, but [with incorrect descriptors](https://github.com/nodejs/node/issues/48699))
4849
- Added Electron 27 compat data mapping
4950

5051
##### [3.31.1 - 2023.07.06](https://github.com/zloirock/core-js/releases/tag/v3.31.1)

packages/core-js-compat/src/data.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2285,11 +2285,13 @@ export const data = {
22852285
'esnext.string.to-well-formed': null,
22862286
'esnext.symbol.async-dispose': {
22872287
// Node 20.4.0 add `Symbol.asyncDispose`, but with incorrect descriptor
2288-
node: '20.4.0',
2288+
// https://github.com/nodejs/node/issues/48699
2289+
node: '20.5.0',
22892290
},
22902291
'esnext.symbol.dispose': {
22912292
// Node 20.4.0 add `Symbol.dispose`, but with incorrect descriptor
2292-
node: '20.4.0',
2293+
// https://github.com/nodejs/node/issues/48699
2294+
node: '20.5.0',
22932295
},
22942296
'esnext.symbol.is-registered-symbol': {
22952297
},
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
'use strict';
2+
var defineWellKnownSymbol = require('../internals/well-known-symbol-define');
3+
4+
// `Symbol.asyncDispose` well-known symbol
5+
// https://github.com/tc39/proposal-async-explicit-resource-management
6+
defineWellKnownSymbol('asyncDispose');
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
'use strict';
2+
var defineWellKnownSymbol = require('../internals/well-known-symbol-define');
3+
4+
// `Symbol.dispose` well-known symbol
5+
// https://github.com/tc39/proposal-explicit-resource-management
6+
defineWellKnownSymbol('dispose');
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
'use strict';
2+
var global = require('../internals/global');
23
var defineWellKnownSymbol = require('../internals/well-known-symbol-define');
4+
var defineProperty = require('../internals/object-define-property').f;
5+
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
6+
7+
var Symbol = global.Symbol;
38

49
// `Symbol.asyncDispose` well-known symbol
510
// https://github.com/tc39/proposal-async-explicit-resource-management
611
defineWellKnownSymbol('asyncDispose');
12+
13+
if (Symbol) {
14+
var descriptor = getOwnPropertyDescriptor(Symbol, 'asyncDispose');
15+
// workaround of NodeJS 20.4 bug
16+
// https://github.com/nodejs/node/issues/48699
17+
// and incorrect descriptor from some transpilers and userland helpers
18+
if (descriptor.enumerable && descriptor.configurable && descriptor.writable) {
19+
defineProperty(Symbol, 'asyncDispose', { value: descriptor.value, enumerable: false, configurable: false, writable: false });
20+
}
21+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
'use strict';
2+
var global = require('../internals/global');
23
var defineWellKnownSymbol = require('../internals/well-known-symbol-define');
4+
var defineProperty = require('../internals/object-define-property').f;
5+
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
6+
7+
var Symbol = global.Symbol;
38

49
// `Symbol.dispose` well-known symbol
510
// https://github.com/tc39/proposal-explicit-resource-management
611
defineWellKnownSymbol('dispose');
12+
13+
if (Symbol) {
14+
var descriptor = getOwnPropertyDescriptor(Symbol, 'dispose');
15+
// workaround of NodeJS 20.4 bug
16+
// https://github.com/nodejs/node/issues/48699
17+
// and incorrect descriptor from some transpilers and userland helpers
18+
if (descriptor.enumerable && descriptor.configurable && descriptor.writable) {
19+
defineProperty(Symbol, 'dispose', { value: descriptor.value, enumerable: false, configurable: false, writable: false });
20+
}
21+
}

tests/compat/tests.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,10 +1789,12 @@ GLOBAL.tests = {
17891789
return String.dedent;
17901790
},
17911791
'esnext.symbol.async-dispose': function () {
1792-
return Symbol.dispose;
1792+
var descriptor = Object.getOwnPropertyDescriptor(Symbol, 'asyncDispose');
1793+
return descriptor.value && !descriptor.enumerable && !descriptor.configurable && !descriptor.writable;
17931794
},
17941795
'esnext.symbol.dispose': function () {
1795-
return Symbol.dispose;
1796+
var descriptor = Object.getOwnPropertyDescriptor(Symbol, 'dispose');
1797+
return descriptor.value && !descriptor.enumerable && !descriptor.configurable && !descriptor.writable;
17961798
},
17971799
'esnext.symbol.is-registered-symbol': function () {
17981800
return Symbol.isRegisteredSymbol;

tests/unit-global/esnext.symbol.async-dispose.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { DESCRIPTORS, GLOBAL } from '../helpers/constants';
1+
import { DESCRIPTORS } from '../helpers/constants';
22

33
QUnit.test('Symbol.asyncDispose', assert => {
44
assert.true('asyncDispose' in Symbol, 'Symbol.asyncDispose available');
55
assert.true(Object(Symbol.asyncDispose) instanceof Symbol, 'Symbol.asyncDispose is symbol');
66
// Node 20.4.0 add `Symbol.asyncDispose`, but with incorrect descriptor
77
// https://github.com/nodejs/node/issues/48699
8-
if (DESCRIPTORS && GLOBAL.process?.versions?.node !== '20.4.0') {
8+
if (DESCRIPTORS) {
99
const descriptor = Object.getOwnPropertyDescriptor(Symbol, 'asyncDispose');
1010
assert.false(descriptor.enumerable, 'non-enumerable');
1111
assert.false(descriptor.writable, 'non-writable');

tests/unit-global/esnext.symbol.dispose.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { DESCRIPTORS, GLOBAL } from '../helpers/constants';
1+
import { DESCRIPTORS } from '../helpers/constants';
22

33
QUnit.test('Symbol.dispose', assert => {
44
assert.true('dispose' in Symbol, 'Symbol.dispose available');
55
assert.true(Object(Symbol.dispose) instanceof Symbol, 'Symbol.dispose is symbol');
66
// Node 20.4.0 add `Symbol.dispose`, but with incorrect descriptor
77
// https://github.com/nodejs/node/issues/48699
8-
if (DESCRIPTORS && GLOBAL.process?.versions?.node !== '20.4.0') {
8+
if (DESCRIPTORS) {
99
const descriptor = Object.getOwnPropertyDescriptor(Symbol, 'dispose');
1010
assert.false(descriptor.enumerable, 'non-enumerable');
1111
assert.false(descriptor.writable, 'non-writable');

0 commit comments

Comments
 (0)