Skip to content

Commit 55e4c0a

Browse files
authored
Merge pull request #193 from Teyik0/main
fix t.Files() upload from server side #124
2 parents ee21b4f + 1274c5c commit 55e4c0a

File tree

6 files changed

+153
-17
lines changed

6 files changed

+153
-17
lines changed

example/b.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Elysia } from 'elysia'
22
import { treaty } from '../src'
33

44
const app = new Elysia().get('/', () => ({
5-
a: Bun.file('./test/kyuukurarin.mp4')
5+
a: Bun.file('./test/public/kyuukurarin.mp4')
66
}))
77

88
const api = treaty(app)

src/treaty2/index.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,22 @@ const createProxy = (
288288
for (const [key, field] of Object.entries(
289289
fetchInit.body
290290
)) {
291+
292+
if (Array.isArray(field)) {
293+
for (let i = 0; i < field.length; i++) {
294+
const value = (field as any)[i]
295+
296+
formData.append(
297+
key as any,
298+
value instanceof File
299+
? await createNewFile(value)
300+
: value
301+
)
302+
}
303+
304+
continue
305+
}
306+
291307
if (isServer) {
292308
formData.append(key, field as any)
293309

@@ -313,21 +329,6 @@ const createProxy = (
313329
continue
314330
}
315331

316-
if (Array.isArray(field)) {
317-
for (let i = 0; i < field.length; i++) {
318-
const value = (field as any)[i]
319-
320-
formData.append(
321-
key as any,
322-
value instanceof File
323-
? await createNewFile(value)
324-
: value
325-
)
326-
}
327-
328-
continue
329-
}
330-
331332
formData.append(key, field as string)
332333
}
333334

test/public/aris-yuzu.jpg

963 KB
Loading
File renamed without changes.

test/public/midori.png

69.3 KB
Loading

test/treaty2.test.ts

Lines changed: 136 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ const app = new Elysia()
143143
)
144144
.get('/formdata', () =>
145145
form({
146-
image: Bun.file('./test/kyuukurarin.mp4')
146+
image: Bun.file('./test/public/kyuukurarin.mp4')
147147
})
148148
)
149149
.ws('/json-serialization-deserialization', {
@@ -171,6 +171,22 @@ const app = new Elysia()
171171
return 'a'
172172
})
173173
.get('/id/:id?', ({ params: { id = 'unknown' } }) => id)
174+
.post(
175+
'/files',
176+
({ body: { files } }) => files.map((file) => file.name),
177+
{
178+
body: t.Object({
179+
files: t.Files()
180+
})
181+
}
182+
)
183+
.post(
184+
'/file',
185+
({ body: { file } }) => file.name, {
186+
body: t.Object({
187+
file: t.File()
188+
})
189+
})
174190

175191
const client = treaty(app)
176192

@@ -645,3 +661,122 @@ describe('Treaty2 - Using endpoint URL', () => {
645661
})
646662
})
647663
})
664+
665+
666+
describe('Treaty2 - Using t.File() and t.Files() from server', async () => {
667+
const filePath1 = `${import.meta.dir}/public/aris-yuzu.jpg`
668+
const filePath2 = `${import.meta.dir}/public/midori.png`
669+
const filePath3 = `${import.meta.dir}/public/kyuukurarin.mp4`
670+
671+
const bunFile1 = Bun.file(filePath1)
672+
const bunFile2 = Bun.file(filePath2)
673+
const bunFile3 = Bun.file(filePath3)
674+
675+
const file1 = new File([await bunFile1.arrayBuffer()], 'cumin.webp', {
676+
type: 'image/webp'
677+
})
678+
const file2 = new File([await bunFile2.arrayBuffer()], 'curcuma.jpg', {
679+
type: 'image/jpeg'
680+
})
681+
const file3 = new File([await bunFile3.arrayBuffer()], 'kyuukurarin.mp4', {
682+
type: 'video/mp4'
683+
})
684+
685+
const filesForm = new FormData()
686+
filesForm.append('files', file1)
687+
filesForm.append('files', file2)
688+
filesForm.append('files', file3)
689+
690+
const bunFilesForm = new FormData()
691+
bunFilesForm.append('files', bunFile1)
692+
bunFilesForm.append('files', bunFile2)
693+
bunFilesForm.append('files', bunFile3)
694+
695+
it('accept a single Bun.file', async () => {
696+
const { data: files } = await client.files.post({
697+
files: bunFile1 as unknown as FileList
698+
})
699+
700+
expect(files).not.toBeNull()
701+
expect(files).not.toBeUndefined()
702+
expect(files).toEqual([bunFile1.name!])
703+
704+
const { data: filesbis } = await client.files.post({
705+
files: [bunFile1] as unknown as FileList
706+
})
707+
708+
expect(filesbis).not.toBeNull()
709+
expect(filesbis).not.toBeUndefined()
710+
expect(filesbis).toEqual([bunFile1.name!])
711+
712+
const { data: file } = await client.file.post({
713+
file: bunFile1 as unknown as File
714+
})
715+
716+
expect(file).not.toBeNull()
717+
expect(file).not.toBeUndefined()
718+
expect(file).toEqual(bunFile1.name!)
719+
})
720+
721+
it('accept a single regular file', async () => {
722+
const { data: files } = await client.files.post({
723+
files: file1 as unknown as FileList
724+
})
725+
726+
expect(files).not.toBeNull()
727+
expect(files).not.toBeUndefined()
728+
expect(files).toEqual([file1.name!])
729+
730+
const { data: filesbis } = await client.files.post({
731+
files: [file1] as unknown as FileList
732+
})
733+
734+
expect(filesbis).not.toBeNull()
735+
expect(filesbis).not.toBeUndefined()
736+
expect(filesbis).toEqual([file1.name!])
737+
738+
const { data: file } = await client.file.post({
739+
file: file1 as unknown as File
740+
})
741+
742+
expect(file).not.toBeNull()
743+
expect(file).not.toBeUndefined()
744+
expect(file).toEqual(file1.name!)
745+
})
746+
747+
it('accept an array of multiple Bun.file', async () => {
748+
const { data: files } = await client.files.post({
749+
files: [bunFile1, bunFile2, bunFile3] as unknown as FileList
750+
})
751+
752+
expect(files).not.toBeNull()
753+
expect(files).not.toBeUndefined()
754+
expect(files).toEqual([bunFile1.name!, bunFile2.name!, bunFile3.name!])
755+
756+
const { data: filesbis } = await client.files.post({
757+
files: bunFilesForm.getAll('files') as unknown as FileList
758+
})
759+
760+
expect(filesbis).not.toBeNull()
761+
expect(filesbis).not.toBeUndefined()
762+
expect(filesbis).toEqual([bunFile1.name!, bunFile2.name!, bunFile3.name!])
763+
})
764+
765+
it('accept an array of multiple regular file', async () => {
766+
const { data: files } = await client.files.post({
767+
files: [file1, file2, file3] as unknown as FileList
768+
})
769+
770+
expect(files).not.toBeNull()
771+
expect(files).not.toBeUndefined()
772+
expect(files).toEqual([file1.name!, file2.name!, file3.name!])
773+
774+
const { data: filesbis } = await client.files.post({
775+
files: filesForm.getAll('files') as unknown as FileList
776+
})
777+
778+
expect(filesbis).not.toBeNull()
779+
expect(filesbis).not.toBeUndefined()
780+
expect(filesbis).toEqual([file1.name!, file2.name!, file3.name!])
781+
})
782+
})

0 commit comments

Comments
 (0)