import {z} from 'zod' export type Pageable = {offset?: number | undefined, limit?: number | undefined}; export type GetApiV1SpeciesUsageKeySynonymsArgs = {usageKey: number, arg1: Pageable, 'Accept-Language'?: ('abk' | 'aar' | 'afr' | 'aka' | 'sqi' | 'amh' | 'ara' | 'arg' | 'hye' | 'asm' | 'ava' | 'ave' | 'aym' | 'aze' | 'bam' | 'bak' | 'eus' | 'bel' | 'ben' | 'bih' | 'bis' | 'bos' | 'bre' | 'bul' | 'mya' | 'cat' | 'cha' | 'che' | 'zho' | 'chu' | 'chv' | 'cor' | 'cos' | 'cre' | 'hrv' | 'ces' | 'dan' | 'div' | 'nld' | 'dzo' | 'eng' | 'epo' | 'est' | 'ewe' | 'fao' | 'fij' | 'fin' | 'fra' | 'fry' | 'ful' | 'glg' | 'lug' | 'kat' | 'deu' | 'ell' | 'kal' | 'grn' | 'guj' | 'hat' | 'hau' | 'heb' | 'her' | 'hin' | 'hmo' | 'hun' | 'isl' | 'ido' | 'ibo' | 'ind' | 'ina' | 'ile' | 'iku' | 'ipk' | 'gle' | 'ita' | 'jpn' | 'jav' | 'kan' | 'kau' | 'kas' | 'kaz' | 'khm' | 'kik' | 'kin' | 'kir' | 'kom' | 'kon' | 'kor' | 'kur' | 'kua' | 'lao' | 'lat' | 'lav' | 'lim' | 'lin' | 'lit' | 'lub' | 'ltz' | 'mkd' | 'mlg' | 'msa' | 'mal' | 'mlt' | 'glv' | 'mri' | 'mar' | 'mah' | 'mol' | 'mon' | 'nau' | 'nav' | 'ndo' | 'nep' | 'nde' | 'sme' | 'nob' | 'nno' | 'nor' | 'nya' | 'oci' | 'oji' | 'ori' | 'orm' | 'oss' | 'pli' | 'pan' | 'fas' | 'pol' | 'por' | 'pus' | 'que' | 'roh' | 'ron' | 'run' | 'rus' | 'smo' | 'sag' | 'san' | 'srd' | 'gla' | 'srp' | 'sna' | 'iii' | 'snd' | 'sin' | 'slk' | 'slv' | 'som' | 'nbl' | 'sot' | 'spa' | 'sun' | 'swa' | 'ssw' | 'swe' | 'tgl' | 'tah' | 'tgk' | 'tam' | 'tat' | 'tel' | 'tha' | 'bod' | 'tir' | 'ton' | 'tso' | 'tsn' | 'tur' | 'tuk' | 'twi' | 'uig' | 'ukr' | 'urd' | 'uzb' | 'ven' | 'vie' | 'vol' | 'wln' | 'cym' | 'wol' | 'xho' | 'yid' | 'yor' | 'zha' | 'zul' | '') | undefined, limit?: number | undefined, offset?: number | undefined}; export type GetApiV1SpeciesUsageKeySynonymsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const nameUsage = z.object({key: z.number().int().optional(), nubKey: z.number().int().optional(), nameKey: z.number().int().optional(), taxonID: z.string().optional(), sourceTaxonKey: z.number().int().optional(), kingdom: z.string().optional(), phylum: z.string().optional(), order: z.string().optional(), family: z.string().optional(), genus: z.string().optional(), subgenus: z.string().optional(), species: z.string().optional(), kingdomKey: z.number().int().optional(), phylumKey: z.number().int().optional(), classKey: z.number().int().optional(), orderKey: z.number().int().optional(), familyKey: z.number().int().optional(), genusKey: z.number().int().optional(), subgenusKey: z.number().int().optional(), speciesKey: z.number().int().optional(), datasetKey: z.string().optional(), constituentKey: z.string().optional(), parentKey: z.number().int().optional(), parent: z.string().optional(), proParteKey: z.number().int().optional(), acceptedKey: z.number().int().optional(), accepted: z.string().optional(), basionymKey: z.number().int().optional(), basionym: z.string().optional(), scientificName: z.string().optional(), canonicalName: z.string().optional(), vernacularName: z.string().optional(), authorship: z.string().optional(), nameType: z.enum(["SCIENTIFIC", "VIRUS", "HYBRID", "INFORMAL", "CULTIVAR", "CANDIDATUS", "OTU", "DOUBTFUL", "PLACEHOLDER", "NO_NAME", "BLACKLISTED"]).optional(), rank: z.enum(["DOMAIN", "SUPERKINGDOM", "KINGDOM", "SUBKINGDOM", "INFRAKINGDOM", "SUPERPHYLUM", "PHYLUM", "SUBPHYLUM", "INFRAPHYLUM", "SUPERCLASS", "CLASS", "SUBCLASS", "INFRACLASS", "PARVCLASS", "SUPERLEGION", "LEGION", "SUBLEGION", "INFRALEGION", "SUPERCOHORT", "COHORT", "SUBCOHORT", "INFRACOHORT", "MAGNORDER", "SUPERORDER", "GRANDORDER", "ORDER", "SUBORDER", "INFRAORDER", "PARVORDER", "SUPERFAMILY", "FAMILY", "SUBFAMILY", "INFRAFAMILY", "SUPERTRIBE", "TRIBE", "SUBTRIBE", "INFRATRIBE", "SUPRAGENERIC_NAME", "GENUS", "SUBGENUS", "INFRAGENUS", "SECTION", "SUBSECTION", "SERIES", "SUBSERIES", "INFRAGENERIC_NAME", "SPECIES_AGGREGATE", "SPECIES", "INFRASPECIFIC_NAME", "GREX", "SUBSPECIES", "CULTIVAR_GROUP", "CONVARIETY", "INFRASUBSPECIFIC_NAME", "PROLES", "RACE", "NATIO", "ABERRATION", "MORPH", "VARIETY", "SUBVARIETY", "FORM", "SUBFORM", "PATHOVAR", "BIOVAR", "CHEMOVAR", "MORPHOVAR", "PHAGOVAR", "SEROVAR", "CHEMOFORM", "FORMA_SPECIALIS", "CULTIVAR", "STRAIN", "OTHER", "UNRANKED"]).optional(), origin: z.enum(["SOURCE", "DENORMED_CLASSIFICATION", "VERBATIM_PARENT", "VERBATIM_ACCEPTED", "VERBATIM_BASIONYM", "PROPARTE", "AUTONYM", "IMPLICIT_NAME", "MISSING_ACCEPTED", "BASIONYM_PLACEHOLDER", "EX_AUTHOR_SYNONYM", "OTHER"]).optional(), taxonomicStatus: z.enum(["ACCEPTED", "DOUBTFUL", "SYNONYM", "HETEROTYPIC_SYNONYM", "HOMOTYPIC_SYNONYM", "PROPARTE_SYNONYM", "MISAPPLIED"]).optional(), nomenclaturalStatus: z.array(z.enum(["LEGITIMATE", "VALIDLY_PUBLISHED", "NEW_COMBINATION", "REPLACEMENT", "CONSERVED", "PROTECTED", "CORRECTED", "ORIGINAL_COMBINATION", "NEW_SPECIES", "NEW_GENUS", "ALTERNATIVE", "OBSCURE", "CONSERVED_PROPOSED", "PROVISIONAL", "SUBNUDUM", "REJECTED_PROPOSED", "REJECTED_OUTRIGHT_PROPOSED", "DOUBTFUL", "AMBIGUOUS", "CONFUSED", "FORGOTTEN", "ABORTED", "ORTHOGRAPHIC_VARIANT", "SUPERFLUOUS", "NUDUM", "NULL_NAME", "SUPPRESSED", "REJECTED_OUTRIGHT", "REJECTED", "ILLEGITIMATE", "INVALID", "DENIED"])).optional(), remarks: z.string().optional(), publishedIn: z.string().optional(), accordingTo: z.string().optional(), numDescendants: z.number().int().optional(), references: z.string().optional(), modified: z.string().optional(), deleted: z.string().optional(), lastCrawled: z.string().optional(), lastInterpreted: z.string().optional(), issues: z.array(z.enum(["PARENT_NAME_USAGE_ID_INVALID", "ACCEPTED_NAME_USAGE_ID_INVALID", "ORIGINAL_NAME_USAGE_ID_INVALID", "ACCEPTED_NAME_MISSING", "RANK_INVALID", "NOMENCLATURAL_STATUS_INVALID", "TAXONOMIC_STATUS_INVALID", "SCIENTIFIC_NAME_ASSEMBLED", "CHAINED_SYNOYM", "BASIONYM_AUTHOR_MISMATCH", "TAXONOMIC_STATUS_MISMATCH", "PARENT_CYCLE", "CLASSIFICATION_RANK_ORDER_INVALID", "CLASSIFICATION_NOT_APPLIED", "VERNACULAR_NAME_INVALID", "DESCRIPTION_INVALID", "DISTRIBUTION_INVALID", "SPECIES_PROFILE_INVALID", "MULTIMEDIA_INVALID", "BIB_REFERENCE_INVALID", "ALT_IDENTIFIER_INVALID", "BACKBONE_MATCH_NONE", "BACKBONE_MATCH_FUZZY", "BACKBONE_MATCH_AGGREGATE", "ACCEPTED_NAME_NOT_UNIQUE", "PARENT_NAME_NOT_UNIQUE", "ORIGINAL_NAME_NOT_UNIQUE", "RELATIONSHIP_MISSING", "ORIGINAL_NAME_DERIVED", "CONFLICTING_BASIONYM_COMBINATION", "NO_SPECIES", "NAME_PARENT_MISMATCH", "ORTHOGRAPHIC_VARIANT", "HOMONYM", "PUBLISHED_BEFORE_GENUS", "UNPARSABLE", "PARTIALLY_PARSABLE"])).optional(), class: z.string().optional()}); export const pagingResponseNameUsage = z.object({offset: z.number().int().optional(), limit: z.number().int().optional(), endOfRecords: z.boolean().optional(), count: z.number().int().optional(), results: z.array(nameUsage).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 }; /** * Name usage synonyms by id * * GET /v1/species/{usageKey}/synonyms */ export const getApiV1SpeciesUsageKeySynonyms = async (args: GetApiV1SpeciesUsageKeySynonymsArgs, options?: GetApiV1SpeciesUsageKeySynonymsOptions) => { const {baseUrl = "https://api.gbif.org", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.arg1 != null) query.append("arg1", JSON.stringify(args.arg1)) if (args['Accept-Language'] != null) headers.set("Accept-Language", String(args['Accept-Language'])) if (args.limit != null) query.append("limit", String(args.limit)) if (args.offset != null) query.append("offset", String(args.offset)) const url = `${baseUrl.replace(/\/+$/, '')}/v1/species/${encodeURIComponent(String(args.usageKey))}/synonyms${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(pagingResponseNameUsage, await res.json()) };