(target: {}, proto: P): P; declare const x: false | typeof setDunderProto; export = x; es-shims-dunder-proto-ba13098/set.js 0000664 0000000 0000000 00000002374 14730157025 0017356 0 ustar 00root root 0000000 0000000 'use strict'; var callBind = require('call-bind-apply-helpers'); var gOPD = require('gopd'); var $TypeError = require('es-errors/type'); /** @type {{ __proto__?: object | null }} */ var obj = {}; try { obj.__proto__ = null; // eslint-disable-line no-proto } catch (e) { if (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') { throw e; } } var hasProtoMutator = !('toString' in obj); // eslint-disable-next-line no-extra-parens var desc = gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__')); /** @type {import('./set')} */ module.exports = hasProtoMutator && ( // eslint-disable-next-line no-extra-parens (!!desc && typeof desc.set === 'function' && /** @type {import('./set')} */ (callBind([desc.set]))) || /** @type {import('./set')} */ function setDunder(object, proto) { // this is node v0.10 or older, which doesn't have Object.setPrototypeOf and has undeniable __proto__ if (object == null) { // eslint-disable-line eqeqeq throw new $TypeError('set Object.prototype.__proto__ called on null or undefined'); } // eslint-disable-next-line no-proto, no-param-reassign, no-extra-parens /** @type {{ __proto__?: object | null }} */ (object).__proto__ = proto; return proto; } ); es-shims-dunder-proto-ba13098/test/ 0000775 0000000 0000000 00000000000 14730157025 0017176 5 ustar 00root root 0000000 0000000 es-shims-dunder-proto-ba13098/test/get.js 0000664 0000000 0000000 00000002167 14730157025 0020321 0 ustar 00root root 0000000 0000000 'use strict'; var test = require('tape'); var getDunderProto = require('../get'); test('getDunderProto', { skip: !getDunderProto }, function (t) { if (!getDunderProto) { throw 'should never happen; this is just for type narrowing'; // eslint-disable-line no-throw-literal } // @ts-expect-error t['throws'](function () { getDunderProto(); }, TypeError, 'throws if no argument'); // @ts-expect-error t['throws'](function () { getDunderProto(undefined); }, TypeError, 'throws with undefined'); // @ts-expect-error t['throws'](function () { getDunderProto(null); }, TypeError, 'throws with null'); t.equal(getDunderProto({}), Object.prototype); t.equal(getDunderProto([]), Array.prototype); t.equal(getDunderProto(function () {}), Function.prototype); t.equal(getDunderProto(/./g), RegExp.prototype); t.equal(getDunderProto(42), Number.prototype); t.equal(getDunderProto(true), Boolean.prototype); t.equal(getDunderProto('foo'), String.prototype); t.end(); }); test('no dunder proto', { skip: !!getDunderProto }, function (t) { t.notOk('__proto__' in Object.prototype, 'no __proto__ in Object.prototype'); t.end(); }); es-shims-dunder-proto-ba13098/test/index.js 0000664 0000000 0000000 00000000063 14730157025 0020642 0 ustar 00root root 0000000 0000000 'use strict'; require('./get'); require('./set'); es-shims-dunder-proto-ba13098/test/set.js 0000664 0000000 0000000 00000003237 14730157025 0020334 0 ustar 00root root 0000000 0000000 'use strict'; var test = require('tape'); var setDunderProto = require('../set'); test('setDunderProto', { skip: !setDunderProto }, function (t) { if (!setDunderProto) { throw 'should never happen; this is just for type narrowing'; // eslint-disable-line no-throw-literal } // @ts-expect-error t['throws'](function () { setDunderProto(); }, TypeError, 'throws if no arguments'); // @ts-expect-error t['throws'](function () { setDunderProto(undefined); }, TypeError, 'throws with undefined and nothing'); // @ts-expect-error t['throws'](function () { setDunderProto(undefined, undefined); }, TypeError, 'throws with undefined and undefined'); // @ts-expect-error t['throws'](function () { setDunderProto(null); }, TypeError, 'throws with null and undefined'); // @ts-expect-error t['throws'](function () { setDunderProto(null, undefined); }, TypeError, 'throws with null and undefined'); /** @type {{ inherited?: boolean }} */ var obj = {}; t.ok('toString' in obj, 'object initially has toString'); setDunderProto(obj, null); t.notOk('toString' in obj, 'object no longer has toString'); t.notOk('inherited' in obj, 'object lacks inherited property'); setDunderProto(obj, { inherited: true }); t.equal(obj.inherited, true, 'object has inherited property'); t.end(); }); test('no dunder proto', { skip: !!setDunderProto }, function (t) { if ('__proto__' in Object.prototype) { t['throws']( // @ts-expect-error function () { ({}).__proto__ = null; }, // eslint-disable-line no-proto Error, 'throws when setting Object.prototype.__proto__' ); } else { t.notOk('__proto__' in Object.prototype, 'no __proto__ in Object.prototype'); } t.end(); }); es-shims-dunder-proto-ba13098/tsconfig.json 0000664 0000000 0000000 00000000164 14730157025 0020727 0 ustar 00root root 0000000 0000000 { "extends": "@ljharb/tsconfig", "compilerOptions": { "target": "ES2021", }, "exclude": [ "coverage", ], }