import {z} from 'zod' export type V2VirusDataReportRequestContentType = 'COMPLETE' | 'ACCESSIONS_ONLY'; export type GetApiVirusAccessionAccessionsDatasetReportArgs = {accessions: Array, 'filter.refseq_only'?: boolean | undefined, 'filter.annotated_only'?: boolean | undefined, 'filter.released_since'?: string | undefined, 'filter.updated_since'?: string | undefined, 'filter.host'?: string | undefined, 'filter.pangolin_classification'?: string | undefined, 'filter.geo_location'?: string | undefined, 'filter.usa_state'?: string | undefined, 'filter.complete_only'?: boolean | undefined, returned_content?: V2VirusDataReportRequestContentType | undefined, table_fields?: Array | undefined, page_size?: number | undefined, page_token?: string | undefined}; export type GetApiVirusAccessionAccessionsDatasetReportOptions = {baseUrl?: string | undefined, ApiKeyAuthHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const v2reportsIsolate = z.object({name: z.string().optional(), source: z.string().optional(), collection_date: z.string().optional()}); export const v2reportsLineageOrganism = z.object({tax_id: z.number().int().optional(), name: z.string().optional()}); export const v2reportsInfraspecificNames = z.object({breed: z.string().optional(), cultivar: z.string().optional(), ecotype: z.string().optional(), isolate: z.string().optional(), sex: z.string().optional(), strain: z.string().optional()}); export const v2reportsOrganism = z.object({tax_id: z.number().int().optional(), sci_name: z.string().optional(), organism_name: z.string().optional(), common_name: z.string().optional(), lineage: z.array(v2reportsLineageOrganism).optional(), strain: z.string().optional(), pangolin_classification: z.string().optional(), infraspecific_names: v2reportsInfraspecificNames.optional()}); export const v2reportsVirusAssemblyCollectionLocation = z.object({geographic_location: z.string().optional(), geographic_region: z.string().optional(), usa_state: z.string().optional()}); export const v2reportsVirusAssemblyCompleteness = z.enum(["UNKNOWN", "COMPLETE", "PARTIAL"]); 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 v2reportsSeqRangeSetFasta = z.object({seq_id: z.string().optional(), accession_version: z.string().optional(), title: z.string().optional(), sequence_hash: z.string().optional(), range: z.array(v2reportsRange).optional()}); export const v2reportsPurposeOfSampling = z.enum(["PURPOSE_OF_SAMPLING_UNKNOWN", "PURPOSE_OF_SAMPLING_BASELINE_SURVEILLANCE"]); export const v2reportsVirusAssemblySubmitterInfo = z.object({names: z.array(z.string()).optional(), affiliation: z.string().optional(), country: z.string().optional()}); export const v2reportsVirusAssembly = z.object({accession: z.string().optional(), is_complete: z.boolean().optional(), is_annotated: z.boolean().optional(), isolate: v2reportsIsolate.optional(), source_database: z.string().optional(), protein_count: z.number().int().optional(), host: v2reportsOrganism.optional(), virus: v2reportsOrganism.optional(), bioprojects: z.array(z.string()).optional(), location: v2reportsVirusAssemblyCollectionLocation.optional(), update_date: z.string().optional(), release_date: z.string().optional(), nucleotide_completeness: z.string().optional(), completeness: v2reportsVirusAssemblyCompleteness.optional(), length: z.number().int().optional(), gene_count: z.number().int().optional(), mature_peptide_count: z.number().int().optional(), biosample: z.string().optional(), mol_type: z.string().optional(), nucleotide: v2reportsSeqRangeSetFasta.optional(), purpose_of_sampling: v2reportsPurposeOfSampling.optional(), sra_accessions: z.array(z.string()).optional(), submitter: v2reportsVirusAssemblySubmitterInfo.optional(), lab_host: z.string().optional(), is_lab_host: z.boolean().optional(), is_vaccine_strain: z.boolean().optional(), segment: z.string().optional()}); export const v2reportsVirusDataReportPage = z.object({reports: z.array(v2reportsVirusAssembly).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 virus data report by nucleotide accession * * GET /virus/accession/{accessions}/dataset_report */ export const getApiVirusAccessionAccessionsDatasetReport = async (args: GetApiVirusAccessionAccessionsDatasetReportArgs, options?: GetApiVirusAccessionAccessionsDatasetReportOptions) => { 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['filter.refseq_only'] != null) query.append("filter.refseq_only", String(args['filter.refseq_only'])) if (args['filter.annotated_only'] != null) query.append("filter.annotated_only", String(args['filter.annotated_only'])) if (args['filter.released_since'] != null) query.append("filter.released_since", String(args['filter.released_since'])) if (args['filter.updated_since'] != null) query.append("filter.updated_since", String(args['filter.updated_since'])) if (args['filter.host'] != null) query.append("filter.host", String(args['filter.host'])) if (args['filter.pangolin_classification'] != null) query.append("filter.pangolin_classification", String(args['filter.pangolin_classification'])) if (args['filter.geo_location'] != null) query.append("filter.geo_location", String(args['filter.geo_location'])) if (args['filter.usa_state'] != null) query.append("filter.usa_state", String(args['filter.usa_state'])) if (args['filter.complete_only'] != null) query.append("filter.complete_only", String(args['filter.complete_only'])) 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.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 (ApiKeyAuthHeader !== undefined) headers.set("api-key", ApiKeyAuthHeader) const url = `${baseUrl.replace(/\/+$/, '')}/virus/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(v2reportsVirusDataReportPage, await res.json()) };