(text: string, source: string)
| 588 | } |
| 589 | |
| 590 | export function parseTreeStateJson(text: string, source: string): TreeState { |
| 591 | let value: unknown; |
| 592 | try { |
| 593 | value = JSON.parse(text); |
| 594 | } catch (err) { |
| 595 | const message = err instanceof Error ? err.message : String(err); |
| 596 | throw new PlanValidationError(`${source} is not valid JSON: ${message}`); |
| 597 | } |
| 598 | const state = parseUnknownWithSchema({ |
| 599 | schema: TreeStateSchema, |
| 600 | value: normalizeLegacyStateValue(value), |
| 601 | source, |
| 602 | recoveryHint: `Fix rootSlug/tasks enough to traverse ${source}.`, |
| 603 | }); |
| 604 | const rootSlug = taskNameSchema.safeParse(state.rootSlug); |
| 605 | return { |
| 606 | rootSlug: rootSlug.success ? rootSlug.data : null, |
| 607 | tasks: state.tasks.flatMap(task => { |
| 608 | const parsed = TreeTaskSchema.safeParse(task); |
| 609 | return parsed.success ? [parsed.data] : []; |
| 610 | }), |
| 611 | }; |
| 612 | } |
| 613 | |
| 614 | export function formatZodIssues(issues: z.ZodIssue[]): string { |
| 615 | return issues |
no test coverage detected