From 27b3f9d17958d76ced902787e387c15db720af0a Mon Sep 17 00:00:00 2001 From: Patrick Leonard Date: Sun, 29 Dec 2024 04:25:56 -1000 Subject: feat: add Linkwarden importer (#786) * added in Linkwarden import * simpler parsing --------- Co-authored-by: Mohamed Bassem --- apps/web/lib/importBookmarkParser.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'apps/web/lib/importBookmarkParser.ts') diff --git a/apps/web/lib/importBookmarkParser.ts b/apps/web/lib/importBookmarkParser.ts index f3819e79..69b8a78c 100644 --- a/apps/web/lib/importBookmarkParser.ts +++ b/apps/web/lib/importBookmarkParser.ts @@ -140,3 +140,39 @@ export async function parseOmnivoreBookmarkFile( }; }); } + +export async function parseLinkwardenBookmarkFile( + file: File, +): Promise { + const textContent = await file.text(); + const zLinkwardenExportSchema = z.object({ + collections: z.array( + z.object({ + links: z.array( + z.object({ + name: z.string(), + url: z.string(), + tags: z.array(z.object({ name: z.string() })), + createdAt: z.coerce.date(), + }), + ), + }), + ), + }); + + const parsed = zLinkwardenExportSchema.safeParse(JSON.parse(textContent)); + if (!parsed.success) { + throw new Error( + `The uploaded JSON file contains an invalid Linkwarden bookmark file: ${parsed.error.toString()}`, + ); + } + + return parsed.data.collections.flatMap((collection) => { + return collection.links.map((bookmark) => ({ + title: bookmark.name ?? "", + content: { type: BookmarkTypes.LINK as const, url: bookmark.url }, + tags: bookmark.tags.map((tag) => tag.name), + addDate: bookmark.createdAt.getTime() / 1000, + })); + }); +} -- cgit v1.2.3-70-g09d2