supabase-typed-query 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +59 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -5
- package/dist/index.mjs.map +1 -1
- package/dist/src/entity/Entity.d.ts +14 -2
- package/dist/src/entity/Entity.d.ts.map +1 -1
- package/dist/src/entity/PartitionedEntity.d.ts +17 -2
- package/dist/src/entity/PartitionedEntity.d.ts.map +1 -1
- package/dist/src/entity/core.d.ts +26 -26
- package/dist/src/entity/core.d.ts.map +1 -1
- package/dist/src/entity/types.d.ts +40 -31
- package/dist/src/entity/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/utils/errors.ts","../src/query/QueryBuilder.ts","../src/query/Query.ts","../src/query/rpc.ts","../src/query/index.ts","../src/entity/types.ts","../src/entity/core.ts","../src/entity/Entity.ts","../src/entity/PartitionedEntity.ts"],"sourcesContent":["/**\n * Supabase/Postgrest error structure\n */\nexport type SupabaseErrorObject = {\n message: string\n code?: string\n details?: string\n hint?: string\n}\n\n/**\n * Custom Error class that preserves Supabase error details\n */\nexport class SupabaseError extends Error {\n readonly code?: string\n readonly details?: string\n readonly hint?: string\n\n constructor(error: SupabaseErrorObject | unknown) {\n // Check for Error instances FIRST before checking for Supabase error objects\n // because Error instances also have a message property\n if (error instanceof Error) {\n super(error.message)\n this.name = error.name\n this.stack = error.stack\n } else if (isSupabaseError(error)) {\n super(error.message)\n this.name = \"SupabaseError\"\n this.code = error.code\n this.details = error.details\n this.hint = error.hint\n } else {\n super(String(error))\n this.name = \"SupabaseError\"\n }\n }\n\n /**\n * Override toString to include all error details\n */\n override toString(): string {\n const parts = [this.message]\n if (this.code) parts.push(`[Code: ${this.code}]`)\n if (this.details) parts.push(`Details: ${this.details}`)\n if (this.hint) parts.push(`Hint: ${this.hint}`)\n return parts.join(\" | \")\n }\n}\n\n/**\n * Type guard for Supabase error objects\n */\nfunction isSupabaseError(error: unknown): error is SupabaseErrorObject {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as SupabaseErrorObject).message === \"string\"\n )\n}\n\n/**\n * Convert any error to a proper Error instance\n */\nexport const toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error\n }\n return new SupabaseError(error)\n}\n","import type { Database, DatabaseSchema, SupabaseClientType, TableNames, TableRow } from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { Brand, FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok, Option } from \"functype\"\n\nimport type { IsConditions, MappedQuery, Query, QueryBuilderConfig, QueryCondition, WhereConditions } from \"./Query\"\n\n// Simple console logging for open source version\n// Suppress logs during tests to avoid stderr noise in test output\nconst log = {\n error: (msg: string) => process.env.NODE_ENV !== \"test\" && console.error(`[supabase-typed-query] ${msg}`),\n warn: (msg: string) => process.env.NODE_ENV !== \"test\" && console.warn(`[supabase-typed-query] ${msg}`),\n info: (msg: string) => process.env.NODE_ENV !== \"test\" && console.info(`[supabase-typed-query] ${msg}`),\n}\n\n// Tables that don't have a deleted field (like version tracking tables)\n// Tables that don't have a deleted field - consumers can override this\nconst TABLES_WITHOUT_DELETED = new Set<string>([])\n\n/**\n * Functional QueryBuilder implementation using closures instead of classes\n */\n// Helper to wrap async operations with error handling\nconst wrapAsync = <T>(fn: () => Promise<TaskOutcome<T>>): FPromise<TaskOutcome<T>> => {\n // FPromise in newer functype versions is just a promise with additional methods\n // We can use the FPromise constructor if available, or cast it\n return fn() as unknown as FPromise<TaskOutcome<T>>\n}\n\nexport const QueryBuilder = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n config: QueryBuilderConfig<T, DB>,\n): Query<T, DB> => {\n /**\n * Build the Supabase query from accumulated conditions\n */\n const buildSupabaseQuery = () => {\n const { table, conditions, order, limit, offset, schema } = config\n\n // Start with base query - use schema if provided, otherwise default to public\n const baseQuery = schema ? client.schema(schema).from(table) : client.from(table)\n\n // Handle multiple conditions with OR logic\n const queryWithConditions =\n conditions.length === 1 ? applyCondition(baseQuery, conditions[0]) : applyOrConditions(baseQuery, conditions)\n\n // Apply ordering if specified\n const queryWithOrder = order ? queryWithConditions.order(order[0], order[1]) : queryWithConditions\n\n // Apply pagination\n const finalQuery = (() => {\n if (limit && offset !== undefined) {\n // Use range for offset + limit\n return queryWithOrder.range(offset, offset + limit - 1)\n } else if (limit) {\n // Just limit\n return queryWithOrder.limit(limit)\n } else if (offset !== undefined) {\n // Just offset (need to use a large upper bound)\n return queryWithOrder.range(offset, Number.MAX_SAFE_INTEGER)\n }\n return queryWithOrder\n })()\n\n return finalQuery\n }\n\n /**\n * Apply a single condition to the query\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const applyCondition = (query: any, condition: QueryCondition<T, DB>): any => {\n const { where, is, wherein, gt, gte, lt, lte, neq, like, ilike } = condition\n\n // Process WHERE conditions, extracting operators from the where object\n const processedWhere: Record<string, unknown> = {}\n const extractedOperators: {\n gt?: Record<string, unknown>\n gte?: Record<string, unknown>\n lt?: Record<string, unknown>\n lte?: Record<string, unknown>\n neq?: Record<string, unknown>\n like?: Record<string, string>\n ilike?: Record<string, string>\n } = {}\n\n if (where) {\n // Extract top-level operators from where object\n const {\n gt: whereGt,\n gte: whereGte,\n lt: whereLt,\n lte: whereLte,\n neq: whereNeq,\n like: whereLike,\n ilike: whereIlike,\n ...rest\n } = where as Record<string, unknown>\n\n // Store extracted operators\n if (whereGt) extractedOperators.gt = whereGt as Record<string, unknown>\n if (whereGte) extractedOperators.gte = whereGte as Record<string, unknown>\n if (whereLt) extractedOperators.lt = whereLt as Record<string, unknown>\n if (whereLte) extractedOperators.lte = whereLte as Record<string, unknown>\n if (whereNeq) extractedOperators.neq = whereNeq as Record<string, unknown>\n if (whereLike) extractedOperators.like = whereLike as Record<string, string>\n if (whereIlike) extractedOperators.ilike = whereIlike as Record<string, string>\n\n // Process remaining fields\n for (const [key, value] of Object.entries(rest)) {\n if (value && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Date)) {\n // Check if it's an operator object\n const ops = value as Record<string, unknown>\n if (ops.gte !== undefined) {\n extractedOperators.gte = {\n ...extractedOperators.gte,\n [key]: ops.gte,\n }\n }\n if (ops.gt !== undefined) {\n extractedOperators.gt = { ...extractedOperators.gt, [key]: ops.gt }\n }\n if (ops.lte !== undefined) {\n extractedOperators.lte = {\n ...extractedOperators.lte,\n [key]: ops.lte,\n }\n }\n if (ops.lt !== undefined) {\n extractedOperators.lt = { ...extractedOperators.lt, [key]: ops.lt }\n }\n if (ops.neq !== undefined) {\n extractedOperators.neq = {\n ...extractedOperators.neq,\n [key]: ops.neq,\n }\n }\n if (ops.like !== undefined) {\n extractedOperators.like = {\n ...extractedOperators.like,\n [key]: ops.like as string,\n }\n }\n if (ops.ilike !== undefined) {\n extractedOperators.ilike = {\n ...extractedOperators.ilike,\n [key]: ops.ilike as string,\n }\n }\n if (ops.in !== undefined) {\n // Handle IN operator\n if (!wherein) {\n const cond = condition as unknown as Record<string, unknown>\n cond.wherein = {}\n }\n const whereinObj = condition.wherein as Record<string, unknown>\n whereinObj[key] = ops.in\n }\n if (ops.is !== undefined) {\n // Handle IS operator\n if (!is) {\n const cond = condition as unknown as Record<string, unknown>\n cond.is = {}\n }\n const isObj = condition.is as Record<string, unknown>\n isObj[key] = ops.is\n }\n // If no operators found, treat as regular value\n if (!ops.gte && !ops.gt && !ops.lte && !ops.lt && !ops.neq && !ops.like && !ops.ilike && !ops.in && !ops.is) {\n processedWhere[key] = value\n }\n } else {\n // Regular value\n processedWhere[key] = value\n }\n }\n }\n\n // Merge extracted operators with explicitly passed operators\n const mergedGt = { ...gt, ...extractedOperators.gt }\n const mergedGte = { ...gte, ...extractedOperators.gte }\n const mergedLt = { ...lt, ...extractedOperators.lt }\n const mergedLte = { ...lte, ...extractedOperators.lte }\n const mergedNeq = { ...neq, ...extractedOperators.neq }\n const mergedLike = { ...like, ...extractedOperators.like }\n const mergedIlike = { ...ilike, ...extractedOperators.ilike }\n\n // Apply WHERE conditions\n const baseQuery = query.select(\"*\").match(processedWhere)\n\n // Apply soft delete filter based on softDeleteMode\n const queryWithSoftDelete = (() => {\n if (TABLES_WITHOUT_DELETED.has(config.table)) {\n return baseQuery\n }\n if (config.softDeleteMode === \"exclude\") {\n return baseQuery.is(\"deleted\", null)\n }\n if (config.softDeleteMode === \"only\") {\n return baseQuery.not(\"deleted\", \"is\", null)\n }\n // Default: \"include\" - no filter\n return baseQuery\n })()\n\n // Apply WHERE IN conditions\n const queryWithWhereIn = wherein\n ? List(Object.entries(wherein)).foldLeft(queryWithSoftDelete)((q, [column, values]) =>\n q.in(column, values as never),\n )\n : queryWithSoftDelete\n\n // Apply IS conditions\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithWhereIn)((q, [column, value]) =>\n q.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithWhereIn\n\n // Apply comparison operators using merged values\n const queryWithGt =\n Object.keys(mergedGt).length > 0\n ? Object.entries(mergedGt).reduce((q, [key, value]) => q.gt(key, value), queryWithIs)\n : queryWithIs\n\n const queryWithGte =\n Object.keys(mergedGte).length > 0\n ? Object.entries(mergedGte).reduce((q, [key, value]) => q.gte(key, value), queryWithGt)\n : queryWithGt\n\n const queryWithLt =\n Object.keys(mergedLt).length > 0\n ? Object.entries(mergedLt).reduce((q, [key, value]) => q.lt(key, value), queryWithGte)\n : queryWithGte\n\n const queryWithLte =\n Object.keys(mergedLte).length > 0\n ? Object.entries(mergedLte).reduce((q, [key, value]) => q.lte(key, value), queryWithLt)\n : queryWithLt\n\n const queryWithNeq =\n Object.keys(mergedNeq).length > 0\n ? Object.entries(mergedNeq).reduce((q, [key, value]) => q.neq(key, value), queryWithLte)\n : queryWithLte\n\n // Apply pattern matching using merged values\n const queryWithLike =\n Object.keys(mergedLike).length > 0\n ? Object.entries(mergedLike).reduce((q, [key, pattern]) => q.like(key, pattern as string), queryWithNeq)\n : queryWithNeq\n\n const queryWithIlike =\n Object.keys(mergedIlike).length > 0\n ? Object.entries(mergedIlike).reduce((q, [key, pattern]) => q.ilike(key, pattern as string), queryWithLike)\n : queryWithLike\n\n return queryWithIlike\n }\n\n /**\n * Apply multiple conditions with OR logic\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const applyOrConditions = (query: any, conditions: QueryCondition<T, DB>[]): any => {\n // Start with select\n const selectQuery = query.select(\"*\")\n\n // Apply soft delete filter based on softDeleteMode\n const baseQuery = (() => {\n if (TABLES_WITHOUT_DELETED.has(config.table)) {\n return selectQuery\n }\n if (config.softDeleteMode === \"exclude\") {\n return selectQuery.is(\"deleted\", null)\n }\n if (config.softDeleteMode === \"only\") {\n return selectQuery.not(\"deleted\", \"is\", null)\n }\n // Default: \"include\" - no filter\n return selectQuery\n })()\n\n // Separate common conditions from varying conditions\n const commonConditions = new Map<string, unknown>()\n const varyingConditions: QueryCondition<T, DB>[] = []\n\n // Find conditions that are common across all OR branches\n if (conditions.length > 0) {\n const firstCondition = conditions[0]\n\n // Check each key-value pair in the first condition\n Object.entries(firstCondition.where).forEach(([key, value]) => {\n // If this key-value pair exists in ALL conditions, it's common\n const isCommonCondition = conditions.every(\n (condition) => (condition.where as Record<string, unknown>)[key] === value,\n )\n\n if (isCommonCondition) {\n commonConditions.set(key, value)\n }\n })\n\n // Create new conditions with common parts removed\n varyingConditions.push(\n ...conditions.map((condition) => {\n const newWhere = { ...condition.where } as Record<string, unknown>\n commonConditions.forEach((_, key) => {\n delete newWhere[key]\n })\n return {\n where: newWhere as WhereConditions<TableRow<T, DB>>,\n is: condition.is,\n wherein: condition.wherein,\n }\n }),\n )\n }\n\n // Apply common conditions first\n const queryWithCommon = Array.from(commonConditions.entries()).reduce((query, [key, value]) => {\n if (value === null) {\n return query.is(key, null)\n } else {\n return query.eq(key, value)\n }\n }, baseQuery)\n\n // If no varying conditions remain, we're done\n if (varyingConditions.every((condition) => Object.keys(condition.where).length === 0)) {\n return queryWithCommon\n }\n\n // Build OR conditions from the varying parts only\n const orConditions = varyingConditions\n .map((condition) => {\n const parts: string[] = []\n\n // Add WHERE conditions (only the varying ones)\n Object.entries(condition.where).forEach(([key, value]) => {\n if (value === null) {\n parts.push(`${key}.is.null`)\n } else {\n parts.push(`${key}.eq.\"${value}\"`)\n }\n })\n\n // Add IS conditions\n if (condition.is) {\n Object.entries(condition.is).forEach(([key, value]) => {\n if (value === null) {\n parts.push(`${key}.is.null`)\n } else {\n parts.push(`${key}.is.${value}`)\n }\n })\n }\n\n // Add WHERE IN conditions\n if (condition.wherein) {\n Object.entries(condition.wherein).forEach(([key, values]) => {\n if (values && Array.isArray(values) && values.length > 0) {\n const valueList = values.map((v: unknown) => `\"${v}\"`).join(\",\")\n parts.push(`${key}.in.(${valueList})`)\n }\n })\n }\n\n // Add comparison operators\n if (condition.gt) {\n Object.entries(condition.gt).forEach(([key, value]) => {\n parts.push(`${key}.gt.${value}`)\n })\n }\n if (condition.gte) {\n Object.entries(condition.gte).forEach(([key, value]) => {\n parts.push(`${key}.gte.${value}`)\n })\n }\n if (condition.lt) {\n Object.entries(condition.lt).forEach(([key, value]) => {\n parts.push(`${key}.lt.${value}`)\n })\n }\n if (condition.lte) {\n Object.entries(condition.lte).forEach(([key, value]) => {\n parts.push(`${key}.lte.${value}`)\n })\n }\n if (condition.neq) {\n Object.entries(condition.neq).forEach(([key, value]) => {\n if (value === null) {\n parts.push(`${key}.not.is.null`)\n } else {\n parts.push(`${key}.neq.\"${value}\"`)\n }\n })\n }\n\n // Add pattern matching\n if (condition.like) {\n Object.entries(condition.like).forEach(([key, pattern]) => {\n parts.push(`${key}.like.\"${pattern}\"`)\n })\n }\n if (condition.ilike) {\n Object.entries(condition.ilike).forEach(([key, pattern]) => {\n parts.push(`${key}.ilike.\"${pattern}\"`)\n })\n }\n\n return parts.join(\",\")\n })\n .filter((condition) => condition.length > 0)\n\n // Apply OR conditions if any remain\n\n const finalQuery = orConditions.length > 0 ? queryWithCommon.or(orConditions.join(\",\")) : queryWithCommon\n\n return finalQuery\n }\n\n // Return the Query interface implementation\n return {\n /**\n * Add OR condition to the query\n */\n or: (where: WhereConditions<TableRow<T, DB>>, is?: IsConditions<TableRow<T, DB>>): Query<T, DB> => {\n const newConditions = [...config.conditions, { where, is }]\n return QueryBuilder<T, DB>(client, {\n ...config,\n conditions: newConditions,\n })\n },\n\n /**\n * Filter by branded ID with type safety\n */\n whereId: <ID extends Brand<string, string>>(id: ID): Query<T, DB> => {\n const newConditions = [\n ...config.conditions,\n {\n where: { id: id as unknown } as unknown as WhereConditions<TableRow<T, DB>>,\n },\n ]\n return QueryBuilder<T, DB>(client, {\n ...config,\n conditions: newConditions,\n })\n },\n\n /**\n * Add OR condition with branded ID\n */\n orWhereId: <ID extends Brand<string, string>>(id: ID): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, config).or({\n id: id as unknown,\n } as unknown as WhereConditions<TableRow<T, DB>>)\n },\n\n /**\n * Apply mapping function to query results\n */\n map: <U>(fn: (item: TableRow<T, DB>) => U): MappedQuery<U> => {\n return createMappedQuery<T, DB, U>(QueryBuilder<T, DB>(client, config), fn)\n },\n\n /**\n * Apply filter function to query results\n */\n filter: (predicate: (item: TableRow<T, DB>) => boolean): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n filterFn: config.filterFn ? (item: TableRow<T, DB>) => config.filterFn!(item) && predicate(item) : predicate,\n })\n },\n\n /**\n * Limit the number of results\n */\n limit: (count: number): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n limit: count,\n })\n },\n\n /**\n * Offset the results for pagination\n */\n offset: (count: number): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n offset: count,\n })\n },\n\n /**\n * Include all records (no soft delete filter)\n */\n includeDeleted: (): Query<T, DB> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"include\") {\n log.warn(`[${config.table}] includeDeleted() called but already including deleted by default`)\n }\n return QueryBuilder<T, DB>(client, {\n ...config,\n softDeleteMode: \"include\",\n softDeleteAppliedByDefault: false,\n })\n },\n\n /**\n * Exclude soft-deleted records (apply deleted IS NULL filter)\n */\n excludeDeleted: (): Query<T, DB> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"exclude\") {\n log.warn(`[${config.table}] excludeDeleted() called but already excluding deleted by default`)\n }\n return QueryBuilder<T, DB>(client, {\n ...config,\n softDeleteMode: \"exclude\",\n softDeleteAppliedByDefault: false,\n })\n },\n\n /**\n * Query only soft-deleted records (apply deleted IS NOT NULL filter)\n */\n onlyDeleted: (): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n softDeleteMode: \"only\",\n softDeleteAppliedByDefault: false,\n })\n },\n\n /**\n * Execute query expecting exactly one result\n */\n one: (): FPromise<TaskOutcome<Option<TableRow<T, DB>>>> => {\n return wrapAsync(async () => {\n try {\n const query = buildSupabaseQuery()\n const { data, error } = await query.single()\n\n if (error) {\n log.error(`Error getting ${config.table} item: ${toError(error).toString()}`)\n return Err<Option<TableRow<T, DB>>>(toError(error))\n }\n\n const result = data as TableRow<T, DB>\n const filteredResult = config.filterFn ? config.filterFn(result) : true\n\n if (!filteredResult) {\n return Ok(Option.none<TableRow<T, DB>>())\n }\n\n return Ok(Option(result))\n } catch (error) {\n log.error(`Error executing single query on ${config.table}: ${toError(error).toString()}`)\n return Err<Option<TableRow<T, DB>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting zero or more results\n */\n many: (): FPromise<TaskOutcome<List<TableRow<T, DB>>>> => {\n return wrapAsync(async () => {\n try {\n const query = buildSupabaseQuery()\n const { data, error } = await query\n\n if (error) {\n log.error(`Error getting ${config.table} items: ${toError(error).toString()}`)\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n const rawResults = data as TableRow<T, DB>[]\n\n // Apply filter if present\n const results = config.filterFn ? rawResults.filter(config.filterFn) : rawResults\n\n return Ok(List(results))\n } catch (error) {\n log.error(`Error executing multi query on ${config.table}: ${toError(error).toString()}`)\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting first result from potentially multiple\n */\n first: (): FPromise<TaskOutcome<Option<TableRow<T, DB>>>> => {\n return wrapAsync(async () => {\n const manyResult = await QueryBuilder<T, DB>(client, config).many()\n const list = manyResult.orThrow()\n if (list.isEmpty) {\n return Ok(Option.none<TableRow<T, DB>>())\n }\n return Ok(Option(list.head))\n })\n },\n\n /**\n * Execute query expecting exactly one result, throw if error or not found\n */\n oneOrThrow: async (): Promise<TableRow<T, DB>> => {\n const result = await QueryBuilder<T, DB>(client, config).one()\n const option = result.orThrow()\n return option.orThrow(new Error(`No record found in ${config.table}`))\n },\n\n /**\n * Execute query expecting zero or more results, throw if error\n */\n manyOrThrow: async (): Promise<List<TableRow<T, DB>>> => {\n const result = await QueryBuilder<T, DB>(client, config).many()\n return result.orThrow()\n },\n\n /**\n * Execute query expecting first result, throw if error or empty\n */\n firstOrThrow: async (): Promise<TableRow<T, DB>> => {\n const result = await QueryBuilder<T, DB>(client, config).first()\n const option = result.orThrow()\n return option.orThrow(new Error(`No records found in ${config.table}`))\n },\n }\n}\n\n/**\n * Functional MappedQuery implementation\n */\nconst createMappedQuery = <T extends TableNames<DB>, DB extends DatabaseSchema = Database, U = unknown>(\n sourceQuery: Query<T, DB>,\n mapFn: (item: TableRow<T, DB>) => U,\n): MappedQuery<U> => {\n return {\n map: <V>(fn: (item: U) => V): MappedQuery<V> => {\n return createMappedQuery<T, DB, V>(sourceQuery, (item: TableRow<T, DB>) => fn(mapFn(item)))\n },\n\n filter: (predicate: (item: U) => boolean): MappedQuery<U> => {\n const filteredQuery = sourceQuery.filter((item: TableRow<T, DB>) => predicate(mapFn(item)))\n return createMappedQuery<T, DB, U>(filteredQuery, mapFn)\n },\n\n one: (): FPromise<TaskOutcome<Option<U>>> => {\n return wrapAsync(async () => {\n const maybeItemResult = await sourceQuery.one()\n const maybeItem = maybeItemResult.orThrow()\n return maybeItem.fold(\n () => Ok(Option.none<U>()),\n (item) => Ok(Option(mapFn(item))),\n )\n })\n },\n\n many: (): FPromise<TaskOutcome<List<U>>> => {\n return wrapAsync(async () => {\n const itemsResult = await sourceQuery.many()\n const items = itemsResult.orThrow()\n return Ok(items.map(mapFn))\n })\n },\n\n first: (): FPromise<TaskOutcome<Option<U>>> => {\n return wrapAsync(async () => {\n const maybeItemResult = await sourceQuery.first()\n const maybeItem = maybeItemResult.orThrow()\n return maybeItem.fold(\n () => Ok(Option.none<U>()),\n (item) => Ok(Option(mapFn(item))),\n )\n })\n },\n\n /**\n * Execute mapped query expecting exactly one result, throw if error or not found\n */\n oneOrThrow: async (): Promise<U> => {\n const result = await createMappedQuery(sourceQuery, mapFn).one()\n const option = result.orThrow()\n return option.orThrow(new Error(`No record found`))\n },\n\n /**\n * Execute mapped query expecting zero or more results, throw if error\n */\n manyOrThrow: async (): Promise<List<U>> => {\n const result = await createMappedQuery(sourceQuery, mapFn).many()\n return result.orThrow()\n },\n\n /**\n * Execute mapped query expecting first result, throw if error or empty\n */\n firstOrThrow: async (): Promise<U> => {\n const result = await createMappedQuery(sourceQuery, mapFn).first()\n const option = result.orThrow()\n return option.orThrow(new Error(`No records found`))\n },\n }\n}\n\n/**\n * Factory function to create new functional QueryBuilder instances\n */\nexport const createQuery = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: WhereConditions<TableRow<T, DB>> = {},\n is?: IsConditions<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n order?: [keyof TableRow<T, DB> & string, { ascending?: boolean; nullsFirst?: boolean }],\n softDeleteConfig?: { mode?: \"include\" | \"exclude\" | \"only\"; appliedByDefault?: boolean },\n schema?: string,\n): Query<T, DB> => {\n const config: QueryBuilderConfig<T, DB> = {\n table,\n conditions: [{ where, is, wherein }],\n order,\n softDeleteMode: softDeleteConfig?.mode,\n softDeleteAppliedByDefault: softDeleteConfig?.appliedByDefault,\n schema,\n }\n return QueryBuilder<T, DB>(client, config)\n}\n","import type { Database, DatabaseSchema, EmptyObject, TableNames, TableRow } from \"@/types\"\n\nimport type { Brand, FPromise, List, Option, TaskOutcome } from \"functype\"\n\n// Comparison operators for advanced queries\nexport type ComparisonOperators<V> = {\n gte?: V // Greater than or equal\n gt?: V // Greater than\n lte?: V // Less than or equal\n lt?: V // Less than\n neq?: V // Not equal\n like?: string // LIKE pattern (for string fields)\n ilike?: string // Case-insensitive LIKE\n in?: V[] // IN array\n is?: null | boolean // IS NULL/TRUE/FALSE\n}\n\n// Type-safe WHERE conditions that provide IntelliSense for table columns\n// Supports both direct values and operator objects for advanced queries\nexport type WhereConditions<T extends object> = Partial<{\n [K in keyof T]: T[K] | null | ComparisonOperators<T[K]>\n}> & {\n // Special operators that work across columns with type-safe values\n gte?: Partial<{ [K in keyof T]?: T[K] }>\n gt?: Partial<{ [K in keyof T]?: T[K] }>\n lte?: Partial<{ [K in keyof T]?: T[K] }>\n lt?: Partial<{ [K in keyof T]?: T[K] }>\n neq?: Partial<{ [K in keyof T]?: T[K] }>\n like?: Partial<{ [K in keyof T]?: Extract<T[K], string> }>\n ilike?: Partial<{ [K in keyof T]?: Extract<T[K], string> }>\n}\n\n/**\n * Entity-specific WHERE conditions - no nested ComparisonOperators allowed.\n * Entity API methods (getItems, updateItem, etc.) don't process nested operators.\n * Use separate `is`, `wherein`, etc. parameters for these operations.\n *\n * @example\n * // Correct Entity usage:\n * Entity.getItems({ where: { code }, is: { used_at: null } })\n *\n * // Incorrect (use Query API instead for nested operators):\n * Entity.getItems({ where: { code, used_at: { is: null } } }) // TypeScript error\n */\nexport type EntityWhereConditions<T extends object> = Partial<{\n [K in keyof T]: T[K] | null\n}>\n\n// Enhanced type for IS conditions with field-level type safety\nexport type IsConditions<T extends object = EmptyObject> = Partial<Record<keyof T, null | boolean>>\n\n// Soft delete mode for controlling how deleted records are handled\nexport type SoftDeleteMode = \"include\" | \"exclude\" | \"only\"\n\n// =============================================================================\n// Standard Execution Interfaces for Consistent OrThrow Pattern\n// =============================================================================\n\n/**\n * Base execution interface that all database operations implement\n */\nexport interface ExecutableQuery<T> {\n // TaskOutcome version (for explicit error handling)\n execute(): FPromise<TaskOutcome<T>>\n\n // OrThrow version (for simple error handling)\n executeOrThrow(): Promise<T>\n}\n\n/**\n * Standard interface for operations that return a single result\n */\nexport interface SingleExecution<T> extends ExecutableQuery<Option<T>> {\n one(): FPromise<TaskOutcome<Option<T>>>\n oneOrThrow(): Promise<T>\n}\n\n/**\n * Standard interface for operations that return multiple results\n */\nexport interface MultiExecution<T> extends ExecutableQuery<List<T>> {\n many(): FPromise<TaskOutcome<List<T>>>\n manyOrThrow(): Promise<List<T>>\n}\n\n// Branded type support for query conditions\nexport type BrandedWhereParams<T extends object = EmptyObject> = {\n [K in keyof T]?: T[K] | unknown // Simplified to avoid complex conditional types\n}\n\n// Helper type for branded field values\nexport type BrandedFieldValue<T> = T extends Brand<string, infer BaseType> ? T | BaseType : T\n\n// =============================================================================\n// Core Query Interface with Database Generic Support\n// =============================================================================\n\n/**\n * Core Query interface with branded type support.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface Query<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n // Execution methods - explicit about expected results\n one(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T, DB>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<TableRow<T, DB>>\n manyOrThrow(): Promise<List<TableRow<T, DB>>>\n firstOrThrow(): Promise<TableRow<T, DB>>\n\n // Query composition - chainable OR logic with type-safe where conditions\n or(where: WhereConditions<TableRow<T, DB>>, is?: IsConditions<TableRow<T, DB>>): Query<T, DB>\n\n // Branded type-aware query methods (simplified)\n whereId<ID extends Brand<string, string>>(id: ID): Query<T, DB>\n orWhereId<ID extends Brand<string, string>>(id: ID): Query<T, DB>\n\n // Functional operations - maintain composability\n map<U>(fn: (item: TableRow<T, DB>) => U): MappedQuery<U>\n filter(predicate: (item: TableRow<T, DB>) => boolean): Query<T, DB>\n\n // Pagination\n limit(count: number): Query<T, DB>\n offset(count: number): Query<T, DB>\n\n // Soft delete filtering\n includeDeleted(): Query<T, DB>\n excludeDeleted(): Query<T, DB>\n onlyDeleted(): Query<T, DB>\n}\n\n// Mapped query for transformed results\nexport interface MappedQuery<U> {\n one(): FPromise<TaskOutcome<Option<U>>>\n many(): FPromise<TaskOutcome<List<U>>>\n first(): FPromise<TaskOutcome<Option<U>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<U>\n manyOrThrow(): Promise<List<U>>\n firstOrThrow(): Promise<U>\n\n // Continue chaining\n map<V>(fn: (item: U) => V): MappedQuery<V>\n filter(predicate: (item: U) => boolean): MappedQuery<U>\n}\n\n// =============================================================================\n// Query Condition Types\n// =============================================================================\n\n/**\n * Query condition for internal state management with type-safe where.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface QueryCondition<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n where: WhereConditions<TableRow<T, DB>>\n is?: IsConditions<TableRow<T, DB>>\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>\n // Comparison operators\n gt?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n gte?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n lt?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n lte?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n neq?: Partial<Record<keyof TableRow<T, DB>, unknown>>\n // Pattern matching\n like?: Partial<Record<keyof TableRow<T, DB>, string>>\n ilike?: Partial<Record<keyof TableRow<T, DB>, string>>\n}\n\n// =============================================================================\n// Entity Query Interfaces\n// =============================================================================\n\n/**\n * Entity-specific query interfaces for better type safety.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface EntityQuery<T extends TableNames<DB>, DB extends DatabaseSchema = Database> extends Query<T, DB> {\n // Entity-specific methods can be added here\n normalize(): NormalizedQuery<T, DB>\n}\n\n/**\n * Normalized query interface.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface NormalizedQuery<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n one(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T, DB>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n// Type guards for runtime type checking\nexport const isQuery = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n obj: unknown,\n): obj is Query<T, DB> => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"one\" in obj &&\n \"many\" in obj &&\n \"first\" in obj &&\n \"or\" in obj &&\n \"map\" in obj &&\n \"filter\" in obj\n )\n}\n\nexport const isMappedQuery = <U>(obj: unknown): obj is MappedQuery<U> => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"one\" in obj &&\n \"many\" in obj &&\n \"first\" in obj &&\n \"map\" in obj &&\n \"filter\" in obj\n )\n}\n\n// =============================================================================\n// Utility Types for Query Parameters\n// =============================================================================\n\n/**\n * Utility types for query parameters with type safety.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport type QueryWhereParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = WhereConditions<\n TableRow<T, DB>\n>\nexport type QueryIsParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = IsConditions<\n TableRow<T, DB>\n>\nexport type QueryWhereinParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = Partial<\n Record<keyof TableRow<T, DB>, unknown[]>\n>\nexport type QueryOrderParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = [\n keyof TableRow<T, DB> & string,\n { ascending?: boolean; nullsFirst?: boolean },\n]\n\n// =============================================================================\n// Builder Configuration\n// =============================================================================\n\n/**\n * Builder configuration for query construction.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface QueryBuilderConfig<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n table: T\n conditions: QueryCondition<T, DB>[]\n order?: QueryOrderParams<T, DB>\n mapFn?: (item: TableRow<T, DB>) => unknown\n filterFn?: (item: TableRow<T, DB>) => boolean\n limit?: number\n offset?: number\n softDeleteMode?: SoftDeleteMode\n softDeleteAppliedByDefault?: boolean\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n}\n","/**\n * RPC (Remote Procedure Call) support for Supabase stored procedures/functions\n *\n * Provides type-safe invocation of PostgreSQL functions defined in the database.\n *\n * @example\n * ```typescript\n * // Call a function that returns a single value\n * const stats = await rpc(client, \"get_user_stats\", { user_id: \"123\" }).one()\n *\n * // Call a function that returns multiple rows\n * const results = await rpc(client, \"search_products\", { query: \"laptop\" }).many()\n *\n * // With custom schema\n * const data = await rpc(client, \"analytics_query\", { period: \"week\" }, { schema: \"analytics\" }).many()\n * ```\n */\n\nimport type {\n Database,\n DatabaseSchema,\n FunctionArgs,\n FunctionNames,\n FunctionReturns,\n SupabaseClientType,\n} from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok, Option } from \"functype\"\n\n// =============================================================================\n// RPC Execution Types\n// =============================================================================\n\n/**\n * Options for RPC execution\n */\nexport type RpcOptions = {\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n /** Count option for the query */\n count?: \"exact\" | \"planned\" | \"estimated\"\n}\n\n/**\n * Single execution interface for RPC calls\n */\nexport type RpcSingleExecution<T> = {\n /**\n * Execute and return TaskOutcome<Option<T>>\n * Returns None if no result, Some(value) if result exists\n */\n one: () => FPromise<TaskOutcome<Option<T>>>\n\n /**\n * Execute and return T directly, throwing on error or no result\n */\n oneOrThrow: () => Promise<T>\n}\n\n/**\n * Multi execution interface for RPC calls\n */\nexport type RpcMultiExecution<T> = {\n /**\n * Execute and return TaskOutcome<List<T>>\n * Returns empty List if no results\n */\n many: () => FPromise<TaskOutcome<List<T>>>\n\n /**\n * Execute and return List<T> directly, throwing on error\n */\n manyOrThrow: () => Promise<List<T>>\n}\n\n/**\n * Combined RPC query execution interface\n * Provides both single and multi-result execution methods\n */\nexport type RpcExecution<T> = RpcSingleExecution<T> & RpcMultiExecution<T>\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Wraps an async operation to return FPromise<TaskOutcome<T>>\n */\nconst wrapAsync = <T>(fn: () => Promise<TaskOutcome<T>>): FPromise<TaskOutcome<T>> => {\n return fn() as unknown as FPromise<TaskOutcome<T>>\n}\n\n// =============================================================================\n// RPC Implementation\n// =============================================================================\n\n/**\n * Creates an RPC query for invoking a PostgreSQL function.\n *\n * This function provides type-safe invocation of stored procedures/functions\n * defined in your Supabase database. Return types are inferred from your\n * generated Database types.\n *\n * @template F - The function name (must exist in database schema)\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param functionName - The name of the PostgreSQL function to call\n * @param args - Arguments to pass to the function (type-safe based on function definition)\n * @param options - Optional configuration (schema, count)\n * @returns An RpcExecution object with one(), oneOrThrow(), many(), manyOrThrow() methods\n *\n * @example\n * ```typescript\n * // Function returning a single object\n * const userStats = await rpc(client, \"get_user_stats\", { user_id: \"123\" }).one()\n * if (userStats.isOk()) {\n * const stats = userStats.orThrow()\n * if (stats.isSome()) {\n * console.log(stats.get())\n * }\n * }\n *\n * // Function returning multiple rows\n * const products = await rpc(client, \"search_products\", { query: \"laptop\", limit: 10 }).many()\n * products.forEach(p => console.log(p.name))\n *\n * // Using OrThrow variants\n * const stats = await rpc(client, \"get_user_stats\", { user_id: \"123\" }).oneOrThrow()\n * const results = await rpc(client, \"search_all\").manyOrThrow()\n * ```\n */\nexport const rpc = <F extends FunctionNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n functionName: F,\n args?: FunctionArgs<F, DB>,\n options?: RpcOptions,\n): RpcExecution<FunctionReturns<F, DB>> => {\n type ReturnType = FunctionReturns<F, DB>\n\n const executeRpc = (): Promise<{ data: unknown; error: unknown }> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (client as any).rpc(functionName, args ?? {}, {\n count: options?.count,\n })\n }\n\n const one = (): FPromise<TaskOutcome<Option<ReturnType>>> =>\n wrapAsync(async () => {\n try {\n const { data, error } = await executeRpc()\n\n if (error) {\n return Err<Option<ReturnType>>(toError(error))\n }\n\n // Handle null/undefined data\n if (data === null || data === undefined) {\n return Ok(Option.none<ReturnType>())\n }\n\n // Handle array data - return first element\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return Ok(Option.none<ReturnType>())\n }\n return Ok(Option(data[0] as ReturnType))\n }\n\n return Ok(Option(data as ReturnType))\n } catch (error) {\n return Err<Option<ReturnType>>(toError(error))\n }\n })\n\n const oneOrThrow = async (): Promise<ReturnType> => {\n const result = await one()\n const option = result.orThrow()\n return option.fold(\n () => {\n throw new Error(\"RPC call returned no result\")\n },\n (value) => value,\n )\n }\n\n const many = (): FPromise<TaskOutcome<List<ReturnType>>> =>\n wrapAsync(async () => {\n try {\n const { data, error } = await executeRpc()\n\n if (error) {\n return Err<List<ReturnType>>(toError(error))\n }\n\n // Handle null/undefined data\n if (data === null || data === undefined) {\n return Ok(List<ReturnType>([]))\n }\n\n // Handle array data\n if (Array.isArray(data)) {\n return Ok(List(data as ReturnType[]))\n }\n\n // Single value - wrap in list\n return Ok(List([data as ReturnType]))\n } catch (error) {\n return Err<List<ReturnType>>(toError(error))\n }\n })\n\n const manyOrThrow = async (): Promise<List<ReturnType>> => {\n const result = await many()\n return result.orThrow()\n }\n\n return {\n one,\n oneOrThrow,\n many,\n manyOrThrow,\n }\n}\n","import type {\n Database,\n DatabaseSchema,\n EmptyObject,\n SupabaseClientType,\n TableInsert,\n TableNames,\n TableRow,\n TableUpdate,\n} from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok } from \"functype\"\n\nimport type { EntityWhereConditions, Query, WhereConditions } from \"./Query\"\nimport { createQuery } from \"./QueryBuilder\"\n\n// Re-export query types\nexport type {\n ComparisonOperators,\n EntityQuery,\n EntityWhereConditions,\n ExecutableQuery,\n IsConditions,\n MappedQuery,\n MultiExecution,\n Query,\n QueryBuilderConfig,\n QueryCondition,\n QueryIsParams,\n QueryOrderParams,\n QueryWhereinParams,\n QueryWhereParams,\n SingleExecution,\n SoftDeleteMode,\n WhereConditions,\n} from \"./Query\"\n\n// Re-export type guards\nexport { isMappedQuery, isQuery } from \"./Query\"\n\n// Re-export RPC types and function\nexport type { RpcExecution, RpcMultiExecution, RpcOptions, RpcSingleExecution } from \"./rpc\"\nexport { rpc } from \"./rpc\"\n\n// Local type for IS conditions\ntype IsConditionsLocal<T extends object = EmptyObject> = Partial<Record<keyof T, null | boolean>>\n\n// Helper to wrap async operations with error handling\nconst wrapAsync = <T>(fn: () => Promise<TaskOutcome<T>>): FPromise<TaskOutcome<T>> => {\n return fn() as unknown as FPromise<TaskOutcome<T>>\n}\n\n/**\n * Retrieves a single entity from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to query\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the entity if found\n */\nexport const getEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).select(\"*\").match(where)\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(baseQuery)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : baseQuery\n\n const { data, error } = await queryWithIs.single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Retrieves multiple entities from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to query\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param order - Optional ordering parameters\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the entities if found\n */\nexport const getEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>> = {},\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n order: [keyof TableRow<T, DB> & string, { ascending?: boolean; nullsFirst?: boolean }] = [\n \"id\" as keyof TableRow<T, DB> & string,\n { ascending: true },\n ],\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).select(\"*\").match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const queryOrderBy = queryWithIs.order(order[0], order[1])\n\n const { data, error } = await queryOrderBy\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Adds multiple entities to the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to insert into\n * @param entities - The entities to add\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the added entities\n */\nexport const addEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n entities: TableInsert<T, DB>[],\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data, error } = await (tableQuery as any).insert(entities as never).select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as unknown as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Updates a single entity in the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to update\n * @param entities - The entity data to update\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the updated entity\n */\nexport const updateEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n entities: TableUpdate<T, DB>,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).update(entities as never).match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select().single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Upserts multiple entities in the specified table (insert or update on conflict).\n * Uses Supabase's upsert() under the hood with onConflict resolution.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to upsert into\n * @param entities - The entities to upsert\n * @param identity - The column(s) to use for conflict resolution (default: \"id\")\n * @param where - Additional conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the upserted entities\n */\nexport const upsertEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n entities: TableUpdate<T, DB>[],\n identity: (keyof TableRow<T, DB> & string) | (keyof TableRow<T, DB> & string)[] = \"id\" as keyof TableRow<T, DB> &\n string,\n where?: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n const onConflict = Array.isArray(identity) ? identity.join(\",\") : identity\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).upsert(entities as never, { onConflict }).match(where ?? {})\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Deletes a single entity from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the deleted entity\n */\nexport const deleteEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).delete().match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select().single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Deletes multiple entities from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the deleted entities\n */\nexport const deleteEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).delete().match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Soft deletes a single entity by setting the deleted timestamp.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to soft delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the soft deleted entity\n */\nexport const softDeleteEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).update({ deleted: new Date().toISOString() } as never).match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select().single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Soft deletes multiple entities by setting the deleted timestamp.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to soft delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the soft deleted entities\n */\nexport const softDeleteEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).update({ deleted: new Date().toISOString() } as never).match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Creates a new Query for the specified table with initial conditions.\n * This is the new Query-based API that supports OR chaining and functional operations.\n *\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to query\n * @param where - Initial WHERE conditions to filter by\n * @param is - Initial IS conditions to filter by\n * @param wherein - Initial WHERE IN conditions to filter by\n * @param order - Optional ordering parameters\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A Query<T, DB> instance that supports chaining and lazy evaluation\n *\n * @example\n * // Simple query\n * const user = await query(client, \"users\", { id: \"123\" }).one()\n *\n * @example\n * // Query with OR logic\n * const users = await query(client, \"users\", { role: \"admin\" })\n * .or({ role: \"moderator\" })\n * .many()\n *\n * @example\n * // Query with functional operations\n * const names = await query(client, \"users\", { active: true })\n * .map(user => user.name)\n * .filter(name => name.startsWith('A'))\n * .many()\n *\n * @example\n * // Query with custom schema\n * const items = await query(client, \"items\", { active: true }, undefined, undefined, undefined, \"inventory\").many()\n */\nexport const query = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: WhereConditions<TableRow<T, DB>> = {},\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n order?: [keyof TableRow<T, DB> & string, { ascending?: boolean; nullsFirst?: boolean }],\n schema?: string,\n): Query<T, DB> => {\n return createQuery<T, DB>(client, table, where, is, wherein, order, undefined, schema)\n}\n","/**\n * Shared type definitions for Entity and PartitionedEntity\n */\n\nimport type { EntityWhereConditions, MultiExecution, Query, SingleExecution } from \"@/query/Query\"\nimport type { Database, DatabaseSchema, EmptyObject, TableInsert, TableNames, TableRow, TableUpdate } from \"@/types\"\n\nimport type { Brand, FPromise, List, TaskOutcome } from \"functype\"\nimport { Option } from \"functype\"\n\n// =============================================================================\n// Partition Key Types\n// =============================================================================\n\n/**\n * Partition key can be a string or any branded string type\n * This enables type-safe partition keys using functype's Brand/ValidatedBrand\n */\nexport type PartitionKey = string | Brand<string, string>\n\n// =============================================================================\n// Field-Level Type Safety\n// =============================================================================\n\n/**\n * Field-level type safety for queries\n */\nexport type TypedRecord<T, V> = Partial<Record<keyof T, V>>\n\n// =============================================================================\n// Entity Configuration\n// =============================================================================\n\n/**\n * Configuration for standard Entity (no partition)\n */\nexport type EntityConfig = {\n /** Soft delete filtering. true = exclude deleted items, false = include deleted items */\n softDelete: boolean\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n}\n\n/**\n * Configuration for PartitionedEntity\n */\nexport type PartitionedEntityConfig = {\n /** The database column name used for partitioning (e.g., \"tenant_id\") */\n partitionField: string\n /** Soft delete filtering. true = exclude deleted items, false = include deleted items */\n softDelete: boolean\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n}\n\n// =============================================================================\n// Base Parameter Types\n// =============================================================================\n\nexport type WhereParams<T extends object = EmptyObject> = {\n where?: EntityWhereConditions<T>\n}\n\nexport type IsParams<T extends object = EmptyObject> = {\n is?: TypedRecord<T, null | boolean>\n}\n\nexport type WhereinParams<T extends object = EmptyObject> = {\n wherein?: TypedRecord<T, unknown[]>\n}\n\nexport type OrderParams<T extends object = EmptyObject> = {\n order?: [keyof T & string, { ascending?: boolean; nullsFirst?: boolean }]\n}\n\nexport type IdParam = {\n id: string\n}\n\n// =============================================================================\n// Composable Parameter Types\n// =============================================================================\n\nexport type GetItemParams<T extends object = EmptyObject> = IdParam & WhereParams<T> & IsParams<T>\n\nexport type GetItemsParams<T extends object = EmptyObject> = WhereParams<T> &\n IsParams<T> &\n WhereinParams<T> &\n OrderParams<T>\n\nexport type AddItemsParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = {\n items: TableInsert<T, DB>[]\n}\n\n/**\n * Prisma-style update params for single item: { where, data }\n */\nexport type UpdateItemParams<\n T extends TableNames<DB>,\n Row extends object = EmptyObject,\n DB extends DatabaseSchema = Database,\n> = {\n /** Conditions to match the item to update */\n where: EntityWhereConditions<Row>\n /** The data to update */\n data: TableUpdate<T, DB>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Prisma-style update params for multiple items: { where, data }\n */\nexport type UpdateItemsParams<\n T extends TableNames<DB>,\n Row extends object = EmptyObject,\n DB extends DatabaseSchema = Database,\n> = {\n /** Conditions to match items to update */\n where: EntityWhereConditions<Row>\n /** The data to update on all matched items */\n data: TableUpdate<T, DB>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Batch upsert params: update multiple rows with different data per row\n */\nexport type UpsertItemsParams<\n T extends TableNames<DB>,\n Row extends object = EmptyObject,\n DB extends DatabaseSchema = Database,\n> = {\n /** Array of items to upsert, each with its own data */\n items: TableUpdate<T, DB>[]\n /** Column(s) to use as identity for matching (default: \"id\") */\n identity?: (keyof Row & string) | (keyof Row & string)[]\n}\n\n/**\n * Delete params for single item: { where }\n */\nexport type DeleteItemParams<Row extends object = EmptyObject> = {\n /** Conditions to match the item to delete */\n where: EntityWhereConditions<Row>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Delete params for multiple items: { where }\n */\nexport type DeleteItemsParams<Row extends object = EmptyObject> = {\n /** Conditions to match items to delete */\n where: EntityWhereConditions<Row>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n// =============================================================================\n// Mutation Query Wrappers\n// =============================================================================\n\n/**\n * Wrapper type for multi-result mutation operations that implements standard execution interface\n */\nexport type MutationMultiExecution<T> = FPromise<TaskOutcome<List<T>>> & MultiExecution<T>\n\n/**\n * Wrapper type for single-result mutation operations that implements standard execution interface\n */\nexport type MutationSingleExecution<T> = FPromise<TaskOutcome<T>> & SingleExecution<T>\n\n/**\n * Creates a multi-result mutation query that implements the standard execution interface\n */\nexport function MultiMutationQuery<T>(promise: FPromise<TaskOutcome<List<T>>>): MutationMultiExecution<T> {\n const result = Object.assign(promise, {\n many: () => promise,\n manyOrThrow: async (): Promise<List<T>> => {\n const taskResult = await promise\n return taskResult.orThrow()\n },\n execute: () => promise,\n executeOrThrow: async (): Promise<List<T>> => {\n const taskResult = await promise\n return taskResult.orThrow()\n },\n })\n return result as MutationMultiExecution<T>\n}\n\n/**\n * Creates a single-result mutation query that implements the standard execution interface\n */\nexport function SingleMutationQuery<T>(promise: FPromise<TaskOutcome<T>>): MutationSingleExecution<T> {\n const result = Object.assign(promise, {\n one: () => promise.then((outcome: TaskOutcome<T>) => outcome.map((value: T) => Option(value))),\n oneOrThrow: async (): Promise<T> => {\n const taskResult = await promise\n return taskResult.orThrow()\n },\n execute: () => promise.then((outcome: TaskOutcome<T>) => outcome.map((value: T) => Option(value))),\n executeOrThrow: async (): Promise<Option<T>> => {\n const taskResult = await promise\n const value = taskResult.orThrow()\n return Option(value)\n },\n })\n return result as MutationSingleExecution<T>\n}\n\n// =============================================================================\n// Entity Interfaces\n// =============================================================================\n\n/**\n * Base interface for Entity instances (global, no partition)\n */\nexport type IEntity<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = {\n getItem(params: GetItemParams<TableRow<T, DB>>): Query<T, DB>\n getItems(params?: GetItemsParams<TableRow<T, DB>>): Query<T, DB>\n addItems(params: AddItemsParams<T, DB>): MutationMultiExecution<TableRow<T, DB>>\n updateItem(params: UpdateItemParams<T, TableRow<T, DB>, DB>): MutationSingleExecution<TableRow<T, DB>>\n updateItems(params: UpdateItemsParams<T, TableRow<T, DB>, DB>): MutationMultiExecution<TableRow<T, DB>>\n upsertItems(params: UpsertItemsParams<T, TableRow<T, DB>, DB>): MutationMultiExecution<TableRow<T, DB>>\n deleteItem(params: DeleteItemParams<TableRow<T, DB>>): MutationSingleExecution<TableRow<T, DB>>\n deleteItems(params: DeleteItemsParams<TableRow<T, DB>>): MutationMultiExecution<TableRow<T, DB>>\n}\n\n/**\n * Interface for PartitionedEntity instances (requires partition key on calls)\n */\nexport type IPartitionedEntity<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n> = {\n getItem(partitionKey: K, params: GetItemParams<TableRow<T, DB>>): Query<T, DB>\n getItems(partitionKey: K, params?: GetItemsParams<TableRow<T, DB>>): Query<T, DB>\n addItems(params: AddItemsParams<T, DB>): MutationMultiExecution<TableRow<T, DB>>\n updateItem(\n partitionKey: K,\n params: UpdateItemParams<T, TableRow<T, DB>, DB>,\n ): MutationSingleExecution<TableRow<T, DB>>\n updateItems(\n partitionKey: K,\n params: UpdateItemsParams<T, TableRow<T, DB>, DB>,\n ): MutationMultiExecution<TableRow<T, DB>>\n upsertItems(\n partitionKey: K,\n params: UpsertItemsParams<T, TableRow<T, DB>, DB>,\n ): MutationMultiExecution<TableRow<T, DB>>\n deleteItem(partitionKey: K, params: DeleteItemParams<TableRow<T, DB>>): MutationSingleExecution<TableRow<T, DB>>\n deleteItems(partitionKey: K, params: DeleteItemsParams<TableRow<T, DB>>): MutationMultiExecution<TableRow<T, DB>>\n}\n\n/**\n * Type for an entity instance for a specific table\n * @deprecated Use IEntity<T, DB> instead\n */\nexport type EntityType<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = IEntity<T, DB>\n","/**\n * Shared internal functions for Entity and PartitionedEntity (DRY)\n */\n\nimport {\n addEntities,\n deleteEntities,\n deleteEntity,\n softDeleteEntities,\n softDeleteEntity,\n updateEntity,\n upsertEntities,\n} from \"@/query\"\nimport type { EntityWhereConditions, WhereConditions } from \"@/query/Query\"\nimport { createQuery } from \"@/query/QueryBuilder\"\nimport type { Database, DatabaseSchema, SupabaseClientType, TableNames, TableRow, TableUpdate } from \"@/types\"\n\nimport type { FPromise, List, TaskOutcome } from \"functype\"\n\nimport type {\n DeleteItemParams,\n DeleteItemsParams,\n GetItemParams,\n GetItemsParams,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n PartitionKey,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\n UpsertItemsParams,\n WhereinParams,\n} from \"./types\"\nimport { MultiMutationQuery, SingleMutationQuery } from \"./types\"\n\n// =============================================================================\n// Soft Delete Mode Types\n// =============================================================================\n\nexport type SoftDeleteMode = \"exclude\" | \"include\"\n\nexport function getSoftDeleteMode(softDelete: boolean): SoftDeleteMode {\n return softDelete ? \"exclude\" : \"include\"\n}\n\n// =============================================================================\n// Where Condition Builders\n// =============================================================================\n\n/**\n * Builds where conditions with partition key merged in\n */\nexport function buildWhereWithPartition<T extends object>(\n partitionField: string,\n partitionKey: PartitionKey,\n where?: EntityWhereConditions<T>,\n): WhereConditions<T> {\n const partitionCondition = { [partitionField]: partitionKey as string }\n return { ...partitionCondition, ...where } as WhereConditions<T>\n}\n\n/**\n * Builds where conditions with partition key and id\n */\nexport function buildWhereWithPartitionAndId<T extends object>(\n partitionField: string,\n partitionKey: PartitionKey,\n id: string,\n where?: EntityWhereConditions<T>,\n): WhereConditions<T> {\n const partitionCondition = { [partitionField]: partitionKey as string }\n return { ...partitionCondition, ...where, id } as WhereConditions<T>\n}\n\n// =============================================================================\n// Query Creation Functions\n// =============================================================================\n\n/**\n * Creates a getItem query (single item by id)\n */\nexport function createGetItemQuery<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB>>,\n is: TypedRecord<TableRow<T, DB>, null | boolean> | undefined,\n softDeleteMode: SoftDeleteMode,\n schema?: string,\n) {\n return createQuery<T, DB>(\n client,\n name,\n whereConditions,\n is,\n undefined,\n undefined,\n {\n mode: softDeleteMode,\n appliedByDefault: true,\n },\n schema,\n )\n}\n\n/**\n * Creates a getItems query (multiple items)\n */\nexport function createGetItemsQuery<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB>>,\n is: TypedRecord<TableRow<T, DB>, null | boolean> | undefined,\n wherein: TypedRecord<TableRow<T, DB>, unknown[]> | undefined,\n order: GetItemsParams<TableRow<T, DB>>[\"order\"],\n softDeleteMode: SoftDeleteMode,\n schema?: string,\n) {\n return createQuery<T, DB>(\n client,\n name,\n whereConditions,\n is,\n wherein,\n order,\n {\n mode: softDeleteMode,\n appliedByDefault: true,\n },\n schema,\n )\n}\n\n// =============================================================================\n// Mutation Functions\n// =============================================================================\n\n/**\n * Creates an addItems mutation\n */\nexport function createAddItemsMutation<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n items: TableRow<T, DB>[],\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB>> {\n return MultiMutationQuery(\n addEntities<T, DB>(client, name, items, schema) as FPromise<TaskOutcome<List<TableRow<T, DB>>>>,\n )\n}\n\n/**\n * Creates an updateItem mutation\n */\nexport function createUpdateItemMutation<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n item: TableUpdate<T, DB>,\n whereConditions: WhereConditions<TableRow<T, DB>>,\n is: IsParams<TableRow<T, DB>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema?: string,\n): MutationSingleExecution<TableRow<T, DB>> {\n return SingleMutationQuery(\n updateEntity<T, DB>(client, name, item, whereConditions, is, wherein, schema) as FPromise<\n TaskOutcome<TableRow<T, DB>>\n >,\n )\n}\n\n/**\n * Creates an updateItems mutation (Prisma-style: update all matching rows with same data)\n */\nexport function createUpdateItemsMutation<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n data: TableUpdate<T, DB>,\n where: WhereConditions<TableRow<T, DB>>,\n is: IsParams<TableRow<T, DB>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB>> {\n // Use upsertEntities with single-item array - updates all matching rows with same data\n return MultiMutationQuery(\n upsertEntities<T, DB>(client, name, [data], undefined, where, is, wherein, schema) as FPromise<\n TaskOutcome<List<TableRow<T, DB>>>\n >,\n )\n}\n\n/**\n * Creates an upsertItems mutation (batch upsert: each item gets its own data)\n */\nexport function createUpsertItemsMutation<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n items: TableUpdate<T, DB>[],\n identity: (keyof TableRow<T, DB> & string) | (keyof TableRow<T, DB> & string)[],\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB>> {\n return MultiMutationQuery(\n upsertEntities<T, DB>(client, name, items, identity, undefined, undefined, undefined, schema) as FPromise<\n TaskOutcome<List<TableRow<T, DB>>>\n >,\n )\n}\n\n// =============================================================================\n// Entity Method Factories (for maximum DRY)\n// =============================================================================\n\n/**\n * Creates getItem method for Entity (no partition)\n */\nexport function makeGetItem<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n softDeleteMode: SoftDeleteMode,\n schema?: string,\n) {\n return function getItem({ id, where, is }: GetItemParams<TableRow<T, DB>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T, DB>>\n return createGetItemQuery<T, DB>(client, name, whereConditions, is, softDeleteMode, schema)\n }\n}\n\n/**\n * Creates getItems method for Entity (no partition)\n */\nexport function makeGetItems<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n softDeleteMode: SoftDeleteMode,\n schema?: string,\n) {\n return function getItems({ where, is, wherein, order }: GetItemsParams<TableRow<T, DB>> = {}) {\n return createGetItemsQuery<T, DB>(\n client,\n name,\n where as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n order,\n softDeleteMode,\n schema,\n )\n }\n}\n\n/**\n * Creates getItem method for PartitionedEntity\n */\nexport function makePartitionedGetItem<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDeleteMode: SoftDeleteMode, schema?: string) {\n return function getItem(partitionKey: K, { id, where, is }: GetItemParams<TableRow<T, DB>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createGetItemQuery<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is,\n softDeleteMode,\n schema,\n )\n }\n}\n\n/**\n * Creates getItems method for PartitionedEntity\n */\nexport function makePartitionedGetItems<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDeleteMode: SoftDeleteMode, schema?: string) {\n return function getItems(partitionKey: K, { where, is, wherein, order }: GetItemsParams<TableRow<T, DB>> = {}) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createGetItemsQuery<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n order,\n softDeleteMode,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItem method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItem<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n schema?: string,\n) {\n return function updateItem({ where, data, is, wherein }: UpdateItemParams<T, TableRow<T, DB>, DB>) {\n return createUpdateItemMutation<T, DB>(\n client,\n name,\n data,\n where as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItem method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItem<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, schema?: string) {\n return function updateItem(partitionKey: K, { where, data, is, wherein }: UpdateItemParams<T, TableRow<T, DB>, DB>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemMutation<T, DB>(\n client,\n name,\n data,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItems method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItems<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n schema?: string,\n) {\n return function updateItems({ where, data, is, wherein }: UpdateItemsParams<T, TableRow<T, DB>, DB>) {\n return createUpdateItemsMutation<T, DB>(\n client,\n name,\n data,\n where as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItems method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItems<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, schema?: string) {\n return function updateItems(\n partitionKey: K,\n { where, data, is, wherein }: UpdateItemsParams<T, TableRow<T, DB>, DB>,\n ) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemsMutation<T, DB>(\n client,\n name,\n data,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates addItems method (same for both Entity and PartitionedEntity)\n */\nexport function makeAddItems<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n schema?: string,\n) {\n return function addItems({ items }: { items: TableRow<T, DB>[] }) {\n return createAddItemsMutation<T, DB>(client, name, items, schema)\n }\n}\n\n/**\n * Creates upsertItems method for Entity (no partition) - batch upsert with identity\n */\nexport function makeUpsertItems<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n schema?: string,\n) {\n return function upsertItems({\n items,\n identity = \"id\" as keyof TableRow<T, DB> & string,\n }: UpsertItemsParams<T, TableRow<T, DB>, DB>) {\n return createUpsertItemsMutation<T, DB>(client, name, items, identity, schema)\n }\n}\n\n/**\n * Creates upsertItems method for PartitionedEntity - batch upsert with identity\n */\nexport function makePartitionedUpsertItems<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, _partitionField: string, schema?: string) {\n return function upsertItems(\n _partitionKey: K,\n { items, identity = \"id\" as keyof TableRow<T, DB> & string }: UpsertItemsParams<T, TableRow<T, DB>, DB>,\n ) {\n // Note: partitionKey is passed but items should already contain the partition field value\n // This maintains API consistency with other partitioned methods\n return createUpsertItemsMutation<T, DB>(client, name, items, identity, schema)\n }\n}\n\n// =============================================================================\n// Delete Mutation Functions\n// =============================================================================\n\n/**\n * Creates a deleteItem mutation - supports both soft and hard delete\n */\nexport function createDeleteItemMutation<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB>>,\n is: IsParams<TableRow<T, DB>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB>>[\"wherein\"],\n softDelete: boolean,\n schema?: string,\n): MutationSingleExecution<TableRow<T, DB>> {\n const operation = softDelete\n ? softDeleteEntity<T, DB>(client, name, whereConditions, is, wherein, schema)\n : deleteEntity<T, DB>(client, name, whereConditions, is, wherein, schema)\n return SingleMutationQuery(operation as FPromise<TaskOutcome<TableRow<T, DB>>>)\n}\n\n/**\n * Creates a deleteItems mutation - supports both soft and hard delete\n */\nexport function createDeleteItemsMutation<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB>>,\n is: IsParams<TableRow<T, DB>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB>>[\"wherein\"],\n softDelete: boolean,\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB>> {\n const operation = softDelete\n ? softDeleteEntities<T, DB>(client, name, whereConditions, is, wherein, schema)\n : deleteEntities<T, DB>(client, name, whereConditions, is, wherein, schema)\n return MultiMutationQuery(operation as FPromise<TaskOutcome<List<TableRow<T, DB>>>>)\n}\n\n// =============================================================================\n// Delete Method Factories\n// =============================================================================\n\n/**\n * Creates deleteItem method for Entity (no partition)\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makeDeleteItem<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n softDelete: boolean,\n schema?: string,\n) {\n return function deleteItem({ where, is, wherein }: DeleteItemParams<TableRow<T, DB>>) {\n return createDeleteItemMutation<T, DB>(\n client,\n name,\n where as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n\n/**\n * Creates deleteItems method for Entity (no partition)\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makeDeleteItems<T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n softDelete: boolean,\n schema?: string,\n) {\n return function deleteItems({ where, is, wherein }: DeleteItemsParams<TableRow<T, DB>>) {\n return createDeleteItemsMutation<T, DB>(\n client,\n name,\n where as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n\n/**\n * Creates deleteItem method for PartitionedEntity\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makePartitionedDeleteItem<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDelete: boolean, schema?: string) {\n return function deleteItem(partitionKey: K, { where, is, wherein }: DeleteItemParams<TableRow<T, DB>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createDeleteItemMutation<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n\n/**\n * Creates deleteItems method for PartitionedEntity\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makePartitionedDeleteItems<\n T extends TableNames<DB>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDelete: boolean, schema?: string) {\n return function deleteItems(partitionKey: K, { where, is, wherein }: DeleteItemsParams<TableRow<T, DB>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createDeleteItemsMutation<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n","/**\n * Entity - Standard entity without partition\n *\n * Use this for global/shared data that doesn't require partition-based isolation.\n * For multi-tenant data, use PartitionedEntity instead.\n *\n * @example\n * ```typescript\n * // Create a global entity\n * const TenantEntity = Entity<\"tenants\">(client, \"tenants\", {\n * softDelete: true\n * })\n *\n * // Query without partition key\n * const tenants = await TenantEntity.getItems({ where: { status: \"active\" } }).many()\n * const tenant = await TenantEntity.getItem({ id: \"123\" }).one()\n * ```\n */\n\nimport type { Database, DatabaseSchema, SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makeDeleteItem,\n makeDeleteItems,\n makeGetItem,\n makeGetItems,\n makeUpdateItem,\n makeUpdateItems,\n makeUpsertItems,\n} from \"./core\"\nimport type { EntityConfig, IEntity } from \"./types\"\n\n// Re-export types for backwards compatibility\nexport type {\n AddItemsParams,\n DeleteItemParams,\n DeleteItemsParams,\n EntityConfig,\n EntityType,\n GetItemParams,\n GetItemsParams,\n IdParam,\n IEntity,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n OrderParams,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\n UpsertItemsParams,\n WhereinParams,\n WhereParams,\n} from \"./types\"\nexport { MultiMutationQuery, SingleMutationQuery } from \"./types\"\n\n/**\n * Creates an entity interface with methods for interacting with the given table.\n *\n * @param client The Supabase client instance to use for queries.\n * @param name The name of the table to interact with.\n * @param config Configuration for entity behavior.\n * @returns An object with methods for interacting with the table.\n *\n * @typeParam T - The table name type\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport const Entity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n name: T,\n config: EntityConfig,\n): IEntity<T, DB> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { schema } = config\n\n return {\n /**\n * Retrieve a single item from the table by ID.\n * @param params Query parameters including id, where conditions, and is conditions\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItem: makeGetItem<T, DB>(client, name, softDeleteMode, schema),\n\n /**\n * Get a list of items from the table filtered by conditions.\n * @param params Optional query parameters including where, is, wherein, and order\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItems: makeGetItems<T, DB>(client, name, softDeleteMode, schema),\n\n /**\n * Adds multiple items to the table.\n * @param params Parameters including items array\n * @returns A mutation query with OrThrow methods\n */\n addItems: makeAddItems<T, DB>(client, name, schema),\n\n /**\n * Update a single item in the table.\n * @param params Update parameters including id, item data, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItem: makeUpdateItem<T, DB>(client, name, schema),\n\n /**\n * Update multiple items in the table.\n * @param params Update parameters including items array, identity, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItems: makeUpdateItems<T, DB>(client, name, schema),\n\n /**\n * Upsert multiple items with different data per row.\n * @param params Upsert parameters including items array and identity columns\n * @returns A mutation query with OrThrow methods\n */\n upsertItems: makeUpsertItems<T, DB>(client, name, schema),\n\n /**\n * Delete a single item from the table.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted row\n */\n deleteItem: makeDeleteItem<T, DB>(client, name, config.softDelete, schema),\n\n /**\n * Delete multiple items from the table.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted rows\n */\n deleteItems: makeDeleteItems<T, DB>(client, name, config.softDelete, schema),\n }\n}\n","/**\n * PartitionedEntity - Entity with partition key required on every call\n *\n * Use this for multi-tenant or partitioned data where every query must be scoped\n * to a specific partition (e.g., tenant_id, organization_id, etc.)\n *\n * Supports branded types via functype's Brand/ValidatedBrand for type-safe partition keys.\n *\n * @example\n * ```typescript\n * import { ValidatedBrand } from \"functype\"\n *\n * // Define a branded partition key type\n * const TenantId = ValidatedBrand(\"TenantId\", isValidUuid)\n * type TenantId = ReturnType<typeof TenantId.of> extends Option<infer T> ? T : never\n *\n * // Create a partitioned entity\n * const UserEntity = PartitionedEntity<\"users\", TenantId>(client, \"users\", {\n * partitionField: \"tenant_id\",\n * softDelete: true\n * })\n *\n * // All queries require the partition key\n * const users = await UserEntity.getItems(tenantId, { where: { status: \"active\" } }).many()\n * const user = await UserEntity.getItem(tenantId, { id: \"123\" }).one()\n * ```\n */\n\nimport type { Database, DatabaseSchema, SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makePartitionedDeleteItem,\n makePartitionedDeleteItems,\n makePartitionedGetItem,\n makePartitionedGetItems,\n makePartitionedUpdateItem,\n makePartitionedUpdateItems,\n makePartitionedUpsertItems,\n} from \"./core\"\nimport type { IPartitionedEntity, PartitionedEntityConfig, PartitionKey } from \"./types\"\n\n/**\n * Creates a partitioned entity interface where all queries require a partition key.\n *\n * @param client The Supabase client instance to use for queries.\n * @param name The name of the table to interact with.\n * @param config Configuration including partition field and soft delete behavior.\n * @returns An object with methods for interacting with the partitioned table.\n *\n * @typeParam T - The table name type\n * @typeParam K - The partition key type (string or branded type)\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport const PartitionedEntity = <\n T extends TableNames<DB>,\n K extends PartitionKey = string,\n DB extends DatabaseSchema = Database,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n config: PartitionedEntityConfig,\n): IPartitionedEntity<T, K, DB> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { partitionField, schema } = config\n\n return {\n /**\n * Retrieve a single item from the table by ID within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Query parameters including id, where conditions, and is conditions\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItem: makePartitionedGetItem<T, K, DB>(client, name, partitionField, softDeleteMode, schema),\n\n /**\n * Get a list of items from the table within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Optional query parameters including where, is, wherein, and order\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItems: makePartitionedGetItems<T, K, DB>(client, name, partitionField, softDeleteMode, schema),\n\n /**\n * Adds multiple items to the table.\n * Note: Items should include the partition key value in their data.\n * @param params Parameters including items array\n * @returns A mutation query with OrThrow methods\n */\n addItems: makeAddItems<T, DB>(client, name, schema),\n\n /**\n * Update a single item in the table within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Update parameters including id, item data, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItem: makePartitionedUpdateItem<T, K, DB>(client, name, partitionField, schema),\n\n /**\n * Update multiple items in the table within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Update parameters including items array, identity, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItems: makePartitionedUpdateItems<T, K, DB>(client, name, partitionField, schema),\n\n /**\n * Upsert multiple items with different data per row within a partition.\n * Note: Items should include the partition key value in their data.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Upsert parameters including items array and identity columns\n * @returns A mutation query with OrThrow methods\n */\n upsertItems: makePartitionedUpsertItems<T, K, DB>(client, name, partitionField, schema),\n\n /**\n * Delete a single item from the table within a partition.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted row\n */\n deleteItem: makePartitionedDeleteItem<T, K, DB>(client, name, partitionField, config.softDelete, schema),\n\n /**\n * Delete multiple items from the table within a partition.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted rows\n */\n deleteItems: makePartitionedDeleteItems<T, K, DB>(client, name, partitionField, config.softDelete, schema),\n }\n}\n"],"names":["wrapAsync","query"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/utils/errors.ts","../src/query/QueryBuilder.ts","../src/query/Query.ts","../src/query/rpc.ts","../src/query/index.ts","../src/entity/types.ts","../src/entity/core.ts","../src/entity/Entity.ts","../src/entity/PartitionedEntity.ts"],"sourcesContent":["/**\n * Supabase/Postgrest error structure\n */\nexport type SupabaseErrorObject = {\n message: string\n code?: string\n details?: string\n hint?: string\n}\n\n/**\n * Custom Error class that preserves Supabase error details\n */\nexport class SupabaseError extends Error {\n readonly code?: string\n readonly details?: string\n readonly hint?: string\n\n constructor(error: SupabaseErrorObject | unknown) {\n // Check for Error instances FIRST before checking for Supabase error objects\n // because Error instances also have a message property\n if (error instanceof Error) {\n super(error.message)\n this.name = error.name\n this.stack = error.stack\n } else if (isSupabaseError(error)) {\n super(error.message)\n this.name = \"SupabaseError\"\n this.code = error.code\n this.details = error.details\n this.hint = error.hint\n } else {\n super(String(error))\n this.name = \"SupabaseError\"\n }\n }\n\n /**\n * Override toString to include all error details\n */\n override toString(): string {\n const parts = [this.message]\n if (this.code) parts.push(`[Code: ${this.code}]`)\n if (this.details) parts.push(`Details: ${this.details}`)\n if (this.hint) parts.push(`Hint: ${this.hint}`)\n return parts.join(\" | \")\n }\n}\n\n/**\n * Type guard for Supabase error objects\n */\nfunction isSupabaseError(error: unknown): error is SupabaseErrorObject {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as SupabaseErrorObject).message === \"string\"\n )\n}\n\n/**\n * Convert any error to a proper Error instance\n */\nexport const toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error\n }\n return new SupabaseError(error)\n}\n","import type { Database, DatabaseSchema, SupabaseClientType, TableNames, TableRow } from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { Brand, FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok, Option } from \"functype\"\n\nimport type { IsConditions, MappedQuery, Query, QueryBuilderConfig, QueryCondition, WhereConditions } from \"./Query\"\n\n// Simple console logging for open source version\n// Suppress logs during tests to avoid stderr noise in test output\nconst log = {\n error: (msg: string) => process.env.NODE_ENV !== \"test\" && console.error(`[supabase-typed-query] ${msg}`),\n warn: (msg: string) => process.env.NODE_ENV !== \"test\" && console.warn(`[supabase-typed-query] ${msg}`),\n info: (msg: string) => process.env.NODE_ENV !== \"test\" && console.info(`[supabase-typed-query] ${msg}`),\n}\n\n// Tables that don't have a deleted field (like version tracking tables)\n// Tables that don't have a deleted field - consumers can override this\nconst TABLES_WITHOUT_DELETED = new Set<string>([])\n\n/**\n * Functional QueryBuilder implementation using closures instead of classes\n */\n// Helper to wrap async operations with error handling\nconst wrapAsync = <T>(fn: () => Promise<TaskOutcome<T>>): FPromise<TaskOutcome<T>> => {\n // FPromise in newer functype versions is just a promise with additional methods\n // We can use the FPromise constructor if available, or cast it\n return fn() as unknown as FPromise<TaskOutcome<T>>\n}\n\nexport const QueryBuilder = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n config: QueryBuilderConfig<T, DB>,\n): Query<T, DB> => {\n /**\n * Build the Supabase query from accumulated conditions\n */\n const buildSupabaseQuery = () => {\n const { table, conditions, order, limit, offset, schema } = config\n\n // Start with base query - use schema if provided, otherwise default to public\n const baseQuery = schema ? client.schema(schema).from(table) : client.from(table)\n\n // Handle multiple conditions with OR logic\n const queryWithConditions =\n conditions.length === 1 ? applyCondition(baseQuery, conditions[0]) : applyOrConditions(baseQuery, conditions)\n\n // Apply ordering if specified\n const queryWithOrder = order ? queryWithConditions.order(order[0], order[1]) : queryWithConditions\n\n // Apply pagination\n const finalQuery = (() => {\n if (limit && offset !== undefined) {\n // Use range for offset + limit\n return queryWithOrder.range(offset, offset + limit - 1)\n } else if (limit) {\n // Just limit\n return queryWithOrder.limit(limit)\n } else if (offset !== undefined) {\n // Just offset (need to use a large upper bound)\n return queryWithOrder.range(offset, Number.MAX_SAFE_INTEGER)\n }\n return queryWithOrder\n })()\n\n return finalQuery\n }\n\n /**\n * Apply a single condition to the query\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const applyCondition = (query: any, condition: QueryCondition<T, DB>): any => {\n const { where, is, wherein, gt, gte, lt, lte, neq, like, ilike } = condition\n\n // Process WHERE conditions, extracting operators from the where object\n const processedWhere: Record<string, unknown> = {}\n const extractedOperators: {\n gt?: Record<string, unknown>\n gte?: Record<string, unknown>\n lt?: Record<string, unknown>\n lte?: Record<string, unknown>\n neq?: Record<string, unknown>\n like?: Record<string, string>\n ilike?: Record<string, string>\n } = {}\n\n if (where) {\n // Extract top-level operators from where object\n const {\n gt: whereGt,\n gte: whereGte,\n lt: whereLt,\n lte: whereLte,\n neq: whereNeq,\n like: whereLike,\n ilike: whereIlike,\n ...rest\n } = where as Record<string, unknown>\n\n // Store extracted operators\n if (whereGt) extractedOperators.gt = whereGt as Record<string, unknown>\n if (whereGte) extractedOperators.gte = whereGte as Record<string, unknown>\n if (whereLt) extractedOperators.lt = whereLt as Record<string, unknown>\n if (whereLte) extractedOperators.lte = whereLte as Record<string, unknown>\n if (whereNeq) extractedOperators.neq = whereNeq as Record<string, unknown>\n if (whereLike) extractedOperators.like = whereLike as Record<string, string>\n if (whereIlike) extractedOperators.ilike = whereIlike as Record<string, string>\n\n // Process remaining fields\n for (const [key, value] of Object.entries(rest)) {\n if (value && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Date)) {\n // Check if it's an operator object\n const ops = value as Record<string, unknown>\n if (ops.gte !== undefined) {\n extractedOperators.gte = {\n ...extractedOperators.gte,\n [key]: ops.gte,\n }\n }\n if (ops.gt !== undefined) {\n extractedOperators.gt = { ...extractedOperators.gt, [key]: ops.gt }\n }\n if (ops.lte !== undefined) {\n extractedOperators.lte = {\n ...extractedOperators.lte,\n [key]: ops.lte,\n }\n }\n if (ops.lt !== undefined) {\n extractedOperators.lt = { ...extractedOperators.lt, [key]: ops.lt }\n }\n if (ops.neq !== undefined) {\n extractedOperators.neq = {\n ...extractedOperators.neq,\n [key]: ops.neq,\n }\n }\n if (ops.like !== undefined) {\n extractedOperators.like = {\n ...extractedOperators.like,\n [key]: ops.like as string,\n }\n }\n if (ops.ilike !== undefined) {\n extractedOperators.ilike = {\n ...extractedOperators.ilike,\n [key]: ops.ilike as string,\n }\n }\n if (ops.in !== undefined) {\n // Handle IN operator\n if (!wherein) {\n const cond = condition as unknown as Record<string, unknown>\n cond.wherein = {}\n }\n const whereinObj = condition.wherein as Record<string, unknown>\n whereinObj[key] = ops.in\n }\n if (ops.is !== undefined) {\n // Handle IS operator\n if (!is) {\n const cond = condition as unknown as Record<string, unknown>\n cond.is = {}\n }\n const isObj = condition.is as Record<string, unknown>\n isObj[key] = ops.is\n }\n // If no operators found, treat as regular value\n if (!ops.gte && !ops.gt && !ops.lte && !ops.lt && !ops.neq && !ops.like && !ops.ilike && !ops.in && !ops.is) {\n processedWhere[key] = value\n }\n } else {\n // Regular value\n processedWhere[key] = value\n }\n }\n }\n\n // Merge extracted operators with explicitly passed operators\n const mergedGt = { ...gt, ...extractedOperators.gt }\n const mergedGte = { ...gte, ...extractedOperators.gte }\n const mergedLt = { ...lt, ...extractedOperators.lt }\n const mergedLte = { ...lte, ...extractedOperators.lte }\n const mergedNeq = { ...neq, ...extractedOperators.neq }\n const mergedLike = { ...like, ...extractedOperators.like }\n const mergedIlike = { ...ilike, ...extractedOperators.ilike }\n\n // Apply WHERE conditions\n const baseQuery = query.select(\"*\").match(processedWhere)\n\n // Apply soft delete filter based on softDeleteMode\n const queryWithSoftDelete = (() => {\n if (TABLES_WITHOUT_DELETED.has(config.table)) {\n return baseQuery\n }\n if (config.softDeleteMode === \"exclude\") {\n return baseQuery.is(\"deleted\", null)\n }\n if (config.softDeleteMode === \"only\") {\n return baseQuery.not(\"deleted\", \"is\", null)\n }\n // Default: \"include\" - no filter\n return baseQuery\n })()\n\n // Apply WHERE IN conditions\n const queryWithWhereIn = wherein\n ? List(Object.entries(wherein)).foldLeft(queryWithSoftDelete)((q, [column, values]) =>\n q.in(column, values as never),\n )\n : queryWithSoftDelete\n\n // Apply IS conditions\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithWhereIn)((q, [column, value]) =>\n q.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithWhereIn\n\n // Apply comparison operators using merged values\n const queryWithGt =\n Object.keys(mergedGt).length > 0\n ? Object.entries(mergedGt).reduce((q, [key, value]) => q.gt(key, value), queryWithIs)\n : queryWithIs\n\n const queryWithGte =\n Object.keys(mergedGte).length > 0\n ? Object.entries(mergedGte).reduce((q, [key, value]) => q.gte(key, value), queryWithGt)\n : queryWithGt\n\n const queryWithLt =\n Object.keys(mergedLt).length > 0\n ? Object.entries(mergedLt).reduce((q, [key, value]) => q.lt(key, value), queryWithGte)\n : queryWithGte\n\n const queryWithLte =\n Object.keys(mergedLte).length > 0\n ? Object.entries(mergedLte).reduce((q, [key, value]) => q.lte(key, value), queryWithLt)\n : queryWithLt\n\n const queryWithNeq =\n Object.keys(mergedNeq).length > 0\n ? Object.entries(mergedNeq).reduce((q, [key, value]) => q.neq(key, value), queryWithLte)\n : queryWithLte\n\n // Apply pattern matching using merged values\n const queryWithLike =\n Object.keys(mergedLike).length > 0\n ? Object.entries(mergedLike).reduce((q, [key, pattern]) => q.like(key, pattern as string), queryWithNeq)\n : queryWithNeq\n\n const queryWithIlike =\n Object.keys(mergedIlike).length > 0\n ? Object.entries(mergedIlike).reduce((q, [key, pattern]) => q.ilike(key, pattern as string), queryWithLike)\n : queryWithLike\n\n return queryWithIlike\n }\n\n /**\n * Apply multiple conditions with OR logic\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const applyOrConditions = (query: any, conditions: QueryCondition<T, DB>[]): any => {\n // Start with select\n const selectQuery = query.select(\"*\")\n\n // Apply soft delete filter based on softDeleteMode\n const baseQuery = (() => {\n if (TABLES_WITHOUT_DELETED.has(config.table)) {\n return selectQuery\n }\n if (config.softDeleteMode === \"exclude\") {\n return selectQuery.is(\"deleted\", null)\n }\n if (config.softDeleteMode === \"only\") {\n return selectQuery.not(\"deleted\", \"is\", null)\n }\n // Default: \"include\" - no filter\n return selectQuery\n })()\n\n // Separate common conditions from varying conditions\n const commonConditions = new Map<string, unknown>()\n const varyingConditions: QueryCondition<T, DB>[] = []\n\n // Find conditions that are common across all OR branches\n if (conditions.length > 0) {\n const firstCondition = conditions[0]\n\n // Check each key-value pair in the first condition\n Object.entries(firstCondition.where).forEach(([key, value]) => {\n // If this key-value pair exists in ALL conditions, it's common\n const isCommonCondition = conditions.every(\n (condition) => (condition.where as Record<string, unknown>)[key] === value,\n )\n\n if (isCommonCondition) {\n commonConditions.set(key, value)\n }\n })\n\n // Create new conditions with common parts removed\n varyingConditions.push(\n ...conditions.map((condition) => {\n const newWhere = { ...condition.where } as Record<string, unknown>\n commonConditions.forEach((_, key) => {\n delete newWhere[key]\n })\n return {\n where: newWhere as WhereConditions<TableRow<T, DB>>,\n is: condition.is,\n wherein: condition.wherein,\n }\n }),\n )\n }\n\n // Apply common conditions first\n const queryWithCommon = Array.from(commonConditions.entries()).reduce((query, [key, value]) => {\n if (value === null) {\n return query.is(key, null)\n } else {\n return query.eq(key, value)\n }\n }, baseQuery)\n\n // If no varying conditions remain, we're done\n if (varyingConditions.every((condition) => Object.keys(condition.where).length === 0)) {\n return queryWithCommon\n }\n\n // Build OR conditions from the varying parts only\n const orConditions = varyingConditions\n .map((condition) => {\n const parts: string[] = []\n\n // Add WHERE conditions (only the varying ones)\n Object.entries(condition.where).forEach(([key, value]) => {\n if (value === null) {\n parts.push(`${key}.is.null`)\n } else {\n parts.push(`${key}.eq.\"${value}\"`)\n }\n })\n\n // Add IS conditions\n if (condition.is) {\n Object.entries(condition.is).forEach(([key, value]) => {\n if (value === null) {\n parts.push(`${key}.is.null`)\n } else {\n parts.push(`${key}.is.${value}`)\n }\n })\n }\n\n // Add WHERE IN conditions\n if (condition.wherein) {\n Object.entries(condition.wherein).forEach(([key, values]) => {\n if (values && Array.isArray(values) && values.length > 0) {\n const valueList = values.map((v: unknown) => `\"${v}\"`).join(\",\")\n parts.push(`${key}.in.(${valueList})`)\n }\n })\n }\n\n // Add comparison operators\n if (condition.gt) {\n Object.entries(condition.gt).forEach(([key, value]) => {\n parts.push(`${key}.gt.${value}`)\n })\n }\n if (condition.gte) {\n Object.entries(condition.gte).forEach(([key, value]) => {\n parts.push(`${key}.gte.${value}`)\n })\n }\n if (condition.lt) {\n Object.entries(condition.lt).forEach(([key, value]) => {\n parts.push(`${key}.lt.${value}`)\n })\n }\n if (condition.lte) {\n Object.entries(condition.lte).forEach(([key, value]) => {\n parts.push(`${key}.lte.${value}`)\n })\n }\n if (condition.neq) {\n Object.entries(condition.neq).forEach(([key, value]) => {\n if (value === null) {\n parts.push(`${key}.not.is.null`)\n } else {\n parts.push(`${key}.neq.\"${value}\"`)\n }\n })\n }\n\n // Add pattern matching\n if (condition.like) {\n Object.entries(condition.like).forEach(([key, pattern]) => {\n parts.push(`${key}.like.\"${pattern}\"`)\n })\n }\n if (condition.ilike) {\n Object.entries(condition.ilike).forEach(([key, pattern]) => {\n parts.push(`${key}.ilike.\"${pattern}\"`)\n })\n }\n\n return parts.join(\",\")\n })\n .filter((condition) => condition.length > 0)\n\n // Apply OR conditions if any remain\n\n const finalQuery = orConditions.length > 0 ? queryWithCommon.or(orConditions.join(\",\")) : queryWithCommon\n\n return finalQuery\n }\n\n // Return the Query interface implementation\n return {\n /**\n * Add OR condition to the query\n */\n or: (where: WhereConditions<TableRow<T, DB>>, is?: IsConditions<TableRow<T, DB>>): Query<T, DB> => {\n const newConditions = [...config.conditions, { where, is }]\n return QueryBuilder<T, DB>(client, {\n ...config,\n conditions: newConditions,\n })\n },\n\n /**\n * Filter by branded ID with type safety\n */\n whereId: <ID extends Brand<string, string>>(id: ID): Query<T, DB> => {\n const newConditions = [\n ...config.conditions,\n {\n where: { id: id as unknown } as unknown as WhereConditions<TableRow<T, DB>>,\n },\n ]\n return QueryBuilder<T, DB>(client, {\n ...config,\n conditions: newConditions,\n })\n },\n\n /**\n * Add OR condition with branded ID\n */\n orWhereId: <ID extends Brand<string, string>>(id: ID): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, config).or({\n id: id as unknown,\n } as unknown as WhereConditions<TableRow<T, DB>>)\n },\n\n /**\n * Apply mapping function to query results\n */\n map: <U>(fn: (item: TableRow<T, DB>) => U): MappedQuery<U> => {\n return createMappedQuery<T, DB, U>(QueryBuilder<T, DB>(client, config), fn)\n },\n\n /**\n * Apply filter function to query results\n */\n filter: (predicate: (item: TableRow<T, DB>) => boolean): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n filterFn: config.filterFn ? (item: TableRow<T, DB>) => config.filterFn!(item) && predicate(item) : predicate,\n })\n },\n\n /**\n * Limit the number of results\n */\n limit: (count: number): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n limit: count,\n })\n },\n\n /**\n * Offset the results for pagination\n */\n offset: (count: number): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n offset: count,\n })\n },\n\n /**\n * Include all records (no soft delete filter)\n */\n includeDeleted: (): Query<T, DB> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"include\") {\n log.warn(`[${config.table}] includeDeleted() called but already including deleted by default`)\n }\n return QueryBuilder<T, DB>(client, {\n ...config,\n softDeleteMode: \"include\",\n softDeleteAppliedByDefault: false,\n })\n },\n\n /**\n * Exclude soft-deleted records (apply deleted IS NULL filter)\n */\n excludeDeleted: (): Query<T, DB> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"exclude\") {\n log.warn(`[${config.table}] excludeDeleted() called but already excluding deleted by default`)\n }\n return QueryBuilder<T, DB>(client, {\n ...config,\n softDeleteMode: \"exclude\",\n softDeleteAppliedByDefault: false,\n })\n },\n\n /**\n * Query only soft-deleted records (apply deleted IS NOT NULL filter)\n */\n onlyDeleted: (): Query<T, DB> => {\n return QueryBuilder<T, DB>(client, {\n ...config,\n softDeleteMode: \"only\",\n softDeleteAppliedByDefault: false,\n })\n },\n\n /**\n * Execute query expecting exactly one result\n */\n one: (): FPromise<TaskOutcome<Option<TableRow<T, DB>>>> => {\n return wrapAsync(async () => {\n try {\n const query = buildSupabaseQuery()\n const { data, error } = await query.single()\n\n if (error) {\n log.error(`Error getting ${config.table} item: ${toError(error).toString()}`)\n return Err<Option<TableRow<T, DB>>>(toError(error))\n }\n\n const result = data as TableRow<T, DB>\n const filteredResult = config.filterFn ? config.filterFn(result) : true\n\n if (!filteredResult) {\n return Ok(Option.none<TableRow<T, DB>>())\n }\n\n return Ok(Option(result))\n } catch (error) {\n log.error(`Error executing single query on ${config.table}: ${toError(error).toString()}`)\n return Err<Option<TableRow<T, DB>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting zero or more results\n */\n many: (): FPromise<TaskOutcome<List<TableRow<T, DB>>>> => {\n return wrapAsync(async () => {\n try {\n const query = buildSupabaseQuery()\n const { data, error } = await query\n\n if (error) {\n log.error(`Error getting ${config.table} items: ${toError(error).toString()}`)\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n const rawResults = data as TableRow<T, DB>[]\n\n // Apply filter if present\n const results = config.filterFn ? rawResults.filter(config.filterFn) : rawResults\n\n return Ok(List(results))\n } catch (error) {\n log.error(`Error executing multi query on ${config.table}: ${toError(error).toString()}`)\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting first result from potentially multiple\n */\n first: (): FPromise<TaskOutcome<Option<TableRow<T, DB>>>> => {\n return wrapAsync(async () => {\n const manyResult = await QueryBuilder<T, DB>(client, config).many()\n const list = manyResult.orThrow()\n if (list.isEmpty) {\n return Ok(Option.none<TableRow<T, DB>>())\n }\n return Ok(Option(list.head))\n })\n },\n\n /**\n * Execute query expecting exactly one result, throw if error or not found\n */\n oneOrThrow: async (): Promise<TableRow<T, DB>> => {\n const result = await QueryBuilder<T, DB>(client, config).one()\n const option = result.orThrow()\n return option.orThrow(new Error(`No record found in ${config.table}`))\n },\n\n /**\n * Execute query expecting zero or more results, throw if error\n */\n manyOrThrow: async (): Promise<List<TableRow<T, DB>>> => {\n const result = await QueryBuilder<T, DB>(client, config).many()\n return result.orThrow()\n },\n\n /**\n * Execute query expecting first result, throw if error or empty\n */\n firstOrThrow: async (): Promise<TableRow<T, DB>> => {\n const result = await QueryBuilder<T, DB>(client, config).first()\n const option = result.orThrow()\n return option.orThrow(new Error(`No records found in ${config.table}`))\n },\n }\n}\n\n/**\n * Functional MappedQuery implementation\n */\nconst createMappedQuery = <T extends TableNames<DB>, DB extends DatabaseSchema = Database, U = unknown>(\n sourceQuery: Query<T, DB>,\n mapFn: (item: TableRow<T, DB>) => U,\n): MappedQuery<U> => {\n return {\n map: <V>(fn: (item: U) => V): MappedQuery<V> => {\n return createMappedQuery<T, DB, V>(sourceQuery, (item: TableRow<T, DB>) => fn(mapFn(item)))\n },\n\n filter: (predicate: (item: U) => boolean): MappedQuery<U> => {\n const filteredQuery = sourceQuery.filter((item: TableRow<T, DB>) => predicate(mapFn(item)))\n return createMappedQuery<T, DB, U>(filteredQuery, mapFn)\n },\n\n one: (): FPromise<TaskOutcome<Option<U>>> => {\n return wrapAsync(async () => {\n const maybeItemResult = await sourceQuery.one()\n const maybeItem = maybeItemResult.orThrow()\n return maybeItem.fold(\n () => Ok(Option.none<U>()),\n (item) => Ok(Option(mapFn(item))),\n )\n })\n },\n\n many: (): FPromise<TaskOutcome<List<U>>> => {\n return wrapAsync(async () => {\n const itemsResult = await sourceQuery.many()\n const items = itemsResult.orThrow()\n return Ok(items.map(mapFn))\n })\n },\n\n first: (): FPromise<TaskOutcome<Option<U>>> => {\n return wrapAsync(async () => {\n const maybeItemResult = await sourceQuery.first()\n const maybeItem = maybeItemResult.orThrow()\n return maybeItem.fold(\n () => Ok(Option.none<U>()),\n (item) => Ok(Option(mapFn(item))),\n )\n })\n },\n\n /**\n * Execute mapped query expecting exactly one result, throw if error or not found\n */\n oneOrThrow: async (): Promise<U> => {\n const result = await createMappedQuery(sourceQuery, mapFn).one()\n const option = result.orThrow()\n return option.orThrow(new Error(`No record found`))\n },\n\n /**\n * Execute mapped query expecting zero or more results, throw if error\n */\n manyOrThrow: async (): Promise<List<U>> => {\n const result = await createMappedQuery(sourceQuery, mapFn).many()\n return result.orThrow()\n },\n\n /**\n * Execute mapped query expecting first result, throw if error or empty\n */\n firstOrThrow: async (): Promise<U> => {\n const result = await createMappedQuery(sourceQuery, mapFn).first()\n const option = result.orThrow()\n return option.orThrow(new Error(`No records found`))\n },\n }\n}\n\n/**\n * Factory function to create new functional QueryBuilder instances\n */\nexport const createQuery = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: WhereConditions<TableRow<T, DB>> = {},\n is?: IsConditions<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n order?: [keyof TableRow<T, DB> & string, { ascending?: boolean; nullsFirst?: boolean }],\n softDeleteConfig?: { mode?: \"include\" | \"exclude\" | \"only\"; appliedByDefault?: boolean },\n schema?: string,\n): Query<T, DB> => {\n const config: QueryBuilderConfig<T, DB> = {\n table,\n conditions: [{ where, is, wherein }],\n order,\n softDeleteMode: softDeleteConfig?.mode,\n softDeleteAppliedByDefault: softDeleteConfig?.appliedByDefault,\n schema,\n }\n return QueryBuilder<T, DB>(client, config)\n}\n","import type { Database, DatabaseSchema, EmptyObject, TableNames, TableRow } from \"@/types\"\n\nimport type { Brand, FPromise, List, Option, TaskOutcome } from \"functype\"\n\n// Comparison operators for advanced queries\nexport type ComparisonOperators<V> = {\n gte?: V // Greater than or equal\n gt?: V // Greater than\n lte?: V // Less than or equal\n lt?: V // Less than\n neq?: V // Not equal\n like?: string // LIKE pattern (for string fields)\n ilike?: string // Case-insensitive LIKE\n in?: V[] // IN array\n is?: null | boolean // IS NULL/TRUE/FALSE\n}\n\n// Type-safe WHERE conditions that provide IntelliSense for table columns\n// Supports both direct values and operator objects for advanced queries\nexport type WhereConditions<T extends object> = Partial<{\n [K in keyof T]: T[K] | null | ComparisonOperators<T[K]>\n}> & {\n // Special operators that work across columns with type-safe values\n gte?: Partial<{ [K in keyof T]?: T[K] }>\n gt?: Partial<{ [K in keyof T]?: T[K] }>\n lte?: Partial<{ [K in keyof T]?: T[K] }>\n lt?: Partial<{ [K in keyof T]?: T[K] }>\n neq?: Partial<{ [K in keyof T]?: T[K] }>\n like?: Partial<{ [K in keyof T]?: Extract<T[K], string> }>\n ilike?: Partial<{ [K in keyof T]?: Extract<T[K], string> }>\n}\n\n/**\n * Entity-specific WHERE conditions - no nested ComparisonOperators allowed.\n * Entity API methods (getItems, updateItem, etc.) don't process nested operators.\n * Use separate `is`, `wherein`, etc. parameters for these operations.\n *\n * @example\n * // Correct Entity usage:\n * Entity.getItems({ where: { code }, is: { used_at: null } })\n *\n * // Incorrect (use Query API instead for nested operators):\n * Entity.getItems({ where: { code, used_at: { is: null } } }) // TypeScript error\n */\nexport type EntityWhereConditions<T extends object> = Partial<{\n [K in keyof T]: T[K] | null\n}>\n\n// Enhanced type for IS conditions with field-level type safety\nexport type IsConditions<T extends object = EmptyObject> = Partial<Record<keyof T, null | boolean>>\n\n// Soft delete mode for controlling how deleted records are handled\nexport type SoftDeleteMode = \"include\" | \"exclude\" | \"only\"\n\n// =============================================================================\n// Standard Execution Interfaces for Consistent OrThrow Pattern\n// =============================================================================\n\n/**\n * Base execution interface that all database operations implement\n */\nexport interface ExecutableQuery<T> {\n // TaskOutcome version (for explicit error handling)\n execute(): FPromise<TaskOutcome<T>>\n\n // OrThrow version (for simple error handling)\n executeOrThrow(): Promise<T>\n}\n\n/**\n * Standard interface for operations that return a single result\n */\nexport interface SingleExecution<T> extends ExecutableQuery<Option<T>> {\n one(): FPromise<TaskOutcome<Option<T>>>\n oneOrThrow(): Promise<T>\n}\n\n/**\n * Standard interface for operations that return multiple results\n */\nexport interface MultiExecution<T> extends ExecutableQuery<List<T>> {\n many(): FPromise<TaskOutcome<List<T>>>\n manyOrThrow(): Promise<List<T>>\n}\n\n// Branded type support for query conditions\nexport type BrandedWhereParams<T extends object = EmptyObject> = {\n [K in keyof T]?: T[K] | unknown // Simplified to avoid complex conditional types\n}\n\n// Helper type for branded field values\nexport type BrandedFieldValue<T> = T extends Brand<string, infer BaseType> ? T | BaseType : T\n\n// =============================================================================\n// Core Query Interface with Database Generic Support\n// =============================================================================\n\n/**\n * Core Query interface with branded type support.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface Query<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n // Execution methods - explicit about expected results\n one(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T, DB>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<TableRow<T, DB>>\n manyOrThrow(): Promise<List<TableRow<T, DB>>>\n firstOrThrow(): Promise<TableRow<T, DB>>\n\n // Query composition - chainable OR logic with type-safe where conditions\n or(where: WhereConditions<TableRow<T, DB>>, is?: IsConditions<TableRow<T, DB>>): Query<T, DB>\n\n // Branded type-aware query methods (simplified)\n whereId<ID extends Brand<string, string>>(id: ID): Query<T, DB>\n orWhereId<ID extends Brand<string, string>>(id: ID): Query<T, DB>\n\n // Functional operations - maintain composability\n map<U>(fn: (item: TableRow<T, DB>) => U): MappedQuery<U>\n filter(predicate: (item: TableRow<T, DB>) => boolean): Query<T, DB>\n\n // Pagination\n limit(count: number): Query<T, DB>\n offset(count: number): Query<T, DB>\n\n // Soft delete filtering\n includeDeleted(): Query<T, DB>\n excludeDeleted(): Query<T, DB>\n onlyDeleted(): Query<T, DB>\n}\n\n// Mapped query for transformed results\nexport interface MappedQuery<U> {\n one(): FPromise<TaskOutcome<Option<U>>>\n many(): FPromise<TaskOutcome<List<U>>>\n first(): FPromise<TaskOutcome<Option<U>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<U>\n manyOrThrow(): Promise<List<U>>\n firstOrThrow(): Promise<U>\n\n // Continue chaining\n map<V>(fn: (item: U) => V): MappedQuery<V>\n filter(predicate: (item: U) => boolean): MappedQuery<U>\n}\n\n// =============================================================================\n// Query Condition Types\n// =============================================================================\n\n/**\n * Query condition for internal state management with type-safe where.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface QueryCondition<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n where: WhereConditions<TableRow<T, DB>>\n is?: IsConditions<TableRow<T, DB>>\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>\n // Comparison operators\n gt?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n gte?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n lt?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n lte?: Partial<Record<keyof TableRow<T, DB>, number | string | Date>>\n neq?: Partial<Record<keyof TableRow<T, DB>, unknown>>\n // Pattern matching\n like?: Partial<Record<keyof TableRow<T, DB>, string>>\n ilike?: Partial<Record<keyof TableRow<T, DB>, string>>\n}\n\n// =============================================================================\n// Entity Query Interfaces\n// =============================================================================\n\n/**\n * Entity-specific query interfaces for better type safety.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface EntityQuery<T extends TableNames<DB>, DB extends DatabaseSchema = Database> extends Query<T, DB> {\n // Entity-specific methods can be added here\n normalize(): NormalizedQuery<T, DB>\n}\n\n/**\n * Normalized query interface.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface NormalizedQuery<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n one(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T, DB>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T, DB>>>>\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n// Type guards for runtime type checking\nexport const isQuery = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n obj: unknown,\n): obj is Query<T, DB> => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"one\" in obj &&\n \"many\" in obj &&\n \"first\" in obj &&\n \"or\" in obj &&\n \"map\" in obj &&\n \"filter\" in obj\n )\n}\n\nexport const isMappedQuery = <U>(obj: unknown): obj is MappedQuery<U> => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"one\" in obj &&\n \"many\" in obj &&\n \"first\" in obj &&\n \"map\" in obj &&\n \"filter\" in obj\n )\n}\n\n// =============================================================================\n// Utility Types for Query Parameters\n// =============================================================================\n\n/**\n * Utility types for query parameters with type safety.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport type QueryWhereParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = WhereConditions<\n TableRow<T, DB>\n>\nexport type QueryIsParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = IsConditions<\n TableRow<T, DB>\n>\nexport type QueryWhereinParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = Partial<\n Record<keyof TableRow<T, DB>, unknown[]>\n>\nexport type QueryOrderParams<T extends TableNames<DB>, DB extends DatabaseSchema = Database> = [\n keyof TableRow<T, DB> & string,\n { ascending?: boolean; nullsFirst?: boolean },\n]\n\n// =============================================================================\n// Builder Configuration\n// =============================================================================\n\n/**\n * Builder configuration for query construction.\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n */\nexport interface QueryBuilderConfig<T extends TableNames<DB>, DB extends DatabaseSchema = Database> {\n table: T\n conditions: QueryCondition<T, DB>[]\n order?: QueryOrderParams<T, DB>\n mapFn?: (item: TableRow<T, DB>) => unknown\n filterFn?: (item: TableRow<T, DB>) => boolean\n limit?: number\n offset?: number\n softDeleteMode?: SoftDeleteMode\n softDeleteAppliedByDefault?: boolean\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n}\n","/**\n * RPC (Remote Procedure Call) support for Supabase stored procedures/functions\n *\n * Provides type-safe invocation of PostgreSQL functions defined in the database.\n *\n * @example\n * ```typescript\n * // Call a function that returns a single value\n * const stats = await rpc(client, \"get_user_stats\", { user_id: \"123\" }).one()\n *\n * // Call a function that returns multiple rows\n * const results = await rpc(client, \"search_products\", { query: \"laptop\" }).many()\n *\n * // With custom schema\n * const data = await rpc(client, \"analytics_query\", { period: \"week\" }, { schema: \"analytics\" }).many()\n * ```\n */\n\nimport type {\n Database,\n DatabaseSchema,\n FunctionArgs,\n FunctionNames,\n FunctionReturns,\n SupabaseClientType,\n} from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok, Option } from \"functype\"\n\n// =============================================================================\n// RPC Execution Types\n// =============================================================================\n\n/**\n * Options for RPC execution\n */\nexport type RpcOptions = {\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n /** Count option for the query */\n count?: \"exact\" | \"planned\" | \"estimated\"\n}\n\n/**\n * Single execution interface for RPC calls\n */\nexport type RpcSingleExecution<T> = {\n /**\n * Execute and return TaskOutcome<Option<T>>\n * Returns None if no result, Some(value) if result exists\n */\n one: () => FPromise<TaskOutcome<Option<T>>>\n\n /**\n * Execute and return T directly, throwing on error or no result\n */\n oneOrThrow: () => Promise<T>\n}\n\n/**\n * Multi execution interface for RPC calls\n */\nexport type RpcMultiExecution<T> = {\n /**\n * Execute and return TaskOutcome<List<T>>\n * Returns empty List if no results\n */\n many: () => FPromise<TaskOutcome<List<T>>>\n\n /**\n * Execute and return List<T> directly, throwing on error\n */\n manyOrThrow: () => Promise<List<T>>\n}\n\n/**\n * Combined RPC query execution interface\n * Provides both single and multi-result execution methods\n */\nexport type RpcExecution<T> = RpcSingleExecution<T> & RpcMultiExecution<T>\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Wraps an async operation to return FPromise<TaskOutcome<T>>\n */\nconst wrapAsync = <T>(fn: () => Promise<TaskOutcome<T>>): FPromise<TaskOutcome<T>> => {\n return fn() as unknown as FPromise<TaskOutcome<T>>\n}\n\n// =============================================================================\n// RPC Implementation\n// =============================================================================\n\n/**\n * Creates an RPC query for invoking a PostgreSQL function.\n *\n * This function provides type-safe invocation of stored procedures/functions\n * defined in your Supabase database. Return types are inferred from your\n * generated Database types.\n *\n * @template F - The function name (must exist in database schema)\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param functionName - The name of the PostgreSQL function to call\n * @param args - Arguments to pass to the function (type-safe based on function definition)\n * @param options - Optional configuration (schema, count)\n * @returns An RpcExecution object with one(), oneOrThrow(), many(), manyOrThrow() methods\n *\n * @example\n * ```typescript\n * // Function returning a single object\n * const userStats = await rpc(client, \"get_user_stats\", { user_id: \"123\" }).one()\n * if (userStats.isOk()) {\n * const stats = userStats.orThrow()\n * if (stats.isSome()) {\n * console.log(stats.get())\n * }\n * }\n *\n * // Function returning multiple rows\n * const products = await rpc(client, \"search_products\", { query: \"laptop\", limit: 10 }).many()\n * products.forEach(p => console.log(p.name))\n *\n * // Using OrThrow variants\n * const stats = await rpc(client, \"get_user_stats\", { user_id: \"123\" }).oneOrThrow()\n * const results = await rpc(client, \"search_all\").manyOrThrow()\n * ```\n */\nexport const rpc = <F extends FunctionNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n functionName: F,\n args?: FunctionArgs<F, DB>,\n options?: RpcOptions,\n): RpcExecution<FunctionReturns<F, DB>> => {\n type ReturnType = FunctionReturns<F, DB>\n\n const executeRpc = (): Promise<{ data: unknown; error: unknown }> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (client as any).rpc(functionName, args ?? {}, {\n count: options?.count,\n })\n }\n\n const one = (): FPromise<TaskOutcome<Option<ReturnType>>> =>\n wrapAsync(async () => {\n try {\n const { data, error } = await executeRpc()\n\n if (error) {\n return Err<Option<ReturnType>>(toError(error))\n }\n\n // Handle null/undefined data\n if (data === null || data === undefined) {\n return Ok(Option.none<ReturnType>())\n }\n\n // Handle array data - return first element\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return Ok(Option.none<ReturnType>())\n }\n return Ok(Option(data[0] as ReturnType))\n }\n\n return Ok(Option(data as ReturnType))\n } catch (error) {\n return Err<Option<ReturnType>>(toError(error))\n }\n })\n\n const oneOrThrow = async (): Promise<ReturnType> => {\n const result = await one()\n const option = result.orThrow()\n return option.fold(\n () => {\n throw new Error(\"RPC call returned no result\")\n },\n (value) => value,\n )\n }\n\n const many = (): FPromise<TaskOutcome<List<ReturnType>>> =>\n wrapAsync(async () => {\n try {\n const { data, error } = await executeRpc()\n\n if (error) {\n return Err<List<ReturnType>>(toError(error))\n }\n\n // Handle null/undefined data\n if (data === null || data === undefined) {\n return Ok(List<ReturnType>([]))\n }\n\n // Handle array data\n if (Array.isArray(data)) {\n return Ok(List(data as ReturnType[]))\n }\n\n // Single value - wrap in list\n return Ok(List([data as ReturnType]))\n } catch (error) {\n return Err<List<ReturnType>>(toError(error))\n }\n })\n\n const manyOrThrow = async (): Promise<List<ReturnType>> => {\n const result = await many()\n return result.orThrow()\n }\n\n return {\n one,\n oneOrThrow,\n many,\n manyOrThrow,\n }\n}\n","import type {\n Database,\n DatabaseSchema,\n EmptyObject,\n SupabaseClientType,\n TableInsert,\n TableNames,\n TableRow,\n TableUpdate,\n} from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok } from \"functype\"\n\nimport type { EntityWhereConditions, Query, WhereConditions } from \"./Query\"\nimport { createQuery } from \"./QueryBuilder\"\n\n// Re-export query types\nexport type {\n ComparisonOperators,\n EntityQuery,\n EntityWhereConditions,\n ExecutableQuery,\n IsConditions,\n MappedQuery,\n MultiExecution,\n Query,\n QueryBuilderConfig,\n QueryCondition,\n QueryIsParams,\n QueryOrderParams,\n QueryWhereinParams,\n QueryWhereParams,\n SingleExecution,\n SoftDeleteMode,\n WhereConditions,\n} from \"./Query\"\n\n// Re-export type guards\nexport { isMappedQuery, isQuery } from \"./Query\"\n\n// Re-export RPC types and function\nexport type { RpcExecution, RpcMultiExecution, RpcOptions, RpcSingleExecution } from \"./rpc\"\nexport { rpc } from \"./rpc\"\n\n// Local type for IS conditions\ntype IsConditionsLocal<T extends object = EmptyObject> = Partial<Record<keyof T, null | boolean>>\n\n// Helper to wrap async operations with error handling\nconst wrapAsync = <T>(fn: () => Promise<TaskOutcome<T>>): FPromise<TaskOutcome<T>> => {\n return fn() as unknown as FPromise<TaskOutcome<T>>\n}\n\n/**\n * Retrieves a single entity from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to query\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the entity if found\n */\nexport const getEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).select(\"*\").match(where)\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(baseQuery)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : baseQuery\n\n const { data, error } = await queryWithIs.single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Retrieves multiple entities from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to query\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param order - Optional ordering parameters\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the entities if found\n */\nexport const getEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>> = {},\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n order: [keyof TableRow<T, DB> & string, { ascending?: boolean; nullsFirst?: boolean }] = [\n \"id\" as keyof TableRow<T, DB> & string,\n { ascending: true },\n ],\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).select(\"*\").match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const queryOrderBy = queryWithIs.order(order[0], order[1])\n\n const { data, error } = await queryOrderBy\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Adds multiple entities to the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to insert into\n * @param entities - The entities to add\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the added entities\n */\nexport const addEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n entities: TableInsert<T, DB>[],\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data, error } = await (tableQuery as any).insert(entities as never).select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as unknown as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Updates a single entity in the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to update\n * @param entities - The entity data to update\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the updated entity\n */\nexport const updateEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n entities: TableUpdate<T, DB>,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).update(entities as never).match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select().single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Upserts multiple entities in the specified table (insert or update on conflict).\n * Uses Supabase's upsert() under the hood with onConflict resolution.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to upsert into\n * @param entities - The entities to upsert\n * @param identity - The column(s) to use for conflict resolution (default: \"id\")\n * @param where - Additional conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the upserted entities\n */\nexport const upsertEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n entities: TableUpdate<T, DB>[],\n identity: (keyof TableRow<T, DB> & string) | (keyof TableRow<T, DB> & string)[] = \"id\" as keyof TableRow<T, DB> &\n string,\n where?: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n const onConflict = Array.isArray(identity) ? identity.join(\",\") : identity\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).upsert(entities as never, { onConflict }).match(where ?? {})\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Deletes a single entity from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the deleted entity\n */\nexport const deleteEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).delete().match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select().single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Deletes multiple entities from the specified table.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the deleted entities\n */\nexport const deleteEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).delete().match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Soft deletes a single entity by setting the deleted timestamp.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to soft delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the soft deleted entity\n */\nexport const softDeleteEntity = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<TableRow<T, DB>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).update({ deleted: new Date().toISOString() } as never).match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select().single()\n\n if (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n\n return Ok(data as TableRow<T, DB>)\n } catch (error) {\n return Err<TableRow<T, DB>>(toError(error))\n }\n })\n\n/**\n * Soft deletes multiple entities by setting the deleted timestamp.\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to soft delete from\n * @param where - Conditions to filter by\n * @param is - IS conditions to filter by\n * @param wherein - WHERE IN conditions to filter by\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A promise resolving to the soft deleted entities\n */\nexport const softDeleteEntities = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: EntityWhereConditions<TableRow<T, DB>>,\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n schema?: string,\n): FPromise<TaskOutcome<List<TableRow<T, DB>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableQuery = schema ? client.schema(schema).from(table) : client.from(table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (tableQuery as any).update({ deleted: new Date().toISOString() } as never).match(where)\n\n const queryWithIn = wherein\n ? List(Object.entries(wherein)).foldLeft(baseQuery)((query, [column, values]) =>\n query.in(column, values as never),\n )\n : baseQuery\n\n const queryWithIs = is\n ? List(Object.entries(is)).foldLeft(queryWithIn)((query, [column, value]) =>\n query.is(column as keyof TableRow<T, DB> & string, value as boolean | null),\n )\n : queryWithIn\n\n const { data, error } = await queryWithIs.select()\n\n if (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T, DB>[]))\n } catch (error) {\n return Err<List<TableRow<T, DB>>>(toError(error))\n }\n })\n\n/**\n * Creates a new Query for the specified table with initial conditions.\n * This is the new Query-based API that supports OR chaining and functional operations.\n *\n * @template T - The table name\n * @template DB - The database schema type\n * @param client - The Supabase client instance\n * @param table - The table to query\n * @param where - Initial WHERE conditions to filter by\n * @param is - Initial IS conditions to filter by\n * @param wherein - Initial WHERE IN conditions to filter by\n * @param order - Optional ordering parameters\n * @param schema - Database schema to query (defaults to \"public\")\n * @returns A Query<T, DB> instance that supports chaining and lazy evaluation\n *\n * @example\n * // Simple query\n * const user = await query(client, \"users\", { id: \"123\" }).one()\n *\n * @example\n * // Query with OR logic\n * const users = await query(client, \"users\", { role: \"admin\" })\n * .or({ role: \"moderator\" })\n * .many()\n *\n * @example\n * // Query with functional operations\n * const names = await query(client, \"users\", { active: true })\n * .map(user => user.name)\n * .filter(name => name.startsWith('A'))\n * .many()\n *\n * @example\n * // Query with custom schema\n * const items = await query(client, \"items\", { active: true }, undefined, undefined, undefined, \"inventory\").many()\n */\nexport const query = <T extends TableNames<DB>, DB extends DatabaseSchema = Database>(\n client: SupabaseClientType<DB>,\n table: T,\n where: WhereConditions<TableRow<T, DB>> = {},\n is?: IsConditionsLocal<TableRow<T, DB>>,\n wherein?: Partial<Record<keyof TableRow<T, DB>, unknown[]>>,\n order?: [keyof TableRow<T, DB> & string, { ascending?: boolean; nullsFirst?: boolean }],\n schema?: string,\n): Query<T, DB> => {\n return createQuery<T, DB>(client, table, where, is, wherein, order, undefined, schema)\n}\n","/**\n * Shared type definitions for Entity and PartitionedEntity\n */\n\nimport type { EntityWhereConditions, MultiExecution, Query, SingleExecution } from \"@/query/Query\"\nimport type {\n Database,\n DatabaseSchema,\n EmptyObject,\n SchemaNames,\n TableInsert,\n TableNames,\n TableRow,\n TableUpdate,\n} from \"@/types\"\n\nimport type { Brand, FPromise, List, TaskOutcome } from \"functype\"\nimport { Option } from \"functype\"\n\n// =============================================================================\n// Partition Key Types\n// =============================================================================\n\n/**\n * Partition key can be a string or any branded string type\n * This enables type-safe partition keys using functype's Brand/ValidatedBrand\n */\nexport type PartitionKey = string | Brand<string, string>\n\n// =============================================================================\n// Field-Level Type Safety\n// =============================================================================\n\n/**\n * Field-level type safety for queries\n */\nexport type TypedRecord<T, V> = Partial<Record<keyof T, V>>\n\n// =============================================================================\n// Entity Configuration\n// =============================================================================\n\n/**\n * Configuration for standard Entity (no partition)\n */\nexport type EntityConfig = {\n /** Soft delete filtering. true = exclude deleted items, false = include deleted items */\n softDelete: boolean\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n}\n\n/**\n * Configuration for PartitionedEntity\n */\nexport type PartitionedEntityConfig = {\n /** The database column name used for partitioning (e.g., \"tenant_id\") */\n partitionField: string\n /** Soft delete filtering. true = exclude deleted items, false = include deleted items */\n softDelete: boolean\n /** Database schema to query (defaults to \"public\") */\n schema?: string\n}\n\n// =============================================================================\n// Base Parameter Types\n// =============================================================================\n\nexport type WhereParams<T extends object = EmptyObject> = {\n where?: EntityWhereConditions<T>\n}\n\nexport type IsParams<T extends object = EmptyObject> = {\n is?: TypedRecord<T, null | boolean>\n}\n\nexport type WhereinParams<T extends object = EmptyObject> = {\n wherein?: TypedRecord<T, unknown[]>\n}\n\nexport type OrderParams<T extends object = EmptyObject> = {\n order?: [keyof T & string, { ascending?: boolean; nullsFirst?: boolean }]\n}\n\nexport type IdParam = {\n id: string\n}\n\n// =============================================================================\n// Composable Parameter Types\n// =============================================================================\n\nexport type GetItemParams<T extends object = EmptyObject> = IdParam & WhereParams<T> & IsParams<T>\n\nexport type GetItemsParams<T extends object = EmptyObject> = WhereParams<T> &\n IsParams<T> &\n WhereinParams<T> &\n OrderParams<T>\n\nexport type AddItemsParams<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = {\n items: TableInsert<T, DB, S>[]\n}\n\n/**\n * Prisma-style update params for single item: { where, data }\n */\nexport type UpdateItemParams<\n T extends TableNames<DB, S>,\n Row extends object = EmptyObject,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = {\n /** Conditions to match the item to update */\n where: EntityWhereConditions<Row>\n /** The data to update */\n data: TableUpdate<T, DB, S>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Prisma-style update params for multiple items: { where, data }\n */\nexport type UpdateItemsParams<\n T extends TableNames<DB, S>,\n Row extends object = EmptyObject,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = {\n /** Conditions to match items to update */\n where: EntityWhereConditions<Row>\n /** The data to update on all matched items */\n data: TableUpdate<T, DB, S>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Batch upsert params: update multiple rows with different data per row\n */\nexport type UpsertItemsParams<\n T extends TableNames<DB, S>,\n Row extends object = EmptyObject,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = {\n /** Array of items to upsert, each with its own data */\n items: TableUpdate<T, DB, S>[]\n /** Column(s) to use as identity for matching (default: \"id\") */\n identity?: (keyof Row & string) | (keyof Row & string)[]\n}\n\n/**\n * Delete params for single item: { where }\n */\nexport type DeleteItemParams<Row extends object = EmptyObject> = {\n /** Conditions to match the item to delete */\n where: EntityWhereConditions<Row>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Delete params for multiple items: { where }\n */\nexport type DeleteItemsParams<Row extends object = EmptyObject> = {\n /** Conditions to match items to delete */\n where: EntityWhereConditions<Row>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n// =============================================================================\n// Mutation Query Wrappers\n// =============================================================================\n\n/**\n * Wrapper type for multi-result mutation operations that implements standard execution interface\n */\nexport type MutationMultiExecution<T> = FPromise<TaskOutcome<List<T>>> & MultiExecution<T>\n\n/**\n * Wrapper type for single-result mutation operations that implements standard execution interface\n */\nexport type MutationSingleExecution<T> = FPromise<TaskOutcome<T>> & SingleExecution<T>\n\n/**\n * Creates a multi-result mutation query that implements the standard execution interface\n */\nexport function MultiMutationQuery<T>(promise: FPromise<TaskOutcome<List<T>>>): MutationMultiExecution<T> {\n const result = Object.assign(promise, {\n many: () => promise,\n manyOrThrow: async (): Promise<List<T>> => {\n const taskResult = await promise\n return taskResult.orThrow()\n },\n execute: () => promise,\n executeOrThrow: async (): Promise<List<T>> => {\n const taskResult = await promise\n return taskResult.orThrow()\n },\n })\n return result as MutationMultiExecution<T>\n}\n\n/**\n * Creates a single-result mutation query that implements the standard execution interface\n */\nexport function SingleMutationQuery<T>(promise: FPromise<TaskOutcome<T>>): MutationSingleExecution<T> {\n const result = Object.assign(promise, {\n one: () => promise.then((outcome: TaskOutcome<T>) => outcome.map((value: T) => Option(value))),\n oneOrThrow: async (): Promise<T> => {\n const taskResult = await promise\n return taskResult.orThrow()\n },\n execute: () => promise.then((outcome: TaskOutcome<T>) => outcome.map((value: T) => Option(value))),\n executeOrThrow: async (): Promise<Option<T>> => {\n const taskResult = await promise\n const value = taskResult.orThrow()\n return Option(value)\n },\n })\n return result as MutationSingleExecution<T>\n}\n\n// =============================================================================\n// Entity Interfaces\n// =============================================================================\n\n/**\n * Base interface for Entity instances (global, no partition)\n *\n * @typeParam T - The table name\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n * @typeParam S - The schema name (defaults to \"public\")\n */\nexport type IEntity<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = {\n getItem(params: GetItemParams<TableRow<T, DB, S>>): Query<T, DB>\n getItems(params?: GetItemsParams<TableRow<T, DB, S>>): Query<T, DB>\n addItems(params: AddItemsParams<T, DB, S>): MutationMultiExecution<TableRow<T, DB, S>>\n updateItem(params: UpdateItemParams<T, TableRow<T, DB, S>, DB, S>): MutationSingleExecution<TableRow<T, DB, S>>\n updateItems(params: UpdateItemsParams<T, TableRow<T, DB, S>, DB, S>): MutationMultiExecution<TableRow<T, DB, S>>\n upsertItems(params: UpsertItemsParams<T, TableRow<T, DB, S>, DB, S>): MutationMultiExecution<TableRow<T, DB, S>>\n deleteItem(params: DeleteItemParams<TableRow<T, DB, S>>): MutationSingleExecution<TableRow<T, DB, S>>\n deleteItems(params: DeleteItemsParams<TableRow<T, DB, S>>): MutationMultiExecution<TableRow<T, DB, S>>\n}\n\n/**\n * Interface for PartitionedEntity instances (requires partition key on calls)\n *\n * @typeParam T - The table name\n * @typeParam K - The partition key type\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n * @typeParam S - The schema name (defaults to \"public\")\n */\nexport type IPartitionedEntity<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = {\n getItem(partitionKey: K, params: GetItemParams<TableRow<T, DB, S>>): Query<T, DB>\n getItems(partitionKey: K, params?: GetItemsParams<TableRow<T, DB, S>>): Query<T, DB>\n addItems(params: AddItemsParams<T, DB, S>): MutationMultiExecution<TableRow<T, DB, S>>\n updateItem(\n partitionKey: K,\n params: UpdateItemParams<T, TableRow<T, DB, S>, DB, S>,\n ): MutationSingleExecution<TableRow<T, DB, S>>\n updateItems(\n partitionKey: K,\n params: UpdateItemsParams<T, TableRow<T, DB, S>, DB, S>,\n ): MutationMultiExecution<TableRow<T, DB, S>>\n upsertItems(\n partitionKey: K,\n params: UpsertItemsParams<T, TableRow<T, DB, S>, DB, S>,\n ): MutationMultiExecution<TableRow<T, DB, S>>\n deleteItem(partitionKey: K, params: DeleteItemParams<TableRow<T, DB, S>>): MutationSingleExecution<TableRow<T, DB, S>>\n deleteItems(\n partitionKey: K,\n params: DeleteItemsParams<TableRow<T, DB, S>>,\n ): MutationMultiExecution<TableRow<T, DB, S>>\n}\n\n/**\n * Type for an entity instance for a specific table\n * @deprecated Use IEntity<T, DB, S> instead\n */\nexport type EntityType<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n> = IEntity<T, DB, S>\n","/**\n * Shared internal functions for Entity and PartitionedEntity (DRY)\n */\n\nimport {\n addEntities,\n deleteEntities,\n deleteEntity,\n softDeleteEntities,\n softDeleteEntity,\n updateEntity,\n upsertEntities,\n} from \"@/query\"\nimport type { EntityWhereConditions, WhereConditions } from \"@/query/Query\"\nimport { createQuery } from \"@/query/QueryBuilder\"\nimport type {\n Database,\n DatabaseSchema,\n SchemaNames,\n SupabaseClientType,\n TableNames,\n TableRow,\n TableUpdate,\n} from \"@/types\"\n\nimport type { FPromise, List, TaskOutcome } from \"functype\"\n\nimport type {\n DeleteItemParams,\n DeleteItemsParams,\n GetItemParams,\n GetItemsParams,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n PartitionKey,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\n UpsertItemsParams,\n WhereinParams,\n} from \"./types\"\nimport { MultiMutationQuery, SingleMutationQuery } from \"./types\"\n\n// =============================================================================\n// Soft Delete Mode Types\n// =============================================================================\n\nexport type SoftDeleteMode = \"exclude\" | \"include\"\n\nexport function getSoftDeleteMode(softDelete: boolean): SoftDeleteMode {\n return softDelete ? \"exclude\" : \"include\"\n}\n\n// =============================================================================\n// Where Condition Builders\n// =============================================================================\n\n/**\n * Builds where conditions with partition key merged in\n */\nexport function buildWhereWithPartition<T extends object>(\n partitionField: string,\n partitionKey: PartitionKey,\n where?: EntityWhereConditions<T>,\n): WhereConditions<T> {\n const partitionCondition = { [partitionField]: partitionKey as string }\n return { ...partitionCondition, ...where } as WhereConditions<T>\n}\n\n/**\n * Builds where conditions with partition key and id\n */\nexport function buildWhereWithPartitionAndId<T extends object>(\n partitionField: string,\n partitionKey: PartitionKey,\n id: string,\n where?: EntityWhereConditions<T>,\n): WhereConditions<T> {\n const partitionCondition = { [partitionField]: partitionKey as string }\n return { ...partitionCondition, ...where, id } as WhereConditions<T>\n}\n\n// =============================================================================\n// Query Creation Functions\n// =============================================================================\n\n/**\n * Creates a getItem query (single item by id)\n */\nexport function createGetItemQuery<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB, S>>,\n is: TypedRecord<TableRow<T, DB, S>, null | boolean> | undefined,\n softDeleteMode: SoftDeleteMode,\n schema?: string,\n) {\n return createQuery<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as TypedRecord<TableRow<T, DB>, null | boolean> | undefined,\n undefined,\n undefined,\n {\n mode: softDeleteMode,\n appliedByDefault: true,\n },\n schema,\n )\n}\n\n/**\n * Creates a getItems query (multiple items)\n */\nexport function createGetItemsQuery<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB, S>>,\n is: TypedRecord<TableRow<T, DB, S>, null | boolean> | undefined,\n wherein: TypedRecord<TableRow<T, DB, S>, unknown[]> | undefined,\n order: GetItemsParams<TableRow<T, DB, S>>[\"order\"],\n softDeleteMode: SoftDeleteMode,\n schema?: string,\n) {\n return createQuery<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as TypedRecord<TableRow<T, DB>, null | boolean> | undefined,\n wherein as TypedRecord<TableRow<T, DB>, unknown[]> | undefined,\n order as GetItemsParams<TableRow<T, DB>>[\"order\"],\n {\n mode: softDeleteMode,\n appliedByDefault: true,\n },\n schema,\n )\n}\n\n// =============================================================================\n// Mutation Functions\n// =============================================================================\n\n/**\n * Creates an addItems mutation\n */\nexport function createAddItemsMutation<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n items: TableRow<T, DB, S>[],\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB, S>> {\n return MultiMutationQuery(\n addEntities<T, DB>(client, name, items as TableRow<T, DB>[], schema) as FPromise<\n TaskOutcome<List<TableRow<T, DB, S>>>\n >,\n )\n}\n\n/**\n * Creates an updateItem mutation\n */\nexport function createUpdateItemMutation<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n item: TableUpdate<T, DB, S>,\n whereConditions: WhereConditions<TableRow<T, DB, S>>,\n is: IsParams<TableRow<T, DB, S>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB, S>>[\"wherein\"],\n schema?: string,\n): MutationSingleExecution<TableRow<T, DB, S>> {\n return SingleMutationQuery(\n updateEntity<T, DB>(\n client,\n name,\n item as TableUpdate<T, DB>,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as IsParams<TableRow<T, DB>>[\"is\"],\n wherein as WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema,\n ) as FPromise<TaskOutcome<TableRow<T, DB, S>>>,\n )\n}\n\n/**\n * Creates an updateItems mutation (Prisma-style: update all matching rows with same data)\n */\nexport function createUpdateItemsMutation<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n data: TableUpdate<T, DB, S>,\n where: WhereConditions<TableRow<T, DB, S>>,\n is: IsParams<TableRow<T, DB, S>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB, S>>[\"wherein\"],\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB, S>> {\n // Use upsertEntities with single-item array - updates all matching rows with same data\n return MultiMutationQuery(\n upsertEntities<T, DB>(\n client,\n name,\n [data] as TableUpdate<T, DB>[],\n undefined,\n where as WhereConditions<TableRow<T, DB>>,\n is as IsParams<TableRow<T, DB>>[\"is\"],\n wherein as WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema,\n ) as FPromise<TaskOutcome<List<TableRow<T, DB, S>>>>,\n )\n}\n\n/**\n * Creates an upsertItems mutation (batch upsert: each item gets its own data)\n */\nexport function createUpsertItemsMutation<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n items: TableUpdate<T, DB, S>[],\n identity: (keyof TableRow<T, DB, S> & string) | (keyof TableRow<T, DB, S> & string)[],\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB, S>> {\n return MultiMutationQuery(\n upsertEntities<T, DB>(\n client,\n name,\n items as TableUpdate<T, DB>[],\n identity as (keyof TableRow<T, DB> & string) | (keyof TableRow<T, DB> & string)[],\n undefined,\n undefined,\n undefined,\n schema,\n ) as FPromise<TaskOutcome<List<TableRow<T, DB, S>>>>,\n )\n}\n\n// =============================================================================\n// Entity Method Factories (for maximum DRY)\n// =============================================================================\n\n/**\n * Creates getItem method for Entity (no partition)\n */\nexport function makeGetItem<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, softDeleteMode: SoftDeleteMode, schema?: string) {\n return function getItem({ id, where, is }: GetItemParams<TableRow<T, DB, S>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T, DB, S>>\n return createGetItemQuery<T, DB, S>(client, name, whereConditions, is, softDeleteMode, schema)\n }\n}\n\n/**\n * Creates getItems method for Entity (no partition)\n */\nexport function makeGetItems<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, softDeleteMode: SoftDeleteMode, schema?: string) {\n return function getItems({ where, is, wherein, order }: GetItemsParams<TableRow<T, DB, S>> = {}) {\n return createGetItemsQuery<T, DB, S>(\n client,\n name,\n where as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n order,\n softDeleteMode,\n schema,\n )\n }\n}\n\n/**\n * Creates getItem method for PartitionedEntity\n */\nexport function makePartitionedGetItem<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDeleteMode: SoftDeleteMode, schema?: string) {\n return function getItem(partitionKey: K, { id, where, is }: GetItemParams<TableRow<T, DB, S>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createGetItemQuery<T, DB, S>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB, S>>,\n is,\n softDeleteMode,\n schema,\n )\n }\n}\n\n/**\n * Creates getItems method for PartitionedEntity\n */\nexport function makePartitionedGetItems<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDeleteMode: SoftDeleteMode, schema?: string) {\n return function getItems(partitionKey: K, { where, is, wherein, order }: GetItemsParams<TableRow<T, DB, S>> = {}) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createGetItemsQuery<T, DB, S>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n order,\n softDeleteMode,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItem method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItem<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, schema?: string) {\n return function updateItem({ where, data, is, wherein }: UpdateItemParams<T, TableRow<T, DB, S>, DB, S>) {\n return createUpdateItemMutation<T, DB, S>(\n client,\n name,\n data,\n where as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItem method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItem<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, schema?: string) {\n return function updateItem(\n partitionKey: K,\n { where, data, is, wherein }: UpdateItemParams<T, TableRow<T, DB, S>, DB, S>,\n ) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemMutation<T, DB, S>(\n client,\n name,\n data,\n whereConditions as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItems method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItems<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, schema?: string) {\n return function updateItems({ where, data, is, wherein }: UpdateItemsParams<T, TableRow<T, DB, S>, DB, S>) {\n return createUpdateItemsMutation<T, DB, S>(\n client,\n name,\n data,\n where as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates updateItems method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItems<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, schema?: string) {\n return function updateItems(\n partitionKey: K,\n { where, data, is, wherein }: UpdateItemsParams<T, TableRow<T, DB, S>, DB, S>,\n ) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemsMutation<T, DB, S>(\n client,\n name,\n data,\n whereConditions as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n schema,\n )\n }\n}\n\n/**\n * Creates addItems method (same for both Entity and PartitionedEntity)\n */\nexport function makeAddItems<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, schema?: string) {\n return function addItems({ items }: { items: TableRow<T, DB, S>[] }) {\n return createAddItemsMutation<T, DB, S>(client, name, items, schema)\n }\n}\n\n/**\n * Creates upsertItems method for Entity (no partition) - batch upsert with identity\n */\nexport function makeUpsertItems<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, schema?: string) {\n return function upsertItems({\n items,\n identity = \"id\" as keyof TableRow<T, DB, S> & string,\n }: UpsertItemsParams<T, TableRow<T, DB, S>, DB, S>) {\n return createUpsertItemsMutation<T, DB, S>(client, name, items, identity, schema)\n }\n}\n\n/**\n * Creates upsertItems method for PartitionedEntity - batch upsert with identity\n */\nexport function makePartitionedUpsertItems<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, _partitionField: string, schema?: string) {\n return function upsertItems(\n _partitionKey: K,\n { items, identity = \"id\" as keyof TableRow<T, DB, S> & string }: UpsertItemsParams<T, TableRow<T, DB, S>, DB, S>,\n ) {\n // Note: partitionKey is passed but items should already contain the partition field value\n // This maintains API consistency with other partitioned methods\n return createUpsertItemsMutation<T, DB, S>(client, name, items, identity, schema)\n }\n}\n\n// =============================================================================\n// Delete Mutation Functions\n// =============================================================================\n\n/**\n * Creates a deleteItem mutation - supports both soft and hard delete\n */\nexport function createDeleteItemMutation<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB, S>>,\n is: IsParams<TableRow<T, DB, S>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB, S>>[\"wherein\"],\n softDelete: boolean,\n schema?: string,\n): MutationSingleExecution<TableRow<T, DB, S>> {\n const operation = softDelete\n ? softDeleteEntity<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as IsParams<TableRow<T, DB>>[\"is\"],\n wherein as WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema,\n )\n : deleteEntity<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as IsParams<TableRow<T, DB>>[\"is\"],\n wherein as WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema,\n )\n return SingleMutationQuery(operation as FPromise<TaskOutcome<TableRow<T, DB, S>>>)\n}\n\n/**\n * Creates a deleteItems mutation - supports both soft and hard delete\n */\nexport function createDeleteItemsMutation<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n whereConditions: WhereConditions<TableRow<T, DB, S>>,\n is: IsParams<TableRow<T, DB, S>>[\"is\"],\n wherein: WhereinParams<TableRow<T, DB, S>>[\"wherein\"],\n softDelete: boolean,\n schema?: string,\n): MutationMultiExecution<TableRow<T, DB, S>> {\n const operation = softDelete\n ? softDeleteEntities<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as IsParams<TableRow<T, DB>>[\"is\"],\n wherein as WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema,\n )\n : deleteEntities<T, DB>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB>>,\n is as IsParams<TableRow<T, DB>>[\"is\"],\n wherein as WhereinParams<TableRow<T, DB>>[\"wherein\"],\n schema,\n )\n return MultiMutationQuery(operation as FPromise<TaskOutcome<List<TableRow<T, DB, S>>>>)\n}\n\n// =============================================================================\n// Delete Method Factories\n// =============================================================================\n\n/**\n * Creates deleteItem method for Entity (no partition)\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makeDeleteItem<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, softDelete: boolean, schema?: string) {\n return function deleteItem({ where, is, wherein }: DeleteItemParams<TableRow<T, DB, S>>) {\n return createDeleteItemMutation<T, DB, S>(\n client,\n name,\n where as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n\n/**\n * Creates deleteItems method for Entity (no partition)\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makeDeleteItems<\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, softDelete: boolean, schema?: string) {\n return function deleteItems({ where, is, wherein }: DeleteItemsParams<TableRow<T, DB, S>>) {\n return createDeleteItemsMutation<T, DB, S>(\n client,\n name,\n where as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n\n/**\n * Creates deleteItem method for PartitionedEntity\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makePartitionedDeleteItem<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDelete: boolean, schema?: string) {\n return function deleteItem(partitionKey: K, { where, is, wherein }: DeleteItemParams<TableRow<T, DB, S>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createDeleteItemMutation<T, DB, S>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n\n/**\n * Creates deleteItems method for PartitionedEntity\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n */\nexport function makePartitionedDeleteItems<\n T extends TableNames<DB, S>,\n K extends PartitionKey,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(client: SupabaseClientType<DB>, name: T, partitionField: string, softDelete: boolean, schema?: string) {\n return function deleteItems(partitionKey: K, { where, is, wherein }: DeleteItemsParams<TableRow<T, DB, S>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createDeleteItemsMutation<T, DB, S>(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T, DB, S>>,\n is,\n wherein,\n softDelete,\n schema,\n )\n }\n}\n","/**\n * Entity - Standard entity without partition\n *\n * Use this for global/shared data that doesn't require partition-based isolation.\n * For multi-tenant data, use PartitionedEntity instead.\n *\n * @example\n * ```typescript\n * // Create a global entity\n * const TenantEntity = Entity<\"tenants\">(client, \"tenants\", {\n * softDelete: true\n * })\n *\n * // Query without partition key\n * const tenants = await TenantEntity.getItems({ where: { status: \"active\" } }).many()\n * const tenant = await TenantEntity.getItem({ id: \"123\" }).one()\n * ```\n */\n\nimport type { Database, DatabaseSchema, SchemaNames, SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makeDeleteItem,\n makeDeleteItems,\n makeGetItem,\n makeGetItems,\n makeUpdateItem,\n makeUpdateItems,\n makeUpsertItems,\n} from \"./core\"\nimport type { EntityConfig, IEntity } from \"./types\"\n\n// Re-export types for backwards compatibility\nexport type {\n AddItemsParams,\n DeleteItemParams,\n DeleteItemsParams,\n EntityConfig,\n EntityType,\n GetItemParams,\n GetItemsParams,\n IdParam,\n IEntity,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n OrderParams,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\n UpsertItemsParams,\n WhereinParams,\n WhereParams,\n} from \"./types\"\nexport { MultiMutationQuery, SingleMutationQuery } from \"./types\"\n\n/**\n * Creates an entity interface with methods for interacting with the given table.\n *\n * @param client The Supabase client instance to use for queries.\n * @param name The name of the table to interact with.\n * @param config Configuration for entity behavior.\n * @returns An object with methods for interacting with the table.\n *\n * @typeParam T - The table name type\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n * @typeParam S - The schema name (defaults to \"public\")\n *\n * @example\n * ```typescript\n * // Using default public schema\n * const Users = Entity<\"users\">(client, \"users\", { softDelete: false })\n *\n * // Using a custom schema\n * const Tokens = Entity<\"provider_tokens\", Database, \"agent_todo\">(\n * client, \"provider_tokens\", { softDelete: false }\n * )\n * ```\n */\nexport const Entity = <\n T extends TableNames<DB, S>,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n config: EntityConfig,\n): IEntity<T, DB, S> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { schema } = config\n\n return {\n /**\n * Retrieve a single item from the table by ID.\n * @param params Query parameters including id, where conditions, and is conditions\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItem: makeGetItem<T, DB, S>(client, name, softDeleteMode, schema),\n\n /**\n * Get a list of items from the table filtered by conditions.\n * @param params Optional query parameters including where, is, wherein, and order\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItems: makeGetItems<T, DB, S>(client, name, softDeleteMode, schema),\n\n /**\n * Adds multiple items to the table.\n * @param params Parameters including items array\n * @returns A mutation query with OrThrow methods\n */\n addItems: makeAddItems<T, DB, S>(client, name, schema),\n\n /**\n * Update a single item in the table.\n * @param params Update parameters including id, item data, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItem: makeUpdateItem<T, DB, S>(client, name, schema),\n\n /**\n * Update multiple items in the table.\n * @param params Update parameters including items array, identity, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItems: makeUpdateItems<T, DB, S>(client, name, schema),\n\n /**\n * Upsert multiple items with different data per row.\n * @param params Upsert parameters including items array and identity columns\n * @returns A mutation query with OrThrow methods\n */\n upsertItems: makeUpsertItems<T, DB, S>(client, name, schema),\n\n /**\n * Delete a single item from the table.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted row\n */\n deleteItem: makeDeleteItem<T, DB, S>(client, name, config.softDelete, schema),\n\n /**\n * Delete multiple items from the table.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted rows\n */\n deleteItems: makeDeleteItems<T, DB, S>(client, name, config.softDelete, schema),\n }\n}\n","/**\n * PartitionedEntity - Entity with partition key required on every call\n *\n * Use this for multi-tenant or partitioned data where every query must be scoped\n * to a specific partition (e.g., tenant_id, organization_id, etc.)\n *\n * Supports branded types via functype's Brand/ValidatedBrand for type-safe partition keys.\n *\n * @example\n * ```typescript\n * import { ValidatedBrand } from \"functype\"\n *\n * // Define a branded partition key type\n * const TenantId = ValidatedBrand(\"TenantId\", isValidUuid)\n * type TenantId = ReturnType<typeof TenantId.of> extends Option<infer T> ? T : never\n *\n * // Create a partitioned entity\n * const UserEntity = PartitionedEntity<\"users\", TenantId>(client, \"users\", {\n * partitionField: \"tenant_id\",\n * softDelete: true\n * })\n *\n * // All queries require the partition key\n * const users = await UserEntity.getItems(tenantId, { where: { status: \"active\" } }).many()\n * const user = await UserEntity.getItem(tenantId, { id: \"123\" }).one()\n * ```\n */\n\nimport type { Database, DatabaseSchema, SchemaNames, SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makePartitionedDeleteItem,\n makePartitionedDeleteItems,\n makePartitionedGetItem,\n makePartitionedGetItems,\n makePartitionedUpdateItem,\n makePartitionedUpdateItems,\n makePartitionedUpsertItems,\n} from \"./core\"\nimport type { IPartitionedEntity, PartitionedEntityConfig, PartitionKey } from \"./types\"\n\n/**\n * Creates a partitioned entity interface where all queries require a partition key.\n *\n * @param client The Supabase client instance to use for queries.\n * @param name The name of the table to interact with.\n * @param config Configuration including partition field and soft delete behavior.\n * @returns An object with methods for interacting with the partitioned table.\n *\n * @typeParam T - The table name type\n * @typeParam K - The partition key type (string or branded type)\n * @typeParam DB - The database schema type (defaults to placeholder Database)\n * @typeParam S - The schema name (defaults to \"public\")\n *\n * @example\n * ```typescript\n * // Using default public schema\n * const UserEntity = PartitionedEntity<\"users\", TenantId>(client, \"users\", {\n * partitionField: \"tenant_id\",\n * softDelete: true\n * })\n *\n * // Using a custom schema\n * const TaskEntity = PartitionedEntity<\"tasks\", TenantId, Database, \"agent_todo\">(\n * client, \"tasks\", { partitionField: \"user_id\", softDelete: false }\n * )\n * ```\n */\nexport const PartitionedEntity = <\n T extends TableNames<DB, S>,\n K extends PartitionKey = string,\n DB extends DatabaseSchema = Database,\n S extends SchemaNames<DB> = \"public\" & SchemaNames<DB>,\n>(\n client: SupabaseClientType<DB>,\n name: T,\n config: PartitionedEntityConfig,\n): IPartitionedEntity<T, K, DB, S> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { partitionField, schema } = config\n\n return {\n /**\n * Retrieve a single item from the table by ID within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Query parameters including id, where conditions, and is conditions\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItem: makePartitionedGetItem<T, K, DB, S>(client, name, partitionField, softDeleteMode, schema),\n\n /**\n * Get a list of items from the table within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Optional query parameters including where, is, wherein, and order\n * @returns A chainable query that can be executed with .one(), .many(), or .first()\n */\n getItems: makePartitionedGetItems<T, K, DB, S>(client, name, partitionField, softDeleteMode, schema),\n\n /**\n * Adds multiple items to the table.\n * Note: Items should include the partition key value in their data.\n * @param params Parameters including items array\n * @returns A mutation query with OrThrow methods\n */\n addItems: makeAddItems<T, DB, S>(client, name, schema),\n\n /**\n * Update a single item in the table within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Update parameters including id, item data, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItem: makePartitionedUpdateItem<T, K, DB, S>(client, name, partitionField, schema),\n\n /**\n * Update multiple items in the table within a partition.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Update parameters including items array, identity, and optional filters\n * @returns A mutation query with OrThrow methods\n */\n updateItems: makePartitionedUpdateItems<T, K, DB, S>(client, name, partitionField, schema),\n\n /**\n * Upsert multiple items with different data per row within a partition.\n * Note: Items should include the partition key value in their data.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Upsert parameters including items array and identity columns\n * @returns A mutation query with OrThrow methods\n */\n upsertItems: makePartitionedUpsertItems<T, K, DB, S>(client, name, partitionField, schema),\n\n /**\n * Delete a single item from the table within a partition.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted row\n */\n deleteItem: makePartitionedDeleteItem<T, K, DB, S>(client, name, partitionField, config.softDelete, schema),\n\n /**\n * Delete multiple items from the table within a partition.\n * When softDelete is true, sets the deleted timestamp instead of hard deleting.\n * @param partitionKey The partition key value (e.g., tenantId)\n * @param params Delete parameters including where conditions\n * @returns A mutation query with OrThrow methods, returns deleted rows\n */\n deleteItems: makePartitionedDeleteItems<T, K, DB, S>(client, name, partitionField, config.softDelete, schema),\n }\n}\n"],"names":["wrapAsync","query"],"mappings":"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"}
|