export type FilterMode = "client" | "server"; export interface ResourceConfiguration { filterOptions?: { mode?: FilterMode; }; } export interface SpecConfiguration { specUrl: string; baseApiUrl?: string; title?: string; getToken?: () => string | null; resourceConfig?: Record; } export interface ValidationMessage { type: "error" | "warning" | "info"; message: string; } export interface ResourceRelationship { fieldName: string; config: FKFieldConfig; targetSchemaName: string; } export interface ResourceConfig { name: string; schemaName: string; displayName: string; path: string; primaryKey: string; displayFormat: string; listColumns: string[]; fields: FieldConfig[]; orderedFields: FieldConfig[]; operations: { list: boolean; get: boolean; create: boolean; update: boolean; delete: boolean; }; updateMethod: "put" | "patch"; pagination: { limitParam: string; offsetParam: string; defaultLimit: number; } | null; relationships: ResourceRelationship[]; streaming?: boolean; parent?: { resource: string; pathParam: string }; subResources?: string[]; } export interface FKFieldConfig { resource: string; prefetch: boolean; } export interface OneOfOption { value: string; label: string; fields: FieldConfig[]; } export interface FieldConfig { name: string; label: string; description: string; type: string; format?: string; order: number; hidden: { form?: boolean; list?: boolean; detail?: boolean }; filterable: boolean; sortable: boolean; readOnly: boolean; required: boolean; enumValues?: string[]; fk?: FKFieldConfig; uiType?: string; uploadUrl?: string; upload?: { type: string; url: string }; refSchema?: string; inlineDisplayFormat?: string; isArray: boolean; oneOfOptions?: OneOfOption[]; discriminatorProperty?: string; autocomplete?: "text" | "token" | "email" | "phone"; } export interface OpenApiSpec { openapi: string; info: { title: string; version: string; }; servers?: { url: string }[]; components?: { schemas?: Record; }; paths?: Record; } export interface ParsedListResponse { total?: number; items?: any[]; }