Skip to content

Commit 4d9a05e

Browse files
committed
feat: add wrong cases
1 parent 663b74b commit 4d9a05e

File tree

2 files changed

+103
-9
lines changed

2 files changed

+103
-9
lines changed

reform.test.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,17 @@ Deno.test("reform, n-depth array", () => {
4646
assertEquals(reform(form), { multiple: [["1"], ["2"], ["3"], ["4"]] });
4747
});
4848

49+
Deno.test("reform, sparse array", () => {
50+
const form = new FormData();
51+
52+
form.append("multiple[5]", "5");
53+
form.append("multiple[3]", "3");
54+
55+
assertEquals(reform(form), {
56+
multiple: [null, null, null, "3", null, "5"], // fill sparse as null
57+
});
58+
});
59+
4960
Deno.test("reform, n-depth, indexed array", () => {
5061
const form = new FormData();
5162

@@ -69,3 +80,74 @@ Deno.test("reform, object array", () => {
6980
users: [{ id: "10", name: "wan2land" }, { id: "11", name: "wan3land" }],
7081
});
7182
});
83+
84+
Deno.test("reform, n-depth object", () => {
85+
const form = new FormData();
86+
87+
form.append("user[id]", "11");
88+
form.append("user.name", "wan2land");
89+
form.append("user[pet].name", "bori");
90+
form.append("user[pet][age]", "5");
91+
92+
assertEquals(reform(form), {
93+
user: {
94+
id: "11",
95+
name: "wan2land",
96+
pet: { name: "bori", age: "5" },
97+
},
98+
});
99+
});
100+
101+
Deno.test("reform, wrong array, overwrite", () => {
102+
{
103+
const form = new FormData();
104+
105+
form.append("user.name.something", "foo");
106+
form.append("user[]", "wan2land");
107+
form.append("user.name", "wan2land"); // overwrite!
108+
109+
assertEquals(reform(form), {
110+
user: {
111+
name: "wan2land",
112+
},
113+
});
114+
}
115+
{
116+
const form = new FormData();
117+
118+
form.append("user[]", "wan3land");
119+
form.append("user.name", "wan2land");
120+
form.append("user[]", "wan2land"); // overwrite!
121+
122+
assertEquals(reform(form), {
123+
user: ["wan2land"],
124+
});
125+
}
126+
});
127+
128+
Deno.test("reform, wrong object, overwrite", () => {
129+
{
130+
const form = new FormData();
131+
132+
form.append("user.name", "wan2land");
133+
form.append("user", "wan2land");
134+
form.append("user.name", "wan2land"); // overwrite!
135+
136+
assertEquals(reform(form), {
137+
user: {
138+
name: "wan2land",
139+
},
140+
});
141+
}
142+
{
143+
const form = new FormData();
144+
145+
form.append("user", "wan2land");
146+
form.append("user.name", "wan2land");
147+
form.append("user", "wan2land"); // overwrite!
148+
149+
assertEquals(reform(form), {
150+
user: "wan2land",
151+
});
152+
}
153+
});

reform.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import { parseName } from "./parse_name.ts";
22

3+
function isPlainObject(value: unknown): value is ReformData {
4+
return typeof value === "object" && value !== null && !Array.isArray(value);
5+
}
6+
37
export interface ReformData {
48
[name: string]: ReformDataValue;
59
}
610

7-
export type ReformDataValue = File | string | ReformData | ReformDataValue[];
11+
export type ReformDataValue =
12+
| File
13+
| string
14+
| ReformData
15+
| (ReformDataValue | null)[];
816

917
export function reform<T extends ReformData = ReformData>(form: FormData): T {
1018
const reformed: ReformData = {};
@@ -14,22 +22,28 @@ export function reform<T extends ReformData = ReformData>(form: FormData): T {
1422
let data: any = reformed;
1523
for (const [keyIndex, key] of keys.entries()) {
1624
if (keyIndex + 1 === keys.length) {
17-
if (typeof key === "string" || typeof key === "number") {
25+
if (typeof key === "string") {
1826
data[key] = value;
19-
} else if (Array.isArray(data)) {
20-
data.push(value);
27+
} else if (typeof key === "number") {
28+
data[key] = value;
29+
// fill sparse
30+
for (let i = 0; i < key; i++) {
31+
if (!(i in data)) {
32+
data[i] = null;
33+
}
34+
}
2135
} else {
22-
throw new Error("111");
36+
data.push(value);
2337
}
2438
break;
2539
}
2640
const nextKey = keys[keyIndex + 1];
2741
if (typeof key === "string" || typeof key === "number") {
2842
if (typeof nextKey === "string") {
29-
data[key] = data[key] ?? {};
43+
data[key] = isPlainObject(data[key]) ? data[key] : {};
3044
data = data[key];
3145
} else {
32-
data[key] = data[key] ?? [];
46+
data[key] = Array.isArray(data[key]) ? data[key] : [];
3347
data = data[key];
3448
}
3549
} else if (Array.isArray(data)) {
@@ -42,8 +56,6 @@ export function reform<T extends ReformData = ReformData>(form: FormData): T {
4256
data.push(next);
4357
data = next;
4458
}
45-
} else {
46-
throw new Error("22");
4759
}
4860
}
4961
}

0 commit comments

Comments
 (0)