From 43eed6415ca2900ef56cd89daf405f71b33d3aeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 4 Apr 2024 12:01:22 -0400 Subject: [PATCH 01/10] fallback to sync dispose on undefined asyncDispose --- .../babel-helpers/src/helpers/usingCtx.ts | 2 +- .../exec-async/invalid-not-a-function.js | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index 9ca800ae9787..445b61ff310f 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -32,7 +32,7 @@ export default function _usingCtx() { var dispose = value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]; } - if (dispose == null) { + if (dispose === undefined) { dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")]; } if (typeof dispose !== "function") { diff --git a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js index 0877dd37be3f..17926483f0f3 100644 --- a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js +++ b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js @@ -1,3 +1,16 @@ -return expect(async function () { - await using foo = { [Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]: 3 }; -}()).rejects.toThrow(TypeError); +expect( + (async function () { + await using foo = { + [Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]: 3, + }; + })() +).rejects.toThrow(TypeError); + +expect( + (async function () { + await using foo = { + [Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]: null, + [Symbol.dispose || Symbol.for("Symbol.dispose")]() {}, + }; + })() +).rejects.toThrow(TypeError); From 61c830ea8cfd343e2a440fc0f86cf0828c470013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 4 Apr 2024 13:30:54 -0400 Subject: [PATCH 02/10] fix: do not await the promise returned from a sync dipose --- .../babel-helpers/src/helpers/usingCtx.ts | 25 +++++++++---- .../exec-async/sync-fallback-promise.js | 35 +++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/sync-fallback-promise.js diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index 445b61ff310f..e42aeb7c024c 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -1,9 +1,15 @@ /* @minVersion 7.23.9 */ +const enum DisposeKind { + SYNC = 0, + AWAIT_ASYNC = 1, + AWAIT_SYNC = 2, +} + type Stack = { v?: any; d: null | undefined | (() => any); - a: boolean; + k: DisposeKind; }; export default function _usingCtx() { @@ -30,18 +36,20 @@ export default function _usingCtx() { // core-js-pure uses Symbol.for for polyfilling well-known symbols if (isAwait) { var dispose = - value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]; + value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")], + kind = DisposeKind.AWAIT_ASYNC; } if (dispose === undefined) { dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")]; + kind = isAwait ? DisposeKind.AWAIT_SYNC : DisposeKind.SYNC; } if (typeof dispose !== "function") { throw new TypeError(`Property [Symbol.dispose] is not a function.`); } - stack.push({ v: value, d: dispose, a: isAwait }); + stack.push({ v: value, d: dispose, k: kind }); } else if (isAwait) { // provide the nullish `value` as `d` for minification gain - stack.push({ d: value, a: isAwait }); + stack.push({ d: value, k: DisposeKind.AWAIT_SYNC }); } return value; } @@ -62,8 +70,13 @@ export default function _usingCtx() { try { var resource, disposalResult = resource.d && resource.d.call(resource.v); - if (resource.a) { - return Promise.resolve(disposalResult).then(next, err); + if (resource.k) { + return Promise.resolve( + // resource.k == DisposeKind.AWAIT_SYNC + resource.k ^ DisposeKind.AWAIT_ASYNC + ? undefined + : disposalResult, + ).then(next, err); } } catch (e) { return err(e); diff --git a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/sync-fallback-promise.js b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/sync-fallback-promise.js new file mode 100644 index 000000000000..fac7a9dcaf6e --- /dev/null +++ b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/sync-fallback-promise.js @@ -0,0 +1,35 @@ +return (async () => { + const log = []; + + const promiseDispose = new Promise((resolve, _) => { + setTimeout(() => { + log.push("y dispose promise body"); + resolve(); + }, 0); + }); + + { + await using x = { + [Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]() { + log.push("x asyncDispose body"); + }, + }; + await using y = { + [Symbol.dispose || Symbol.for("Symbol.dispose")]() { + log.push("y dispose body"); + return promiseDispose; + }, + }; + } + + log.push("body"); + + await promiseDispose; + + expect(log).toEqual([ + "y dispose body", + "x asyncDispose body", + "body", + "y dispose promise body", + ]); +})(); From e57be3cb656863bdf15af2b34a1c913cad5895a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 4 Apr 2024 13:33:06 -0400 Subject: [PATCH 03/10] improve asyncDispose error Previously we throw "[Symbol.dispose] is not a function", which can be very confusing. --- packages/babel-helpers/src/helpers/usingCtx.ts | 7 ++++++- .../test/fixtures/exec-async/invalid-not-a-function.js | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index e42aeb7c024c..7d74f79e0809 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -44,7 +44,12 @@ export default function _usingCtx() { kind = isAwait ? DisposeKind.AWAIT_SYNC : DisposeKind.SYNC; } if (typeof dispose !== "function") { - throw new TypeError(`Property [Symbol.dispose] is not a function.`); + throw new TypeError( + "Property [Symbol." + + // kind == DisposeKind.AWAIT_ASYNC + (kind & DisposeKind.AWAIT_ASYNC ? "asyncDispose" : "dispose") + + "] is not a function.", + ); } stack.push({ v: value, d: dispose, k: kind }); } else if (isAwait) { diff --git a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js index 17926483f0f3..d5ea54fb28c8 100644 --- a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js +++ b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js @@ -6,6 +6,14 @@ expect( })() ).rejects.toThrow(TypeError); +expect( + (async function () { + await using foo = { + [Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]: 3, + }; + })() +).rejects.toThrow("Property [Symbol.asyncDispose] is not a function."); + expect( (async function () { await using foo = { @@ -13,4 +21,4 @@ expect( [Symbol.dispose || Symbol.for("Symbol.dispose")]() {}, }; })() -).rejects.toThrow(TypeError); +).rejects.toThrow("Property [Symbol.asyncDispose] is not a function."); From 8fb2a72da1103a83a1c9afe828523d5761dffff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 4 Apr 2024 15:28:12 -0400 Subject: [PATCH 04/10] optimize helper size --- .../babel-helpers/src/helpers/usingCtx.ts | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index 7d74f79e0809..66a0766b7250 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -1,9 +1,18 @@ /* @minVersion 7.23.9 */ +const enum DisposeFlag { + // set when the dispose function is a [Symbol.asyncDispose] method + ASYNC_FLAG = 1, + // alias of AWAIT_FLAG: set when the resource is an `await using` disposable + ASYNC_MASK = 2, +} + const enum DisposeKind { SYNC = 0, - AWAIT_ASYNC = 1, + // AWAIT_FLAG AWAIT_SYNC = 2, + // AWAIT_FLAG | ASYNC_FLAG + AWAIT_ASYNC = 3, } type Stack = { @@ -41,13 +50,12 @@ export default function _usingCtx() { } if (dispose === undefined) { dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")]; - kind = isAwait ? DisposeKind.AWAIT_SYNC : DisposeKind.SYNC; + kind &= DisposeFlag.ASYNC_MASK; } if (typeof dispose !== "function") { throw new TypeError( "Property [Symbol." + - // kind == DisposeKind.AWAIT_ASYNC - (kind & DisposeKind.AWAIT_ASYNC ? "asyncDispose" : "dispose") + + (kind & DisposeFlag.ASYNC_FLAG ? "asyncDispose" : "dispose") + "] is not a function.", ); } @@ -77,10 +85,8 @@ export default function _usingCtx() { disposalResult = resource.d && resource.d.call(resource.v); if (resource.k) { return Promise.resolve( - // resource.k == DisposeKind.AWAIT_SYNC - resource.k ^ DisposeKind.AWAIT_ASYNC - ? undefined - : disposalResult, + // provide 0 here for minification gain + resource.k & DisposeFlag.ASYNC_FLAG ? disposalResult : 0, ).then(next, err); } } catch (e) { From 350dd2ff93006c87c8caf8c4a3598587f4700029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 5 Apr 2024 11:14:17 -0400 Subject: [PATCH 05/10] simplify error message --- packages/babel-helpers/src/helpers/usingCtx.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index 66a0766b7250..e1b9bf667bd9 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -53,11 +53,7 @@ export default function _usingCtx() { kind &= DisposeFlag.ASYNC_MASK; } if (typeof dispose !== "function") { - throw new TypeError( - "Property [Symbol." + - (kind & DisposeFlag.ASYNC_FLAG ? "asyncDispose" : "dispose") + - "] is not a function.", - ); + throw new TypeError("Object is not disposable."); } stack.push({ v: value, d: dispose, k: kind }); } else if (isAwait) { From 947a93029aba74a8116448ab3ba4c5b312320d27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 5 Apr 2024 11:20:13 -0400 Subject: [PATCH 06/10] update test cases --- .../test/fixtures/exec-async/invalid-not-a-function.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js index d5ea54fb28c8..bff4ca8c2968 100644 --- a/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js +++ b/packages/babel-plugin-proposal-explicit-resource-management/test/fixtures/exec-async/invalid-not-a-function.js @@ -12,7 +12,7 @@ expect( [Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")]: 3, }; })() -).rejects.toThrow("Property [Symbol.asyncDispose] is not a function."); +).rejects.toThrow("Object is not disposable."); expect( (async function () { @@ -21,4 +21,4 @@ expect( [Symbol.dispose || Symbol.for("Symbol.dispose")]() {}, }; })() -).rejects.toThrow("Property [Symbol.asyncDispose] is not a function."); +).rejects.toThrow("Object is not disposable."); From c46ba2dcd151286a9725d19a8d335d2a7fc7b979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 5 Apr 2024 12:03:05 -0400 Subject: [PATCH 07/10] Update packages/babel-helpers/src/helpers/usingCtx.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Ribaudo --- packages/babel-helpers/src/helpers/usingCtx.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index e1b9bf667bd9..4db2c6610002 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -82,7 +82,7 @@ export default function _usingCtx() { if (resource.k) { return Promise.resolve( // provide 0 here for minification gain - resource.k & DisposeFlag.ASYNC_FLAG ? disposalResult : 0, + resource.k & DisposeFlag.ASYNC_FLAG && disposalResult, ).then(next, err); } } catch (e) { From dcab815c46823f6a7b64d4ca0c65649547834f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 5 Apr 2024 12:05:58 -0400 Subject: [PATCH 08/10] tweak comment --- packages/babel-helpers/src/helpers/usingCtx.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index 4db2c6610002..e191344c8958 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -81,7 +81,7 @@ export default function _usingCtx() { disposalResult = resource.d && resource.d.call(resource.v); if (resource.k) { return Promise.resolve( - // provide 0 here for minification gain + // do not await the promise returned from the sync @@dispose resource.k & DisposeFlag.ASYNC_FLAG && disposalResult, ).then(next, err); } From 8869938f4c2d670f153c083eba1d395a0bc9655c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 5 Apr 2024 16:15:50 -0400 Subject: [PATCH 09/10] rename enums --- .../babel-helpers/src/helpers/usingCtx.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/babel-helpers/src/helpers/usingCtx.ts b/packages/babel-helpers/src/helpers/usingCtx.ts index e191344c8958..068851943f85 100644 --- a/packages/babel-helpers/src/helpers/usingCtx.ts +++ b/packages/babel-helpers/src/helpers/usingCtx.ts @@ -2,17 +2,17 @@ const enum DisposeFlag { // set when the dispose function is a [Symbol.asyncDispose] method - ASYNC_FLAG = 1, - // alias of AWAIT_FLAG: set when the resource is an `await using` disposable - ASYNC_MASK = 2, + ASYNC_DISPOSE = 1, + // alias of AWAIT_USING: set when the resource is an `await using` disposable + ASYNC_DISPOSE_MASK = 2, } const enum DisposeKind { - SYNC = 0, + USING_DISPOSE = 0, // AWAIT_FLAG - AWAIT_SYNC = 2, - // AWAIT_FLAG | ASYNC_FLAG - AWAIT_ASYNC = 3, + AWAIT_USING_DISPOSE = 2, + // Flag.AWAIT_USING | Flag.ASYNC_DISPOSE + AWAIT_USING_ASYNC_DISPOSE = 3, } type Stack = { @@ -46,11 +46,11 @@ export default function _usingCtx() { if (isAwait) { var dispose = value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")], - kind = DisposeKind.AWAIT_ASYNC; + kind = DisposeKind.AWAIT_USING_ASYNC_DISPOSE; } if (dispose === undefined) { dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")]; - kind &= DisposeFlag.ASYNC_MASK; + kind &= DisposeFlag.ASYNC_DISPOSE_MASK; } if (typeof dispose !== "function") { throw new TypeError("Object is not disposable."); @@ -58,7 +58,7 @@ export default function _usingCtx() { stack.push({ v: value, d: dispose, k: kind }); } else if (isAwait) { // provide the nullish `value` as `d` for minification gain - stack.push({ d: value, k: DisposeKind.AWAIT_SYNC }); + stack.push({ d: value, k: DisposeKind.AWAIT_USING_DISPOSE }); } return value; } @@ -82,7 +82,7 @@ export default function _usingCtx() { if (resource.k) { return Promise.resolve( // do not await the promise returned from the sync @@dispose - resource.k & DisposeFlag.ASYNC_FLAG && disposalResult, + resource.k & DisposeFlag.ASYNC_DISPOSE && disposalResult, ).then(next, err); } } catch (e) { From c3a7acfd15f9e0037f107989fefb5221b4e75e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Tue, 30 Apr 2024 15:39:36 -0400 Subject: [PATCH 10/10] update fixtures --- .../babel-helpers/src/helpers-generated.ts | 4 +- .../helpers/esm/usingCtx.js | 47 ++++++++++--------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/packages/babel-helpers/src/helpers-generated.ts b/packages/babel-helpers/src/helpers-generated.ts index a00184c18a93..9e9ae6c7eb92 100644 --- a/packages/babel-helpers/src/helpers-generated.ts +++ b/packages/babel-helpers/src/helpers-generated.ts @@ -188,10 +188,10 @@ export default Object.freeze({ "7.22.0", 'export default function _using(o,n,e){if(null==n)return n;if(Object(n)!==n)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(e)var r=n[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(null==r&&(r=n[Symbol.dispose||Symbol.for("Symbol.dispose")]),"function"!=typeof r)throw new TypeError("Property [Symbol.dispose] is not a function.");return o.push({v:n,d:r,a:e}),n}', ), - // size: 922, gzip size: 481 + // size: 922, gzip size: 496 usingCtx: helper( "7.23.9", - 'export default function _usingCtx(){var r="function"==typeof SuppressedError?SuppressedError:function(r,n){var e=Error();return e.name="SuppressedError",e.error=r,e.suppressed=n,e},n={},e=[];function using(r,n){if(null!=n){if(Object(n)!==n)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(r)var o=n[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(null==o&&(o=n[Symbol.dispose||Symbol.for("Symbol.dispose")]),"function"!=typeof o)throw new TypeError("Property [Symbol.dispose] is not a function.");e.push({v:n,d:o,a:r})}else r&&e.push({d:n,a:r});return n}return{e:n,u:using.bind(null,!1),a:using.bind(null,!0),d:function(){var o=this.e;function next(){for(;r=e.pop();)try{var r,t=r.d&&r.d.call(r.v);if(r.a)return Promise.resolve(t).then(next,err)}catch(r){return err(r)}if(o!==n)throw o}function err(e){return o=o!==n?new r(e,o):e,next()}return next()}}}', + 'export default function _usingCtx(){var r="function"==typeof SuppressedError?SuppressedError:function(r,e){var n=Error();return n.name="SuppressedError",n.error=r,n.suppressed=e,n},e={},n=[];function using(r,e){if(null!=e){if(Object(e)!==e)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(r)var o=e[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")],t=3;if(void 0===o&&(o=e[Symbol.dispose||Symbol.for("Symbol.dispose")],t&=2),"function"!=typeof o)throw new TypeError("Object is not disposable.");n.push({v:e,d:o,k:t})}else r&&n.push({d:e,k:2});return e}return{e:e,u:using.bind(null,!1),a:using.bind(null,!0),d:function(){var o=this.e;function next(){for(;r=n.pop();)try{var r,t=r.d&&r.d.call(r.v);if(r.k)return Promise.resolve(1&r.k&&t).then(next,err)}catch(r){return err(r)}if(o!==e)throw o}function err(n){return o=o!==e?new r(n,o):n,next()}return next()}}}', ), // size: 1252, gzip size: 572 wrapRegExp: helper( diff --git a/packages/babel-runtime-corejs3/helpers/esm/usingCtx.js b/packages/babel-runtime-corejs3/helpers/esm/usingCtx.js index 331cfe7cd7e9..af1a0b3163df 100644 --- a/packages/babel-runtime-corejs3/helpers/esm/usingCtx.js +++ b/packages/babel-runtime-corejs3/helpers/esm/usingCtx.js @@ -6,46 +6,47 @@ import _pushInstanceProperty from "core-js-pure/features/instance/push.js"; import _bindInstanceProperty from "core-js-pure/features/instance/bind.js"; import _Promise from "core-js-pure/features/promise/index.js"; export default function _usingCtx() { - var r = "function" == typeof _SuppressedError ? _SuppressedError : function (r, n) { - var e = Error(); - return e.name = "SuppressedError", e.error = r, e.suppressed = n, e; + var r = "function" == typeof _SuppressedError ? _SuppressedError : function (r, e) { + var n = Error(); + return n.name = "SuppressedError", n.error = r, n.suppressed = e, n; }, - n = {}, - e = []; - function using(r, n) { - if (null != n) { - if (Object(n) !== n) throw new TypeError("using declarations can only be used with objects, functions, null, or undefined."); - if (r) var o = n[_Symbol$asyncDispose || _Symbol$for("Symbol.asyncDispose")]; - if (null == o && (o = n[_Symbol$dispose || _Symbol$for("Symbol.dispose")]), "function" != typeof o) throw new TypeError("Property [Symbol.dispose] is not a function."); - _pushInstanceProperty(e).call(e, { - v: n, + e = {}, + n = []; + function using(r, e) { + if (null != e) { + if (Object(e) !== e) throw new TypeError("using declarations can only be used with objects, functions, null, or undefined."); + if (r) var o = e[_Symbol$asyncDispose || _Symbol$for("Symbol.asyncDispose")], + t = 3; + if (void 0 === o && (o = e[_Symbol$dispose || _Symbol$for("Symbol.dispose")], t &= 2), "function" != typeof o) throw new TypeError("Object is not disposable."); + _pushInstanceProperty(n).call(n, { + v: e, d: o, - a: r + k: t }); - } else r && _pushInstanceProperty(e).call(e, { - d: n, - a: r + } else r && _pushInstanceProperty(n).call(n, { + d: e, + k: 2 }); - return n; + return e; } return { - e: n, + e: e, u: _bindInstanceProperty(using).call(using, null, !1), a: _bindInstanceProperty(using).call(using, null, !0), d: function d() { var o = this.e; function next() { - for (; r = e.pop();) try { + for (; r = n.pop();) try { var r, t = r.d && r.d.call(r.v); - if (r.a) return _Promise.resolve(t).then(next, err); + if (r.k) return _Promise.resolve(1 & r.k && t).then(next, err); } catch (r) { return err(r); } - if (o !== n) throw o; + if (o !== e) throw o; } - function err(e) { - return o = o !== n ? new r(e, o) : e, next(); + function err(n) { + return o = o !== e ? new r(n, o) : n, next(); } return next(); }