import {z} from 'zod' export type GetApiPlotObservationsObCodeArgs = {ob_code: string, detail?: ('geo' | 'minimal' | 'full') | undefined, with_nested?: boolean | undefined, create_parquet?: boolean | undefined, bundle?: string | undefined}; export type GetApiPlotObservationsObCodeOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const plotObservationBase = z.object({ob_code: z.string().optional(), author_obs_code: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional()}); export const plotObsGeo = z.object({count: z.number().int().optional(), data: z.array(plotObservationBase).optional()}); export const plotObsMinimal = z.object({count: z.number().int().optional(), data: z.array(z.object({ob_code: z.string().optional(), author_obs_code: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), area: z.number().optional(), author_plot_code: z.string().optional(), country: z.string().optional(), elevation: z.number().optional(), pl_code: z.string().optional(), state_province: z.string().optional(), year: z.number().int().optional()})).optional()}); export const plotObsMinimalNested = z.object({count: z.number().int().optional(), data: z.array(z.object({ob_code: z.string().optional(), author_obs_code: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), area: z.number().optional(), author_plot_code: z.string().optional(), country: z.string().optional(), elevation: z.number().optional(), pl_code: z.string().optional(), state_province: z.string().optional(), year: z.number().int().optional(), taxon_count: z.number().int().optional(), taxon_count_returned: z.number().int().optional(), top_taxon_observations: z.array(z.object({to_code: z.string().optional(), pc_code: z.string().optional(), name: z.string().optional(), max_cover: z.number().optional()})).optional(), top_classifications: z.array(z.object({cl_code: z.string().optional(), ci_code: z.string().optional(), cc_code: z.string().optional(), comm_name: z.string().optional(), comm_code: z.string().optional()})).optional()})).optional()}); export const plotObsFull = z.object({count: z.number().int().optional(), data: z.array(z.object({ob_code: z.string().optional(), author_obs_code: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), area: z.number().optional(), author_plot_code: z.string().optional(), country: z.string().optional(), elevation: z.number().optional(), pl_code: z.string().optional(), state_province: z.string().optional(), year: z.number().int().optional(), rf_code: z.string().optional(), rf_label: z.string().optional(), parent_pl_code: z.string().optional(), location_accuracy: z.number().optional(), confidentiality_status: z.number().int().optional(), author_e: z.string().optional(), author_n: z.string().optional(), author_zone: z.string().optional(), author_datum: z.string().optional(), author_location: z.string().optional(), location_narrative: z.string().optional(), azimuth: z.number().optional(), dsgpoly: z.string().optional(), shape: z.string().optional(), stand_size: z.string().optional(), placement_method: z.string().optional(), permanence: z.boolean().optional(), layout_narrative: z.string().optional(), elevation_accuracy: z.number().optional(), elevation_range: z.number().optional(), slope_aspect: z.number().optional(), min_slope_aspect: z.number().optional(), max_slope_aspect: z.number().optional(), slope_gradient: z.number().optional(), min_slope_gradient: z.number().optional(), max_slope_gradient: z.number().optional(), topo_position: z.string().optional(), landform: z.string().optional(), surficial_deposits: z.string().optional(), rock_type: z.string().optional(), previous_obs_id: z.string().optional(), pj_code: z.string().optional(), project_name: z.string().optional(), obs_start_date: z.string().optional(), obs_end_date: z.string().optional(), date_accuracy: z.string().optional(), date_entered: z.string().optional(), cm_code: z.string().optional(), cover_method_name: z.string().optional(), cover_dispersion: z.string().optional(), auto_taxon_cover: z.boolean().optional(), method_narrative: z.string().optional(), taxon_observation_area: z.number().optional(), stem_size_limit: z.number().optional(), stem_observation_area: z.number().optional(), stem_sample_method: z.string().optional(), original_data: z.string().optional(), effort_level: z.string().optional(), plot_validation_level: z.number().int().optional(), floristic_quality: z.string().optional(), bryophyte_quality: z.string().optional(), lichen_quality: z.string().optional(), observation_narrative: z.string().optional(), landscape_narrative: z.string().optional(), homogeneity: z.string().optional(), phenologic_aspect: z.string().optional(), representativeness: z.string().optional(), stand_maturity: z.string().optional(), successional_status: z.string().optional(), basal_area: z.number().optional(), hydrologic_regime: z.string().optional(), soil_moisture_regime: z.string().optional(), soil_drainage: z.string().optional(), water_salinity: z.string().optional(), water_depth: z.number().optional(), shore_distance: z.number().optional(), soil_depth: z.number().optional(), organic_depth: z.number().optional(), st_code: z.string().optional(), soil_taxon_src: z.string().optional(), percent_bed_rock: z.number().optional(), percent_rock_gravel: z.number().optional(), percent_wood: z.number().optional(), percent_litter: z.number().optional(), percent_bare_soil: z.number().optional(), percent_water: z.number().optional(), percent_other: z.number().optional(), name_other: z.string().optional(), tree_ht: z.number().optional(), shrub_ht: z.number().optional(), field_ht: z.number().optional(), nonvascular_ht: z.number().optional(), submerged_ht: z.number().optional(), tree_cover: z.number().optional(), shrub_cover: z.number().optional(), field_cover: z.number().optional(), nonvascular_cover: z.number().optional(), floating_cover: z.number().optional(), submerged_cover: z.number().optional(), dominant_stratum: z.string().optional(), growthform_1_type: z.string().optional(), growthform_2_type: z.string().optional(), growthform_3_type: z.string().optional(), growthform_1_cover: z.number().optional(), growthform_2_cover: z.number().optional(), growthform_3_cover: z.number().optional(), total_cover: z.number().optional(), has_observation_synonym: z.boolean().optional(), replaced_by_ob_code: z.string().optional(), sm_code: z.string().optional(), stratum_method_name: z.string().optional(), stratum_method_description: z.string().optional(), stratum_assignment: z.string().optional()})).optional()}); export const plotObsFullNested = z.object({count: z.number().int().optional(), data: z.array(z.object({ob_code: z.string().optional(), author_obs_code: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), area: z.number().optional(), author_plot_code: z.string().optional(), country: z.string().optional(), elevation: z.number().optional(), pl_code: z.string().optional(), state_province: z.string().optional(), year: z.number().int().optional(), rf_code: z.string().optional(), rf_label: z.string().optional(), parent_pl_code: z.string().optional(), location_accuracy: z.number().optional(), confidentiality_status: z.number().int().optional(), author_e: z.string().optional(), author_n: z.string().optional(), author_zone: z.string().optional(), author_datum: z.string().optional(), author_location: z.string().optional(), location_narrative: z.string().optional(), azimuth: z.number().optional(), dsgpoly: z.string().optional(), shape: z.string().optional(), stand_size: z.string().optional(), placement_method: z.string().optional(), permanence: z.boolean().optional(), layout_narrative: z.string().optional(), elevation_accuracy: z.number().optional(), elevation_range: z.number().optional(), slope_aspect: z.number().optional(), min_slope_aspect: z.number().optional(), max_slope_aspect: z.number().optional(), slope_gradient: z.number().optional(), min_slope_gradient: z.number().optional(), max_slope_gradient: z.number().optional(), topo_position: z.string().optional(), landform: z.string().optional(), surficial_deposits: z.string().optional(), rock_type: z.string().optional(), previous_obs_id: z.string().optional(), pj_code: z.string().optional(), project_name: z.string().optional(), obs_start_date: z.string().optional(), obs_end_date: z.string().optional(), date_accuracy: z.string().optional(), date_entered: z.string().optional(), cm_code: z.string().optional(), cover_method_name: z.string().optional(), cover_dispersion: z.string().optional(), auto_taxon_cover: z.boolean().optional(), method_narrative: z.string().optional(), taxon_observation_area: z.number().optional(), stem_size_limit: z.number().optional(), stem_observation_area: z.number().optional(), stem_sample_method: z.string().optional(), original_data: z.string().optional(), effort_level: z.string().optional(), plot_validation_level: z.number().int().optional(), floristic_quality: z.string().optional(), bryophyte_quality: z.string().optional(), lichen_quality: z.string().optional(), observation_narrative: z.string().optional(), landscape_narrative: z.string().optional(), homogeneity: z.string().optional(), phenologic_aspect: z.string().optional(), representativeness: z.string().optional(), stand_maturity: z.string().optional(), successional_status: z.string().optional(), basal_area: z.number().optional(), hydrologic_regime: z.string().optional(), soil_moisture_regime: z.string().optional(), soil_drainage: z.string().optional(), water_salinity: z.string().optional(), water_depth: z.number().optional(), shore_distance: z.number().optional(), soil_depth: z.number().optional(), organic_depth: z.number().optional(), st_code: z.string().optional(), soil_taxon_src: z.string().optional(), percent_bed_rock: z.number().optional(), percent_rock_gravel: z.number().optional(), percent_wood: z.number().optional(), percent_litter: z.number().optional(), percent_bare_soil: z.number().optional(), percent_water: z.number().optional(), percent_other: z.number().optional(), name_other: z.string().optional(), tree_ht: z.number().optional(), shrub_ht: z.number().optional(), field_ht: z.number().optional(), nonvascular_ht: z.number().optional(), submerged_ht: z.number().optional(), tree_cover: z.number().optional(), shrub_cover: z.number().optional(), field_cover: z.number().optional(), nonvascular_cover: z.number().optional(), floating_cover: z.number().optional(), submerged_cover: z.number().optional(), dominant_stratum: z.string().optional(), growthform_1_type: z.string().optional(), growthform_2_type: z.string().optional(), growthform_3_type: z.string().optional(), growthform_1_cover: z.number().optional(), growthform_2_cover: z.number().optional(), growthform_3_cover: z.number().optional(), total_cover: z.number().optional(), has_observation_synonym: z.boolean().optional(), replaced_by_ob_code: z.string().optional(), sm_code: z.string().optional(), stratum_method_name: z.string().optional(), stratum_method_description: z.string().optional(), stratum_assignment: z.string().optional(), disturbances: z.array(z.object({type: z.string().optional(), comment: z.string().optional(), intensity: z.string().optional(), age: z.number().optional(), extent: z.number().optional()})).optional(), soils: z.array(z.object({horizon: z.string().optional(), depth_top: z.number().optional(), depth_bottom: z.number().optional(), color: z.string().optional(), organic: z.number().optional(), texture: z.string().optional(), sand: z.number().optional(), silt: z.number().optional(), clay: z.number().optional(), coarse: z.number().optional(), ph: z.number().optional(), exchange_capacity: z.number().optional(), base_saturation: z.number().optional(), description: z.string().optional()})).optional(), named_places: z.array(z.object({np_code: z.string().optional(), system: z.string().optional(), name: z.string().optional(), description: z.string().optional(), code: z.string().optional()})).optional(), taxon_count: z.number().int().optional(), taxon_importance_count: z.number().int().optional(), taxon_importance_count_returned: z.number().int().optional(), top_taxon_observations: z.array(z.object({to_code: z.string().optional(), tm_code: z.string().optional(), pc_code: z.string().optional(), plant_name: z.string().optional(), sr_code: z.string().optional(), stratum_name: z.string().optional(), cover: z.number().optional()})).optional(), top_classifications: z.array(z.object({cl_code: z.string().optional(), ci_code: z.string().optional(), cc_code: z.string().optional(), comm_name: z.string().optional(), comm_code: z.string().optional()})).optional()})).optional()}); export const getApiPlotObservationsObCodeResponse = z.union([plotObsGeo, plotObsMinimal, plotObsMinimalNested, plotObsFull, plotObsFullNested]); 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 plot observation * * GET /plot-observations/{ob_code} */ export const getApiPlotObservationsObCode = async (args: GetApiPlotObservationsObCodeArgs, options?: GetApiPlotObservationsObCodeOptions) => { const {baseUrl = "https://api.vegbank.org", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.detail != null) query.append("detail", String(args.detail)) if (args.with_nested != null) query.append("with_nested", String(args.with_nested)) if (args.create_parquet != null) query.append("create_parquet", String(args.create_parquet)) if (args.bundle != null) query.append("bundle", String(args.bundle)) const url = `${baseUrl.replace(/\/+$/, '')}/plot-observations/${encodeURIComponent(String(args.ob_code))}${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(getApiPlotObservationsObCodeResponse, await res.json()) };