spb/cancerindex
Public
TypeScript 97.2%
SQL 1.5%
CSS 0.6%
JavaScript 0.5%
1import { SITE_URL, SITE_NAME } from './site';2import { toDate } from './format';34/** Serialize JSON-LD safely for a <script type="application/ld+json"> block. */5export function jsonLd(obj: Record<string, unknown>): string {6 return JSON.stringify(obj).replace(/</g, '\\u003c');7}89/** Schema.org MedicalCondition — only fields we actually hold (§148). */10export function medicalConditionLd(c: { slug: string; canonicalName: string; description: string | null; aliases: string[]; codes: Array<{ system: string; code: string }> }) {11 const codeSystemName: Record<string, string> = { ncit: 'NCIt', icd10: 'ICD-10', icd10cm: 'ICD-10-CM', oncotree: 'OncoTree', doid: 'DOID', umls: 'UMLS', mesh: 'MeSH', mondo: 'MONDO' };12 const ld: Record<string, unknown> = {13 '@context': 'https://schema.org',14 '@type': 'MedicalCondition',15 name: c.canonicalName,16 url: `${SITE_URL}/cancer/${c.slug}`,17 };18 if (c.description) ld.description = c.description;19 if (c.aliases.length) ld.alternateName = c.aliases.slice(0, 20);20 const codes = c.codes.filter((k) => codeSystemName[k.system]).map((k) => ({ '@type': 'MedicalCode', codeValue: k.code, codingSystem: codeSystemName[k.system] }));21 if (codes.length) ld.code = codes;22 return ld;23}2425export function drugLd(d: { slug: string; name: string; description: string | null; mechanism: string | null; aliases: string[] }) {26 const ld: Record<string, unknown> = { '@context': 'https://schema.org', '@type': 'Drug', name: d.name, url: `${SITE_URL}/drug/${d.slug}` };27 if (d.description) ld.description = d.description;28 if (d.mechanism) ld.mechanismOfAction = d.mechanism;29 if (d.aliases.length) ld.alternateName = d.aliases.slice(0, 20);30 return ld;31}3233export function datasetLd(d: { name: string; description: string; url: string; distributionUrl: string; license: string; dateModified?: Date | string | null }) {34 const ld: Record<string, unknown> = {35 '@context': 'https://schema.org',36 '@type': 'Dataset',37 name: d.name,38 description: d.description,39 url: d.url,40 license: d.license,41 creator: { '@type': 'Organization', name: SITE_NAME, url: SITE_URL },42 distribution: [{ '@type': 'DataDownload', encodingFormat: 'text/csv', contentUrl: d.distributionUrl }],43 };44 const dm = toDate(d.dateModified);45 if (dm) ld.dateModified = dm.toISOString();46 return ld;47}48