import {z} from 'zod' export type GetApiApiV3MetaBasesBaseIdFieldsFieldIdArgs = {baseId: string, fieldId: string}; export type GetApiApiV3MetaBasesBaseIdFieldsFieldIdOptions = {baseUrl?: string | undefined, xcToken?: string | undefined, fetch?: typeof fetch | undefined}; export const fieldOptionsLongText = z.object({rich_text: z.boolean().optional(), generate_text_using_ai: z.boolean().optional(), smart_mode: z.boolean().optional()}); export const fieldOptionsPhoneNumber = z.object({validate: z.boolean().optional()}); export const fieldOptionsNumber = z.object({abbreviate: z.enum(["none", "auto", "thousand", "million", "billion", "trillion"]).optional(), separator: z.enum(["locale", "none_period", "none_comma", "comma_period", "period_comma", "space_period", "space_comma"]).optional()}); export const fieldOptionsCurrency = z.object({abbreviate: z.enum(["none", "auto", "thousand", "million", "billion", "trillion"]).optional(), currency_locale: z.string().optional(), precision: z.number().gte(0).lte(8).optional(), currency_code: z.enum(["AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BYR", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU", "CRC", "CUC", "CUP", "CVE", "CYP", "CZK", "DJF", "DKK", "DOP", "DZD", "EEK", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHC", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LVL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MRU", "MTL", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "ROL", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDD", "SDG", "SEK", "SGD", "SHP", "SIT", "SKK", "SLE", "SLL", "SOS", "SRD", "SSP", "STD", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMM", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "USN", "USS", "UYI", "UYU", "UYW", "UZS", "VEB", "VED", "VES", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XFO", "XFU", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZMK", "ZMW", "ZWD", "ZWG", "ZWL"]).optional()}); export const fieldOptionsPercent = z.object({show_as_progress: z.boolean().optional(), shape: z.enum(["bar", "circle"]).optional(), precision: z.number().gte(0).lte(8).optional()}); export const fieldOptionsDuration = z.object({duration_format: z.enum(["h:mm", "h:mm:ss", "h:mm:ss.s", "h:mm:ss.ss", "h:mm:ss.sss", "d h", "d h:mm", "d h:mm:ss", "d h m", "d h m s", "h:mm:ss.S", "h:mm:ss.SS", "h:mm:ss.SSS"]).optional()}); export const fieldOptionsDateTime = z.object({date_format: z.string().optional(), time_format: z.string().optional(), "12hr_format": z.boolean().optional(), display_timezone: z.boolean().optional(), timezone: z.string().optional(), use_same_timezone_for_all: z.boolean().optional()}); export const fieldOptionsSelect = z.object({choices: z.array(z.object({id: z.string().optional(), title: z.string(), color: z.string().optional()})).optional()}); export const fieldOptionsRating = z.object({icon: z.enum(["star", "heart", "circle-filled", "thumbs-up", "flag"]).optional(), max_value: z.number().int().gte(1).lte(10).optional(), color: z.string().optional()}); export const fieldOptionsCheckbox = z.object({icon: z.enum(["square", "circle-check", "circle-filled", "star", "heart", "thumbs-up", "flag"]).optional(), color: z.string().optional()}); export const fieldOptionsBarcode = z.object({barcode_format: z.string().optional(), barcode_value_field_id: z.string().optional()}); export const fieldOptionsFormula = z.object({formula: z.string().optional(), display_type: z.string().nullable().optional(), display_column_meta: z.object({}).optional()}); export const fieldOptionsUser = z.object({allow_multiple_users: z.boolean().optional(), notify: z.boolean().optional()}); export const fieldOptionsLookup = z.object({related_field_id: z.string(), related_table_lookup_field_id: z.string(), error: z.string().optional(), enable_conditions: z.boolean().optional(), lookup_limit: z.number().int().gte(0).nullable().optional(), lookup_limit_type: z.enum(["first", "last"]).optional(), use_recursive_evaluation: z.boolean().optional(), display_type: z.string().nullable().optional(), display_column_meta: z.object({}).optional()}); export const fieldOptionsLinks = z.object({relation_type: z.enum(["om", "mo", "mm", "oo", "hm", "bt"]), related_table_id: z.string(), related_base_id: z.string().optional(), enable_conditions: z.boolean().optional()}); export const fieldOptionsLinkToAnotherRecord = z.object({relation_type: z.enum(["om", "mo", "mm", "oo", "hm", "bt"]), related_table_id: z.string(), related_base_id: z.string().optional(), enable_conditions: z.boolean().optional()}); export const fieldOptionsRollup = z.object({related_field_id: z.string(), related_table_rollup_field_id: z.string(), rollup_function: z.enum(["count", "countAll", "min", "max", "avg", "sum", "countDistinct", "sumDistinct", "avgDistinct", "formula"]), formula: z.string().optional(), error: z.string().optional(), precision: z.number().gte(0).lte(8).optional(), display_type: z.string().nullable().optional(), display_column_meta: z.object({}).optional(), enable_conditions: z.boolean().optional(), separator: z.enum(["locale", "none_period", "none_comma", "comma_period", "period_comma", "space_period", "space_comma"]).optional()}); export const fieldOptionsButton = z.discriminatedUnion("type", [z.object({type: z.literal("formula"), formula: z.string(), label: z.string().optional(), icon: z.string().optional(), color: z.enum(["brand", "red", "green", "maroon", "blue", "orange", "pink", "purple", "yellow", "gray"]).optional(), theme: z.enum(["solid", "light", "text"]).optional()}), z.object({type: z.literal("webhook"), webhook_id: z.string(), button_hook_id: z.string().optional(), label: z.string().optional(), icon: z.string().optional(), color: z.enum(["brand", "red", "green", "maroon", "blue", "orange", "pink", "purple", "yellow", "gray"]).optional(), theme: z.enum(["solid", "light", "text"]).optional()}), z.object({type: z.literal("ai"), prompt: z.string(), integration_id: z.string(), theme: z.enum(["solid", "light", "text"]).optional(), output_column_ids: z.string().optional(), label: z.string().optional(), icon: z.string().optional(), color: z.enum(["brand", "red", "green", "maroon", "blue", "orange", "pink", "purple", "yellow", "gray"]).optional()}), z.object({type: z.literal("script"), script_id: z.string(), label: z.string().optional(), icon: z.string().optional(), color: z.enum(["brand", "red", "green", "maroon", "blue", "orange", "pink", "purple", "yellow", "gray"]).optional(), theme: z.enum(["solid", "light", "text"]).optional()}), z.object({type: z.literal("url"), formula: z.string(), label: z.string().optional(), icon: z.string().optional(), color: z.enum(["brand", "red", "green", "maroon", "blue", "orange", "pink", "purple", "yellow", "gray"]).optional(), theme: z.enum(["solid", "light", "text"]).optional()})]); export const fieldOptionsAttachment = z.object({max_number_of_attachments: z.number().int().gte(1).optional(), max_attachment_size: z.number().int().gte(1).optional(), supported_attachment_mime_types: z.array(z.string()).optional()}); export const fieldOptionsQrCode = z.object({qrcode_value_field_id: z.string().optional()}); export const fieldOptionsCreatedBy = z.object({allow_multiple_users: z.boolean().optional(), notify: z.boolean().optional()}); export const fieldOptionsLastModifiedBy = z.object({allow_multiple_users: z.boolean().optional(), notify: z.boolean().optional()}); export const field = z.union([z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("SingleLineText").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("LongText").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsLongText.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.enum(["PhoneNumber", "URL", "Email"]).optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsPhoneNumber.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.enum(["Number", "Decimal"]).optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsNumber.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("JSON").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Currency").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsCurrency.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Percent").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsPercent.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Duration").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsDuration.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.enum(["Date", "DateTime", "Time"]).optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsDateTime.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.enum(["SingleSelect", "MultiSelect"]).optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsSelect.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Rating").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsRating.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Checkbox").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsCheckbox.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Barcode").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsBarcode.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Formula").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsFormula.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("User").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsUser.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Lookup").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsLookup.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Links").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsLinks.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("LinkToAnotherRecord").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsLinkToAnotherRecord.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Rollup").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsRollup.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Button").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsButton.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("Attachment").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsAttachment.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("QrCode").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsQrCode.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.enum(["CreatedTime", "LastModifiedTime"]).optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsDateTime.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("CreatedBy").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsCreatedBy.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.literal("LastModifiedBy").optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: z.boolean().optional(), options: fieldOptionsLastModifiedBy.optional()}), z.object({id: z.string().optional(), title: z.string().optional(), type: z.enum(["Geometry", "Year", "AutoNumber"]).optional(), description: z.string().nullable().optional(), default_value: z.union([z.string(), z.boolean(), z.number()]).optional(), unique: 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 }; /** * Get field * * GET /api/v3/meta/bases/{baseId}/fields/{fieldId} * * Also accepts auth: bearerAuth */ export const getApiApiV3MetaBasesBaseIdFieldsFieldId = async (args: GetApiApiV3MetaBasesBaseIdFieldsFieldIdArgs, options?: GetApiApiV3MetaBasesBaseIdFieldsFieldIdOptions) => { const {baseUrl = "https://app.nocodb.com", fetch: fetchFn = fetch, xcToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (xcToken !== undefined) headers.set("xc-token", xcToken) const url = `${baseUrl.replace(/\/+$/, '')}/api/v3/meta/bases/${encodeURIComponent(String(args.baseId))}/fields/${encodeURIComponent(String(args.fieldId))}${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(field, await res.json()) };