summaryrefslogtreecommitdiff
path: root/js/url_search_params.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/url_search_params.ts')
-rw-r--r--js/url_search_params.ts297
1 files changed, 0 insertions, 297 deletions
diff --git a/js/url_search_params.ts b/js/url_search_params.ts
deleted file mode 100644
index 0835133d5..000000000
--- a/js/url_search_params.ts
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-import { URL } from "./url.ts";
-import { requiredArguments, isIterable } from "./util.ts";
-
-export class URLSearchParams {
- private params: Array<[string, string]> = [];
- private url: URL | null = null;
-
- constructor(init: string | string[][] | Record<string, string> = "") {
- if (typeof init === "string") {
- this._handleStringInitialization(init);
- return;
- }
-
- if (Array.isArray(init) || isIterable(init)) {
- this._handleArrayInitialization(init);
- return;
- }
-
- if (Object(init) !== init) {
- return;
- }
-
- if (init instanceof URLSearchParams) {
- this.params = init.params;
- return;
- }
-
- // Overload: record<USVString, USVString>
- for (const key of Object.keys(init)) {
- this.append(key, init[key]);
- }
- }
-
- private updateSteps(): void {
- if (this.url === null) {
- return;
- }
-
- let query: string | null = this.toString();
- if (query === "") {
- query = null;
- }
-
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (this.url as any)._parts.query = query;
- }
-
- /** Appends a specified key/value pair as a new search parameter.
- *
- * searchParams.append('name', 'first');
- * searchParams.append('name', 'second');
- */
- append(name: string, value: string): void {
- requiredArguments("URLSearchParams.append", arguments.length, 2);
- this.params.push([String(name), String(value)]);
- this.updateSteps();
- }
-
- /** Deletes the given search parameter and its associated value,
- * from the list of all search parameters.
- *
- * searchParams.delete('name');
- */
- delete(name: string): void {
- requiredArguments("URLSearchParams.delete", arguments.length, 1);
- name = String(name);
- let i = 0;
- while (i < this.params.length) {
- if (this.params[i][0] === name) {
- this.params.splice(i, 1);
- } else {
- i++;
- }
- }
- this.updateSteps();
- }
-
- /** Returns all the values associated with a given search parameter
- * as an array.
- *
- * searchParams.getAll('name');
- */
- getAll(name: string): string[] {
- requiredArguments("URLSearchParams.getAll", arguments.length, 1);
- name = String(name);
- const values = [];
- for (const entry of this.params) {
- if (entry[0] === name) {
- values.push(entry[1]);
- }
- }
-
- return values;
- }
-
- /** Returns the first value associated to the given search parameter.
- *
- * searchParams.get('name');
- */
- get(name: string): string | null {
- requiredArguments("URLSearchParams.get", arguments.length, 1);
- name = String(name);
- for (const entry of this.params) {
- if (entry[0] === name) {
- return entry[1];
- }
- }
-
- return null;
- }
-
- /** Returns a Boolean that indicates whether a parameter with the
- * specified name exists.
- *
- * searchParams.has('name');
- */
- has(name: string): boolean {
- requiredArguments("URLSearchParams.has", arguments.length, 1);
- name = String(name);
- return this.params.some((entry): boolean => entry[0] === name);
- }
-
- /** Sets the value associated with a given search parameter to the
- * given value. If there were several matching values, this method
- * deletes the others. If the search parameter doesn't exist, this
- * method creates it.
- *
- * searchParams.set('name', 'value');
- */
- set(name: string, value: string): void {
- requiredArguments("URLSearchParams.set", arguments.length, 2);
-
- // If there are any name-value pairs whose name is name, in list,
- // set the value of the first such name-value pair to value
- // and remove the others.
- name = String(name);
- value = String(value);
- let found = false;
- let i = 0;
- while (i < this.params.length) {
- if (this.params[i][0] === name) {
- if (!found) {
- this.params[i][1] = value;
- found = true;
- i++;
- } else {
- this.params.splice(i, 1);
- }
- } else {
- i++;
- }
- }
-
- // Otherwise, append a new name-value pair whose name is name
- // and value is value, to list.
- if (!found) {
- this.append(name, value);
- }
-
- this.updateSteps();
- }
-
- /** Sort all key/value pairs contained in this object in place and
- * return undefined. The sort order is according to Unicode code
- * points of the keys.
- *
- * searchParams.sort();
- */
- sort(): void {
- this.params = this.params.sort(
- (a, b): number => (a[0] === b[0] ? 0 : a[0] > b[0] ? 1 : -1)
- );
- this.updateSteps();
- }
-
- /** Calls a function for each element contained in this object in
- * place and return undefined. Optionally accepts an object to use
- * as this when executing callback as second argument.
- *
- * searchParams.forEach((value, key, parent) => {
- * console.log(value, key, parent);
- * });
- *
- */
- forEach(
- callbackfn: (value: string, key: string, parent: this) => void,
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- thisArg?: any
- ): void {
- requiredArguments("URLSearchParams.forEach", arguments.length, 1);
-
- if (typeof thisArg !== "undefined") {
- callbackfn = callbackfn.bind(thisArg);
- }
-
- for (const [key, value] of this.entries()) {
- callbackfn(value, key, this);
- }
- }
-
- /** Returns an iterator allowing to go through all keys contained
- * in this object.
- *
- * for (const key of searchParams.keys()) {
- * console.log(key);
- * }
- */
- *keys(): IterableIterator<string> {
- for (const entry of this.params) {
- yield entry[0];
- }
- }
-
- /** Returns an iterator allowing to go through all values contained
- * in this object.
- *
- * for (const value of searchParams.values()) {
- * console.log(value);
- * }
- */
- *values(): IterableIterator<string> {
- for (const entry of this.params) {
- yield entry[1];
- }
- }
-
- /** Returns an iterator allowing to go through all key/value
- * pairs contained in this object.
- *
- * for (const [key, value] of searchParams.entries()) {
- * console.log(key, value);
- * }
- */
- *entries(): IterableIterator<[string, string]> {
- yield* this.params;
- }
-
- /** Returns an iterator allowing to go through all key/value
- * pairs contained in this object.
- *
- * for (const [key, value] of searchParams[Symbol.iterator]()) {
- * console.log(key, value);
- * }
- */
- *[Symbol.iterator](): IterableIterator<[string, string]> {
- yield* this.params;
- }
-
- /** Returns a query string suitable for use in a URL.
- *
- * searchParams.toString();
- */
- toString(): string {
- return this.params
- .map(
- (tuple): string =>
- `${encodeURIComponent(tuple[0])}=${encodeURIComponent(tuple[1])}`
- )
- .join("&");
- }
-
- private _handleStringInitialization(init: string): void {
- // Overload: USVString
- // If init is a string and starts with U+003F (?),
- // remove the first code point from init.
- if (init.charCodeAt(0) === 0x003f) {
- init = init.slice(1);
- }
-
- for (const pair of init.split("&")) {
- // Empty params are ignored
- if (pair.length === 0) {
- continue;
- }
- const position = pair.indexOf("=");
- const name = pair.slice(0, position === -1 ? pair.length : position);
- const value = pair.slice(name.length + 1);
- this.append(decodeURIComponent(name), decodeURIComponent(value));
- }
- }
-
- private _handleArrayInitialization(
- init: string[][] | Iterable<[string, string]>
- ): void {
- // Overload: sequence<sequence<USVString>>
- for (const tuple of init) {
- // If pair does not contain exactly two items, then throw a TypeError.
- if (tuple.length !== 2) {
- throw new TypeError(
- "URLSearchParams.constructor tuple array argument must only contain pair elements"
- );
- }
- this.append(tuple[0], tuple[1]);
- }
- }
-}