From 216e610aa8d20f86b354f6f5877e2fb4cee9fff1 Mon Sep 17 00:00:00 2001 From: Nate Kelley Date: Thu, 7 Aug 2025 17:16:41 -0600 Subject: [PATCH] Added some additional safe parse element stuff --- apps/server/src/api/v2/reports/[id]/GET.ts | 6 +++--- .../database/src/schema-types/report-elements.ts | 2 +- .../src/report/platejs-conversion.test.ts | 16 +++++++++++++--- .../src/report/platejs-conversions.ts | 16 +++++++--------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/apps/server/src/api/v2/reports/[id]/GET.ts b/apps/server/src/api/v2/reports/[id]/GET.ts index 965193dd7..31a6244a9 100644 --- a/apps/server/src/api/v2/reports/[id]/GET.ts +++ b/apps/server/src/api/v2/reports/[id]/GET.ts @@ -1,5 +1,5 @@ import { getReport } from '@buster/database'; -import type { GetReportIndividualResponse } from '@buster/server-shared/reports'; +import type { GetReportIndividualResponse, ReportElements } from '@buster/server-shared/reports'; import { markdownToPlatejs } from '@buster/server-utils/report'; import { Hono } from 'hono'; import { HTTPException } from 'hono/http-exception'; @@ -14,10 +14,10 @@ export async function getReportHandler( const platejsResult = await markdownToPlatejs(report.content); if (platejsResult.error) { - throw platejsResult.error; + console.error('Error converting markdown to PlateJS:', platejsResult.error); } - const content = platejsResult.elements ?? []; + const content: ReportElements = platejsResult.elements as unknown as ReportElements; //why do I have to do this? const response: GetReportIndividualResponse = { ...report, diff --git a/packages/database/src/schema-types/report-elements.ts b/packages/database/src/schema-types/report-elements.ts index 1c94dc556..b49578442 100644 --- a/packages/database/src/schema-types/report-elements.ts +++ b/packages/database/src/schema-types/report-elements.ts @@ -323,7 +323,7 @@ const ListTypeEnum = z.enum(['ul', 'ol']); // Nested list item for complex lists const NestedListElementSchema = z.object({ type: z.enum(['li', 'lic', 'lii', 'ul', 'ol']), - children: z.array(z.any()).default([]), + children: z.array(z.any()).default([]), //not super happy about this... but... ce la vie }); // List container (unordered or ordered) diff --git a/packages/server-utils/src/report/platejs-conversion.test.ts b/packages/server-utils/src/report/platejs-conversion.test.ts index b013731a5..28a20e85a 100644 --- a/packages/server-utils/src/report/platejs-conversion.test.ts +++ b/packages/server-utils/src/report/platejs-conversion.test.ts @@ -1,4 +1,4 @@ -import type { ReportElements } from '@buster/database'; +import { type ReportElements, ReportElementsSchema } from '@buster/database'; import { describe, expect, it } from 'vitest'; import { markdownToPlatejs, platejsToMarkdown } from './platejs-conversions'; @@ -73,7 +73,7 @@ Here's an unordered list: }); it('real world markdown', async () => { - const markdown = `Our most popular mountain bike over the last 12 months is Mountain-200 Black, 38 with 825 units sold. + const markdownOG = `Our most popular mountain bike over the last 12 months is Mountain-200 Black, 38 with 825 units sold. ## Key Findings - The top-selling mountain bike model is **Mountain-200 Black, 38**. - It sold **825 units** in the last 12 months. @@ -99,8 +99,14 @@ Here's an unordered list: - Using revenue-based popularity could favor higher-priced bikes; I chose units to avoid price bias. - Using the riding discipline filter (e.g., Mountain) was considered, but I used the explicit Mountain Bikes subcategory to exclude components. `; + + const markdown = ` +- Filters: + - Product Category = "Bikes" +`; + const platejs = await markdownToPlatejs(markdown); - expect(platejs).toBeDefined(); + expect(platejs.elements).toBeDefined(); }); }); @@ -564,5 +570,9 @@ describe('platejsToMarkdown', () => { type: 'ul', }, ]; + + const markdownFromPlatejs = await platejsToMarkdown(elements); + + expect(markdownFromPlatejs).toBeDefined(); }); }); diff --git a/packages/server-utils/src/report/platejs-conversions.ts b/packages/server-utils/src/report/platejs-conversions.ts index f406dc8b1..41c30706f 100644 --- a/packages/server-utils/src/report/platejs-conversions.ts +++ b/packages/server-utils/src/report/platejs-conversions.ts @@ -1,21 +1,19 @@ import { type ReportElements, ReportElementsSchema } from '@buster/database'; import type { Descendant } from 'platejs'; +import type { ZodError } from 'zod'; import { SERVER_EDITOR } from './server-editor'; -export const markdownToPlatejs = async (markdown: string) => { +export const markdownToPlatejs = async ( + markdown: string +): Promise<{ error: ZodError | Error | null; elements: ReportElements }> => { try { - const descendants = SERVER_EDITOR.api.markdown.deserialize(markdown); - console.log('descendants', descendants); - - console.log('descendants.json', JSON.stringify(descendants, null, 2)); + const descendants: ReportElements = SERVER_EDITOR.api.markdown.deserialize(markdown); const safeParsedElements = ReportElementsSchema.safeParse(descendants); - console.log('safeParsedElements', safeParsedElements); - return { - error: safeParsedElements.error, - elements: safeParsedElements.data, + error: safeParsedElements.error as ZodError, + elements: descendants, }; } catch (error) { console.error('Error converting markdown to PlateJS:', error);