import {z} from 'zod' export type SectionRequest = {gene_id: string, request_id: string, snapshot_id?: (string | null) | undefined, section: 'overview' | 'disease_validity' | 'structure' | 'constraint' | 'dosage' | 'mechanisms' | 'clinical_variants' | 'clinical_variant_consequences' | 'expression' | 'gwas' | 'phenotypes' | 'protein_pathways' | 'literature', limit?: number | undefined, cursor?: (string | null) | undefined}; export type CreateApiPublicV1GenesSectionArgs = {body: SectionRequest}; export type CreateApiPublicV1GenesSectionOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const freshness = z.object({last_source_check: z.string().min(1).max(200).nullable(), stale: z.boolean(), stale_reason: z.string().min(1).max(2000).nullable()}); export const overviewData = z.object({kind: z.literal("overview"), summary: z.string().min(1).max(40000).nullable(), summary_source_id: z.string().min(1).max(200).nullable()}); export const diseaseAssertion = z.object({assertion_id: z.string().min(1).max(200), source_id: z.string().min(1).max(200), disease_id: z.string().min(1).max(200), disease_name: z.string().min(1).max(2000), inheritance: z.string().min(1).max(200).nullable(), classification: z.string().min(1).max(200), curation_date: z.string().min(1).max(200).nullable(), panel: z.string().min(1).max(2000).nullable(), criteria_version: z.string().min(1).max(200).nullable(), report_url: z.string().max(2000), mechanism: z.string().min(1).max(2000).nullable().optional(), allelic_requirement: z.string().min(1).max(2000).nullable().optional(), mirrored_assertion_id: z.string().min(1).max(200).nullable().optional(), original_disease_id: z.string().min(1).max(200).nullable().optional(), submitter: z.string().min(1).max(2000).nullable().optional(), mechanism_support: z.string().min(1).max(2000).nullable().optional(), variant_consequence: z.string().min(1).max(2000).nullable().optional(), pmids: z.array(z.string()).optional()}); export const diseaseData = z.object({kind: z.literal("disease_validity"), count_unit: z.literal("source_assertion").optional(), records: z.array(diseaseAssertion)}); export const exon = z.object({rank: z.number().int().gte(1), start: z.number().int().gte(1), end: z.number().int().gte(1)}); export const codingSegment = z.object({rank: z.number().int().gte(1), start: z.number().int().gte(1), end: z.number().int().gte(1), phase: z.union([z.literal(0), z.literal(1), z.literal(2)])}); export const transcript = z.object({transcript_id: z.string().min(1).max(200), source_id: z.string().min(1).max(200), assembly: z.enum(["GRCh37", "GRCh38"]), assembly_accession: z.string().min(1).max(200).nullable(), annotation_release: z.string().min(1).max(200), coordinate_system: z.literal("1-based-closed"), contig: z.string().min(1).max(200), strand: z.enum(["+", "-"]), start: z.number().int().gte(1), end: z.number().int().gte(1), mane_status: z.enum(["Select", "Plus Clinical"]).nullable(), refseq_transcript: z.string().min(1).max(200).nullable(), refseq_protein: z.string().min(1).max(200).nullable().optional(), protein_id: z.string().min(1).max(200).nullable(), protein_length: z.number().int().gte(1).nullable().optional(), exons: z.array(exon), coding_segments: z.array(codingSegment).optional(), stop_codon_segments: z.array(exon).optional()}); export const structureData = z.object({kind: z.literal("structure"), count_unit: z.literal("source_transcript_model").optional(), transcript_scope: z.enum(["MANE", "provider_catalog", "multi_source_native"]), distinct_transcript_total: z.number().int().gte(0).nullable().optional(), records: z.array(transcript)}); export const constraintMetric = z.object({source_gene_id: z.string().min(1).max(200).nullable().optional(), source_gene_namespace: z.enum(["ncbi_gene", "ensembl_gene"]).nullable().optional(), source_canonical: z.boolean().nullable().optional(), source_mane_select: z.boolean().nullable().optional(), source_id: z.string().min(1).max(200), gene_id: z.string(), transcript_id: z.string().min(1).max(200).nullable(), selection_rule: z.string().min(1).max(2000), pli: z.number().gte(0).lte(1).nullable(), oe_lof: z.number().gte(0).nullable(), oe_lof_lower: z.number().gte(0).nullable(), oe_lof_upper: z.number().gte(0).nullable(), observed_lof: z.number().int().gte(0).nullable(), oe_missense: z.number().gte(0).nullable().optional(), oe_missense_lower: z.number().gte(0).nullable().optional(), oe_missense_upper: z.number().gte(0).nullable().optional(), observed_missense: z.number().int().gte(0).nullable().optional(), expected_lof: z.number().gte(0).nullable(), missense_z: z.number().nullable(), quality_flags: z.array(z.string().min(1).max(200)), expected_synonymous: z.number().gte(0).nullable().optional(), expected_missense: z.number().gte(0).nullable().optional(), display_status: z.enum(["available", "caution", "unreliable"]).optional(), gene_flags: z.array(z.string().min(1).max(200)).optional(), constraint_flags: z.array(z.string().min(1).max(200)).optional(), reported_metrics: z.record(z.string(), z.number().nullable()).optional()}); export const constraintData = z.object({kind: z.literal("constraint"), count_unit: z.literal("source_metric_record").optional(), records: z.array(constraintMetric)}); export const dosageAssertion = z.object({source_id: z.string().min(1).max(200), assertion_id: z.string().min(1).max(200), axis: z.enum(["haploinsufficiency", "triplosensitivity"]), score: z.enum(["0", "1", "2", "3", "30", "40", "Not yet evaluated", "-1"]), description: z.string().min(1).max(2000).nullable(), disease_id: z.string().min(1).max(200).nullable(), evaluated_at: z.string().min(1).max(200).nullable(), pmids: z.array(z.string()), report_url: z.string().max(2000)}); export const dosageData = z.object({kind: z.literal("dosage"), count_unit: z.literal("source_dosage_assertion").optional(), records: z.array(dosageAssertion)}); export const mechanismAssertion = z.object({source_id: z.string().min(1).max(200), assertion_id: z.string().min(1).max(200), disease_id: z.string().min(1).max(200), disease_name: z.string().min(1).max(2000), mechanism: z.string().min(1).max(2000), support: z.string().min(1).max(2000).nullable(), allelic_requirement: z.string().min(1).max(2000).nullable(), variant_consequence: z.string().min(1).max(2000).nullable(), classification: z.string().min(1).max(200), report_url: z.string().max(2000)}); export const mechanismsData = z.object({kind: z.literal("mechanisms"), count_unit: z.literal("source_relation").optional(), records: z.array(mechanismAssertion)}); export const distributionBin = z.object({label: z.string().min(1).max(2000), count: z.number().int().gte(0)}); export const clinicalAxis = z.object({axis: z.enum(["germline", "somatic_clinical_impact", "oncogenicity"]), represented_variations: z.number().int().gte(0), classification_counts: z.array(distributionBin), review_status_counts: z.array(distributionBin)}); export const resolverAllele = z.object({assembly: z.literal("GRCh38"), chromosome: z.string().min(1).max(200), position: z.number().int().gte(1), reference: z.string().max(100), alternate: z.string().max(100)}); export const clinicalVariantExample = z.object({source_id: z.string().min(1).max(200), variation_id: z.string(), name: z.string().min(1).max(2000), variant_type: z.string().min(1).max(200), germline: z.string().min(1).max(2000).nullable(), germline_review_status: z.string().min(1).max(2000).nullable(), somatic_clinical_impact: z.string().min(1).max(2000).nullable(), somatic_review_status: z.string().min(1).max(2000).nullable(), oncogenicity: z.string().min(1).max(2000).nullable(), oncogenicity_review_status: z.string().min(1).max(2000).nullable(), source_url: z.string().max(2000), resolver_allele: resolverAllele.nullable(), resolver_status: z.enum(["supported_exact_allele_requires_resolution", "unsupported_or_no_unique_grch38_allele"])}); export const clinicalVariantsData = z.object({kind: z.literal("clinical_variants"), count_unit: z.literal("selected_variant_example").optional(), source_id: z.string().min(1).max(200), unique_variation_total: z.number().int().gte(0), membership_rule: z.literal("explicit_hgnc_or_unique_ncbi_gene_crosswalk"), axes: z.array(clinicalAxis), variant_type_counts: z.array(distributionBin), example_selection: z.literal("lowest_variation_id_bounded_50"), records: z.array(clinicalVariantExample)}); export const clinicalConsequenceRecord = z.object({source_id: z.string().min(1).max(200), so_id: z.string(), term: z.string().min(1).max(2000), represented_variations: z.number().int().gte(1), axes: z.array(clinicalAxis)}); export const clinicalConsequencesData = z.object({kind: z.literal("clinical_variant_consequences"), source_id: z.string().min(1).max(200), count_unit: z.literal("source_consequence_bin").optional(), eligible_variations: z.number().int().gte(0), membership_rule: z.literal("single_native_geneinfo_unique_ncbi_crosswalk"), consequence_scope: z.literal("provider_transcript_collapsed_MC"), records: z.array(clinicalConsequenceRecord)}); export const expressionRecord = z.object({source_id: z.string().min(1).max(200), ensembl_gene_id: z.string().min(1).max(200), tissue_id: z.string().min(1).max(200), tissue_label: z.string().min(1).max(2000), median_tpm: z.number().gte(0).nullable(), unit: z.literal("TPM"), statistic: z.literal("median"), sample_count: z.number().int().gte(1).nullable(), category_type: z.literal("provider_expression_category")}); export const expressionData = z.object({kind: z.literal("expression"), count_unit: z.literal("provider_expression_category").optional(), records: z.array(expressionRecord)}); export const gwasRecord = z.object({source_id: z.string().min(1).max(200), association_id: z.string().min(1).max(200), association_identity_kind: z.enum(["provider_id", "full_source_row_digest"]), study_accession: z.string(), trait: z.string().min(1).max(2000), trait_ids: z.array(z.string().min(1).max(2000)), mapped_trait: z.string().max(10000), pmid: z.string().nullable(), reported_genes: z.string().max(10000), mapped_genes: z.string().max(10000), variant: z.string().max(10000), p_value: z.string().max(200), p_value_context: z.string().min(1).max(2000).nullable(), odds_ratio_or_beta: z.string().min(1).max(2000).nullable(), confidence_interval: z.string().min(1).max(2000).nullable(), source_url: z.string().max(2000), gene_assignment: z.enum(["reported_gene", "mapped_gene"]), gene_assignments: z.array(z.enum(["reported_gene", "mapped_gene"])), mapped_gene_context: z.array(z.enum(["intergenic_neighbor", "within_gene", "provider_mapping_unspecified"]))}); export const gwasData = z.object({kind: z.literal("gwas"), count_unit: z.literal("source_association_record").optional(), records: z.array(gwasRecord)}); export const phenotypeRecord = z.object({source_id: z.string().min(1).max(200), assertion_id: z.string().min(1).max(200), disease_id: z.string().min(1).max(200), disease_name: z.string().min(1).max(2000), phenotype_id: z.string(), phenotype_label: z.unknown(), allelic_requirement: z.string().min(1).max(2000).nullable(), classification: z.string().min(1).max(200), curation_date: z.string().min(1).max(200).nullable(), report_url: z.string().max(2000), pmids: z.array(z.string())}); export const phenotypesData = z.object({kind: z.literal("phenotypes"), count_unit: z.literal("source_relation_phenotype").optional(), records: z.array(phenotypeRecord)}); export const proteinCrossReference = z.object({database: z.string().min(1).max(200), accession: z.string().min(1).max(200), label: z.string().min(1).max(2000).nullable(), source_url: z.string().max(2000).nullable()}); export const proteinRecord = z.object({source_id: z.string().min(1).max(200), accession: z.string().min(1).max(200), entry_name: z.string().min(1).max(200), reviewed: z.boolean(), protein_name: z.string().min(1).max(2000), protein_length: z.number().int().gte(1), function_text: z.string().max(40000).nullable(), function_evidence: z.array(z.string().min(1).max(2000)), pathway_text: z.string().max(10000).nullable(), cross_references: z.array(proteinCrossReference), source_url: z.string().max(2000)}); export const proteinPathwaysData = z.object({kind: z.literal("protein_pathways"), count_unit: z.literal("reviewed_protein_record").optional(), records: z.array(proteinRecord)}); export const variantAnalysisServicePresentationSchemasPublicGeneSchemasPagination = z.object({observed_total: z.number().int().gte(0).nullable().optional(), total: z.number().int().gte(0).nullable(), returned: z.number().int().gte(0).lte(50), count_unit: z.string().min(1).max(200).nullable(), next_cursor: z.string().nullable()}); export const sectionResponse = z.object({gene_id: z.string(), section: z.enum(["overview", "disease_validity", "structure", "constraint", "dosage", "mechanisms", "clinical_variants", "clinical_variant_consequences", "expression", "gwas", "phenotypes", "protein_pathways", "literature"]), status: z.enum(["available", "source_has_no_record", "unavailable", "not_integrated", "not_applicable"]), coverage: z.enum(["complete", "partial", "truncated", "unknown"]), coverage_scope: z.string().min(1).max(2000), freshness: freshness, source_ids: z.array(z.string().min(1).max(200)), data: z.union([overviewData, diseaseData, structureData, constraintData, dosageData, mechanismsData, clinicalVariantsData, clinicalConsequencesData, expressionData, gwasData, phenotypesData, proteinPathwaysData]).nullable(), limitations: z.array(z.string().min(1).max(2000)), request_id: z.string(), snapshot_id: z.string(), pagination: variantAnalysisServicePresentationSchemasPublicGeneSchemasPagination.nullable()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Gene Section * * POST /public/v1/genes/section */ export const createApiPublicV1GenesSection = async (args: CreateApiPublicV1GenesSectionArgs, options: CreateApiPublicV1GenesSectionOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/public/v1/genes/section${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(sectionResponse, await res.json()) };