disposablestack
Version:
An ESnext spec-compliant `DisposableStack`, `AsyncDisposableStack`, `Symbol.dispose`, and `Symbol.asyncDispose` shim/polyfill/replacement that works as far down as ES3.
62 lines (47 loc) • 1.83 kB
JavaScript
'use strict';
var $SyntaxError = require('es-errors/syntax');
var $TypeError = require('es-errors/type');
var Call = require('es-abstract/2025/Call');
var GetMethod = require('es-abstract/2025/GetMethod');
var NewPromiseCapability = require('es-abstract/2025/NewPromiseCapability');
var isObject = require('es-abstract/helpers/isObject');
var symbolDispose = require('../Symbol.dispose/polyfill')();
var symbolAsyncDispose = require('../Symbol.asyncDispose/polyfill')();
module.exports = function GetDisposeMethod(V, hint) {
if (!isObject(V)) {
throw new $TypeError('`V` must be an Object');
}
if (hint !== 'SYNC-DISPOSE' && hint !== 'ASYNC-DISPOSE') {
throw new $SyntaxError('Assertion failed: `hint` must be `~SYNC-DISPOSE~` or `~ASYNC-DISPOSE~`');
}
var method;
if (hint === 'ASYNC-DISPOSE' && symbolAsyncDispose) { // step 1
method = GetMethod(V, symbolAsyncDispose); // step 1.a
}
if (!method) {
if (!symbolDispose) {
throw new $SyntaxError('`Symbol.dispose` is not supported');
}
method = GetMethod(V, symbolDispose); // step 1.b.i, 2.a
if (typeof method !== 'undefined') { // step 1.b.ii
return function () { // step 1.b.ii.1, 1.b.ii.3
// eslint-disable-next-line no-invalid-this
var O = this; // step 1.b.ii.1.a
// Call(method, O); // step // step 1.b.ii.1.b
if (hint === 'ASYNC-DISPOSE') {
var promiseCapability = NewPromiseCapability(Promise); // step 1.b.ii.1.b
try {
Call(method, O); // step 1.b.ii.1.c
Call(promiseCapability['[[Resolve]]'], undefined, [undefined]); // step 1.b.ii.1.e
} catch (e) {
promiseCapability['[[Reject]]'](e); // step 1.b.ii.1.d
}
return promiseCapability['[[Promise]]']; // step 1.b.ii.1.f
}
Call(method, O);
return void undefined;
};
}
}
return method; // step 3
};