import {z} from 'zod' export type GetApiApiV3MetaBasesBaseIdViewsViewIdArgs = {baseId: string, viewId: string}; export type GetApiApiV3MetaBasesBaseIdViewsViewIdOptions = {baseUrl?: string | undefined, xcToken?: string | undefined, fetch?: typeof fetch | undefined}; export const viewOptionsGrid = z.object({groups: z.array(z.object({field_id: z.string(), direction: z.enum(["asc", "desc"]).optional()})).optional(), row_height: z.enum(["short", "medium", "tall", "extra"]).optional()}); export const sortCreate = z.object({field_id: z.string(), direction: z.enum(["asc", "desc"]).optional(), order_by: z.enum(["alphabetical", "option_order"]).optional()}); export const filterResponse = z.object({id: z.string().optional(), parent_id: z.string().optional(), field_id: z.string(), operator: z.string(), sub_operator: z.string().nullable().optional(), value: z.string().nullable().optional(), enabled: z.boolean().optional()}); export const filterGroupResponse: z.ZodType = z.object({id: z.string(), parent_id: z.string().optional(), group_operator: z.enum(["AND", "OR"]), enabled: z.boolean().optional(), filters: z.array(z.union([filterResponse, z.lazy(() => filterGroupResponse)]))}); export const filterCreateUpdateResponse = z.union([filterResponse, filterGroupResponse]); export const viewAggregationEnum = z.enum(["sum", "min", "max", "avg", "median", "std_dev", "range", "count", "count_empty", "count_filled", "count_unique", "percent_empty", "percent_filled", "percent_unique", "none", "attachment_size", "checked", "unchecked", "percent_checked", "percent_unchecked", "earliest_date", "latest_date", "date_range", "month_range"]); export const viewFields = z.array(z.object({field_id: z.string(), show: z.boolean(), width: z.number().int().optional(), aggregation: viewAggregationEnum.optional()})); export const filter = z.object({id: z.string().optional(), parent_id: z.string().optional(), field_id: z.string(), operator: z.string(), sub_operator: z.string().nullable().optional(), value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(), enabled: z.boolean().optional()}); export const filterGroup: z.ZodType = z.object({id: z.string(), parent_id: z.string().optional(), group_operator: z.enum(["AND", "OR"]), enabled: z.boolean().optional(), filters: z.array(z.union([filter, z.lazy(() => filterGroup)]))}); export const filterCreateUpdate = z.union([z.object({id: z.string().optional(), parent_id: z.string().optional(), field_id: z.string(), operator: z.string(), sub_operator: z.string().nullable().optional(), value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(), enabled: z.boolean().optional()}), z.object({id: z.string(), parent_id: z.string().optional(), group_operator: z.enum(["AND", "OR"]), enabled: z.boolean().optional(), filters: z.array(z.union([filter, filterGroup]))})]); export const viewRowColour = z.discriminatedUnion("mode", [z.object({mode: z.literal("filter"), conditions: z.array(z.object({apply_as_row_background: z.boolean().optional(), color: z.string().optional(), filters: filterCreateUpdate.optional()}))}), z.object({mode: z.literal("select"), field_id: z.string(), apply_as_row_background: z.boolean().optional()})]); export const viewOptionsGallery = z.object({cover_field_id: z.string().optional()}); export const viewOptionsKanban = z.object({stack_by: z.object({field_id: z.string(), stack_order: z.array(z.string()).optional()}), cover_field_id: z.string().optional()}); export const viewOptionsCalendar = z.object({date_ranges: z.array(z.object({start_date_field_id: z.string(), end_date_field_id: z.string().optional()}))}); export const viewOptionsTimeline = z.object({date_ranges: z.array(z.object({start_date_field_id: z.string(), end_date_field_id: z.string().nullable().optional()})).optional()}); export const dateDependency = z.object({dates: z.object({start_field_id: z.string(), end_field_id: z.string()}).optional(), duration_field_id: z.string().nullable().optional(), dependency: z.object({linkrow_field_id: z.string(), linkrow_role: z.enum(["predecessors", "successors"]), connection_type: z.enum(["end-to-start", "end-to-end", "start-to-end", "start-to-start"]), buffer_type: z.enum(["flexible", "fixed", "none"]), buffer_days: z.number().int().gte(0)}).optional(), include_weekends: z.boolean().optional(), is_active: z.boolean().optional()}); export const viewOptionsGantt = z.object({date_dependency: dateDependency.nullable().optional()}); export const viewOptionsMap = z.object({geo_data_field_id: z.string().optional()}); export const filterCreate = z.union([z.object({id: z.string().optional(), parent_id: z.string().optional(), field_id: z.string(), operator: z.string(), sub_operator: z.string().nullable().optional(), value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(), enabled: z.boolean().optional()}), z.object({group_operator: z.enum(["AND", "OR"]), filters: z.array(z.union([z.object({id: z.string().optional(), parent_id: z.string().optional(), field_id: z.string(), operator: z.string(), sub_operator: z.string().nullable().optional(), value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(), enabled: z.boolean().optional()}), z.object({group_operator: z.enum(["AND", "OR"]), filters: z.array(z.union([z.object({id: z.string().optional(), parent_id: z.string().optional(), field_id: z.string(), operator: z.string(), sub_operator: z.string().nullable().optional(), value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(), enabled: z.boolean().optional()}), z.object({group_operator: z.enum(["AND", "OR"]), filters: z.array(filter)})]))})]))})]); export const viewOptionsList = z.object({levels: z.array(z.object({level: z.number(), table_id: z.string(), link_field_id: z.string().nullable().optional(), filters: filterCreate.optional(), sorts: z.array(sortCreate).optional(), fields: viewFields.optional()})).optional(), show_empty_parents: z.boolean().optional(), row_height: z.enum(["short", "medium", "tall", "extra"]).optional()}); export const view = z.union([z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("grid"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsGrid.optional(), sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("gallery"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsGallery.optional(), sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("kanban"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsKanban, sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("calendar"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsCalendar, sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("timeline"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsTimeline, sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("gantt"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsGantt.optional(), sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("map"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsMap.optional(), sorts: z.array(sortCreate).optional(), filters: filterCreateUpdateResponse.optional(), fields: viewFields.optional(), row_coloring: viewRowColour.optional()}), z.object({id: z.string(), table_id: z.string().optional(), title: z.string(), type: z.literal("list"), lock_type: z.enum(["collaborative", "locked", "personal"]).optional(), description: z.string().optional(), created_by: z.string().optional(), owned_by: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), options: viewOptionsList.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 view schema * * GET /api/v3/meta/bases/{baseId}/views/{viewId} * * Also accepts auth: bearerAuth */ export const getApiApiV3MetaBasesBaseIdViewsViewId = async (args: GetApiApiV3MetaBasesBaseIdViewsViewIdArgs, options?: GetApiApiV3MetaBasesBaseIdViewsViewIdOptions) => { 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))}/views/${encodeURIComponent(String(args.viewId))}${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(view, await res.json()) };