0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-01 09:24:20 -04:00
denoland-deno/js/form_data.ts
Ryan Dahl d43b43ca78
Refactor snapshot build (#2825)
Instead of using core/snapshot_creator.rs, instead two crates are
introduced which allow building the snapshot during build.rs.

Rollup is removed and replaced with our own bundler. This removes
the Node build dependency. Modules in //js now use Deno-style imports
with file extensions, rather than Node style extensionless imports.

This improves incremental build time when changes are made to //js files
by about 40 seconds.
2019-09-02 17:07:11 -04:00

149 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import * as domTypes from "./dom_types.ts";
import * as blob from "./blob.ts";
import * as domFile from "./dom_file.ts";
import { DomIterableMixin } from "./mixins/dom_iterable.ts";
import { requiredArguments } from "./util.ts";
const dataSymbol = Symbol("data");
class FormDataBase {
private [dataSymbol]: Array<[string, domTypes.FormDataEntryValue]> = [];
/** Appends a new value onto an existing key inside a `FormData`
* object, or adds the key if it does not already exist.
*
* formData.append('name', 'first');
* formData.append('name', 'second');
*/
append(name: string, value: string): void;
append(name: string, value: blob.DenoBlob, filename?: string): void;
append(name: string, value: string | blob.DenoBlob, filename?: string): void {
requiredArguments("FormData.append", arguments.length, 2);
name = String(name);
if (value instanceof blob.DenoBlob) {
const dfile = new domFile.DenoFile([value], filename || name);
this[dataSymbol].push([name, dfile]);
} else {
this[dataSymbol].push([name, String(value)]);
}
}
/** Deletes a key/value pair from a `FormData` object.
*
* formData.delete('name');
*/
delete(name: string): void {
requiredArguments("FormData.delete", arguments.length, 1);
name = String(name);
let i = 0;
while (i < this[dataSymbol].length) {
if (this[dataSymbol][i][0] === name) {
this[dataSymbol].splice(i, 1);
} else {
i++;
}
}
}
/** Returns an array of all the values associated with a given key
* from within a `FormData`.
*
* formData.getAll('name');
*/
getAll(name: string): domTypes.FormDataEntryValue[] {
requiredArguments("FormData.getAll", arguments.length, 1);
name = String(name);
const values = [];
for (const entry of this[dataSymbol]) {
if (entry[0] === name) {
values.push(entry[1]);
}
}
return values;
}
/** Returns the first value associated with a given key from within a
* `FormData` object.
*
* formData.get('name');
*/
get(name: string): domTypes.FormDataEntryValue | null {
requiredArguments("FormData.get", arguments.length, 1);
name = String(name);
for (const entry of this[dataSymbol]) {
if (entry[0] === name) {
return entry[1];
}
}
return null;
}
/** Returns a boolean stating whether a `FormData` object contains a
* certain key/value pair.
*
* formData.has('name');
*/
has(name: string): boolean {
requiredArguments("FormData.has", arguments.length, 1);
name = String(name);
return this[dataSymbol].some((entry): boolean => entry[0] === name);
}
/** Sets a new value for an existing key inside a `FormData` object, or
* adds the key/value if it does not already exist.
* ref: https://xhr.spec.whatwg.org/#dom-formdata-set
*
* formData.set('name', 'value');
*/
set(name: string, value: string): void;
set(name: string, value: blob.DenoBlob, filename?: string): void;
set(name: string, value: string | blob.DenoBlob, filename?: string): void {
requiredArguments("FormData.set", arguments.length, 2);
name = String(name);
// If there are any entries in the context objects entry list whose name
// is name, replace the first such entry with entry and remove the others
let found = false;
let i = 0;
while (i < this[dataSymbol].length) {
if (this[dataSymbol][i][0] === name) {
if (!found) {
if (value instanceof blob.DenoBlob) {
const dfile = new domFile.DenoFile([value], filename || name);
this[dataSymbol][i][1] = dfile;
} else {
this[dataSymbol][i][1] = String(value);
}
found = true;
} else {
this[dataSymbol].splice(i, 1);
continue;
}
}
i++;
}
// Otherwise, append entry to the context objects entry list.
if (!found) {
if (value instanceof blob.DenoBlob) {
const dfile = new domFile.DenoFile([value], filename || name);
this[dataSymbol].push([name, dfile]);
} else {
this[dataSymbol].push([name, String(value)]);
}
}
}
get [Symbol.toStringTag](): string {
return "FormData";
}
}
export class FormData extends DomIterableMixin<
string,
domTypes.FormDataEntryValue,
typeof FormDataBase
>(FormDataBase, dataSymbol) {}