Skip to content

Commit 178abb2

Browse files
authored
Merge pull request #1151 from zloirock/explicit-resource-management
2 parents 6a9b2a3 + 6b6b9c3 commit 178abb2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1538
-22
lines changed

CHANGELOG.md

+24
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,30 @@
5959
- `String.prototype.toWellFormed`
6060
- Moved to Stage 3, [November 2022 TC39 meeting](https://github.com/babel/proposals/issues/85#issuecomment-1332180862)
6161
- Added `/actual/` entries, disabled unconditional forced replacement
62+
- [Explicit resource management](https://github.com/tc39/proposal-explicit-resource-management) Stage 3 and [Async explicit resource management](https://github.com/tc39/proposal-async-explicit-resource-management) Stage 2 proposals:
63+
- Renamed from "`using` statement" and [splitted into 2 (sync and async) proposals](https://github.com/tc39/proposal-explicit-resource-management/pull/131)
64+
- In addition to already present well-known symbols, added new built-ins:
65+
- `Symbol.dispose`
66+
- `Symbol.asyncDispose`
67+
- `SuppressedError`
68+
- `DisposableStack`
69+
- `DisposableStack.prototype.dispose`
70+
- `DisposableStack.prototype.use`
71+
- `DisposableStack.prototype.adopt`
72+
- `DisposableStack.prototype.defer`
73+
- `DisposableStack.prototype.move`
74+
- `DisposableStack.prototype[@@dispose]`
75+
- `AsyncDisposableStack`
76+
- `AsyncDisposableStack.prototype.disposeAsync`
77+
- `AsyncDisposableStack.prototype.use`
78+
- `AsyncDisposableStack.prototype.adopt`
79+
- `AsyncDisposableStack.prototype.defer`
80+
- `AsyncDisposableStack.prototype.move`
81+
- `AsyncDisposableStack.prototype[@@asyncDispose]`
82+
- `Iterator.prototype[@@dispose]`
83+
- `AsyncIterator.prototype[@@asyncDispose]`
84+
- Sync version of this proposal moved to Stage 3, [November 2022 TC39 meeting](https://github.com/babel/proposals/issues/85#issuecomment-1333747094)
85+
- Added `/actual/` namespace entries for Stage 3 proposal
6286
- [Compat data targets](/packages/core-js-compat#targets-option) improvements:
6387
- [React Native from 0.70 shipped with Hermes as the default engine.](https://reactnative.dev/blog/2022/07/08/hermes-as-the-default) However, bundled Hermes versions differ from standalone Hermes releases. So added **`react-native`** target for React Native with bundled Hermes.
6488
- [According to the documentation](https://developer.oculus.com/documentation/web/browser-intro/), Oculus Browser was renamed to Meta Quest Browser, so `oculus` target was renamed to **`quest`**.

README.md

+65-8
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,12 @@ queueMicrotask(() => console.log('called as microtask'));
130130
- [`Array` grouping](#array-grouping)
131131
- [Change `Array` by copy](#change-array-by-copy)
132132
- [New `Set` methods](#new-set-methods)
133+
- [Explicit resource management](#explicit-resource-management)
133134
- [Well-formed unicode strings](#well-formed-unicode-strings)
134135
- [Stage 2 proposals](#stage-2-proposals)
135136
- [`Map.prototype.emplace`](#mapprototypeemplace)
136137
- [`Array.isTemplateObject`](#arrayistemplateobject)
137-
- [`Symbol.{ asyncDispose, dispose }` for `using` statement](#symbol-asyncdispose-dispose--for-using-statement)
138+
- [Async explicit resource management](#async-explicit-resource-management)
138139
- [`Symbol.metadataKey` for decorators metadata proposal](#symbolmetadatakey-for-decorators-metadata-proposal)
139140
- [Stage 1 proposals](#stage-1-proposals)
140141
- [`Observable`](#observable)
@@ -593,10 +594,11 @@ class [
593594
constructor(message: string, { cause: any }): %Error%;
594595
}
595596

596-
class AggregateError {
597-
constructor(errors: Iterable, message: string, { cause: any }): AggregateError;
597+
class AggregateError extends Error {
598+
constructor(errors: Iterable, message?: string, { cause: any }?): AggregateError;
598599
errors: Array<any>;
599600
message: string;
601+
cause: any;
600602
}
601603

602604
class Error {
@@ -2311,6 +2313,45 @@ new Set([1, 2, 3]).isDisjointFrom(new Set([4, 5, 6])); // => true
23112313
new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2, 1])); // => true
23122314
new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3])); // => true
23132315
```
2316+
##### [Explicit Resource Management](https://github.com/tc39/proposal-explicit-resource-management)[⬆](#index)
2317+
Note: **This is only built-ins for this proposal, `using` syntax support requires transpiler support.**
2318+
2319+
Modules [`esnext.symbol.dispose`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.dispose.js), [`esnext.disposable-stack.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.disposable-stack.constructor.js), [`esnext.suppressed-error.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.suppressed-error.constructor.js), [`esnext.iterator.dispose`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.dispose.js).
2320+
```js
2321+
class Symbol {
2322+
static dispose: @@dispose;
2323+
}
2324+
2325+
class DisposableStack {
2326+
constructor(): DisposableStack;
2327+
dispose(): undefined;
2328+
use(value: Disposable): value;
2329+
adopt(value: object, onDispose: Function): value;
2330+
defer(onDispose: Function): undefined;
2331+
@@dispose(): undefined;
2332+
@@toStringTag: 'DisposableStack';
2333+
}
2334+
2335+
class SuppressedError extends Error {
2336+
constructor(error: any, suppressed: any, message?: string, { cause: any }?): SuppressedError;
2337+
error: any;
2338+
suppressed: any;
2339+
message: string;
2340+
cause: any;
2341+
}
2342+
2343+
class Iterator {
2344+
@@dispose(): undefined;
2345+
}
2346+
```
2347+
[*CommonJS entry points:*](#commonjs-api)
2348+
```js
2349+
core-js/proposals/explicit-resource-management
2350+
core-js(-pure)/full/symbol/dispose
2351+
core-js(-pure)/full/disposable-stack
2352+
core-js(-pure)/full/suppressed-error
2353+
core-js(-pure)/full/iterator/dispose
2354+
```
23142355
##### [Well-formed unicode strings](https://github.com/tc39/proposal-is-usv-string)[⬆](#index)
23152356
Modules [`esnext.string.is-well-formed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.string.is-well-formed.js) and [`esnext.string.to-well-formed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.string.to-well-formed.js)
23162357
```js
@@ -2382,19 +2423,35 @@ core-js(-pure)/full/array/is-template-object
23822423
```js
23832424
console.log(Array.isTemplateObject((it => it)`qwe${ 123 }asd`)); // => true
23842425
```
2385-
##### [`Symbol.{ asyncDispose, dispose }` for `using` statement](https://github.com/tc39/proposal-using-statement)[⬆](#index)
2386-
Modules [`esnext.symbol.dispose`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.dispose.js) and [`esnext.symbol.async-dispose`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.async-dispose.js).
2426+
##### [Async Explicit Resource Management](https://github.com/tc39/proposal-async-explicit-resource-management)[⬆](#index)
2427+
Note: **This is only built-ins for this proposal, `using` syntax support requires transpiler support.**
2428+
2429+
Modules [`esnext.symbol.async-dispose`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.async-dispose.js), [`esnext.async-disposable-stack.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-disposable-stack.constructor.js), [`esnext.async-iterator.async-dispose`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.async-dispose.js).
23872430
```js
23882431
class Symbol {
23892432
static asyncDispose: @@asyncDispose;
2390-
static dispose: @@dispose;
2433+
}
2434+
2435+
class AsyncDisposableStack {
2436+
constructor(): AsyncDisposableStack;
2437+
disposeAsync(): Promise<undefined>;
2438+
use(value: AsyncDisposable | Disposable): value;
2439+
adopt(value: object, onDispose: Function): value;
2440+
defer(onDispose: Function): undefined;
2441+
@@asyncDispose(): Promise<undefined>;
2442+
@@toStringTag: 'AsyncDisposableStack';
2443+
}
2444+
2445+
class AsyncIterator {
2446+
@@asyncDispose(): Promise<undefined>;
23912447
}
23922448
```
23932449
[*CommonJS entry points:*](#commonjs-api)
23942450
```js
2395-
core-js/proposals/using-statement
2451+
core-js/proposals/async-explicit-resource-management
23962452
core-js(-pure)/full/symbol/async-dispose
2397-
core-js(-pure)/full/symbol/dispose
2453+
core-js(-pure)/full/async-disposable-stack
2454+
core-js(-pure)/full/async-iterator/async-dispose
23982455
```
23992456
##### [`Symbol.metadataKey` for decorators metadata proposal](https://github.com/tc39/proposal-decorator-metadata)[⬆](#index)
24002457
Module [`esnext.symbol.metadata-key`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.metadata-key.js).

packages/core-js-compat/src/data.mjs

+10
Original file line numberDiff line numberDiff line change
@@ -1802,6 +1802,8 @@ export const data = {
18021802
},
18031803
// TODO: Remove from `core-js@4`
18041804
'esnext.aggregate-error': null,
1805+
'esnext.suppressed-error.constructor': {
1806+
},
18051807
'esnext.array.from-async': {
18061808
bun: '0.3.0',
18071809
},
@@ -1858,11 +1860,15 @@ export const data = {
18581860
deno: '1.27',
18591861
safari: '16.0',
18601862
},
1863+
'esnext.async-disposable-stack.constructor': {
1864+
},
18611865
'esnext.async-iterator.constructor': {
18621866
},
18631867
// TODO: Remove from `core-js@4`
18641868
'esnext.async-iterator.as-indexed-pairs': {
18651869
},
1870+
'esnext.async-iterator.async-dispose': {
1871+
},
18661872
'esnext.async-iterator.drop': {
18671873
},
18681874
'esnext.async-iterator.every': {
@@ -1895,6 +1901,8 @@ export const data = {
18951901
},
18961902
'esnext.composite-symbol': {
18971903
},
1904+
'esnext.disposable-stack.constructor': {
1905+
},
18981906
'esnext.function.is-callable': {
18991907
},
19001908
'esnext.function.is-constructor': {
@@ -1908,6 +1916,8 @@ export const data = {
19081916
// TODO: Remove from `core-js@4`
19091917
'esnext.iterator.as-indexed-pairs': {
19101918
},
1919+
'esnext.iterator.dispose': {
1920+
},
19111921
'esnext.iterator.drop': {
19121922
},
19131923
'esnext.iterator.every': {

packages/core-js-compat/src/modules-by-versions.mjs

+5
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ export default {
163163
'web.self',
164164
],
165165
3.27: [
166+
'esnext.suppressed-error.constructor',
167+
'esnext.async-disposable-stack.constructor',
168+
'esnext.async-iterator.async-dispose',
169+
'esnext.disposable-stack.constructor',
170+
'esnext.iterator.dispose',
166171
'esnext.set.difference.v2',
167172
'esnext.set.intersection.v2',
168173
'esnext.set.is-disjoint-from.v2',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
require('../../modules/es.error.cause');
2+
require('../../modules/es.object.to-string');
3+
require('../../modules/esnext.suppressed-error.constructor');
4+
require('../../modules/esnext.disposable-stack.constructor');
5+
var path = require('../../internals/path');
6+
7+
module.exports = path.DisposableStack;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
require('../../modules/es.error.cause');
2+
require('../../modules/es.object.to-string');
3+
require('../../modules/esnext.suppressed-error.constructor');
4+
require('../../modules/esnext.disposable-stack.constructor');
5+
var path = require('../../internals/path');
6+
7+
module.exports = path.DisposableStack;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
require('../../modules/esnext.iterator.dispose');

packages/core-js/actual/iterator/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ require('../../modules/es.object.to-string');
33
require('../../modules/es.promise');
44
require('../../modules/es.string.iterator');
55
require('../../modules/esnext.iterator.constructor');
6+
require('../../modules/esnext.iterator.dispose');
67
require('../../modules/esnext.iterator.drop');
78
require('../../modules/esnext.iterator.every');
89
require('../../modules/esnext.iterator.filter');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
require('../modules/es.error.cause');
2+
require('../modules/esnext.suppressed-error.constructor');
3+
var path = require('../internals/path');
4+
5+
module.exports = path.SuppressedError;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
require('../../modules/esnext.symbol.dispose');
2+
var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
3+
4+
module.exports = WrappedWellKnownSymbolModule.f('dispose');
+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
var parent = require('../../stable/symbol');
22

3+
require('../../modules/esnext.symbol.dispose');
4+
35
module.exports = parent;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require('../../modules/es.error.cause');
2+
require('../../modules/es.object.to-string');
3+
require('../../modules/es.promise');
4+
require('../../modules/esnext.suppressed-error.constructor');
5+
require('../../modules/esnext.async-disposable-stack.constructor');
6+
var path = require('../../internals/path');
7+
8+
module.exports = path.AsyncDisposableStack;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require('../../modules/es.error.cause');
2+
require('../../modules/es.object.to-string');
3+
require('../../modules/es.promise');
4+
require('../../modules/esnext.suppressed-error.constructor');
5+
require('../../modules/esnext.async-disposable-stack.constructor');
6+
var path = require('../../internals/path');
7+
8+
module.exports = path.AsyncDisposableStack;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
require('../../modules/es.object.to-string');
2+
require('../../modules/es.promise');
3+
require('../../modules/esnext.async-iterator.async-dispose');

packages/core-js/full/async-iterator/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var parent = require('../../actual/async-iterator');
2+
require('../../modules/esnext.async-iterator.async-dispose');
23
// TODO: Remove from `core-js@4`
34
require('../../modules/esnext.async-iterator.as-indexed-pairs');
45
require('../../modules/esnext.async-iterator.indexed');

packages/core-js/full/async-iterator/indexed.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// TODO: Remove from `core-js@4`
12
require('../../modules/es.object.to-string');
23
require('../../modules/es.promise');
34
require('../../modules/esnext.async-iterator.constructor');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var parent = require('../../actual/disposable-stack/constructor');
2+
3+
module.exports = parent;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var parent = require('../../actual/disposable-stack');
2+
3+
module.exports = parent;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var parent = require('../../actual/iterator/dispose');
2+
3+
module.exports = parent;

packages/core-js/full/iterator/indexed.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// TODO: Remove from `core-js@4`
12
require('../../modules/es.object.to-string');
23
require('../../modules/esnext.iterator.constructor');
34
require('../../modules/esnext.iterator.indexed');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var parent = require('../actual/suppressed-error');
2+
3+
module.exports = parent;
+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
require('../../modules/esnext.symbol.dispose');
2-
var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
1+
var parent = require('../../actual/symbol/dispose');
32

4-
module.exports = WrappedWellKnownSymbolModule.f('dispose');
3+
module.exports = parent;

packages/core-js/full/symbol/index.js

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
var parent = require('../../actual/symbol');
22
require('../../modules/esnext.symbol.async-dispose');
3-
require('../../modules/esnext.symbol.dispose');
43
require('../../modules/esnext.symbol.matcher');
54
require('../../modules/esnext.symbol.metadata-key');
65
require('../../modules/esnext.symbol.observable');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var uncurryThis = require('../internals/function-uncurry-this');
2+
var bind = require('../internals/function-bind-context');
3+
var anObject = require('../internals/an-object');
4+
var isNullOrUndefined = require('../internals/is-null-or-undefined');
5+
var getMethod = require('../internals/get-method');
6+
var wellKnownSymbol = require('../internals/well-known-symbol');
7+
8+
var ASYNC_DISPOSE = wellKnownSymbol('asyncDispose');
9+
var DISPOSE = wellKnownSymbol('dispose');
10+
11+
var push = uncurryThis([].push);
12+
13+
var getDisposeMethod = function (V, hint) {
14+
if (hint == 'async-dispose') {
15+
return getMethod(V, ASYNC_DISPOSE) || getMethod(V, DISPOSE);
16+
} return getMethod(V, DISPOSE);
17+
};
18+
19+
var createDisposableResource = function (V, hint, method) {
20+
return bind(method || getDisposeMethod(V, hint), V);
21+
};
22+
23+
var addDisposableResource = function (disposable, V, hint, method) {
24+
var resource;
25+
if (!method) {
26+
if (isNullOrUndefined(V)) return;
27+
resource = createDisposableResource(V, hint);
28+
} else if (isNullOrUndefined(V)) {
29+
resource = createDisposableResource(undefined, hint, method);
30+
} else {
31+
resource = createDisposableResource(anObject(V), hint, method);
32+
}
33+
34+
push(disposable.stack, resource);
35+
};
36+
37+
module.exports = {
38+
getDisposeMethod: getDisposeMethod,
39+
addDisposableResource: addDisposableResource
40+
};

0 commit comments

Comments
 (0)