| export function validateReport(r) { |
| if (!r) throw new Error("report_view missing"); |
| |
| if (!r.marketTitle) { |
| throw new Error("report_view.marketTitle missing"); |
| } |
| |
| if (!r.marketOverview) { |
| throw new Error("report_view.marketOverview missing"); |
| } |
| |
| const mo = r.marketOverview; |
| if (typeof mo.pastYear_2023 !== 'number') throw new Error("pastYear_2023 must be number"); |
| if (typeof mo.currentYear_2025 !== 'number') throw new Error("currentYear_2025 must be number"); |
| |
| |
| if (!Array.isArray(r.marketSegments)) { |
| throw new Error("report_view.marketSegments must be array"); |
| } |
| } |
|
|
|
|
|
|