-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathshim.js
More file actions
80 lines (72 loc) · 2.34 KB
/
shim.js
File metadata and controls
80 lines (72 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'use strict';
var hasSymbols = require('has-symbols')();
var getInferredName = require('get-symbol-description/getInferredName');
var polyfill = require('./polyfill');
var $Object = require('es-object-atoms');
var gOPD = require('gopd');
var callBind = require('call-bind');
var gOPDs = require('object.getownpropertydescriptors/polyfill')();
var dP = $Object.defineProperty;
var dPs = $Object.defineProperties;
var setProto = $Object.setPrototypeOf;
/** @typedef {import('.').Getter} Getter */
/** @typedef {import('.')} BoundGetter */
/** @param {Getter} getter */
var define = function defineGetter(getter) {
dP(Symbol.prototype, 'description', {
configurable: true,
enumerable: false,
get: getter
});
};
/** @param {Getter} getter */
var shimGlobal = function shimGlobalSymbol(getter) {
var origSym = callBind.apply(Symbol);
var emptyStrings = $Object.create ? $Object.create(null) : {};
var SymNew = /** @type {(this: symbol, description?: string) => symbol} */ function Symbol() {
var sym = origSym(this, /** @type {Parameters<typeof Symbol>} */ (/** @type {unknown} */ (arguments)));
if (arguments.length > 0 && arguments[0] === '') {
emptyStrings[sym] = true;
}
return sym;
};
SymNew.prototype = Symbol.prototype;
setProto(SymNew, Symbol);
var props = gOPDs(Symbol);
delete props.length;
delete props.arguments;
delete props.caller;
dPs(SymNew, props);
// @ts-expect-error properties are copied above
Symbol = SymNew; // eslint-disable-line no-native-reassign, no-global-assign, no-implicit-globals
/** @type {BoundGetter} */
var boundGetter = callBind(getter);
/** @type {Getter} */
var wrappedGetter = function description() {
/* eslint no-invalid-this: 0 */
var symbolDescription = boundGetter(this);
if (emptyStrings[this]) {
return '';
}
return symbolDescription;
};
define(wrappedGetter);
return wrappedGetter;
};
/** @type {import('./shim')} */
module.exports = function shimSymbolDescription() {
if (!hasSymbols || !gOPD) {
return false;
}
var desc = gOPD(Symbol.prototype, 'description');
var getter = polyfill();
var isMissing = !desc || typeof desc.get !== 'function';
var isBroken = !isMissing && (typeof Symbol().description !== 'undefined' || Symbol('').description !== '');
if (isMissing || isBroken) {
if (!getInferredName) {
return shimGlobal(getter);
}
define(getter);
}
return getter;
};