import {z} from 'zod' export type GetApiApiV1ProjectsProjectIdConditionsArgs = {project_id: string, rev?: (string | null) | undefined}; export type GetApiApiV1ProjectsProjectIdConditionsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const dimensions = z.object({width_in: z.number().gte(0).nullable().optional(), thickness_in: z.number().gte(0).nullable().optional(), height_in: z.number().gte(0).nullable().optional(), slope: z.string().nullable().optional()}); export const tileModule = z.object({w_in: z.number().int().gte(0), h_in: z.number().int().gte(0), gap_in: z.number().int().gte(0)}); export const gridSpacing = z.object({x_in: z.number().int().gte(0), y_in: z.number().int().gte(0)}); export const rounding = z.object({enabled: z.boolean().optional(), increment: z.number().gt(0).optional()}); export const displayConfig = z.object({name: z.boolean().optional(), dimension: z.boolean().optional(), pattern_while_drawing: z.boolean().optional()}); export const conditionConfig = z.object({dimensions: dimensions.nullable().optional(), tile_module: tileModule.nullable().optional(), grid_spacing: gridSpacing.nullable().optional(), rounding: rounding.optional(), display: displayConfig.optional()}); export const conditionMetadata = z.object({dimensions: dimensions.nullable().optional()}); export const attachmentConfig = z.object({deduct_from_parent: z.boolean().optional()}); export const derivation = z.object({id: z.string(), ordinal: z.number().int().gte(1), result_type: z.enum(["count", "total_height", "perimeter", "surface_area_top_or_bottom", "surface_area_top_and_bottom", "surface_area_all_sides", "surface_area_full", "volume", "length", "segment_count", "surface_area_single_side", "surface_area_both_sides", "surface_area_single_end", "surface_area_both_ends", "surface_area_all_side_duct", "area", "grid_length_visible", "grid_length_x_visible", "grid_length_y_visible", "grid_intersection_count", "tile_count_average", "tile_count_visible", "area_counts"]), uom: z.enum(["EA", "LF", "IN", "FT", "SF", "SY", "CF", "CY"]), respects_backouts: z.boolean().optional(), respects_attachments: z.boolean().optional()}); export const traceGroupRef = z.object({name: z.string().nullable().optional(), measurement_count: z.number().int()}); export const condition = z.object({id: z.string(), project_id: z.string(), name: z.string(), geometry_kind: z.enum(["count", "linear", "area"]), shape: z.enum(["circle", "square", "rectangle"]).nullable().optional(), unit: z.string(), color: z.string(), config: conditionConfig.optional(), metadata: conditionMetadata.optional(), attachment_kind: z.enum(["area", "linear"]).nullable().optional(), attachment_config: attachmentConfig.nullable().optional(), derivations: z.array(derivation).optional(), measurement_count: z.number().int().optional(), folder_id: z.string().nullable().optional(), folder_path: z.string().optional(), sort_order: z.number().optional(), layer_id: z.string(), notes: z.string().nullable().optional(), extension_id: z.string().nullable().optional(), phase_code_id: z.string().nullable().optional(), trace_groups: z.array(traceGroupRef).nullable().optional()}); export const conditionListResponse = z.object({items: z.array(condition), truncated: z.boolean().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 }; /** * List Conditions * * GET /api/v1/projects/{project_id}/conditions */ export const getApiApiV1ProjectsProjectIdConditions = async (args: GetApiApiV1ProjectsProjectIdConditionsArgs, options: GetApiApiV1ProjectsProjectIdConditionsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.rev != null) query.append("rev", String(args.rev)) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/projects/${encodeURIComponent(String(args.project_id))}/conditions${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(conditionListResponse, await res.json()) };