import {z} from 'zod' export type NumericVariable = {id: string, name: string, description?: string | undefined, hide?: boolean | undefined, kind: 'numeric', default?: (number | null) | undefined, unit?: ('inches' | 'feet' | 'yards' | 'miles' | 'millimeters' | 'centimeters' | 'meters' | 'kilometers' | 'sq_inches' | 'sq_feet' | 'sq_yards' | 'sq_miles' | 'sq_mm' | 'sq_cm' | 'sq_meters' | 'sq_km' | 'acres' | 'hectares' | 'cu_inches' | 'cu_feet' | 'cu_yards' | 'cu_meters' | 'us_fl_oz' | 'us_pints' | 'us_quarts' | 'us_gallons' | 'milliliters' | 'liters' | 'uk_fl_oz' | 'uk_pints' | 'uk_quarts' | 'uk_gallons' | 'each' | null) | undefined, decimal_places?: number | undefined, minimum?: (number | null) | undefined, maximum?: (number | null) | undefined, hide_if_zero?: boolean | undefined, hide_if_not_used?: boolean | undefined, clear_if_hidden?: boolean | undefined}; export type TextVariable = {id: string, name: string, description?: string | undefined, hide?: boolean | undefined, kind: 'text', default?: string | undefined, hide_if_zero?: boolean | undefined, hide_if_not_used?: boolean | undefined, clear_if_hidden?: boolean | undefined}; export type CheckboxVariable = {id: string, name: string, description?: string | undefined, hide?: boolean | undefined, kind: 'checkbox', default?: boolean | undefined, hide_if_zero?: boolean | undefined, hide_if_not_used?: boolean | undefined, clear_if_hidden?: boolean | undefined}; export type DropdownOption = {id: string, label: string, value?: (number | null) | undefined}; export type DropdownVariable = {id: string, name: string, description?: string | undefined, hide?: boolean | undefined, kind: 'dropdown', options: Array, default_option_id: string, hide_if_not_used?: boolean | undefined, clear_if_hidden?: boolean | undefined}; export type FormulaVariable = {id: string, name: string, description?: string | undefined, hide?: boolean | undefined, kind: 'formula', expression?: string | undefined, unit?: ('inches' | 'feet' | 'yards' | 'miles' | 'millimeters' | 'centimeters' | 'meters' | 'kilometers' | 'sq_inches' | 'sq_feet' | 'sq_yards' | 'sq_miles' | 'sq_mm' | 'sq_cm' | 'sq_meters' | 'sq_km' | 'acres' | 'hectares' | 'cu_inches' | 'cu_feet' | 'cu_yards' | 'cu_meters' | 'us_fl_oz' | 'us_pints' | 'us_quarts' | 'us_gallons' | 'milliliters' | 'liters' | 'uk_fl_oz' | 'uk_pints' | 'uk_quarts' | 'uk_gallons' | 'each' | null) | undefined, decimal_places?: number | undefined, hide_if_zero?: boolean | undefined}; export type CreateExtensionRequest = {name: string, variables?: (Array | null) | undefined}; export type CreateApiApiV1ExtensionsArgs = {body: CreateExtensionRequest}; export type CreateApiApiV1ExtensionsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const numericVariable = z.object({id: z.string().min(10).max(18), name: z.string().min(1).max(200), description: z.string().max(500).optional(), hide: z.boolean().optional(), kind: z.literal("numeric"), default: z.number().nullable().optional(), unit: z.union([z.enum(["inches", "feet", "yards", "miles", "millimeters", "centimeters", "meters", "kilometers"]), z.enum(["sq_inches", "sq_feet", "sq_yards", "sq_miles", "sq_mm", "sq_cm", "sq_meters", "sq_km", "acres", "hectares"]), z.enum(["cu_inches", "cu_feet", "cu_yards", "cu_meters", "us_fl_oz", "us_pints", "us_quarts", "us_gallons", "milliliters", "liters", "uk_fl_oz", "uk_pints", "uk_quarts", "uk_gallons"]), z.literal("each")]).nullable().optional(), decimal_places: z.number().int().gte(0).lte(10).optional(), minimum: z.number().nullable().optional(), maximum: z.number().nullable().optional(), hide_if_zero: z.boolean().optional(), hide_if_not_used: z.boolean().optional(), clear_if_hidden: z.boolean().optional()}); export const textVariable = z.object({id: z.string().min(10).max(18), name: z.string().min(1).max(200), description: z.string().max(500).optional(), hide: z.boolean().optional(), kind: z.literal("text"), default: z.string().max(500).optional(), hide_if_zero: z.boolean().optional(), hide_if_not_used: z.boolean().optional(), clear_if_hidden: z.boolean().optional()}); export const checkboxVariable = z.object({id: z.string().min(10).max(18), name: z.string().min(1).max(200), description: z.string().max(500).optional(), hide: z.boolean().optional(), kind: z.literal("checkbox"), default: z.boolean().optional(), hide_if_zero: z.boolean().optional(), hide_if_not_used: z.boolean().optional(), clear_if_hidden: z.boolean().optional()}); export const dropdownOption = z.object({id: z.string().min(10).max(18), label: z.string().min(1).max(200), value: z.number().nullable().optional()}); export const dropdownVariable = z.object({id: z.string().min(10).max(18), name: z.string().min(1).max(200), description: z.string().max(500).optional(), hide: z.boolean().optional(), kind: z.literal("dropdown"), options: z.array(dropdownOption), default_option_id: z.string().min(10).max(18), hide_if_not_used: z.boolean().optional(), clear_if_hidden: z.boolean().optional()}); export const formulaVariable = z.object({id: z.string().min(10).max(18), name: z.string().min(1).max(200), description: z.string().max(500).optional(), hide: z.boolean().optional(), kind: z.literal("formula"), expression: z.string().max(2000).optional(), unit: z.union([z.enum(["inches", "feet", "yards", "miles", "millimeters", "centimeters", "meters", "kilometers"]), z.enum(["sq_inches", "sq_feet", "sq_yards", "sq_miles", "sq_mm", "sq_cm", "sq_meters", "sq_km", "acres", "hectares"]), z.enum(["cu_inches", "cu_feet", "cu_yards", "cu_meters", "us_fl_oz", "us_pints", "us_quarts", "us_gallons", "milliliters", "liters", "uk_fl_oz", "uk_pints", "uk_quarts", "uk_gallons"]), z.literal("each")]).nullable().optional(), decimal_places: z.number().int().gte(0).lte(10).optional(), hide_if_zero: z.boolean().optional()}); export const extension = z.object({id: z.string(), owner_id: z.string(), name: z.string(), variables: z.array(z.discriminatedUnion("kind", [numericVariable, textVariable, checkboxVariable, dropdownVariable, formulaVariable])).optional(), created_at: z.string(), updated_at: z.string()}); 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 }; /** * Create Extension * * POST /api/v1/extensions */ export const createApiApiV1Extensions = async (args: CreateApiApiV1ExtensionsArgs, options: CreateApiApiV1ExtensionsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/extensions${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(extension, await res.json()) };