summaryrefslogtreecommitdiff
path: root/js/form_data.ts
diff options
context:
space:
mode:
authorKyra <kyradiscord@gmail.com>2018-11-04 19:05:02 +0100
committerRyan Dahl <ry@tinyclouds.org>2018-11-04 10:05:02 -0800
commite93d686e9d5e797f7e4e02bda56a8b6d535326ca (patch)
treee89490da61e17ee890ce590fdaa99d0701dc8308 /js/form_data.ts
parent1241b8e9babfec3e87c8958e2065966ee5dd1335 (diff)
Web APIs: `File` and `FormData` (#1056)
Diffstat (limited to 'js/form_data.ts')
-rw-r--r--js/form_data.ts107
1 files changed, 107 insertions, 0 deletions
diff --git a/js/form_data.ts b/js/form_data.ts
new file mode 100644
index 000000000..662643520
--- /dev/null
+++ b/js/form_data.ts
@@ -0,0 +1,107 @@
+// Copyright 2018 the Deno authors. All rights reserved. MIT license.
+import * as domTypes from "./dom_types";
+import * as blob from "./blob";
+import * as file from "./file";
+import { DomIterableMixin } from "./mixins/dom_iterable";
+
+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 {
+ if (value instanceof blob.DenoBlob) {
+ const dfile = new file.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 {
+ 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[] {
+ 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 {
+ 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 {
+ return this[dataSymbol].some(entry => 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.
+ *
+ * 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 {
+ this.delete(name);
+ if (value instanceof blob.DenoBlob) {
+ const dfile = new file.DenoFile([value], filename || name);
+ this[dataSymbol].push([name, dfile]);
+ } else {
+ this[dataSymbol].push([name, String(value)]);
+ }
+ }
+}
+
+// tslint:disable-next-line:variable-name
+export const FormData = DomIterableMixin<
+ string,
+ domTypes.FormDataEntryValue,
+ typeof FormDataBase
+>(FormDataBase, dataSymbol);