Skip to content

Commit ddf640a

Browse files
committed
polyfill queueMicrotask on Node 11 because of ExperimentalWarning, nodejs/node#25592
1 parent cde0327 commit ddf640a

File tree

6 files changed

+52
-32
lines changed

6 files changed

+52
-32
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -1338,7 +1338,9 @@ module.exports = {
13381338
},
13391339
'web.queue-microtask': {
13401340
chrome: '71',
1341-
node: '11.0',
1341+
// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
1342+
// Waition for https://github.com/nodejs/node/pull/25594
1343+
// node: '11.0',
13421344
},
13431345
'web.timers': {
13441346
ie: '10',

packages/core-js-pure/override/internals/export.js

+21-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22
var global = require('../internals/global');
3+
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
34
var isForced = require('../internals/is-forced');
45
var path = require('../internals/path');
56
var bind = require('../internals/bind-context');
@@ -21,16 +22,18 @@ var wrapConstructor = function (NativeConstructor) {
2122
};
2223

2324
/*
24-
options.target - name of the target object
25-
options.global - target is the global object
26-
options.stat - export as static methods of target
27-
options.proto - export as prototype methods of target
28-
options.real - real prototype method for the `pure` version
29-
options.forced - export even if the native feature is available
30-
options.bind - bind methods to the target, required for the `pure` version
31-
options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
32-
options.unsafe - use the simple assignment of property instead of delete + defineProperty
33-
options.sham - add a flag to not completely full polyfills
25+
options.target - name of the target object
26+
options.global - target is the global object
27+
options.stat - export as static methods of target
28+
options.proto - export as prototype methods of target
29+
options.real - real prototype method for the `pure` version
30+
options.forced - export even if the native feature is available
31+
options.bind - bind methods to the target, required for the `pure` version
32+
options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
33+
options.unsafe - use the simple assignment of property instead of delete + defineProperty
34+
options.sham - add a flag to not completely full polyfills
35+
options.enumerable - export as enumerable property
36+
options.noTargetGet - prevent calling a getter on target
3437
*/
3538
module.exports = function (options, source) {
3639
var TARGET = options.target;
@@ -43,7 +46,8 @@ module.exports = function (options, source) {
4346
var target = GLOBAL ? path : path[TARGET] || (path[TARGET] = {});
4447
var targetPrototype = target.prototype;
4548

46-
var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE, key, sourceProperty, targetProperty, resultProperty;
49+
var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE;
50+
var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor;
4751

4852
for (key in source) {
4953
FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
@@ -52,8 +56,13 @@ module.exports = function (options, source) {
5256

5357
targetProperty = target[key];
5458

59+
if (USE_NATIVE) if (options.noTargetGet) {
60+
descriptor = getOwnPropertyDescriptor(nativeSource, key);
61+
nativeProperty = descriptor && descriptor.value;
62+
} else nativeProperty = nativeSource[key];
63+
5564
// export native or implementation
56-
sourceProperty = USE_NATIVE ? nativeSource[key] : source[key];
65+
sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key];
5766

5867
if (USE_NATIVE && typeof targetProperty === typeof sourceProperty) continue;
5968

packages/core-js/internals/export.js

+18-13
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
var global = require('../internals/global');
2+
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
23
var hide = require('../internals/hide');
34
var redefine = require('../internals/redefine');
45
var setGlobal = require('../internals/set-global');
56
var copyConstructorProperties = require('../internals/copy-constructor-properties');
67
var isForced = require('../internals/is-forced');
78

89
/*
9-
options.target - name of the target object
10-
options.global - target is the global object
11-
options.stat - export as static methods of target
12-
options.proto - export as prototype methods of target
13-
options.real - real prototype method for the `pure` version
14-
options.forced - export even if the native feature is available
15-
options.bind - bind methods to the target, required for the `pure` version
16-
options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
17-
options.unsafe - use the simple assignment of property instead of delete + defineProperty
18-
options.sham - add a flag to not completely full polyfills
19-
options.enumerable - export as enumerable property
10+
options.target - name of the target object
11+
options.global - target is the global object
12+
options.stat - export as static methods of target
13+
options.proto - export as prototype methods of target
14+
options.real - real prototype method for the `pure` version
15+
options.forced - export even if the native feature is available
16+
options.bind - bind methods to the target, required for the `pure` version
17+
options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
18+
options.unsafe - use the simple assignment of property instead of delete + defineProperty
19+
options.sham - add a flag to not completely full polyfills
20+
options.enumerable - export as enumerable property
21+
options.noTargetGet - prevent calling a getter on target
2022
*/
2123
module.exports = function (options, source) {
2224
var TARGET = options.target;
2325
var GLOBAL = options.global;
2426
var STATIC = options.stat;
25-
var FORCED, target, key, targetProperty, sourceProperty;
27+
var FORCED, target, key, targetProperty, sourceProperty, descriptor;
2628
if (GLOBAL) {
2729
target = global;
2830
} else if (STATIC) {
@@ -31,8 +33,11 @@ module.exports = function (options, source) {
3133
target = (global[TARGET] || {}).prototype;
3234
}
3335
if (target) for (key in source) {
34-
targetProperty = target[key];
3536
sourceProperty = source[key];
37+
if (options.noTargetGet) {
38+
descriptor = getOwnPropertyDescriptor(target, key);
39+
targetProperty = descriptor && descriptor.value;
40+
} else targetProperty = target[key];
3641
FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
3742
// contained in target
3843
if (!FORCED && targetProperty !== undefined) {

packages/core-js/internals/microtask.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
var global = require('../internals/global');
2+
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
23
var classof = require('../internals/classof-raw');
34
var macrotask = require('../internals/task').set;
45
var userAgent = require('../internals/user-agent');
56
var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
67
var process = global.process;
78
var Promise = global.Promise;
8-
var queueMicrotask = global.queueMicrotask;
9-
var isNode = classof(process) == 'process';
9+
var IS_NODE = classof(process) == 'process';
10+
// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
11+
var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
12+
var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
1013

1114
var flush, head, last, notify, toggle, node, promise;
1215

1316
// modern engines have queueMicrotask method
1417
if (!queueMicrotask) {
1518
flush = function () {
1619
var parent, fn;
17-
if (isNode && (parent = process.domain)) parent.exit();
20+
if (IS_NODE && (parent = process.domain)) parent.exit();
1821
while (head) {
1922
fn = head.fn;
2023
head = head.next;
@@ -30,7 +33,7 @@ if (!queueMicrotask) {
3033
};
3134

3235
// Node.js
33-
if (isNode) {
36+
if (IS_NODE) {
3437
notify = function () {
3538
process.nextTick(flush);
3639
};

packages/core-js/internals/redefine.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ require('../internals/shared')('inspectSource', function (it) {
1515
(module.exports = function (O, key, value, options) {
1616
var unsafe = options ? !!options.unsafe : false;
1717
var simple = options ? !!options.enumerable : false;
18+
var noTargetGet = options ? !!options.noTargetGet : false;
1819
if (typeof value == 'function') {
1920
if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);
2021
enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');
@@ -24,7 +25,7 @@ require('../internals/shared')('inspectSource', function (it) {
2425
return;
2526
} else if (!unsafe) {
2627
delete O[key];
27-
} else if (O[key]) {
28+
} else if (!noTargetGet && O[key]) {
2829
simple = true;
2930
}
3031
if (simple) O[key] = value;

packages/core-js/modules/web.queue-microtask.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var microtask = require('../internals/microtask');
44
var process = require('../internals/global').process;
55
var isNode = require('../internals/classof-raw')(process) == 'process';
66

7-
require('../internals/export')({ global: true }, {
7+
require('../internals/export')({ global: true, noTargetGet: true }, {
88
queueMicrotask: function queueMicrotask(fn) {
99
var domain = isNode && process.domain;
1010
microtask(domain ? domain.bind(fn) : fn);

0 commit comments

Comments
 (0)