supabase-typed-query 0.3.2 → 0.4.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 CHANGED
@@ -724,9 +724,9 @@ function createUpdateItemMutation(client, name, item, whereConditions, is, where
724
724
  updateEntity(client, name, item, whereConditions, is, wherein)
725
725
  );
726
726
  }
727
- function createUpdateItemsMutation(client, name, items, identity, where, is, wherein) {
727
+ function createUpdateItemsMutation(client, name, data, where, is, wherein) {
728
728
  return MultiMutationQuery(
729
- updateEntities(client, name, items, identity, where, is, wherein)
729
+ updateEntities(client, name, [data], void 0, where, is, wherein)
730
730
  );
731
731
  }
732
732
  function makeGetItem(client, name, softDeleteMode) {
@@ -761,40 +761,25 @@ function makePartitionedGetItems(client, name, partitionField, softDeleteMode) {
761
761
  };
762
762
  }
763
763
  function makeUpdateItem(client, name) {
764
- return function updateItem({ id, item, where, is, wherein }) {
765
- const whereConditions = { ...where, id };
766
- return createUpdateItemMutation(client, name, item, whereConditions, is, wherein);
764
+ return function updateItem({ where, data, is, wherein }) {
765
+ return createUpdateItemMutation(client, name, data, where, is, wherein);
767
766
  };
768
767
  }
769
768
  function makePartitionedUpdateItem(client, name, partitionField) {
770
- return function updateItem(partitionKey, { id, item, where, is, wherein }) {
771
- const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where);
772
- return createUpdateItemMutation(client, name, item, whereConditions, is, wherein);
769
+ return function updateItem(partitionKey, { where, data, is, wherein }) {
770
+ const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where);
771
+ return createUpdateItemMutation(client, name, data, whereConditions, is, wherein);
773
772
  };
774
773
  }
775
774
  function makeUpdateItems(client, name) {
776
- return function updateItems({
777
- items,
778
- identity = "id",
779
- where,
780
- is,
781
- wherein
782
- }) {
783
- return createUpdateItemsMutation(client, name, items, identity, where, is, wherein);
775
+ return function updateItems({ where, data, is, wherein }) {
776
+ return createUpdateItemsMutation(client, name, data, where, is, wherein);
784
777
  };
785
778
  }
786
779
  function makePartitionedUpdateItems(client, name, partitionField) {
787
- return function updateItems(partitionKey, { items, identity = "id", where, is, wherein }) {
780
+ return function updateItems(partitionKey, { where, data, is, wherein }) {
788
781
  const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where);
789
- return createUpdateItemsMutation(
790
- client,
791
- name,
792
- items,
793
- identity,
794
- whereConditions,
795
- is,
796
- wherein
797
- );
782
+ return createUpdateItemsMutation(client, name, data, whereConditions, is, wherein);
798
783
  };
799
784
  }
800
785
  function makeAddItems(client, name) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/errors.ts","../src/query/QueryBuilder.ts","../src/query/Query.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 { 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>(\n client: SupabaseClientType,\n config: QueryBuilderConfig<T>,\n): Query<T> => {\n /**\n * Build the Supabase query from accumulated conditions\n */\n const buildSupabaseQuery = () => {\n const { table, conditions, order, limit, offset } = config\n\n // Start with base query (just the table reference)\n const baseQuery = 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>): 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> & 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>[]): 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>[] = []\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>>,\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>>, is?: IsConditions<TableRow<T>>): Query<T> => {\n const newConditions = [...config.conditions, { where, is }]\n return QueryBuilder(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> => {\n const newConditions = [\n ...config.conditions,\n {\n where: { id: id as unknown } as unknown as WhereConditions<TableRow<T>>,\n },\n ]\n return QueryBuilder(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> => {\n return QueryBuilder(client, config).or({\n id: id as unknown,\n } as unknown as WhereConditions<TableRow<T>>)\n },\n\n /**\n * Apply mapping function to query results\n */\n map: <U>(fn: (item: TableRow<T>) => U): MappedQuery<U> => {\n return createMappedQuery(QueryBuilder(client, config), fn)\n },\n\n /**\n * Apply filter function to query results\n */\n filter: (predicate: (item: TableRow<T>) => boolean): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n filterFn: config.filterFn ? (item: TableRow<T>) => config.filterFn!(item) && predicate(item) : predicate,\n })\n },\n\n /**\n * Limit the number of results\n */\n limit: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n limit: count,\n })\n },\n\n /**\n * Offset the results for pagination\n */\n offset: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n offset: count,\n })\n },\n\n /**\n * Include all records (no soft delete filter)\n */\n includeDeleted: (): Query<T> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"include\") {\n log.warn(`[${config.table}] includeDeleted() called but already including deleted by default`)\n }\n return QueryBuilder(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> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"exclude\") {\n log.warn(`[${config.table}] excludeDeleted() called but already excluding deleted by default`)\n }\n return QueryBuilder(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> => {\n return QueryBuilder(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>>>> => {\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>>>(toError(error))\n }\n\n const result = data as TableRow<T>\n const filteredResult = config.filterFn ? config.filterFn(result) : true\n\n if (!filteredResult) {\n return Ok(Option.none<TableRow<T>>())\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting zero or more results\n */\n many: (): FPromise<TaskOutcome<List<TableRow<T>>>> => {\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>>>(toError(error))\n }\n\n const rawResults = data as TableRow<T>[]\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting first result from potentially multiple\n */\n first: (): FPromise<TaskOutcome<Option<TableRow<T>>>> => {\n return wrapAsync(async () => {\n const manyResult = await QueryBuilder(client, config).many()\n const list = manyResult.orThrow()\n if (list.isEmpty) {\n return Ok(Option.none<TableRow<T>>())\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>> => {\n const result = await QueryBuilder(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>>> => {\n const result = await QueryBuilder(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>> => {\n const result = await QueryBuilder(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, U>(\n sourceQuery: Query<T>,\n mapFn: (item: TableRow<T>) => U,\n): MappedQuery<U> => {\n return {\n map: <V>(fn: (item: U) => V): MappedQuery<V> => {\n return createMappedQuery(sourceQuery, (item: TableRow<T>) => fn(mapFn(item)))\n },\n\n filter: (predicate: (item: U) => boolean): MappedQuery<U> => {\n const filteredQuery = sourceQuery.filter((item: TableRow<T>) => predicate(mapFn(item)))\n return createMappedQuery(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>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditions<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n softDeleteConfig?: { mode?: \"include\" | \"exclude\" | \"only\"; appliedByDefault?: boolean },\n): Query<T> => {\n const config: QueryBuilderConfig<T> = {\n table,\n conditions: [{ where, is, wherein }],\n order,\n softDeleteMode: softDeleteConfig?.mode,\n softDeleteAppliedByDefault: softDeleteConfig?.appliedByDefault,\n }\n return QueryBuilder(client, config)\n}\n","import type { 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// 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// Core Query interface with branded type support\nexport interface Query<T extends TableNames> {\n // Execution methods - explicit about expected results\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<TableRow<T>>\n manyOrThrow(): Promise<List<TableRow<T>>>\n firstOrThrow(): Promise<TableRow<T>>\n\n // Query composition - chainable OR logic with type-safe where conditions\n or(where: WhereConditions<TableRow<T>>, is?: IsConditions<TableRow<T>>): Query<T>\n\n // Branded type-aware query methods (simplified)\n whereId<ID extends Brand<string, string>>(id: ID): Query<T>\n orWhereId<ID extends Brand<string, string>>(id: ID): Query<T>\n\n // Functional operations - maintain composability\n map<U>(fn: (item: TableRow<T>) => U): MappedQuery<U>\n filter(predicate: (item: TableRow<T>) => boolean): Query<T>\n\n // Pagination\n limit(count: number): Query<T>\n offset(count: number): Query<T>\n\n // Soft delete filtering\n includeDeleted(): Query<T>\n excludeDeleted(): Query<T>\n onlyDeleted(): Query<T>\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// Query condition for internal state management with type-safe where\nexport interface QueryCondition<T extends TableNames> {\n where: WhereConditions<TableRow<T>>\n is?: IsConditions<TableRow<T>>\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>\n // Comparison operators\n gt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n gte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n neq?: Partial<Record<keyof TableRow<T>, unknown>>\n // Pattern matching\n like?: Partial<Record<keyof TableRow<T>, string>>\n ilike?: Partial<Record<keyof TableRow<T>, string>>\n}\n\n// Entity-specific query interfaces for better type safety\nexport interface EntityQuery<T extends TableNames> extends Query<T> {\n // Entity-specific methods can be added here\n normalize(): NormalizedQuery<T>\n}\n\nexport interface NormalizedQuery<T extends TableNames> {\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n}\n\n// Type guards for runtime type checking\nexport const isQuery = <T extends TableNames>(obj: unknown): obj is Query<T> => {\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// Utility types for query parameters with type safety\nexport type QueryWhereParams<T extends TableNames> = WhereConditions<TableRow<T>>\nexport type QueryIsParams<T extends TableNames> = IsConditions<TableRow<T>>\nexport type QueryWhereinParams<T extends TableNames> = Partial<Record<keyof TableRow<T>, unknown[]>>\nexport type QueryOrderParams<T extends TableNames> = [\n keyof TableRow<T> & string,\n { ascending?: boolean; nullsFirst?: boolean },\n]\n\n// Builder configuration for query construction\nexport interface QueryBuilderConfig<T extends TableNames> {\n table: T\n conditions: QueryCondition<T>[]\n order?: QueryOrderParams<T>\n mapFn?: (item: TableRow<T>) => unknown\n filterFn?: (item: TableRow<T>) => boolean\n limit?: number\n offset?: number\n softDeleteMode?: SoftDeleteMode\n softDeleteAppliedByDefault?: boolean\n}\n","import type { EmptyObject, SupabaseClientType, TableInsert, TableNames, TableRow, TableUpdate } from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok } from \"functype\"\n\nimport type { Query, WhereConditions } from \"./Query\"\nimport { createQuery } from \"./QueryBuilder\"\n\n// Re-export query types\nexport type {\n ComparisonOperators,\n EntityQuery,\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// 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 * @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 * @returns A promise resolving to the entity if found\n */\nexport const getEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Retrieves multiple entities from the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the entities if found\n */\nexport const getEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }] = [\n \"id\" as keyof TableRow<T> & string,\n { ascending: true },\n ],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Adds multiple entities to the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to insert into\n * @param entities - The entities to add\n * @returns A promise resolving to the added entities\n */\nexport const addEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableInsert<T>[],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data, error } = await (client.from(table) as any).insert(entities as never).select()\n\n if (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n\n return Ok(List(data as unknown as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Updates a single entity in the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the updated entity\n */\nexport const updateEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Updates multiple entities in the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to update\n * @param entities - The entities to update\n * @param identity - The column(s) to use as the identity\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 * @returns A promise resolving to the updated entities\n */\nexport const updateEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>[],\n identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[] = \"id\" as keyof TableRow<T> & string,\n where?: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\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 baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(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 * @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 * @returns A Query<T> 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 */\nexport const query = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n): Query<T> => {\n return createQuery(client, table, where, is, wherein, order)\n}\n","/**\n * Shared type definitions for Entity and PartitionedEntity\n */\n\nimport type { MultiExecution, Query, SingleExecution, WhereConditions } from \"@/query/Query\"\nimport type { 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}\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}\n\n// =============================================================================\n// Base Parameter Types\n// =============================================================================\n\nexport type WhereParams<T extends object = EmptyObject> = {\n where?: WhereConditions<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> = {\n items: TableInsert<T>[]\n}\n\nexport type UpdateItemParams<T extends TableNames, Row extends object = EmptyObject> = IdParam & {\n item: TableUpdate<T>\n} & WhereParams<Row> &\n IsParams<Row> &\n WhereinParams<Row>\n\nexport type UpdateItemsParams<T extends TableNames, Row extends object = EmptyObject> = {\n items: TableUpdate<T>[]\n identity?: (keyof Row & string) | (keyof Row & string)[]\n} & WhereParams<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> = {\n getItem(params: GetItemParams<TableRow<T>>): Query<T>\n getItems(params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Interface for PartitionedEntity instances (requires partition key on calls)\n */\nexport type IPartitionedEntity<T extends TableNames, K extends PartitionKey> = {\n getItem(partitionKey: K, params: GetItemParams<TableRow<T>>): Query<T>\n getItems(partitionKey: K, params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(partitionKey: K, params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(partitionKey: K, params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Type for an entity instance for a specific table\n * @deprecated Use IEntity<T> instead\n */\nexport type EntityType<T extends TableNames> = IEntity<T>\n","/**\n * Shared internal functions for Entity and PartitionedEntity (DRY)\n */\n\nimport { addEntities, updateEntities, updateEntity } from \"@/query\"\nimport type { WhereConditions } from \"@/query/Query\"\nimport { createQuery } from \"@/query/QueryBuilder\"\nimport type { SupabaseClientType, TableNames, TableRow, TableUpdate } from \"@/types\"\n\nimport type { FPromise, List, TaskOutcome } from \"functype\"\n\nimport type {\n GetItemParams,\n GetItemsParams,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n PartitionKey,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\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?: WhereConditions<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?: WhereConditions<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>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, undefined, undefined, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n/**\n * Creates a getItems query (multiple items)\n */\nexport function createGetItemsQuery<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n wherein: TypedRecord<TableRow<T>, unknown[]> | undefined,\n order: GetItemsParams<TableRow<T>>[\"order\"],\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, wherein, order, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n// =============================================================================\n// Mutation Functions\n// =============================================================================\n\n/**\n * Creates an addItems mutation\n */\nexport function createAddItemsMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n items: TableRow<T>[],\n): MutationMultiExecution<TableRow<T>> {\n return MultiMutationQuery(addEntities(client, name, items) as FPromise<TaskOutcome<List<TableRow<T>>>>)\n}\n\n/**\n * Creates an updateItem mutation\n */\nexport function createUpdateItemMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n item: TableUpdate<T>,\n whereConditions: WhereConditions<TableRow<T>>,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationSingleExecution<TableRow<T>> {\n return SingleMutationQuery(\n updateEntity(client, name, item, whereConditions, is, wherein) as FPromise<TaskOutcome<TableRow<T>>>,\n )\n}\n\n/**\n * Creates an updateItems mutation\n */\nexport function createUpdateItemsMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n items: TableUpdate<T>[],\n identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[],\n where: WhereConditions<TableRow<T>> | undefined,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationMultiExecution<TableRow<T>> {\n return MultiMutationQuery(\n updateEntities(client, name, items, identity, where, is, wherein) as FPromise<TaskOutcome<List<TableRow<T>>>>,\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>(client: SupabaseClientType, name: T, softDeleteMode: SoftDeleteMode) {\n return function getItem({ id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T>>\n return createGetItemQuery(client, name, whereConditions, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for Entity (no partition)\n */\nexport function makeGetItems<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems({ where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n return createGetItemsQuery(client, name, where as WhereConditions<TableRow<T>>, is, wherein, order, softDeleteMode)\n }\n}\n\n/**\n * Creates getItem method for PartitionedEntity\n */\nexport function makePartitionedGetItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItem(partitionKey: K, { id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createGetItemQuery(client, name, whereConditions as WhereConditions<TableRow<T>>, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for PartitionedEntity\n */\nexport function makePartitionedGetItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems(partitionKey: K, { where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createGetItemsQuery(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T>>,\n is,\n wherein,\n order,\n softDeleteMode,\n )\n }\n}\n\n/**\n * Creates updateItem method for Entity (no partition)\n */\nexport function makeUpdateItem<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItem({ id, item, where, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T>>\n return createUpdateItemMutation(client, name, item, whereConditions, is, wherein)\n }\n}\n\n/**\n * Creates updateItem method for PartitionedEntity\n */\nexport function makePartitionedUpdateItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItem(partitionKey: K, { id, item, where, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createUpdateItemMutation(client, name, item, whereConditions as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for Entity (no partition)\n */\nexport function makeUpdateItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItems({\n items,\n identity = \"id\" as keyof TableRow<T> & string,\n where,\n is,\n wherein,\n }: UpdateItemsParams<T, TableRow<T>>) {\n return createUpdateItemsMutation(client, name, items, identity, where as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for PartitionedEntity\n */\nexport function makePartitionedUpdateItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItems(\n partitionKey: K,\n { items, identity = \"id\" as keyof TableRow<T> & string, where, is, wherein }: UpdateItemsParams<T, TableRow<T>>,\n ) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemsMutation(\n client,\n name,\n items,\n identity,\n whereConditions as WhereConditions<TableRow<T>>,\n is,\n wherein,\n )\n }\n}\n\n/**\n * Creates addItems method (same for both Entity and PartitionedEntity)\n */\nexport function makeAddItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function addItems({ items }: { items: TableRow<T>[] }) {\n return createAddItemsMutation(client, name, items)\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport { getSoftDeleteMode, makeAddItems, makeGetItem, makeGetItems, makeUpdateItem, makeUpdateItems } from \"./core\"\nimport type { EntityConfig, IEntity } from \"./types\"\n\n// Re-export types for backwards compatibility\nexport type {\n AddItemsParams,\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 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 */\nexport const Entity = <T extends TableNames>(client: SupabaseClientType, name: T, config: EntityConfig): IEntity<T> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\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(client, name, softDeleteMode),\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(client, name, softDeleteMode),\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(client, name),\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(client, name),\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(client, name),\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makePartitionedGetItem,\n makePartitionedGetItems,\n makePartitionedUpdateItem,\n makePartitionedUpdateItems,\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 */\nexport const PartitionedEntity = <T extends TableNames, K extends PartitionKey = string>(\n client: SupabaseClientType,\n name: T,\n config: PartitionedEntityConfig,\n): IPartitionedEntity<T, K> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { partitionField } = 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>(client, name, partitionField, softDeleteMode),\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>(client, name, partitionField, softDeleteMode),\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(client, name),\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>(client, name, partitionField),\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>(client, name, partitionField),\n }\n}\n"],"names":["wrapAsync","query","List","Err","Ok","Option"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/errors.ts","../src/query/QueryBuilder.ts","../src/query/Query.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 { 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>(\n client: SupabaseClientType,\n config: QueryBuilderConfig<T>,\n): Query<T> => {\n /**\n * Build the Supabase query from accumulated conditions\n */\n const buildSupabaseQuery = () => {\n const { table, conditions, order, limit, offset } = config\n\n // Start with base query (just the table reference)\n const baseQuery = 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>): 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> & 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>[]): 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>[] = []\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>>,\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>>, is?: IsConditions<TableRow<T>>): Query<T> => {\n const newConditions = [...config.conditions, { where, is }]\n return QueryBuilder(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> => {\n const newConditions = [\n ...config.conditions,\n {\n where: { id: id as unknown } as unknown as WhereConditions<TableRow<T>>,\n },\n ]\n return QueryBuilder(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> => {\n return QueryBuilder(client, config).or({\n id: id as unknown,\n } as unknown as WhereConditions<TableRow<T>>)\n },\n\n /**\n * Apply mapping function to query results\n */\n map: <U>(fn: (item: TableRow<T>) => U): MappedQuery<U> => {\n return createMappedQuery(QueryBuilder(client, config), fn)\n },\n\n /**\n * Apply filter function to query results\n */\n filter: (predicate: (item: TableRow<T>) => boolean): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n filterFn: config.filterFn ? (item: TableRow<T>) => config.filterFn!(item) && predicate(item) : predicate,\n })\n },\n\n /**\n * Limit the number of results\n */\n limit: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n limit: count,\n })\n },\n\n /**\n * Offset the results for pagination\n */\n offset: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n offset: count,\n })\n },\n\n /**\n * Include all records (no soft delete filter)\n */\n includeDeleted: (): Query<T> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"include\") {\n log.warn(`[${config.table}] includeDeleted() called but already including deleted by default`)\n }\n return QueryBuilder(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> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"exclude\") {\n log.warn(`[${config.table}] excludeDeleted() called but already excluding deleted by default`)\n }\n return QueryBuilder(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> => {\n return QueryBuilder(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>>>> => {\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>>>(toError(error))\n }\n\n const result = data as TableRow<T>\n const filteredResult = config.filterFn ? config.filterFn(result) : true\n\n if (!filteredResult) {\n return Ok(Option.none<TableRow<T>>())\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting zero or more results\n */\n many: (): FPromise<TaskOutcome<List<TableRow<T>>>> => {\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>>>(toError(error))\n }\n\n const rawResults = data as TableRow<T>[]\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting first result from potentially multiple\n */\n first: (): FPromise<TaskOutcome<Option<TableRow<T>>>> => {\n return wrapAsync(async () => {\n const manyResult = await QueryBuilder(client, config).many()\n const list = manyResult.orThrow()\n if (list.isEmpty) {\n return Ok(Option.none<TableRow<T>>())\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>> => {\n const result = await QueryBuilder(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>>> => {\n const result = await QueryBuilder(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>> => {\n const result = await QueryBuilder(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, U>(\n sourceQuery: Query<T>,\n mapFn: (item: TableRow<T>) => U,\n): MappedQuery<U> => {\n return {\n map: <V>(fn: (item: U) => V): MappedQuery<V> => {\n return createMappedQuery(sourceQuery, (item: TableRow<T>) => fn(mapFn(item)))\n },\n\n filter: (predicate: (item: U) => boolean): MappedQuery<U> => {\n const filteredQuery = sourceQuery.filter((item: TableRow<T>) => predicate(mapFn(item)))\n return createMappedQuery(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>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditions<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n softDeleteConfig?: { mode?: \"include\" | \"exclude\" | \"only\"; appliedByDefault?: boolean },\n): Query<T> => {\n const config: QueryBuilderConfig<T> = {\n table,\n conditions: [{ where, is, wherein }],\n order,\n softDeleteMode: softDeleteConfig?.mode,\n softDeleteAppliedByDefault: softDeleteConfig?.appliedByDefault,\n }\n return QueryBuilder(client, config)\n}\n","import type { 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// 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// Core Query interface with branded type support\nexport interface Query<T extends TableNames> {\n // Execution methods - explicit about expected results\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<TableRow<T>>\n manyOrThrow(): Promise<List<TableRow<T>>>\n firstOrThrow(): Promise<TableRow<T>>\n\n // Query composition - chainable OR logic with type-safe where conditions\n or(where: WhereConditions<TableRow<T>>, is?: IsConditions<TableRow<T>>): Query<T>\n\n // Branded type-aware query methods (simplified)\n whereId<ID extends Brand<string, string>>(id: ID): Query<T>\n orWhereId<ID extends Brand<string, string>>(id: ID): Query<T>\n\n // Functional operations - maintain composability\n map<U>(fn: (item: TableRow<T>) => U): MappedQuery<U>\n filter(predicate: (item: TableRow<T>) => boolean): Query<T>\n\n // Pagination\n limit(count: number): Query<T>\n offset(count: number): Query<T>\n\n // Soft delete filtering\n includeDeleted(): Query<T>\n excludeDeleted(): Query<T>\n onlyDeleted(): Query<T>\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// Query condition for internal state management with type-safe where\nexport interface QueryCondition<T extends TableNames> {\n where: WhereConditions<TableRow<T>>\n is?: IsConditions<TableRow<T>>\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>\n // Comparison operators\n gt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n gte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n neq?: Partial<Record<keyof TableRow<T>, unknown>>\n // Pattern matching\n like?: Partial<Record<keyof TableRow<T>, string>>\n ilike?: Partial<Record<keyof TableRow<T>, string>>\n}\n\n// Entity-specific query interfaces for better type safety\nexport interface EntityQuery<T extends TableNames> extends Query<T> {\n // Entity-specific methods can be added here\n normalize(): NormalizedQuery<T>\n}\n\nexport interface NormalizedQuery<T extends TableNames> {\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n}\n\n// Type guards for runtime type checking\nexport const isQuery = <T extends TableNames>(obj: unknown): obj is Query<T> => {\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// Utility types for query parameters with type safety\nexport type QueryWhereParams<T extends TableNames> = WhereConditions<TableRow<T>>\nexport type QueryIsParams<T extends TableNames> = IsConditions<TableRow<T>>\nexport type QueryWhereinParams<T extends TableNames> = Partial<Record<keyof TableRow<T>, unknown[]>>\nexport type QueryOrderParams<T extends TableNames> = [\n keyof TableRow<T> & string,\n { ascending?: boolean; nullsFirst?: boolean },\n]\n\n// Builder configuration for query construction\nexport interface QueryBuilderConfig<T extends TableNames> {\n table: T\n conditions: QueryCondition<T>[]\n order?: QueryOrderParams<T>\n mapFn?: (item: TableRow<T>) => unknown\n filterFn?: (item: TableRow<T>) => boolean\n limit?: number\n offset?: number\n softDeleteMode?: SoftDeleteMode\n softDeleteAppliedByDefault?: boolean\n}\n","import type { EmptyObject, SupabaseClientType, TableInsert, TableNames, TableRow, TableUpdate } from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok } from \"functype\"\n\nimport type { Query, WhereConditions } from \"./Query\"\nimport { createQuery } from \"./QueryBuilder\"\n\n// Re-export query types\nexport type {\n ComparisonOperators,\n EntityQuery,\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// 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 * @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 * @returns A promise resolving to the entity if found\n */\nexport const getEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Retrieves multiple entities from the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the entities if found\n */\nexport const getEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }] = [\n \"id\" as keyof TableRow<T> & string,\n { ascending: true },\n ],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Adds multiple entities to the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to insert into\n * @param entities - The entities to add\n * @returns A promise resolving to the added entities\n */\nexport const addEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableInsert<T>[],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data, error } = await (client.from(table) as any).insert(entities as never).select()\n\n if (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n\n return Ok(List(data as unknown as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Updates a single entity in the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the updated entity\n */\nexport const updateEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Updates multiple entities in the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to update\n * @param entities - The entities to update\n * @param identity - The column(s) to use as the identity\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 * @returns A promise resolving to the updated entities\n */\nexport const updateEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>[],\n identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[] = \"id\" as keyof TableRow<T> & string,\n where?: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\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 baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(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 * @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 * @returns A Query<T> 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 */\nexport const query = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n): Query<T> => {\n return createQuery(client, table, where, is, wherein, order)\n}\n","/**\n * Shared type definitions for Entity and PartitionedEntity\n */\n\nimport type { MultiExecution, Query, SingleExecution, WhereConditions } from \"@/query/Query\"\nimport type { 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}\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}\n\n// =============================================================================\n// Base Parameter Types\n// =============================================================================\n\nexport type WhereParams<T extends object = EmptyObject> = {\n where?: WhereConditions<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> = {\n items: TableInsert<T>[]\n}\n\n/**\n * Prisma-style update params for single item: { where, data }\n */\nexport type UpdateItemParams<T extends TableNames, Row extends object = EmptyObject> = {\n /** Conditions to match the item to update */\n where: WhereConditions<Row>\n /** The data to update */\n data: TableUpdate<T>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Prisma-style update params for multiple items: { where, data }\n */\nexport type UpdateItemsParams<T extends TableNames, Row extends object = EmptyObject> = {\n /** Conditions to match items to update */\n where: WhereConditions<Row>\n /** The data to update on all matched items */\n data: TableUpdate<T>\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> = {\n getItem(params: GetItemParams<TableRow<T>>): Query<T>\n getItems(params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Interface for PartitionedEntity instances (requires partition key on calls)\n */\nexport type IPartitionedEntity<T extends TableNames, K extends PartitionKey> = {\n getItem(partitionKey: K, params: GetItemParams<TableRow<T>>): Query<T>\n getItems(partitionKey: K, params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(partitionKey: K, params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(partitionKey: K, params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Type for an entity instance for a specific table\n * @deprecated Use IEntity<T> instead\n */\nexport type EntityType<T extends TableNames> = IEntity<T>\n","/**\n * Shared internal functions for Entity and PartitionedEntity (DRY)\n */\n\nimport { addEntities, updateEntities, updateEntity } from \"@/query\"\nimport type { WhereConditions } from \"@/query/Query\"\nimport { createQuery } from \"@/query/QueryBuilder\"\nimport type { SupabaseClientType, TableNames, TableRow, TableUpdate } from \"@/types\"\n\nimport type { FPromise, List, TaskOutcome } from \"functype\"\n\nimport type {\n GetItemParams,\n GetItemsParams,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n PartitionKey,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\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?: WhereConditions<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?: WhereConditions<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>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, undefined, undefined, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n/**\n * Creates a getItems query (multiple items)\n */\nexport function createGetItemsQuery<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n wherein: TypedRecord<TableRow<T>, unknown[]> | undefined,\n order: GetItemsParams<TableRow<T>>[\"order\"],\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, wherein, order, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n// =============================================================================\n// Mutation Functions\n// =============================================================================\n\n/**\n * Creates an addItems mutation\n */\nexport function createAddItemsMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n items: TableRow<T>[],\n): MutationMultiExecution<TableRow<T>> {\n return MultiMutationQuery(addEntities(client, name, items) as FPromise<TaskOutcome<List<TableRow<T>>>>)\n}\n\n/**\n * Creates an updateItem mutation\n */\nexport function createUpdateItemMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n item: TableUpdate<T>,\n whereConditions: WhereConditions<TableRow<T>>,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationSingleExecution<TableRow<T>> {\n return SingleMutationQuery(\n updateEntity(client, name, item, whereConditions, is, wherein) as FPromise<TaskOutcome<TableRow<T>>>,\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>(\n client: SupabaseClientType,\n name: T,\n data: TableUpdate<T>,\n where: WhereConditions<TableRow<T>>,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationMultiExecution<TableRow<T>> {\n // Use updateEntities with single-item array - updates all matching rows with same data\n return MultiMutationQuery(\n updateEntities(client, name, [data], undefined, where, is, wherein) as FPromise<TaskOutcome<List<TableRow<T>>>>,\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>(client: SupabaseClientType, name: T, softDeleteMode: SoftDeleteMode) {\n return function getItem({ id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T>>\n return createGetItemQuery(client, name, whereConditions, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for Entity (no partition)\n */\nexport function makeGetItems<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems({ where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n return createGetItemsQuery(client, name, where as WhereConditions<TableRow<T>>, is, wherein, order, softDeleteMode)\n }\n}\n\n/**\n * Creates getItem method for PartitionedEntity\n */\nexport function makePartitionedGetItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItem(partitionKey: K, { id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createGetItemQuery(client, name, whereConditions as WhereConditions<TableRow<T>>, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for PartitionedEntity\n */\nexport function makePartitionedGetItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems(partitionKey: K, { where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createGetItemsQuery(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T>>,\n is,\n wherein,\n order,\n softDeleteMode,\n )\n }\n}\n\n/**\n * Creates updateItem method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItem<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItem({ where, data, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n return createUpdateItemMutation(client, name, data, where as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItem method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItem(partitionKey: K, { where, data, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemMutation(client, name, data, whereConditions as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItems({ where, data, is, wherein }: UpdateItemsParams<T, TableRow<T>>) {\n return createUpdateItemsMutation(client, name, data, where as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItems(partitionKey: K, { where, data, is, wherein }: UpdateItemsParams<T, TableRow<T>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemsMutation(client, name, data, whereConditions as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates addItems method (same for both Entity and PartitionedEntity)\n */\nexport function makeAddItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function addItems({ items }: { items: TableRow<T>[] }) {\n return createAddItemsMutation(client, name, items)\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport { getSoftDeleteMode, makeAddItems, makeGetItem, makeGetItems, makeUpdateItem, makeUpdateItems } from \"./core\"\nimport type { EntityConfig, IEntity } from \"./types\"\n\n// Re-export types for backwards compatibility\nexport type {\n AddItemsParams,\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 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 */\nexport const Entity = <T extends TableNames>(client: SupabaseClientType, name: T, config: EntityConfig): IEntity<T> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\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(client, name, softDeleteMode),\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(client, name, softDeleteMode),\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(client, name),\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(client, name),\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(client, name),\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makePartitionedGetItem,\n makePartitionedGetItems,\n makePartitionedUpdateItem,\n makePartitionedUpdateItems,\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 */\nexport const PartitionedEntity = <T extends TableNames, K extends PartitionKey = string>(\n client: SupabaseClientType,\n name: T,\n config: PartitionedEntityConfig,\n): IPartitionedEntity<T, K> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { partitionField } = 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>(client, name, partitionField, softDeleteMode),\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>(client, name, partitionField, softDeleteMode),\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(client, name),\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>(client, name, partitionField),\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>(client, name, partitionField),\n }\n}\n"],"names":["wrapAsync","query","List","Err","Ok","Option"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -723,9 +723,9 @@ function createUpdateItemMutation(client, name, item, whereConditions, is, where
723
723
  updateEntity(client, name, item, whereConditions, is, wherein)
724
724
  );
725
725
  }
726
- function createUpdateItemsMutation(client, name, items, identity, where, is, wherein) {
726
+ function createUpdateItemsMutation(client, name, data, where, is, wherein) {
727
727
  return MultiMutationQuery(
728
- updateEntities(client, name, items, identity, where, is, wherein)
728
+ updateEntities(client, name, [data], void 0, where, is, wherein)
729
729
  );
730
730
  }
731
731
  function makeGetItem(client, name, softDeleteMode) {
@@ -760,40 +760,25 @@ function makePartitionedGetItems(client, name, partitionField, softDeleteMode) {
760
760
  };
761
761
  }
762
762
  function makeUpdateItem(client, name) {
763
- return function updateItem({ id, item, where, is, wherein }) {
764
- const whereConditions = { ...where, id };
765
- return createUpdateItemMutation(client, name, item, whereConditions, is, wherein);
763
+ return function updateItem({ where, data, is, wherein }) {
764
+ return createUpdateItemMutation(client, name, data, where, is, wherein);
766
765
  };
767
766
  }
768
767
  function makePartitionedUpdateItem(client, name, partitionField) {
769
- return function updateItem(partitionKey, { id, item, where, is, wherein }) {
770
- const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where);
771
- return createUpdateItemMutation(client, name, item, whereConditions, is, wherein);
768
+ return function updateItem(partitionKey, { where, data, is, wherein }) {
769
+ const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where);
770
+ return createUpdateItemMutation(client, name, data, whereConditions, is, wherein);
772
771
  };
773
772
  }
774
773
  function makeUpdateItems(client, name) {
775
- return function updateItems({
776
- items,
777
- identity = "id",
778
- where,
779
- is,
780
- wherein
781
- }) {
782
- return createUpdateItemsMutation(client, name, items, identity, where, is, wherein);
774
+ return function updateItems({ where, data, is, wherein }) {
775
+ return createUpdateItemsMutation(client, name, data, where, is, wherein);
783
776
  };
784
777
  }
785
778
  function makePartitionedUpdateItems(client, name, partitionField) {
786
- return function updateItems(partitionKey, { items, identity = "id", where, is, wherein }) {
779
+ return function updateItems(partitionKey, { where, data, is, wherein }) {
787
780
  const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where);
788
- return createUpdateItemsMutation(
789
- client,
790
- name,
791
- items,
792
- identity,
793
- whereConditions,
794
- is,
795
- wherein
796
- );
781
+ return createUpdateItemsMutation(client, name, data, whereConditions, is, wherein);
797
782
  };
798
783
  }
799
784
  function makeAddItems(client, name) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/utils/errors.ts","../src/query/QueryBuilder.ts","../src/query/Query.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 { 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>(\n client: SupabaseClientType,\n config: QueryBuilderConfig<T>,\n): Query<T> => {\n /**\n * Build the Supabase query from accumulated conditions\n */\n const buildSupabaseQuery = () => {\n const { table, conditions, order, limit, offset } = config\n\n // Start with base query (just the table reference)\n const baseQuery = 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>): 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> & 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>[]): 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>[] = []\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>>,\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>>, is?: IsConditions<TableRow<T>>): Query<T> => {\n const newConditions = [...config.conditions, { where, is }]\n return QueryBuilder(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> => {\n const newConditions = [\n ...config.conditions,\n {\n where: { id: id as unknown } as unknown as WhereConditions<TableRow<T>>,\n },\n ]\n return QueryBuilder(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> => {\n return QueryBuilder(client, config).or({\n id: id as unknown,\n } as unknown as WhereConditions<TableRow<T>>)\n },\n\n /**\n * Apply mapping function to query results\n */\n map: <U>(fn: (item: TableRow<T>) => U): MappedQuery<U> => {\n return createMappedQuery(QueryBuilder(client, config), fn)\n },\n\n /**\n * Apply filter function to query results\n */\n filter: (predicate: (item: TableRow<T>) => boolean): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n filterFn: config.filterFn ? (item: TableRow<T>) => config.filterFn!(item) && predicate(item) : predicate,\n })\n },\n\n /**\n * Limit the number of results\n */\n limit: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n limit: count,\n })\n },\n\n /**\n * Offset the results for pagination\n */\n offset: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n offset: count,\n })\n },\n\n /**\n * Include all records (no soft delete filter)\n */\n includeDeleted: (): Query<T> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"include\") {\n log.warn(`[${config.table}] includeDeleted() called but already including deleted by default`)\n }\n return QueryBuilder(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> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"exclude\") {\n log.warn(`[${config.table}] excludeDeleted() called but already excluding deleted by default`)\n }\n return QueryBuilder(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> => {\n return QueryBuilder(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>>>> => {\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>>>(toError(error))\n }\n\n const result = data as TableRow<T>\n const filteredResult = config.filterFn ? config.filterFn(result) : true\n\n if (!filteredResult) {\n return Ok(Option.none<TableRow<T>>())\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting zero or more results\n */\n many: (): FPromise<TaskOutcome<List<TableRow<T>>>> => {\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>>>(toError(error))\n }\n\n const rawResults = data as TableRow<T>[]\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting first result from potentially multiple\n */\n first: (): FPromise<TaskOutcome<Option<TableRow<T>>>> => {\n return wrapAsync(async () => {\n const manyResult = await QueryBuilder(client, config).many()\n const list = manyResult.orThrow()\n if (list.isEmpty) {\n return Ok(Option.none<TableRow<T>>())\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>> => {\n const result = await QueryBuilder(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>>> => {\n const result = await QueryBuilder(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>> => {\n const result = await QueryBuilder(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, U>(\n sourceQuery: Query<T>,\n mapFn: (item: TableRow<T>) => U,\n): MappedQuery<U> => {\n return {\n map: <V>(fn: (item: U) => V): MappedQuery<V> => {\n return createMappedQuery(sourceQuery, (item: TableRow<T>) => fn(mapFn(item)))\n },\n\n filter: (predicate: (item: U) => boolean): MappedQuery<U> => {\n const filteredQuery = sourceQuery.filter((item: TableRow<T>) => predicate(mapFn(item)))\n return createMappedQuery(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>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditions<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n softDeleteConfig?: { mode?: \"include\" | \"exclude\" | \"only\"; appliedByDefault?: boolean },\n): Query<T> => {\n const config: QueryBuilderConfig<T> = {\n table,\n conditions: [{ where, is, wherein }],\n order,\n softDeleteMode: softDeleteConfig?.mode,\n softDeleteAppliedByDefault: softDeleteConfig?.appliedByDefault,\n }\n return QueryBuilder(client, config)\n}\n","import type { 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// 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// Core Query interface with branded type support\nexport interface Query<T extends TableNames> {\n // Execution methods - explicit about expected results\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<TableRow<T>>\n manyOrThrow(): Promise<List<TableRow<T>>>\n firstOrThrow(): Promise<TableRow<T>>\n\n // Query composition - chainable OR logic with type-safe where conditions\n or(where: WhereConditions<TableRow<T>>, is?: IsConditions<TableRow<T>>): Query<T>\n\n // Branded type-aware query methods (simplified)\n whereId<ID extends Brand<string, string>>(id: ID): Query<T>\n orWhereId<ID extends Brand<string, string>>(id: ID): Query<T>\n\n // Functional operations - maintain composability\n map<U>(fn: (item: TableRow<T>) => U): MappedQuery<U>\n filter(predicate: (item: TableRow<T>) => boolean): Query<T>\n\n // Pagination\n limit(count: number): Query<T>\n offset(count: number): Query<T>\n\n // Soft delete filtering\n includeDeleted(): Query<T>\n excludeDeleted(): Query<T>\n onlyDeleted(): Query<T>\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// Query condition for internal state management with type-safe where\nexport interface QueryCondition<T extends TableNames> {\n where: WhereConditions<TableRow<T>>\n is?: IsConditions<TableRow<T>>\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>\n // Comparison operators\n gt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n gte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n neq?: Partial<Record<keyof TableRow<T>, unknown>>\n // Pattern matching\n like?: Partial<Record<keyof TableRow<T>, string>>\n ilike?: Partial<Record<keyof TableRow<T>, string>>\n}\n\n// Entity-specific query interfaces for better type safety\nexport interface EntityQuery<T extends TableNames> extends Query<T> {\n // Entity-specific methods can be added here\n normalize(): NormalizedQuery<T>\n}\n\nexport interface NormalizedQuery<T extends TableNames> {\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n}\n\n// Type guards for runtime type checking\nexport const isQuery = <T extends TableNames>(obj: unknown): obj is Query<T> => {\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// Utility types for query parameters with type safety\nexport type QueryWhereParams<T extends TableNames> = WhereConditions<TableRow<T>>\nexport type QueryIsParams<T extends TableNames> = IsConditions<TableRow<T>>\nexport type QueryWhereinParams<T extends TableNames> = Partial<Record<keyof TableRow<T>, unknown[]>>\nexport type QueryOrderParams<T extends TableNames> = [\n keyof TableRow<T> & string,\n { ascending?: boolean; nullsFirst?: boolean },\n]\n\n// Builder configuration for query construction\nexport interface QueryBuilderConfig<T extends TableNames> {\n table: T\n conditions: QueryCondition<T>[]\n order?: QueryOrderParams<T>\n mapFn?: (item: TableRow<T>) => unknown\n filterFn?: (item: TableRow<T>) => boolean\n limit?: number\n offset?: number\n softDeleteMode?: SoftDeleteMode\n softDeleteAppliedByDefault?: boolean\n}\n","import type { EmptyObject, SupabaseClientType, TableInsert, TableNames, TableRow, TableUpdate } from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok } from \"functype\"\n\nimport type { Query, WhereConditions } from \"./Query\"\nimport { createQuery } from \"./QueryBuilder\"\n\n// Re-export query types\nexport type {\n ComparisonOperators,\n EntityQuery,\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// 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 * @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 * @returns A promise resolving to the entity if found\n */\nexport const getEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Retrieves multiple entities from the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the entities if found\n */\nexport const getEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }] = [\n \"id\" as keyof TableRow<T> & string,\n { ascending: true },\n ],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Adds multiple entities to the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to insert into\n * @param entities - The entities to add\n * @returns A promise resolving to the added entities\n */\nexport const addEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableInsert<T>[],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data, error } = await (client.from(table) as any).insert(entities as never).select()\n\n if (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n\n return Ok(List(data as unknown as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Updates a single entity in the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the updated entity\n */\nexport const updateEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Updates multiple entities in the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to update\n * @param entities - The entities to update\n * @param identity - The column(s) to use as the identity\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 * @returns A promise resolving to the updated entities\n */\nexport const updateEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>[],\n identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[] = \"id\" as keyof TableRow<T> & string,\n where?: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\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 baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(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 * @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 * @returns A Query<T> 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 */\nexport const query = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n): Query<T> => {\n return createQuery(client, table, where, is, wherein, order)\n}\n","/**\n * Shared type definitions for Entity and PartitionedEntity\n */\n\nimport type { MultiExecution, Query, SingleExecution, WhereConditions } from \"@/query/Query\"\nimport type { 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}\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}\n\n// =============================================================================\n// Base Parameter Types\n// =============================================================================\n\nexport type WhereParams<T extends object = EmptyObject> = {\n where?: WhereConditions<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> = {\n items: TableInsert<T>[]\n}\n\nexport type UpdateItemParams<T extends TableNames, Row extends object = EmptyObject> = IdParam & {\n item: TableUpdate<T>\n} & WhereParams<Row> &\n IsParams<Row> &\n WhereinParams<Row>\n\nexport type UpdateItemsParams<T extends TableNames, Row extends object = EmptyObject> = {\n items: TableUpdate<T>[]\n identity?: (keyof Row & string) | (keyof Row & string)[]\n} & WhereParams<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> = {\n getItem(params: GetItemParams<TableRow<T>>): Query<T>\n getItems(params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Interface for PartitionedEntity instances (requires partition key on calls)\n */\nexport type IPartitionedEntity<T extends TableNames, K extends PartitionKey> = {\n getItem(partitionKey: K, params: GetItemParams<TableRow<T>>): Query<T>\n getItems(partitionKey: K, params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(partitionKey: K, params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(partitionKey: K, params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Type for an entity instance for a specific table\n * @deprecated Use IEntity<T> instead\n */\nexport type EntityType<T extends TableNames> = IEntity<T>\n","/**\n * Shared internal functions for Entity and PartitionedEntity (DRY)\n */\n\nimport { addEntities, updateEntities, updateEntity } from \"@/query\"\nimport type { WhereConditions } from \"@/query/Query\"\nimport { createQuery } from \"@/query/QueryBuilder\"\nimport type { SupabaseClientType, TableNames, TableRow, TableUpdate } from \"@/types\"\n\nimport type { FPromise, List, TaskOutcome } from \"functype\"\n\nimport type {\n GetItemParams,\n GetItemsParams,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n PartitionKey,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\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?: WhereConditions<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?: WhereConditions<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>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, undefined, undefined, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n/**\n * Creates a getItems query (multiple items)\n */\nexport function createGetItemsQuery<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n wherein: TypedRecord<TableRow<T>, unknown[]> | undefined,\n order: GetItemsParams<TableRow<T>>[\"order\"],\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, wherein, order, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n// =============================================================================\n// Mutation Functions\n// =============================================================================\n\n/**\n * Creates an addItems mutation\n */\nexport function createAddItemsMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n items: TableRow<T>[],\n): MutationMultiExecution<TableRow<T>> {\n return MultiMutationQuery(addEntities(client, name, items) as FPromise<TaskOutcome<List<TableRow<T>>>>)\n}\n\n/**\n * Creates an updateItem mutation\n */\nexport function createUpdateItemMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n item: TableUpdate<T>,\n whereConditions: WhereConditions<TableRow<T>>,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationSingleExecution<TableRow<T>> {\n return SingleMutationQuery(\n updateEntity(client, name, item, whereConditions, is, wherein) as FPromise<TaskOutcome<TableRow<T>>>,\n )\n}\n\n/**\n * Creates an updateItems mutation\n */\nexport function createUpdateItemsMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n items: TableUpdate<T>[],\n identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[],\n where: WhereConditions<TableRow<T>> | undefined,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationMultiExecution<TableRow<T>> {\n return MultiMutationQuery(\n updateEntities(client, name, items, identity, where, is, wherein) as FPromise<TaskOutcome<List<TableRow<T>>>>,\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>(client: SupabaseClientType, name: T, softDeleteMode: SoftDeleteMode) {\n return function getItem({ id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T>>\n return createGetItemQuery(client, name, whereConditions, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for Entity (no partition)\n */\nexport function makeGetItems<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems({ where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n return createGetItemsQuery(client, name, where as WhereConditions<TableRow<T>>, is, wherein, order, softDeleteMode)\n }\n}\n\n/**\n * Creates getItem method for PartitionedEntity\n */\nexport function makePartitionedGetItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItem(partitionKey: K, { id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createGetItemQuery(client, name, whereConditions as WhereConditions<TableRow<T>>, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for PartitionedEntity\n */\nexport function makePartitionedGetItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems(partitionKey: K, { where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createGetItemsQuery(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T>>,\n is,\n wherein,\n order,\n softDeleteMode,\n )\n }\n}\n\n/**\n * Creates updateItem method for Entity (no partition)\n */\nexport function makeUpdateItem<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItem({ id, item, where, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T>>\n return createUpdateItemMutation(client, name, item, whereConditions, is, wherein)\n }\n}\n\n/**\n * Creates updateItem method for PartitionedEntity\n */\nexport function makePartitionedUpdateItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItem(partitionKey: K, { id, item, where, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createUpdateItemMutation(client, name, item, whereConditions as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for Entity (no partition)\n */\nexport function makeUpdateItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItems({\n items,\n identity = \"id\" as keyof TableRow<T> & string,\n where,\n is,\n wherein,\n }: UpdateItemsParams<T, TableRow<T>>) {\n return createUpdateItemsMutation(client, name, items, identity, where as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for PartitionedEntity\n */\nexport function makePartitionedUpdateItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItems(\n partitionKey: K,\n { items, identity = \"id\" as keyof TableRow<T> & string, where, is, wherein }: UpdateItemsParams<T, TableRow<T>>,\n ) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemsMutation(\n client,\n name,\n items,\n identity,\n whereConditions as WhereConditions<TableRow<T>>,\n is,\n wherein,\n )\n }\n}\n\n/**\n * Creates addItems method (same for both Entity and PartitionedEntity)\n */\nexport function makeAddItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function addItems({ items }: { items: TableRow<T>[] }) {\n return createAddItemsMutation(client, name, items)\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport { getSoftDeleteMode, makeAddItems, makeGetItem, makeGetItems, makeUpdateItem, makeUpdateItems } from \"./core\"\nimport type { EntityConfig, IEntity } from \"./types\"\n\n// Re-export types for backwards compatibility\nexport type {\n AddItemsParams,\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 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 */\nexport const Entity = <T extends TableNames>(client: SupabaseClientType, name: T, config: EntityConfig): IEntity<T> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\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(client, name, softDeleteMode),\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(client, name, softDeleteMode),\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(client, name),\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(client, name),\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(client, name),\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makePartitionedGetItem,\n makePartitionedGetItems,\n makePartitionedUpdateItem,\n makePartitionedUpdateItems,\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 */\nexport const PartitionedEntity = <T extends TableNames, K extends PartitionKey = string>(\n client: SupabaseClientType,\n name: T,\n config: PartitionedEntityConfig,\n): IPartitionedEntity<T, K> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { partitionField } = 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>(client, name, partitionField, softDeleteMode),\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>(client, name, partitionField, softDeleteMode),\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(client, name),\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>(client, name, partitionField),\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>(client, name, partitionField),\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/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 { 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>(\n client: SupabaseClientType,\n config: QueryBuilderConfig<T>,\n): Query<T> => {\n /**\n * Build the Supabase query from accumulated conditions\n */\n const buildSupabaseQuery = () => {\n const { table, conditions, order, limit, offset } = config\n\n // Start with base query (just the table reference)\n const baseQuery = 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>): 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> & 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>[]): 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>[] = []\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>>,\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>>, is?: IsConditions<TableRow<T>>): Query<T> => {\n const newConditions = [...config.conditions, { where, is }]\n return QueryBuilder(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> => {\n const newConditions = [\n ...config.conditions,\n {\n where: { id: id as unknown } as unknown as WhereConditions<TableRow<T>>,\n },\n ]\n return QueryBuilder(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> => {\n return QueryBuilder(client, config).or({\n id: id as unknown,\n } as unknown as WhereConditions<TableRow<T>>)\n },\n\n /**\n * Apply mapping function to query results\n */\n map: <U>(fn: (item: TableRow<T>) => U): MappedQuery<U> => {\n return createMappedQuery(QueryBuilder(client, config), fn)\n },\n\n /**\n * Apply filter function to query results\n */\n filter: (predicate: (item: TableRow<T>) => boolean): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n filterFn: config.filterFn ? (item: TableRow<T>) => config.filterFn!(item) && predicate(item) : predicate,\n })\n },\n\n /**\n * Limit the number of results\n */\n limit: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n limit: count,\n })\n },\n\n /**\n * Offset the results for pagination\n */\n offset: (count: number): Query<T> => {\n return QueryBuilder(client, {\n ...config,\n offset: count,\n })\n },\n\n /**\n * Include all records (no soft delete filter)\n */\n includeDeleted: (): Query<T> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"include\") {\n log.warn(`[${config.table}] includeDeleted() called but already including deleted by default`)\n }\n return QueryBuilder(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> => {\n if (config.softDeleteAppliedByDefault && config.softDeleteMode === \"exclude\") {\n log.warn(`[${config.table}] excludeDeleted() called but already excluding deleted by default`)\n }\n return QueryBuilder(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> => {\n return QueryBuilder(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>>>> => {\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>>>(toError(error))\n }\n\n const result = data as TableRow<T>\n const filteredResult = config.filterFn ? config.filterFn(result) : true\n\n if (!filteredResult) {\n return Ok(Option.none<TableRow<T>>())\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting zero or more results\n */\n many: (): FPromise<TaskOutcome<List<TableRow<T>>>> => {\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>>>(toError(error))\n }\n\n const rawResults = data as TableRow<T>[]\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>>>(toError(error))\n }\n })\n },\n\n /**\n * Execute query expecting first result from potentially multiple\n */\n first: (): FPromise<TaskOutcome<Option<TableRow<T>>>> => {\n return wrapAsync(async () => {\n const manyResult = await QueryBuilder(client, config).many()\n const list = manyResult.orThrow()\n if (list.isEmpty) {\n return Ok(Option.none<TableRow<T>>())\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>> => {\n const result = await QueryBuilder(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>>> => {\n const result = await QueryBuilder(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>> => {\n const result = await QueryBuilder(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, U>(\n sourceQuery: Query<T>,\n mapFn: (item: TableRow<T>) => U,\n): MappedQuery<U> => {\n return {\n map: <V>(fn: (item: U) => V): MappedQuery<V> => {\n return createMappedQuery(sourceQuery, (item: TableRow<T>) => fn(mapFn(item)))\n },\n\n filter: (predicate: (item: U) => boolean): MappedQuery<U> => {\n const filteredQuery = sourceQuery.filter((item: TableRow<T>) => predicate(mapFn(item)))\n return createMappedQuery(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>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditions<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n softDeleteConfig?: { mode?: \"include\" | \"exclude\" | \"only\"; appliedByDefault?: boolean },\n): Query<T> => {\n const config: QueryBuilderConfig<T> = {\n table,\n conditions: [{ where, is, wherein }],\n order,\n softDeleteMode: softDeleteConfig?.mode,\n softDeleteAppliedByDefault: softDeleteConfig?.appliedByDefault,\n }\n return QueryBuilder(client, config)\n}\n","import type { 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// 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// Core Query interface with branded type support\nexport interface Query<T extends TableNames> {\n // Execution methods - explicit about expected results\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n\n // OrThrow methods - throw errors instead of returning TaskOutcome (v0.8.0+)\n oneOrThrow(): Promise<TableRow<T>>\n manyOrThrow(): Promise<List<TableRow<T>>>\n firstOrThrow(): Promise<TableRow<T>>\n\n // Query composition - chainable OR logic with type-safe where conditions\n or(where: WhereConditions<TableRow<T>>, is?: IsConditions<TableRow<T>>): Query<T>\n\n // Branded type-aware query methods (simplified)\n whereId<ID extends Brand<string, string>>(id: ID): Query<T>\n orWhereId<ID extends Brand<string, string>>(id: ID): Query<T>\n\n // Functional operations - maintain composability\n map<U>(fn: (item: TableRow<T>) => U): MappedQuery<U>\n filter(predicate: (item: TableRow<T>) => boolean): Query<T>\n\n // Pagination\n limit(count: number): Query<T>\n offset(count: number): Query<T>\n\n // Soft delete filtering\n includeDeleted(): Query<T>\n excludeDeleted(): Query<T>\n onlyDeleted(): Query<T>\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// Query condition for internal state management with type-safe where\nexport interface QueryCondition<T extends TableNames> {\n where: WhereConditions<TableRow<T>>\n is?: IsConditions<TableRow<T>>\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>\n // Comparison operators\n gt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n gte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lt?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n lte?: Partial<Record<keyof TableRow<T>, number | string | Date>>\n neq?: Partial<Record<keyof TableRow<T>, unknown>>\n // Pattern matching\n like?: Partial<Record<keyof TableRow<T>, string>>\n ilike?: Partial<Record<keyof TableRow<T>, string>>\n}\n\n// Entity-specific query interfaces for better type safety\nexport interface EntityQuery<T extends TableNames> extends Query<T> {\n // Entity-specific methods can be added here\n normalize(): NormalizedQuery<T>\n}\n\nexport interface NormalizedQuery<T extends TableNames> {\n one(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n many(): FPromise<TaskOutcome<List<TableRow<T>>>>\n first(): FPromise<TaskOutcome<Option<TableRow<T>>>>\n}\n\n// Type guards for runtime type checking\nexport const isQuery = <T extends TableNames>(obj: unknown): obj is Query<T> => {\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// Utility types for query parameters with type safety\nexport type QueryWhereParams<T extends TableNames> = WhereConditions<TableRow<T>>\nexport type QueryIsParams<T extends TableNames> = IsConditions<TableRow<T>>\nexport type QueryWhereinParams<T extends TableNames> = Partial<Record<keyof TableRow<T>, unknown[]>>\nexport type QueryOrderParams<T extends TableNames> = [\n keyof TableRow<T> & string,\n { ascending?: boolean; nullsFirst?: boolean },\n]\n\n// Builder configuration for query construction\nexport interface QueryBuilderConfig<T extends TableNames> {\n table: T\n conditions: QueryCondition<T>[]\n order?: QueryOrderParams<T>\n mapFn?: (item: TableRow<T>) => unknown\n filterFn?: (item: TableRow<T>) => boolean\n limit?: number\n offset?: number\n softDeleteMode?: SoftDeleteMode\n softDeleteAppliedByDefault?: boolean\n}\n","import type { EmptyObject, SupabaseClientType, TableInsert, TableNames, TableRow, TableUpdate } from \"@/types\"\nimport { toError } from \"@/utils/errors\"\n\nimport type { FPromise, TaskOutcome } from \"functype\"\nimport { Err, List, Ok } from \"functype\"\n\nimport type { Query, WhereConditions } from \"./Query\"\nimport { createQuery } from \"./QueryBuilder\"\n\n// Re-export query types\nexport type {\n ComparisonOperators,\n EntityQuery,\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// 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 * @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 * @returns A promise resolving to the entity if found\n */\nexport const getEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Retrieves multiple entities from the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the entities if found\n */\nexport const getEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }] = [\n \"id\" as keyof TableRow<T> & string,\n { ascending: true },\n ],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Adds multiple entities to the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to insert into\n * @param entities - The entities to add\n * @returns A promise resolving to the added entities\n */\nexport const addEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableInsert<T>[],\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data, error } = await (client.from(table) as any).insert(entities as never).select()\n\n if (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n\n return Ok(List(data as unknown as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(toError(error))\n }\n })\n\n/**\n * Updates a single entity in the specified table.\n * @template T - The table name\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 * @returns A promise resolving to the updated entity\n */\nexport const updateEntity = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>,\n where: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<TableRow<T>>> =>\n wrapAsync(async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const baseQuery = (client.from(table) 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> & 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>>(toError(error))\n }\n\n return Ok(data as TableRow<T>)\n } catch (error) {\n return Err<TableRow<T>>(toError(error))\n }\n })\n\n/**\n * Updates multiple entities in the specified table.\n * @template T - The table name\n * @param client - The Supabase client instance\n * @param table - The table to update\n * @param entities - The entities to update\n * @param identity - The column(s) to use as the identity\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 * @returns A promise resolving to the updated entities\n */\nexport const updateEntities = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n entities: TableUpdate<T>[],\n identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[] = \"id\" as keyof TableRow<T> & string,\n where?: WhereConditions<TableRow<T>>,\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n): FPromise<TaskOutcome<List<TableRow<T>>>> =>\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 baseQuery = (client.from(table) 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> & 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>>>(toError(error))\n }\n\n return Ok(List(data as TableRow<T>[]))\n } catch (error) {\n return Err<List<TableRow<T>>>(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 * @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 * @returns A Query<T> 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 */\nexport const query = <T extends TableNames>(\n client: SupabaseClientType,\n table: T,\n where: WhereConditions<TableRow<T>> = {},\n is?: IsConditionsLocal<TableRow<T>>,\n wherein?: Partial<Record<keyof TableRow<T>, unknown[]>>,\n order?: [keyof TableRow<T> & string, { ascending?: boolean; nullsFirst?: boolean }],\n): Query<T> => {\n return createQuery(client, table, where, is, wherein, order)\n}\n","/**\n * Shared type definitions for Entity and PartitionedEntity\n */\n\nimport type { MultiExecution, Query, SingleExecution, WhereConditions } from \"@/query/Query\"\nimport type { 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}\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}\n\n// =============================================================================\n// Base Parameter Types\n// =============================================================================\n\nexport type WhereParams<T extends object = EmptyObject> = {\n where?: WhereConditions<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> = {\n items: TableInsert<T>[]\n}\n\n/**\n * Prisma-style update params for single item: { where, data }\n */\nexport type UpdateItemParams<T extends TableNames, Row extends object = EmptyObject> = {\n /** Conditions to match the item to update */\n where: WhereConditions<Row>\n /** The data to update */\n data: TableUpdate<T>\n} & IsParams<Row> &\n WhereinParams<Row>\n\n/**\n * Prisma-style update params for multiple items: { where, data }\n */\nexport type UpdateItemsParams<T extends TableNames, Row extends object = EmptyObject> = {\n /** Conditions to match items to update */\n where: WhereConditions<Row>\n /** The data to update on all matched items */\n data: TableUpdate<T>\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> = {\n getItem(params: GetItemParams<TableRow<T>>): Query<T>\n getItems(params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Interface for PartitionedEntity instances (requires partition key on calls)\n */\nexport type IPartitionedEntity<T extends TableNames, K extends PartitionKey> = {\n getItem(partitionKey: K, params: GetItemParams<TableRow<T>>): Query<T>\n getItems(partitionKey: K, params?: GetItemsParams<TableRow<T>>): Query<T>\n addItems(params: AddItemsParams<T>): MutationMultiExecution<TableRow<T>>\n updateItem(partitionKey: K, params: UpdateItemParams<T, TableRow<T>>): MutationSingleExecution<TableRow<T>>\n updateItems(partitionKey: K, params: UpdateItemsParams<T, TableRow<T>>): MutationMultiExecution<TableRow<T>>\n}\n\n/**\n * Type for an entity instance for a specific table\n * @deprecated Use IEntity<T> instead\n */\nexport type EntityType<T extends TableNames> = IEntity<T>\n","/**\n * Shared internal functions for Entity and PartitionedEntity (DRY)\n */\n\nimport { addEntities, updateEntities, updateEntity } from \"@/query\"\nimport type { WhereConditions } from \"@/query/Query\"\nimport { createQuery } from \"@/query/QueryBuilder\"\nimport type { SupabaseClientType, TableNames, TableRow, TableUpdate } from \"@/types\"\n\nimport type { FPromise, List, TaskOutcome } from \"functype\"\n\nimport type {\n GetItemParams,\n GetItemsParams,\n IsParams,\n MutationMultiExecution,\n MutationSingleExecution,\n PartitionKey,\n TypedRecord,\n UpdateItemParams,\n UpdateItemsParams,\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?: WhereConditions<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?: WhereConditions<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>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, undefined, undefined, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n/**\n * Creates a getItems query (multiple items)\n */\nexport function createGetItemsQuery<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n whereConditions: WhereConditions<TableRow<T>>,\n is: TypedRecord<TableRow<T>, null | boolean> | undefined,\n wherein: TypedRecord<TableRow<T>, unknown[]> | undefined,\n order: GetItemsParams<TableRow<T>>[\"order\"],\n softDeleteMode: SoftDeleteMode,\n) {\n return createQuery(client, name, whereConditions, is, wherein, order, {\n mode: softDeleteMode,\n appliedByDefault: true,\n })\n}\n\n// =============================================================================\n// Mutation Functions\n// =============================================================================\n\n/**\n * Creates an addItems mutation\n */\nexport function createAddItemsMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n items: TableRow<T>[],\n): MutationMultiExecution<TableRow<T>> {\n return MultiMutationQuery(addEntities(client, name, items) as FPromise<TaskOutcome<List<TableRow<T>>>>)\n}\n\n/**\n * Creates an updateItem mutation\n */\nexport function createUpdateItemMutation<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n item: TableUpdate<T>,\n whereConditions: WhereConditions<TableRow<T>>,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationSingleExecution<TableRow<T>> {\n return SingleMutationQuery(\n updateEntity(client, name, item, whereConditions, is, wherein) as FPromise<TaskOutcome<TableRow<T>>>,\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>(\n client: SupabaseClientType,\n name: T,\n data: TableUpdate<T>,\n where: WhereConditions<TableRow<T>>,\n is: IsParams<TableRow<T>>[\"is\"],\n wherein: WhereinParams<TableRow<T>>[\"wherein\"],\n): MutationMultiExecution<TableRow<T>> {\n // Use updateEntities with single-item array - updates all matching rows with same data\n return MultiMutationQuery(\n updateEntities(client, name, [data], undefined, where, is, wherein) as FPromise<TaskOutcome<List<TableRow<T>>>>,\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>(client: SupabaseClientType, name: T, softDeleteMode: SoftDeleteMode) {\n return function getItem({ id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = { ...where, id } as WhereConditions<TableRow<T>>\n return createGetItemQuery(client, name, whereConditions, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for Entity (no partition)\n */\nexport function makeGetItems<T extends TableNames>(\n client: SupabaseClientType,\n name: T,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems({ where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n return createGetItemsQuery(client, name, where as WhereConditions<TableRow<T>>, is, wherein, order, softDeleteMode)\n }\n}\n\n/**\n * Creates getItem method for PartitionedEntity\n */\nexport function makePartitionedGetItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItem(partitionKey: K, { id, where, is }: GetItemParams<TableRow<T>>) {\n const whereConditions = buildWhereWithPartitionAndId(partitionField, partitionKey, id, where)\n return createGetItemQuery(client, name, whereConditions as WhereConditions<TableRow<T>>, is, softDeleteMode)\n }\n}\n\n/**\n * Creates getItems method for PartitionedEntity\n */\nexport function makePartitionedGetItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n softDeleteMode: SoftDeleteMode,\n) {\n return function getItems(partitionKey: K, { where, is, wherein, order }: GetItemsParams<TableRow<T>> = {}) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createGetItemsQuery(\n client,\n name,\n whereConditions as WhereConditions<TableRow<T>>,\n is,\n wherein,\n order,\n softDeleteMode,\n )\n }\n}\n\n/**\n * Creates updateItem method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItem<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItem({ where, data, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n return createUpdateItemMutation(client, name, data, where as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItem method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItem<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItem(partitionKey: K, { where, data, is, wherein }: UpdateItemParams<T, TableRow<T>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemMutation(client, name, data, whereConditions as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for Entity (no partition) - Prisma-style { where, data }\n */\nexport function makeUpdateItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function updateItems({ where, data, is, wherein }: UpdateItemsParams<T, TableRow<T>>) {\n return createUpdateItemsMutation(client, name, data, where as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates updateItems method for PartitionedEntity - Prisma-style { where, data }\n */\nexport function makePartitionedUpdateItems<T extends TableNames, K extends PartitionKey>(\n client: SupabaseClientType,\n name: T,\n partitionField: string,\n) {\n return function updateItems(partitionKey: K, { where, data, is, wherein }: UpdateItemsParams<T, TableRow<T>>) {\n const whereConditions = buildWhereWithPartition(partitionField, partitionKey, where)\n return createUpdateItemsMutation(client, name, data, whereConditions as WhereConditions<TableRow<T>>, is, wherein)\n }\n}\n\n/**\n * Creates addItems method (same for both Entity and PartitionedEntity)\n */\nexport function makeAddItems<T extends TableNames>(client: SupabaseClientType, name: T) {\n return function addItems({ items }: { items: TableRow<T>[] }) {\n return createAddItemsMutation(client, name, items)\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport { getSoftDeleteMode, makeAddItems, makeGetItem, makeGetItems, makeUpdateItem, makeUpdateItems } from \"./core\"\nimport type { EntityConfig, IEntity } from \"./types\"\n\n// Re-export types for backwards compatibility\nexport type {\n AddItemsParams,\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 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 */\nexport const Entity = <T extends TableNames>(client: SupabaseClientType, name: T, config: EntityConfig): IEntity<T> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\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(client, name, softDeleteMode),\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(client, name, softDeleteMode),\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(client, name),\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(client, name),\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(client, name),\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 { SupabaseClientType, TableNames } from \"@/types\"\n\nimport {\n getSoftDeleteMode,\n makeAddItems,\n makePartitionedGetItem,\n makePartitionedGetItems,\n makePartitionedUpdateItem,\n makePartitionedUpdateItems,\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 */\nexport const PartitionedEntity = <T extends TableNames, K extends PartitionKey = string>(\n client: SupabaseClientType,\n name: T,\n config: PartitionedEntityConfig,\n): IPartitionedEntity<T, K> => {\n const softDeleteMode = getSoftDeleteMode(config.softDelete)\n const { partitionField } = 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>(client, name, partitionField, softDeleteMode),\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>(client, name, partitionField, softDeleteMode),\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(client, name),\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>(client, name, partitionField),\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>(client, name, partitionField),\n }\n}\n"],"names":["wrapAsync","query"],"mappings":"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"}
@@ -28,9 +28,9 @@ export declare function createAddItemsMutation<T extends TableNames>(client: Sup
28
28
  */
29
29
  export declare function createUpdateItemMutation<T extends TableNames>(client: SupabaseClientType, name: T, item: TableUpdate<T>, whereConditions: WhereConditions<TableRow<T>>, is: IsParams<TableRow<T>>["is"], wherein: WhereinParams<TableRow<T>>["wherein"]): MutationSingleExecution<TableRow<T>>;
30
30
  /**
31
- * Creates an updateItems mutation
31
+ * Creates an updateItems mutation (Prisma-style: update all matching rows with same data)
32
32
  */
33
- export declare function createUpdateItemsMutation<T extends TableNames>(client: SupabaseClientType, name: T, items: TableUpdate<T>[], identity: (keyof TableRow<T> & string) | (keyof TableRow<T> & string)[], where: WhereConditions<TableRow<T>> | undefined, is: IsParams<TableRow<T>>["is"], wherein: WhereinParams<TableRow<T>>["wherein"]): MutationMultiExecution<TableRow<T>>;
33
+ export declare function createUpdateItemsMutation<T extends TableNames>(client: SupabaseClientType, name: T, data: TableUpdate<T>, where: WhereConditions<TableRow<T>>, is: IsParams<TableRow<T>>["is"], wherein: WhereinParams<TableRow<T>>["wherein"]): MutationMultiExecution<TableRow<T>>;
34
34
  /**
35
35
  * Creates getItem method for Entity (no partition)
36
36
  */
@@ -48,21 +48,21 @@ export declare function makePartitionedGetItem<T extends TableNames, K extends P
48
48
  */
49
49
  export declare function makePartitionedGetItems<T extends TableNames, K extends PartitionKey>(client: SupabaseClientType, name: T, partitionField: string, softDeleteMode: SoftDeleteMode): (partitionKey: K, { where, is, wherein, order }?: GetItemsParams<TableRow<T>>) => import('../query').Query<T>;
50
50
  /**
51
- * Creates updateItem method for Entity (no partition)
51
+ * Creates updateItem method for Entity (no partition) - Prisma-style { where, data }
52
52
  */
53
- export declare function makeUpdateItem<T extends TableNames>(client: SupabaseClientType, name: T): ({ id, item, where, is, wherein }: UpdateItemParams<T, TableRow<T>>) => MutationSingleExecution<Record<string, unknown>>;
53
+ export declare function makeUpdateItem<T extends TableNames>(client: SupabaseClientType, name: T): ({ where, data, is, wherein }: UpdateItemParams<T, TableRow<T>>) => MutationSingleExecution<Record<string, unknown>>;
54
54
  /**
55
- * Creates updateItem method for PartitionedEntity
55
+ * Creates updateItem method for PartitionedEntity - Prisma-style { where, data }
56
56
  */
57
- export declare function makePartitionedUpdateItem<T extends TableNames, K extends PartitionKey>(client: SupabaseClientType, name: T, partitionField: string): (partitionKey: K, { id, item, where, is, wherein }: UpdateItemParams<T, TableRow<T>>) => MutationSingleExecution<Record<string, unknown>>;
57
+ export declare function makePartitionedUpdateItem<T extends TableNames, K extends PartitionKey>(client: SupabaseClientType, name: T, partitionField: string): (partitionKey: K, { where, data, is, wherein }: UpdateItemParams<T, TableRow<T>>) => MutationSingleExecution<Record<string, unknown>>;
58
58
  /**
59
- * Creates updateItems method for Entity (no partition)
59
+ * Creates updateItems method for Entity (no partition) - Prisma-style { where, data }
60
60
  */
61
- export declare function makeUpdateItems<T extends TableNames>(client: SupabaseClientType, name: T): ({ items, identity, where, is, wherein, }: UpdateItemsParams<T, TableRow<T>>) => MutationMultiExecution<Record<string, unknown>>;
61
+ export declare function makeUpdateItems<T extends TableNames>(client: SupabaseClientType, name: T): ({ where, data, is, wherein }: UpdateItemsParams<T, TableRow<T>>) => MutationMultiExecution<Record<string, unknown>>;
62
62
  /**
63
- * Creates updateItems method for PartitionedEntity
63
+ * Creates updateItems method for PartitionedEntity - Prisma-style { where, data }
64
64
  */
65
- export declare function makePartitionedUpdateItems<T extends TableNames, K extends PartitionKey>(client: SupabaseClientType, name: T, partitionField: string): (partitionKey: K, { items, identity, where, is, wherein }: UpdateItemsParams<T, TableRow<T>>) => MutationMultiExecution<Record<string, unknown>>;
65
+ export declare function makePartitionedUpdateItems<T extends TableNames, K extends PartitionKey>(client: SupabaseClientType, name: T, partitionField: string): (partitionKey: K, { where, data, is, wherein }: UpdateItemsParams<T, TableRow<T>>) => MutationMultiExecution<Record<string, unknown>>;
66
66
  /**
67
67
  * Creates addItems method (same for both Entity and PartitionedEntity)
68
68
  */
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/entity/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/entity/core.ts"],"names":[],"mappings":"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"}
@@ -49,13 +49,24 @@ export type GetItemsParams<T extends object = EmptyObject> = WhereParams<T> & Is
49
49
  export type AddItemsParams<T extends TableNames> = {
50
50
  items: TableInsert<T>[];
51
51
  };
52
- export type UpdateItemParams<T extends TableNames, Row extends object = EmptyObject> = IdParam & {
53
- item: TableUpdate<T>;
54
- } & WhereParams<Row> & IsParams<Row> & WhereinParams<Row>;
52
+ /**
53
+ * Prisma-style update params for single item: { where, data }
54
+ */
55
+ export type UpdateItemParams<T extends TableNames, Row extends object = EmptyObject> = {
56
+ /** Conditions to match the item to update */
57
+ where: WhereConditions<Row>;
58
+ /** The data to update */
59
+ data: TableUpdate<T>;
60
+ } & IsParams<Row> & WhereinParams<Row>;
61
+ /**
62
+ * Prisma-style update params for multiple items: { where, data }
63
+ */
55
64
  export type UpdateItemsParams<T extends TableNames, Row extends object = EmptyObject> = {
56
- items: TableUpdate<T>[];
57
- identity?: (keyof Row & string) | (keyof Row & string)[];
58
- } & WhereParams<Row> & IsParams<Row> & WhereinParams<Row>;
65
+ /** Conditions to match items to update */
66
+ where: WhereConditions<Row>;
67
+ /** The data to update on all matched items */
68
+ data: TableUpdate<T>;
69
+ } & IsParams<Row> & WhereinParams<Row>;
59
70
  /**
60
71
  * Wrapper type for multi-result mutation operations that implements standard execution interface
61
72
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/entity/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/entity/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "supabase-typed-query",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "Type-safe query builder and entity pattern for Supabase with TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",