From 90b8b2978a441ecfd7a61b772d92fd870a01b3d0 Mon Sep 17 00:00:00 2001 From: Michael Wang Date: Fri, 5 Jun 2026 02:11:53 +0800 Subject: [PATCH 1/4] feat: support upload image api --- nodejs/src/index.ts | 15 ++++++++++++--- nodejs/src/type.ts | 11 +++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/nodejs/src/index.ts b/nodejs/src/index.ts index 3389ee4..1ea9bb7 100644 --- a/nodejs/src/index.ts +++ b/nodejs/src/index.ts @@ -26,6 +26,8 @@ import { UpdateFolderOrderBody, UpdateTeamFolderBody, UpdateUserFolderBody, + UploadNoteImageOptions, + UploadNoteImageResponse, } from './type' import * as HackMDErrors from './error' @@ -70,9 +72,6 @@ export class API { this.axios = axios.create({ baseURL: hackmdAPIEndpointURL, - headers:{ - "Content-Type": "application/json", - }, timeout: options.timeout }) @@ -209,6 +208,16 @@ export class API { return this.unwrapData(this.axios.delete(`notes/${noteId}`), options.unwrapData) as unknown as OptionReturnType } + async uploadNoteImage (noteId: string, image: Blob, options = defaultOption as Opt): Promise> { + const formData = new FormData() + formData.append('image', image, options.filename ?? undefined) + + return this.unwrapData( + this.axios.post(`notes/${noteId}/images`, formData), + options.unwrapData, + ) as unknown as OptionReturnType + } + async getTeams (options = defaultOption as Opt): Promise> { return this.unwrapData(this.axios.get("teams"), options.unwrapData) as unknown as OptionReturnType } diff --git a/nodejs/src/type.ts b/nodejs/src/type.ts index 50eb3f3..9dd93e8 100644 --- a/nodejs/src/type.ts +++ b/nodejs/src/type.ts @@ -114,6 +114,17 @@ export type CreateUserNote = SingleNote export type UpdateUserNote = void export type DeleteUserNote = void +export type UploadNoteImageResponse = { + data: { + link: string + } +} + +export type UploadNoteImageOptions = { + unwrapData?: boolean + filename?: string +} + // Teams export type GetUserTeams = Team[] From 676fd50d1b877a6216ffc50da939d5100db69e48 Mon Sep 17 00:00:00 2001 From: Michael Wang Date: Fri, 5 Jun 2026 02:17:53 +0800 Subject: [PATCH 2/4] test: add integration and e2e tests --- nodejs/tests/api.spec.ts | 61 +++++++++++++++++++++ nodejs/tests/e2e/api.e2e.spec.ts | 26 +++++++++ nodejs/tests/fixtures/hackmd-cute-logo.png | Bin 0 -> 67156 bytes 3 files changed, 87 insertions(+) create mode 100644 nodejs/tests/fixtures/hackmd-cute-logo.png diff --git a/nodejs/tests/api.spec.ts b/nodejs/tests/api.spec.ts index 9f3f28f..adaabd5 100644 --- a/nodejs/tests/api.spec.ts +++ b/nodejs/tests/api.spec.ts @@ -143,6 +143,67 @@ test('updateFolderOrder sends order payload', async () => { }) }) +test('uploadNoteImage sends image as multipart form data', async () => { + let uploaded: FormDataEntryValue | null = null + let contentType: string | null = null + + server.use( + http.post('https://api.hackmd.io/v1/notes/test-note-id/images', async ({ request }) => { + contentType = request.headers.get('content-type') + const formData = await request.formData() + uploaded = formData.get('image') + + return HttpResponse.json({ + data: { + link: 'https://hackmd.io/_uploads/test-image.png', + }, + }) + }), + ) + + const response = await client.uploadNoteImage( + 'test-note-id', + new Blob(['test image'], { type: 'image/png' }), + { filename: 'test-image.png' }, + ) + + expect(contentType).toContain('multipart/form-data') + expect(contentType).not.toContain('application/json') + expect(uploaded).toBeInstanceOf(Blob) + const uploadedBlob = uploaded as unknown as Blob + expect(uploadedBlob.type).toBe('image/png') + expect(response).toEqual({ + data: { + link: 'https://hackmd.io/_uploads/test-image.png', + }, + }) +}) + +test('uploadNoteImage supports raw Axios response', async () => { + server.use( + http.post('https://api.hackmd.io/v1/notes/test-note-id/images', () => { + return HttpResponse.json({ + data: { + link: 'https://hackmd.io/_uploads/raw-image.png', + }, + }) + }), + ) + + const response = await client.uploadNoteImage( + 'test-note-id', + new Blob(['test image'], { type: 'image/png' }), + { filename: 'raw-image.png', unwrapData: false }, + ) + + expect(response).toHaveProperty('status', 200) + expect(response.data).toEqual({ + data: { + link: 'https://hackmd.io/_uploads/raw-image.png', + }, + }) +}) + test('should support updating team note title and tags metadata', async () => { const updatedTags = ['team', 'metadata'] let requestBody: unknown diff --git a/nodejs/tests/e2e/api.e2e.spec.ts b/nodejs/tests/e2e/api.e2e.spec.ts index 8729e6b..b027d9c 100644 --- a/nodejs/tests/e2e/api.e2e.spec.ts +++ b/nodejs/tests/e2e/api.e2e.spec.ts @@ -1,3 +1,4 @@ +import { readFileSync } from 'fs' import type { ApiFolderOrder } from '../../src' import { API } from '../../src' import { HttpResponseError } from '../../src/error' @@ -144,6 +145,31 @@ describe('HackMD API (live e2e)', () => { } }) + it('uploadNoteImage uploads an image to the note', async () => { + const image = readFileSync('tests/fixtures/hackmd-cute-logo.png') + + try { + const uploaded = await client.uploadNoteImage( + noteId, + new Blob([new Uint8Array(image)], { type: 'image/png' }), + { filename: `hackmd-cute-logo-${stamp}.png` }, + ) + + expect(uploaded.data.link).toEqual(expect.any(String)) + expect(uploaded.data.link.length).toBeGreaterThan(0) + } catch (err) { + if (isNotFound(err)) { + console.warn( + '[e2e] POST /notes/{noteId}/images returned 404 (image upload not on this host). ' + + 'Use https://api-stage.hackmd.io/v1 to test image uploads.', + ) + expect(isNotFound(err)).toBe(true) + return + } + throw err + } + }) + it('getNoteList includes the note', async () => { const list = await client.getNoteList() const found = list.find(n => n.id === noteId) diff --git a/nodejs/tests/fixtures/hackmd-cute-logo.png b/nodejs/tests/fixtures/hackmd-cute-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8d20cd07395f74dd387aced0c0d8b3c92dd1f86d GIT binary patch literal 67156 zcmd?Rg7Nw-KyN_Ro+KC;Jo~f;B|aD!As8t!VO4k7 z-E_onIN}o@(7DZ{(x_0s1eyqc(F#yga()U)nh>9a2r`u7R~5%NE8*Y>iv_}Ch6ZAZ z3581Q4a*D)FCCP*Au?acZz`&d@t>q`B=fS(<1TLV&gXCc;^uygM&PXcL@J%fB}aF* z_JbvM?^KKK_s{sokd_yo=W!yzDEP$(D#doQB?2i?qq#CN7q;`Vs-}|;OKq@M_Lug? zXD(IO>fg7&(j~ug%7bXv^r^ZydL1l$-{x`MO}h2kR0Kbv5d(gqXEUQnw&S{N(p&ff9xBS&4qDUY=~aC8R~iu3r3jtrtv3 zI0*4Y@uv%?ngS0&jh@&GCl^NOAF!y7d`lzDix!8RibT6(B>mz4_p1pjD{w!a@FW@r zIqJW@{6*lnBZ&De2fFTlL{l8ES6iT@lC&0Vj~B}XU7xMeD7(ArV&cglzlK9$#i!Xy(@);5CQ`fbVMEo{BO=lXjD_ER zO?As9alJa1>NXFa~A0WfrgY-qiCXfIk?A#<+v!VH-c#sF&N1>@2@MpS9b5LnAD;-j~4M@NnQ}bx_iK zzdn#WrupEwF=$h57mSL>F;Vx!)WmVOJb!BKA)~h?AiuX|oz>eWqnx@}_S|l=RQJ2L zTwBNo@ZJ8zq0Iy7pDFC&=LbveL2qu%9d{4?Y>(Z7FPtzmD8Lk!pVI|joFE}T95iL# zm_Mfrfc}O3An#z~wSxwmEo1OMY?U`A*eX;Kw%GsLC-7H)0yx#-aeEUwN+G!a{#yD3 zgX^q+nUwqwL;k|Z3M~CVAwvd>Mf%@g`tSu=Hyu3#|2-b~gscx>NOnRkl>a$1FvyqW zLJ0GC0%p|zJs$W3b}(e|@(<?T%PG>VdKNP@CF`H~o$iP6HW|;TYHXDn z^^VAcY}IEL_Op!b2UL0P-vh}iVb7T8U3Mnoug|u-)yxjF%FTy}Z)%)2
2hAQ0- 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 z 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 literal 0 HcmV?d00001 From e75a3da7c377db5a7e8f6d5d24150274bc6d3f82 Mon Sep 17 00:00:00 2001 From: Michael Wang Date: Fri, 5 Jun 2026 02:18:20 +0800 Subject: [PATCH 3/4] docs: update readme --- nodejs/README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/nodejs/README.md b/nodejs/README.md index 56b7d94..2e93e1b 100644 --- a/nodejs/README.md +++ b/nodejs/README.md @@ -117,6 +117,23 @@ const updatedNote = await client.getNote('note-id', { etag }) // If the note hasn't changed, the response will have status 304 ``` +### Image Upload + +Upload an image to a note with `uploadNoteImage`. The API returns the uploaded image link in `data.link`. + +```javascript +// Browser: pass a File from an +const uploaded = await client.uploadNoteImage('note-id', file) +console.log(uploaded.data.link) + +// Node.js 18+: pass a Blob and optional filename +const image = new Blob([imageBuffer], { type: 'image/png' }) +const uploadedFromNode = await client.uploadNoteImage('note-id', image, { + filename: 'diagram.png' +}) +console.log(uploadedFromNode.data.link) +``` + ## API See the [code](./src/index.ts) and [typings](./src/type.ts). The API client is written in TypeScript, so you can get auto-completion and type checking in any TypeScript Language Server powered editor or IDE. @@ -143,7 +160,7 @@ npm run test:e2e Set `HACKMD_E2E_MUTATIONS=1` to run write tests against your account: -- **Notes:** create → get → update (title, content, tags) → list → delete. +- **Notes:** create → get → update (title, content, tags) → upload fixture image → list → delete. - **Folders:** one integration test runs create (root + nested) → get → update → list → folder-order round-trip (skipped if that API returns 404) → delete. If **POST `/folders`** returns 404 (common before full production rollout), the test exits early with a warning; use staging or `HACKMD_E2E_FOLDERS=0`. ```bash From d101e4c62d9b8322a2bf24717395f8c90c589059 Mon Sep 17 00:00:00 2001 From: Michael Wang Date: Fri, 5 Jun 2026 03:03:35 +0800 Subject: [PATCH 4/4] test: clenup tests --- nodejs/tests/api.spec.ts | 26 -------------------------- nodejs/tests/e2e/api.e2e.spec.ts | 28 ++++++++-------------------- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/nodejs/tests/api.spec.ts b/nodejs/tests/api.spec.ts index adaabd5..998c8c0 100644 --- a/nodejs/tests/api.spec.ts +++ b/nodejs/tests/api.spec.ts @@ -168,7 +168,6 @@ test('uploadNoteImage sends image as multipart form data', async () => { ) expect(contentType).toContain('multipart/form-data') - expect(contentType).not.toContain('application/json') expect(uploaded).toBeInstanceOf(Blob) const uploadedBlob = uploaded as unknown as Blob expect(uploadedBlob.type).toBe('image/png') @@ -179,31 +178,6 @@ test('uploadNoteImage sends image as multipart form data', async () => { }) }) -test('uploadNoteImage supports raw Axios response', async () => { - server.use( - http.post('https://api.hackmd.io/v1/notes/test-note-id/images', () => { - return HttpResponse.json({ - data: { - link: 'https://hackmd.io/_uploads/raw-image.png', - }, - }) - }), - ) - - const response = await client.uploadNoteImage( - 'test-note-id', - new Blob(['test image'], { type: 'image/png' }), - { filename: 'raw-image.png', unwrapData: false }, - ) - - expect(response).toHaveProperty('status', 200) - expect(response.data).toEqual({ - data: { - link: 'https://hackmd.io/_uploads/raw-image.png', - }, - }) -}) - test('should support updating team note title and tags metadata', async () => { const updatedTags = ['team', 'metadata'] let requestBody: unknown diff --git a/nodejs/tests/e2e/api.e2e.spec.ts b/nodejs/tests/e2e/api.e2e.spec.ts index b027d9c..8a350fb 100644 --- a/nodejs/tests/e2e/api.e2e.spec.ts +++ b/nodejs/tests/e2e/api.e2e.spec.ts @@ -148,26 +148,14 @@ describe('HackMD API (live e2e)', () => { it('uploadNoteImage uploads an image to the note', async () => { const image = readFileSync('tests/fixtures/hackmd-cute-logo.png') - try { - const uploaded = await client.uploadNoteImage( - noteId, - new Blob([new Uint8Array(image)], { type: 'image/png' }), - { filename: `hackmd-cute-logo-${stamp}.png` }, - ) - - expect(uploaded.data.link).toEqual(expect.any(String)) - expect(uploaded.data.link.length).toBeGreaterThan(0) - } catch (err) { - if (isNotFound(err)) { - console.warn( - '[e2e] POST /notes/{noteId}/images returned 404 (image upload not on this host). ' + - 'Use https://api-stage.hackmd.io/v1 to test image uploads.', - ) - expect(isNotFound(err)).toBe(true) - return - } - throw err - } + const uploaded = await client.uploadNoteImage( + noteId, + new Blob([new Uint8Array(image)], { type: 'image/png' }), + { filename: `hackmd-cute-logo-${stamp}.png` }, + ) + + expect(uploaded.data.link).toEqual(expect.any(String)) + expect(uploaded.data.link.length).toBeGreaterThan(0) }) it('getNoteList includes the note', async () => {