summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-11-01 23:25:18 +0100
committerGitHub <noreply@github.com>2023-11-01 22:25:18 +0000
commitab72019a17ccc077384c37eaeae15fffc9ce4d92 (patch)
tree9817bf313e25bdd8d318fb58b3e366f14d252858
parent24c3c9695865bb478f5651da4982b7e0a34afc72 (diff)
feat: enable Array.fromAsync (#21048)
-rw-r--r--cli/main.rs3
-rw-r--r--cli/tests/unit/console_test.ts1
-rw-r--r--cli/tests/unit/globals_test.ts17
-rw-r--r--cli/tsc/dts/lib.esnext.array.d.ts14
4 files changed, 34 insertions, 1 deletions
diff --git a/cli/main.rs b/cli/main.rs
index 24b964169..c6249a21f 100644
--- a/cli/main.rs
+++ b/cli/main.rs
@@ -368,7 +368,8 @@ pub fn main() {
// Using same default as VSCode:
// https://github.com/microsoft/vscode/blob/48d4ba271686e8072fc6674137415bc80d936bc7/extensions/typescript-language-features/src/configuration/configuration.ts#L213-L214
DenoSubcommand::Lsp => vec!["--max-old-space-size=3072".to_string()],
- _ => vec![],
+ // TODO(bartlomieju): upstream this to `deno_core` crate
+ _ => vec!["--harmony-array-from-async".to_string()],
};
init_v8_flags(&default_v8_flags, &flags.v8_flags, get_v8_flags_from_env());
deno_core::JsRuntime::init_platform(None);
diff --git a/cli/tests/unit/console_test.ts b/cli/tests/unit/console_test.ts
index d8990559e..d6e2a5263 100644
--- a/cli/tests/unit/console_test.ts
+++ b/cli/tests/unit/console_test.ts
@@ -500,6 +500,7 @@ Deno.test(function consoleTestStringifyFunctionWithProperties() {
[isArray]: [Function: isArray] { [length]: 1, [name]: "isArray" },
[from]: [Function: from] { [length]: 1, [name]: "from" },
[of]: [Function: of] { [length]: 0, [name]: "of" },
+ [fromAsync]: [Function: fromAsync] { [length]: 1, [name]: "fromAsync" },
[Symbol(Symbol.species)]: [Getter]
}`,
);
diff --git a/cli/tests/unit/globals_test.ts b/cli/tests/unit/globals_test.ts
index e5ff2cc8e..b47e83cfd 100644
--- a/cli/tests/unit/globals_test.ts
+++ b/cli/tests/unit/globals_test.ts
@@ -153,3 +153,20 @@ Deno.test(async function promiseWithResolvers() {
await assertRejects(() => promise, Error, "boom!");
}
});
+
+Deno.test(async function arrayFromAsync() {
+ // Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fromAsync#examples
+ // Thank you.
+ const asyncIterable = (async function* () {
+ for (let i = 0; i < 5; i++) {
+ await new Promise((resolve) => setTimeout(resolve, 10 * i));
+ yield i;
+ }
+ })();
+
+ const a = await Array.fromAsync(asyncIterable);
+ assertEquals(a, [0, 1, 2, 3, 4]);
+
+ const b = await Array.fromAsync(new Map([[1, 2], [3, 4]]));
+ assertEquals(b, [[1, 2], [3, 4]]);
+});
diff --git a/cli/tsc/dts/lib.esnext.array.d.ts b/cli/tsc/dts/lib.esnext.array.d.ts
index a74a7b311..5bf6612fc 100644
--- a/cli/tsc/dts/lib.esnext.array.d.ts
+++ b/cli/tsc/dts/lib.esnext.array.d.ts
@@ -291,3 +291,17 @@ interface BigUint64Array {
with(index: number, value: number): BigUint64Array;
}
+
+// NOTE(bartlomieju): taken from https://github.com/microsoft/TypeScript/issues/50803#issuecomment-1249030430
+// while we wait for these types to officially ship
+interface ArrayConstructor {
+ fromAsync<T>(
+ iterableOrArrayLike: AsyncIterable<T> | Iterable<T | Promise<T>> | ArrayLike<T | Promise<T>>,
+ ): Promise<T[]>;
+
+ fromAsync<T, U>(
+ iterableOrArrayLike: AsyncIterable<T> | Iterable<T> | ArrayLike<T>,
+ mapFn: (value: Awaited<T>) => U,
+ thisArg?: any,
+ ): Promise<Awaited<U>[]>;
+}