1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 15:24:46 -05:00

feat: URLSearchParams should work with custom iterator (#2512)

This commit is contained in:
迷渡 2019-06-14 23:46:07 +08:00 committed by Ryan Dahl
parent dc60fe9f30
commit 52448f351d
3 changed files with 29 additions and 1 deletions

View file

@ -1,6 +1,6 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { URL } from "./url";
import { requiredArguments } from "./util";
import { requiredArguments, isIterable } from "./util";
export class URLSearchParams {
private params: Array<[string, string]> = [];
@ -17,6 +17,11 @@ export class URLSearchParams {
return;
}
if (isIterable(init)) {
this.params = [...init];
return;
}
if (Object(init) !== init) {
return;
}

View file

@ -217,3 +217,13 @@ test(function urlSearchParamsDeletingAppendedMultiple(): void {
params.delete("first");
assertEquals(params.has("first"), false);
});
// ref: https://github.com/web-platform-tests/wpt/blob/master/url/urlsearchparams-constructor.any.js#L176-L182
test(function urlSearchParamsCustomSymbolIterator(): void {
const params = new URLSearchParams();
params[Symbol.iterator] = function*(): IterableIterator<[string, string]> {
yield ["a", "b"];
};
const params1 = new URLSearchParams((params as unknown) as string[][]);
assertEquals(params1.get("a"), "b");
});

View file

@ -122,6 +122,19 @@ export function isObject(o: unknown): o is object {
return o != null && typeof o === "object";
}
// Returns whether o is iterable.
export function isIterable<T, P extends keyof T, K extends T[P]>(
o: T
): o is T & Iterable<[P, K]> {
// checks for null and undefined
if (o == null) {
return false;
}
return (
typeof ((o as unknown) as Iterable<[P, K]>)[Symbol.iterator] === "function"
);
}
// @internal
export function requiredArguments(
name: string,