Skip to content

Commit f641b05

Browse files
authoredJun 26, 2023
Add helpers for using and await using (#213)
* Add helpers for 'using' and 'await using' * Return 'any' from __disposeResources
1 parent cc5ff03 commit f641b05

File tree

6 files changed

+181
-3
lines changed

6 files changed

+181
-3
lines changed
 

‎modules/index.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,7 @@ export {
3131
__classPrivateFieldSet,
3232
__classPrivateFieldIn,
3333
__createBinding,
34+
__addDisposableResource,
35+
__disposeResources,
3436
} from '../tslib.js';
3537
export * as default from '../tslib.js';

‎modules/index.js

+4
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ const {
2929
__classPrivateFieldGet,
3030
__classPrivateFieldSet,
3131
__classPrivateFieldIn,
32+
__addDisposableResource,
33+
__disposeResources,
3234
} = tslib;
3335
export {
3436
__extends,
@@ -60,5 +62,7 @@ export {
6062
__classPrivateFieldGet,
6163
__classPrivateFieldSet,
6264
__classPrivateFieldIn,
65+
__addDisposableResource,
66+
__disposeResources,
6367
};
6468
export default tslib;

‎tslib.d.ts

+23
Original file line numberDiff line numberDiff line change
@@ -428,3 +428,26 @@ export declare function __classPrivateFieldIn(
428428
* @param objectKey The property key to re-export as. Defaults to `key`.
429429
*/
430430
export declare function __createBinding(object: object, target: object, key: PropertyKey, objectKey?: PropertyKey): void;
431+
432+
/**
433+
* Adds a disposable resource to a resource-tracking environment object.
434+
* @param env A resource-tracking environment object.
435+
* @param value Either a Disposable or AsyncDisposable object, `null`, or `undefined`.
436+
* @param async When `true`, `AsyncDisposable` resources can be added. When `false`, `AsyncDisposable` resources cannot be added.
437+
* @returns The {@link value} argument.
438+
*
439+
* @throws {TypeError} If {@link value} is not an object, or if either `Symbol.dispose` or `Symbol.asyncDispose` are not
440+
* defined, or if {@link value} does not have an appropriate `Symbol.dispose` or `Symbol.asyncDispose` method.
441+
*/
442+
export declare function __addDisposableResource<T>(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }, value: T, async: boolean): T;
443+
444+
/**
445+
* Disposes all resources in a resource-tracking environment object.
446+
* @param env A resource-tracking environment object.
447+
* @returns A {@link Promise} if any resources in the environment were marked as `async` when added; otherwise, `void`.
448+
*
449+
* @throws {SuppressedError} if an error thrown during disposal would have suppressed a prior error from disposal or the
450+
* error recorded in the resource-tracking environment object.
451+
* @seealso {@link __addDisposableResource}
452+
*/
453+
export declare function __disposeResources(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }): any;

‎tslib.es6.js

+50-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1212
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1313
PERFORMANCE OF THIS SOFTWARE.
1414
***************************************************************************** */
15-
/* global Reflect, Promise */
15+
/* global Reflect, Promise, SuppressedError, Symbol */
1616

1717
var extendStatics = function(d, b) {
1818
extendStatics = Object.setPrototypeOf ||
@@ -292,6 +292,53 @@ export function __classPrivateFieldIn(state, receiver) {
292292
return typeof state === "function" ? receiver === state : state.has(receiver);
293293
}
294294

295+
export function __addDisposableResource(env, value, async) {
296+
if (value !== null && value !== void 0) {
297+
if (typeof value !== "object") throw new TypeError("Object expected.");
298+
var dispose;
299+
if (async) {
300+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
301+
dispose = value[Symbol.asyncDispose];
302+
}
303+
if (dispose === void 0) {
304+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
305+
dispose = value[Symbol.dispose];
306+
}
307+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
308+
env.stack.push({ value: value, dispose: dispose, async: async });
309+
}
310+
else if (async) {
311+
env.stack.push({ async: true });
312+
}
313+
return value;
314+
}
315+
316+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
317+
var e = new Error(message);
318+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
319+
};
320+
321+
export function __disposeResources(env) {
322+
function fail(e) {
323+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
324+
env.hasError = true;
325+
}
326+
function next() {
327+
while (env.stack.length) {
328+
var rec = env.stack.pop();
329+
try {
330+
var result = rec.dispose && rec.dispose.call(rec.value);
331+
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
332+
}
333+
catch (e) {
334+
fail(e);
335+
}
336+
}
337+
if (env.hasError) throw env.error;
338+
}
339+
return next();
340+
}
341+
295342
export default {
296343
__extends,
297344
__assign,
@@ -318,4 +365,6 @@ export default {
318365
__classPrivateFieldGet,
319366
__classPrivateFieldSet,
320367
__classPrivateFieldIn,
368+
__addDisposableResource,
369+
__disposeResources,
321370
};

‎tslib.es6.mjs

+50-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1212
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1313
PERFORMANCE OF THIS SOFTWARE.
1414
***************************************************************************** */
15-
/* global Reflect, Promise */
15+
/* global Reflect, Promise, SuppressedError, Symbol */
1616

1717
var extendStatics = function(d, b) {
1818
extendStatics = Object.setPrototypeOf ||
@@ -292,6 +292,53 @@ export function __classPrivateFieldIn(state, receiver) {
292292
return typeof state === "function" ? receiver === state : state.has(receiver);
293293
}
294294

295+
export function __addDisposableResource(env, value, async) {
296+
if (value !== null && value !== void 0) {
297+
if (typeof value !== "object") throw new TypeError("Object expected.");
298+
var dispose;
299+
if (async) {
300+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
301+
dispose = value[Symbol.asyncDispose];
302+
}
303+
if (dispose === void 0) {
304+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
305+
dispose = value[Symbol.dispose];
306+
}
307+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
308+
env.stack.push({ value: value, dispose: dispose, async: async });
309+
}
310+
else if (async) {
311+
env.stack.push({ async: true });
312+
}
313+
return value;
314+
}
315+
316+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
317+
var e = new Error(message);
318+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
319+
};
320+
321+
export function __disposeResources(env) {
322+
function fail(e) {
323+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
324+
env.hasError = true;
325+
}
326+
function next() {
327+
while (env.stack.length) {
328+
var rec = env.stack.pop();
329+
try {
330+
var result = rec.dispose && rec.dispose.call(rec.value);
331+
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
332+
}
333+
catch (e) {
334+
fail(e);
335+
}
336+
}
337+
if (env.hasError) throw env.error;
338+
}
339+
return next();
340+
}
341+
295342
export default {
296343
__extends,
297344
__assign,
@@ -318,4 +365,6 @@ export default {
318365
__classPrivateFieldGet,
319366
__classPrivateFieldSet,
320367
__classPrivateFieldIn,
368+
__addDisposableResource,
369+
__disposeResources,
321370
};

‎tslib.js

+52-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1212
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1313
PERFORMANCE OF THIS SOFTWARE.
1414
***************************************************************************** */
15-
/* global global, define, System, Reflect, Promise */
15+
/* global global, define, Symbol, Reflect, Promise, SuppressedError */
1616
var __extends;
1717
var __assign;
1818
var __rest;
@@ -42,6 +42,8 @@ var __classPrivateFieldGet;
4242
var __classPrivateFieldSet;
4343
var __classPrivateFieldIn;
4444
var __createBinding;
45+
var __addDisposableResource;
46+
var __disposeResources;
4547
(function (factory) {
4648
var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
4749
if (typeof define === "function" && define.amd) {
@@ -338,6 +340,53 @@ var __createBinding;
338340
return typeof state === "function" ? receiver === state : state.has(receiver);
339341
};
340342

343+
__addDisposableResource = function (env, value, async) {
344+
if (value !== null && value !== void 0) {
345+
if (typeof value !== "object") throw new TypeError("Object expected.");
346+
var dispose;
347+
if (async) {
348+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
349+
dispose = value[Symbol.asyncDispose];
350+
}
351+
if (dispose === void 0) {
352+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
353+
dispose = value[Symbol.dispose];
354+
}
355+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
356+
env.stack.push({ value: value, dispose: dispose, async: async });
357+
}
358+
else if (async) {
359+
env.stack.push({ async: true });
360+
}
361+
return value;
362+
};
363+
364+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
365+
var e = new Error(message);
366+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
367+
};
368+
369+
__disposeResources = function (env) {
370+
function fail(e) {
371+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
372+
env.hasError = true;
373+
}
374+
function next() {
375+
while (env.stack.length) {
376+
var rec = env.stack.pop();
377+
try {
378+
var result = rec.dispose && rec.dispose.call(rec.value);
379+
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
380+
}
381+
catch (e) {
382+
fail(e);
383+
}
384+
}
385+
if (env.hasError) throw env.error;
386+
}
387+
return next();
388+
};
389+
341390
exporter("__extends", __extends);
342391
exporter("__assign", __assign);
343392
exporter("__rest", __rest);
@@ -367,4 +416,6 @@ var __createBinding;
367416
exporter("__classPrivateFieldGet", __classPrivateFieldGet);
368417
exporter("__classPrivateFieldSet", __classPrivateFieldSet);
369418
exporter("__classPrivateFieldIn", __classPrivateFieldIn);
419+
exporter("__addDisposableResource", __addDisposableResource);
420+
exporter("__disposeResources", __disposeResources);
370421
});

0 commit comments

Comments
 (0)
Please sign in to comment.