import {z} from 'zod' export type V2GeneDatasetReportsRequestContentType = 'COMPLETE' | 'IDS_ONLY' | 'COUNTS_ONLY'; export type V2IncludeTabularHeader = 'INCLUDE_TABULAR_HEADER_FIRST_PAGE_ONLY' | 'INCLUDE_TABULAR_HEADER_ALWAYS' | 'INCLUDE_TABULAR_HEADER_NEVER'; export type V2GeneType = 'UNKNOWN' | 'tRNA' | 'rRNA' | 'snRNA' | 'scRNA' | 'snoRNA' | 'PROTEIN_CODING' | 'PSEUDO' | 'TRANSPOSON' | 'miscRNA' | 'ncRNA' | 'BIOLOGICAL_REGION' | 'OTHER'; export type V2SortDirection = 'SORT_DIRECTION_UNSPECIFIED' | 'SORT_DIRECTION_ASCENDING' | 'SORT_DIRECTION_DESCENDING'; export type GetApiGeneAccessionAccessionsDatasetReportArgs = {returned_content?: V2GeneDatasetReportsRequestContentType | undefined, accessions: Array, table_fields?: Array | undefined, table_format?: string | undefined, include_tabular_header?: V2IncludeTabularHeader | undefined, page_size?: number | undefined, page_token?: string | undefined, query?: string | undefined, types?: Array | undefined, 'sort.field'?: string | undefined, 'sort.direction'?: V2SortDirection | undefined}; export type GetApiGeneAccessionAccessionsDatasetReportOptions = {baseUrl?: string | undefined, ApiKeyAuthHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const v2reportsGeneType = z.enum(["UNKNOWN", "tRNA", "rRNA", "snRNA", "scRNA", "snoRNA", "PROTEIN_CODING", "PSEUDO", "TRANSPOSON", "miscRNA", "ncRNA", "BIOLOGICAL_REGION", "OTHER"]); export const v2reportsRnaType = z.enum(["rna_UNKNOWN", "premsg", "tmRna"]); export const v2reportsOrientation = z.enum(["none", "plus", "minus"]); export const v2reportsRange = z.object({begin: z.string().optional(), end: z.string().optional(), orientation: v2reportsOrientation.optional(), order: z.number().int().optional(), ribosomal_slippage: z.number().int().optional()}); export const v2reportsSeqRangeSet = z.object({accession_version: z.string().optional(), range: z.array(v2reportsRange).optional()}); export const v2reportsGenomicRegionGenomicRegionType = z.enum(["UNKNOWN", "REFSEQ_GENE", "PSEUDOGENE", "BIOLOGICAL_REGION", "OTHER"]); export const v2reportsGenomicRegion = z.object({gene_range: v2reportsSeqRangeSet.optional(), type: v2reportsGenomicRegionGenomicRegionType.optional()}); export const v2reportsNomenclatureAuthority = z.object({authority: z.string().optional(), identifier: z.string().optional()}); export const v2reportsGenomicLocation = z.object({genomic_accession_version: z.string().optional(), sequence_name: z.string().optional(), genomic_range: v2reportsRange.optional(), exons: z.array(v2reportsRange).optional()}); export const v2reportsAnnotation = z.object({assembly_accession: z.string().optional(), assembly_name: z.string().optional(), annotation_name: z.string().optional(), annotation_release_date: z.string().optional(), genomic_locations: z.array(v2reportsGenomicLocation).optional()}); export const v2reportsTranscriptTranscriptType = z.enum(["UNKNOWN", "PROTEIN_CODING", "NON_CODING", "PROTEIN_CODING_MODEL", "NON_CODING_MODEL"]); export const v2reportsTranscriptTypeCount = z.object({type: v2reportsTranscriptTranscriptType.optional(), count: z.number().int().optional()}); export const v2reportsGeneGroup = z.object({id: z.string().optional(), method: z.string().optional()}); export const v2reportsGeneSummary = z.object({source: z.string().optional(), description: z.string().optional(), date: z.string().optional()}); export const v2reportsReference = z.object({pmids: z.array(z.string()).optional()}); export const v2reportsProcessMetadata = z.object({name: z.string().optional(), go_id: z.string().optional(), evidence_code: z.string().optional(), qualifier: z.string().optional(), reference: v2reportsReference.optional()}); export const v2reportsGeneOntology = z.object({assigned_by: z.string().optional(), molecular_functions: z.array(v2reportsProcessMetadata).optional(), biological_processes: z.array(v2reportsProcessMetadata).optional(), cellular_components: z.array(v2reportsProcessMetadata).optional()}); export const v2reportsMapLocationMapType = z.enum(["Unknown", "Cytogenetic", "Genetic"]); export const v2reportsMapLocation = z.object({map_type: v2reportsMapLocationMapType.optional(), map_value: z.string().optional()}); export const v2reportsGeneDescriptor = z.object({gene_id: z.string().optional(), symbol: z.string().optional(), description: z.string().optional(), tax_id: z.string().optional(), taxname: z.string().optional(), common_name: z.string().optional(), type: v2reportsGeneType.optional(), rna_type: v2reportsRnaType.optional(), orientation: v2reportsOrientation.optional(), reference_standards: z.array(v2reportsGenomicRegion).optional(), genomic_regions: z.array(v2reportsGenomicRegion).optional(), chromosomes: z.array(z.string()).optional(), nomenclature_authority: v2reportsNomenclatureAuthority.optional(), swiss_prot_accessions: z.array(z.string()).optional(), ensembl_gene_ids: z.array(z.string()).optional(), omim_ids: z.array(z.string()).optional(), synonyms: z.array(z.string()).optional(), alternate_names: z.array(z.string()).optional(), replaced_gene_id: z.string().optional(), annotations: z.array(v2reportsAnnotation).optional(), transcript_count: z.number().int().optional(), protein_count: z.number().int().optional(), transcript_type_counts: z.array(v2reportsTranscriptTypeCount).optional(), gene_groups: z.array(v2reportsGeneGroup).optional(), summary: z.array(v2reportsGeneSummary).optional(), gene_ontology: v2reportsGeneOntology.optional(), locus_tag: z.string().optional(), map_locations: z.array(v2reportsMapLocation).optional()}); export const v2reportsMaturePeptide = z.object({accession_version: z.string().optional(), name: z.string().optional(), length: z.number().int().optional()}); export const v2reportsProtein = z.object({accession_version: z.string().optional(), name: z.string().optional(), length: z.number().int().optional(), isoform_name: z.string().optional(), ensembl_protein: z.string().optional(), mature_peptides: z.array(v2reportsMaturePeptide).optional()}); export const v2reportsTranscriptSelectCategory = z.enum(["SELECT_UNKNOWN", "REFSEQ_SELECT", "MANE_SELECT", "MANE_PLUS_CLINICAL"]); export const v2reportsTranscript = z.object({accession_version: z.string().optional(), name: z.string().optional(), length: z.number().int().optional(), cds: v2reportsSeqRangeSet.optional(), genomic_locations: z.array(v2reportsGenomicLocation).optional(), ensembl_transcript: z.string().optional(), protein: v2reportsProtein.optional(), type: v2reportsTranscriptTranscriptType.optional(), select_category: v2reportsTranscriptSelectCategory.optional()}); export const v2reportsProductDescriptor = z.object({gene_id: z.string().optional(), symbol: z.string().optional(), description: z.string().optional(), tax_id: z.string().optional(), taxname: z.string().optional(), common_name: z.string().optional(), type: v2reportsGeneType.optional(), rna_type: v2reportsRnaType.optional(), transcripts: z.array(v2reportsTranscript).optional(), transcript_count: z.number().int().optional(), protein_count: z.number().int().optional(), transcript_type_counts: z.array(v2reportsTranscriptTypeCount).optional()}); export const v2reportsExpressionRelease = z.object({release_name: z.string().optional(), assembly_accession: z.string().optional()}); export const v2reportsAggregateExpressionValue = z.object({mean: z.number().optional(), stddev: z.number().optional()}); export const v2reportsSraRun = z.object({accession: z.string().optional(), expression_value: z.number().optional()}); export const v2reportsBioSample = z.object({accession: z.string().optional(), sra_runs: z.array(v2reportsSraRun).optional()}); export const v2reportsSample = z.object({sample_name: z.string().optional(), aggregate_expression_value: v2reportsAggregateExpressionValue.optional(), biosamples: z.array(v2reportsBioSample).optional()}); export const v2reportsExpressionBioProject = z.object({accession: z.string().optional(), study_title: z.string().optional(), description: z.string().optional(), sra_study_accession: z.string().optional(), pmid: z.string().optional(), samples: z.array(v2reportsSample).optional()}); export const v2reportsExpressionDescriptor = z.object({gene_id: z.string().optional(), expression_release: v2reportsExpressionRelease.optional(), expression_method: z.string().optional(), bioprojects: z.array(v2reportsExpressionBioProject).optional()}); export const v2reportsWarningGeneWarningCode = z.enum(["UNKNOWN_GENE_WARNING_CODE", "ACCESSION_VERSION_MISMATCH", "REPLACED_GENE_ID", "DISCONTINUED_GENE_ID", "UNRECOGNIZED_GENE_ID", "UNRECOGNIZED_GENE_SYMBOL", "UNRECOGNIZED_ACCESSION", "UNRECOGNIZED_TAX_TOKEN", "NO_GENE_ANNOTATION_FOUND", "ABOVE_SPECIES_TAXON"]); export const v2reportsWarningReplacedId = z.object({requested: z.string().optional(), returned: z.string().optional()}); export const v2reportsWarning = z.object({gene_warning_code: v2reportsWarningGeneWarningCode.optional(), reason: z.string().optional(), message: z.string().optional(), replaced_id: v2reportsWarningReplacedId.optional(), unrecognized_identifier: z.string().optional()}); export const v2reportsErrorAssemblyErrorCode = z.enum(["UNKNOWN_ASSEMBLY_ERROR_CODE", "INVALID_BIOPROJECT_IDS", "NO_ASSEMBLIES_FOR_BIOPROJECTS", "INVALID_TAXON", "MISSING_SEARCH_FIELD", "INVALID_BIOSAMPLE_IDS", "NO_ASSEMBLIES_FOR_BIOSAMPLE_IDS", "NO_ASSEMBLIES_FOR_ASSEMBLY_NAMES", "INVALID_WGS_ACCESSIONS", "NO_ASSEMBLIES_FOR_WGS_ACCESSIONS"]); export const v2reportsErrorGeneErrorCode = z.enum(["UNKNOWN_GENE_ERROR_CODE", "INCOMPLETE_LOOKUP_SYMBOL", "INVALID_TAXON_GENE_ARGUMENT"]); export const v2reportsErrorOrganelleErrorCode = z.enum(["UNKNOWN_ORGANELLE_ERROR_CODE", "INVALID_ORGANELLE_TAXON", "NO_ORGANELLES_FOR_ACCESSION"]); export const v2reportsErrorVirusErrorCode = z.literal("UNKNOWN_VIRUS_ERROR_CODE"); export const v2reportsErrorTaxonomyErrorCode = z.enum(["UNKNOWN_TAXONOMY_ERROR_CODE", "INVALID_TAXONOMY_TAXON"]); export const v2reportsErrorSequenceErrorCode = z.enum(["UNKNOWN_SEQUENCE_ERROR_CODE", "INVALID_SEQUENCE_ACCESSION"]); export const v2reportsError = z.object({assembly_error_code: v2reportsErrorAssemblyErrorCode.optional(), gene_error_code: v2reportsErrorGeneErrorCode.optional(), organelle_error_code: v2reportsErrorOrganelleErrorCode.optional(), virus_error_code: v2reportsErrorVirusErrorCode.optional(), taxonomy_error_code: v2reportsErrorTaxonomyErrorCode.optional(), sequence_error_code: v2reportsErrorSequenceErrorCode.optional(), reason: z.string().optional(), message: z.string().optional(), invalid_identifiers: z.array(z.string()).optional()}); export const v2reportsGeneReportMatch = z.object({gene: v2reportsGeneDescriptor.optional(), product: v2reportsProductDescriptor.optional(), expression: v2reportsExpressionDescriptor.optional(), query: z.array(z.string()).optional(), warnings: z.array(v2reportsWarning).optional(), warning: v2reportsWarning.optional(), errors: z.array(v2reportsError).optional()}); export const v2reportsMessage = z.object({error: v2reportsError.optional(), warning: v2reportsWarning.optional()}); export const v2reportsGeneDataReportPage = z.object({reports: z.array(v2reportsGeneReportMatch).optional(), messages: z.array(v2reportsMessage).optional(), total_count: z.number().int().optional(), next_page_token: z.string().optional()}); 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 }; /** * Get a gene data report by RefSeq nucleotide or protein accession * * GET /gene/accession/{accessions}/dataset_report */ export const getApiGeneAccessionAccessionsDatasetReport = async (args: GetApiGeneAccessionAccessionsDatasetReportArgs, options?: GetApiGeneAccessionAccessionsDatasetReportOptions) => { const {baseUrl = "https://api.ncbi.nlm.nih.gov/datasets/v2", fetch: fetchFn = fetch, ApiKeyAuthHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.returned_content != null) query.append("returned_content", String(args.returned_content)) for (const item of args.table_fields ?? []) query.append("table_fields", String(item)) if (args.table_format != null) query.append("table_format", String(args.table_format)) if (args.include_tabular_header != null) query.append("include_tabular_header", String(args.include_tabular_header)) if (args.page_size != null) query.append("page_size", String(args.page_size)) if (args.page_token != null) query.append("page_token", String(args.page_token)) if (args.query != null) query.append("query", String(args.query)) for (const item of args.types ?? []) query.append("types", String(item)) if (args['sort.field'] != null) query.append("sort.field", String(args['sort.field'])) if (args['sort.direction'] != null) query.append("sort.direction", String(args['sort.direction'])) if (ApiKeyAuthHeader !== undefined) headers.set("api-key", ApiKeyAuthHeader) const url = `${baseUrl.replace(/\/+$/, '')}/gene/accession/${encodeURIComponent(String(args.accessions))}/dataset_report${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(v2reportsGeneDataReportPage, await res.json()) };