@pol-studios/db 1.0.21 → 1.0.23

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.
Files changed (44) hide show
  1. package/dist/auth/context.js +2 -2
  2. package/dist/auth/hooks.js +3 -3
  3. package/dist/auth/index.js +3 -3
  4. package/dist/{chunk-R5B2XMN5.js → chunk-3L4HOEXV.js} +1614 -2141
  5. package/dist/chunk-3L4HOEXV.js.map +1 -0
  6. package/dist/{chunk-72WV3ALS.js → chunk-3UYBZHEV.js} +2 -2
  7. package/dist/{chunk-X3HZLNBV.js → chunk-BXSOHOQ2.js} +54 -985
  8. package/dist/chunk-BXSOHOQ2.js.map +1 -0
  9. package/dist/{chunk-N26IEHZT.js → chunk-FZF26ZRB.js} +18 -2
  10. package/dist/{chunk-N26IEHZT.js.map → chunk-FZF26ZRB.js.map} +1 -1
  11. package/dist/chunk-HTJ2FQW5.js +963 -0
  12. package/dist/chunk-HTJ2FQW5.js.map +1 -0
  13. package/dist/{chunk-2T6WTCP4.js → chunk-KDORWXGS.js} +69 -154
  14. package/dist/chunk-KDORWXGS.js.map +1 -0
  15. package/dist/{chunk-36DVUMQD.js → chunk-MBU4KE3V.js} +2 -2
  16. package/dist/{chunk-YERWPV6B.js → chunk-Q7WJEOQ5.js} +150 -19
  17. package/dist/chunk-Q7WJEOQ5.js.map +1 -0
  18. package/dist/{chunk-RMRYGICS.js → chunk-TSXQTYUG.js} +4 -4
  19. package/dist/core/index.d.ts +30 -1
  20. package/dist/hooks/index.d.ts +20 -1
  21. package/dist/hooks/index.js +1 -1
  22. package/dist/{index-BNKhgDdC.d.ts → index-2YySlz7X.d.ts} +3 -3
  23. package/dist/index.d.ts +11 -12
  24. package/dist/index.js +14 -95
  25. package/dist/index.native.d.ts +12 -30
  26. package/dist/index.native.js +17 -96
  27. package/dist/index.web.d.ts +132 -15
  28. package/dist/index.web.js +585 -46
  29. package/dist/index.web.js.map +1 -1
  30. package/dist/powersync-bridge/index.d.ts +1 -1
  31. package/dist/powersync-bridge/index.js +1 -1
  32. package/dist/query/index.js +10 -8
  33. package/dist/types/index.d.ts +1 -1
  34. package/dist/{useDbCount-Id14x_1P.d.ts → useDbCount-s-aR9YeV.d.ts} +1 -1
  35. package/dist/{useResolveFeedback-Ca2rh_Bs.d.ts → useResolveFeedback-DTGcHpCs.d.ts} +275 -390
  36. package/dist/with-auth/index.js +4 -4
  37. package/package.json +13 -12
  38. package/dist/chunk-2T6WTCP4.js.map +0 -1
  39. package/dist/chunk-R5B2XMN5.js.map +0 -1
  40. package/dist/chunk-X3HZLNBV.js.map +0 -1
  41. package/dist/chunk-YERWPV6B.js.map +0 -1
  42. /package/dist/{chunk-72WV3ALS.js.map → chunk-3UYBZHEV.js.map} +0 -0
  43. /package/dist/{chunk-36DVUMQD.js.map → chunk-MBU4KE3V.js.map} +0 -0
  44. /package/dist/{chunk-RMRYGICS.js.map → chunk-TSXQTYUG.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/query/select-parser.ts","../src/query/relationship-resolver.ts","../src/query/sql-builder.ts","../src/query/result-joiner.ts","../src/query/executor.ts","../src/query/useQuery.ts","../src/query/usePartialQuery.ts","../src/query/useAdvancedQuery.ts","../src/query/useInfiniteQuery.ts","../src/query/usePartialAdvancedQuery.ts"],"sourcesContent":["/**\n * Select String Parser\n *\n * Parses Supabase PostgREST select syntax into an AST for local SQLite processing.\n *\n * Supported Syntax:\n * - \"*\" -> All columns\n * - \"id, name, status\" -> Specific columns\n * - \"*, RelatedTable(*)\" -> All columns + relation\n * - \"id, RelatedTable(id, name)\" -> Specific + relation with specific columns\n * - \"*, Parent(*, Grandparent(name))\" -> Nested relations\n * - \"*, items:RelatedTable(*)\" -> Aliased relation\n * - \"aliasName:columnName\" -> Aliased column\n */\n\nimport type { ParsedSelect, SelectColumn, SelectRelation } from \"../core/types\";\n\n/**\n * Tokenize a string at the top level, respecting parentheses nesting.\n * Splits by comma but keeps nested parentheses intact.\n *\n * @example\n * tokenizeTopLevel(\"id, name, Parent(*, Child(name))\")\n * // Returns: [\"id\", \"name\", \"Parent(*, Child(name))\"]\n */\nfunction tokenizeTopLevel(input: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n let depth = 0;\n for (const char of input) {\n if (char === \"(\") {\n depth++;\n current += char;\n } else if (char === \")\") {\n depth--;\n current += char;\n } else if (char === \",\" && depth === 0) {\n const trimmed = current.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n current = \"\";\n } else {\n current += char;\n }\n }\n\n // Add the last token\n const trimmed = current.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n return tokens;\n}\n\n/**\n * Parse a single column token that may have an alias.\n *\n * @example\n * parseColumnToken(\"aliasName:columnName\") -> { name: \"columnName\", alias: \"aliasName\" }\n * parseColumnToken(\"columnName\") -> { name: \"columnName\" }\n */\nfunction parseColumnToken(token: string): SelectColumn {\n // Check for alias format: alias:column\n const aliasMatch = token.match(/^(\\w+):(\\w+)$/);\n if (aliasMatch) {\n return {\n name: aliasMatch[2],\n alias: aliasMatch[1]\n };\n }\n return {\n name: token\n };\n}\n\n/**\n * Parse a Supabase PostgREST select string into an AST.\n *\n * @param select - The select string (e.g., \"*, RelatedTable(*)\")\n * @returns Parsed select AST\n *\n * @example\n * parseSelect(\"*\")\n * // Returns: { columns: \"*\", relations: [] }\n *\n * parseSelect(\"id, name, status\")\n * // Returns: {\n * // columns: [{ name: \"id\" }, { name: \"name\" }, { name: \"status\" }],\n * // relations: []\n * // }\n *\n * parseSelect(\"*, EquipmentFixture(*)\")\n * // Returns: {\n * // columns: \"*\",\n * // relations: [{ name: \"EquipmentFixture\", columns: \"*\", relations: [] }]\n * // }\n *\n * parseSelect(\"id, name, ProjectDatabase(name, Organization(*))\")\n * // Returns: {\n * // columns: [{ name: \"id\" }, { name: \"name\" }],\n * // relations: [{\n * // name: \"ProjectDatabase\",\n * // columns: [{ name: \"name\" }],\n * // relations: [{ name: \"Organization\", columns: \"*\", relations: [] }]\n * // }]\n * // }\n */\nexport function parseSelect(select: string): ParsedSelect {\n const trimmed = select.trim();\n\n // Handle simple wildcard\n if (trimmed === \"*\") {\n return {\n columns: \"*\",\n relations: []\n };\n }\n\n // Handle empty string\n if (!trimmed) {\n return {\n columns: \"*\",\n relations: []\n };\n }\n const result: ParsedSelect = {\n columns: [],\n relations: []\n };\n\n // Tokenize at top level (respecting parentheses)\n const tokens = tokenizeTopLevel(trimmed);\n for (const token of tokens) {\n const trimmedToken = token.trim();\n if (!trimmedToken) {\n continue;\n }\n\n // Check if it's a relation: Name(...) or alias:Name(...)\n // Regex: optional alias followed by table name and parentheses with content\n const relationMatch = trimmedToken.match(/^(?:(\\w+):)?(\\w+)\\((.+)\\)$/);\n if (relationMatch) {\n const alias = relationMatch[1];\n const name = relationMatch[2];\n const innerSelect = relationMatch[3];\n\n // Recursively parse inner select\n const innerParsed = parseSelect(innerSelect);\n result.relations.push({\n name,\n alias,\n columns: innerParsed.columns,\n relations: innerParsed.relations\n });\n } else if (trimmedToken === \"*\") {\n // Wildcard - all columns\n result.columns = \"*\";\n } else {\n // It's a column, possibly with alias\n const column = parseColumnToken(trimmedToken);\n\n // Only add to columns array if we haven't set \"*\" already\n if (result.columns !== \"*\") {\n (result.columns as SelectColumn[]).push(column);\n }\n }\n }\n\n // If no explicit columns were added but we have relations, default to \"*\"\n if (Array.isArray(result.columns) && result.columns.length === 0) {\n result.columns = \"*\";\n }\n return result;\n}\n\n/**\n * Convert a parsed select back to a string representation (for debugging)\n */\nexport function stringifySelect(parsed: ParsedSelect): string {\n const parts: string[] = [];\n\n // Add columns\n if (parsed.columns === \"*\") {\n parts.push(\"*\");\n } else {\n for (const col of parsed.columns) {\n if (col.alias) {\n parts.push(`${col.alias}:${col.name}`);\n } else {\n parts.push(col.name);\n }\n }\n }\n\n // Add relations\n for (const rel of parsed.relations) {\n const innerStr = stringifySelect({\n columns: rel.columns,\n relations: rel.relations\n });\n if (rel.alias) {\n parts.push(`${rel.alias}:${rel.name}(${innerStr})`);\n } else {\n parts.push(`${rel.name}(${innerStr})`);\n }\n }\n return parts.join(\", \");\n}\n\n/**\n * Extract all column names from a parsed select (for building SQL queries)\n * Does not include relation names.\n */\nexport function extractColumnNames(parsed: ParsedSelect): string[] | \"*\" {\n if (parsed.columns === \"*\") {\n return \"*\";\n }\n return parsed.columns.map(col => col.name);\n}\n\n/**\n * Extract all relation names from a parsed select\n */\nexport function extractRelationNames(parsed: ParsedSelect): string[] {\n return parsed.relations.map(rel => rel.alias ?? rel.name);\n}\n\n/**\n * Check if a select string references a specific relation\n */\nexport function hasRelation(parsed: ParsedSelect, relationName: string): boolean {\n return parsed.relations.some(rel => rel.name === relationName || rel.alias === relationName);\n}\n\n/**\n * Get the select configuration for a specific relation\n */\nexport function getRelationSelect(parsed: ParsedSelect, relationName: string): SelectRelation | undefined {\n return parsed.relations.find(rel => rel.name === relationName || rel.alias === relationName);\n}\n\n// Export the helper function for testing\nexport { tokenizeTopLevel };","/**\n * Relationship Resolver\n *\n * Looks up relationships between tables from the database schema.\n * Used to determine how to join related data in queries.\n */\n\nimport type { DatabaseSchema, TableSchema, RelationshipInfo, RelationshipType, ResolvedRelationship } from \"../core/types\";\n\n/**\n * Resolves relationships between tables using the database schema.\n *\n * Given a table and a relation name (which could be another table),\n * this class determines:\n * 1. Whether a relationship exists\n * 2. The type of relationship (one-to-many or many-to-one)\n * 3. Which columns are used for the join\n */\nexport class RelationshipResolver {\n constructor(private schema: DatabaseSchema) {}\n\n /**\n * Resolve a relationship from one table to another.\n *\n * This handles both:\n * - Forward relationships: This table has a FK to the related table (many-to-one)\n * - Reverse relationships: Related table has a FK to this table (one-to-many)\n *\n * @param fromTable - The table we're querying from\n * @param relationName - The name of the related table\n * @returns The resolved relationship or null if not found\n *\n * @example\n * // Forward relationship (many-to-one)\n * // EquipmentUnit.projectDatabaseId -> ProjectDatabase.id\n * resolver.resolve(\"EquipmentUnit\", \"ProjectDatabase\")\n * // Returns: {\n * // type: \"many-to-one\",\n * // fromTable: \"EquipmentUnit\",\n * // toTable: \"ProjectDatabase\",\n * // foreignKey: \"projectDatabaseId\",\n * // referencedColumn: \"id\"\n * // }\n *\n * @example\n * // Reverse relationship (one-to-many)\n * // EquipmentUnit <- EquipmentFixture.equipmentUnitId\n * resolver.resolve(\"EquipmentUnit\", \"EquipmentFixture\")\n * // Returns: {\n * // type: \"one-to-many\",\n * // fromTable: \"EquipmentUnit\",\n * // toTable: \"EquipmentFixture\",\n * // foreignKey: \"equipmentUnitId\",\n * // referencedColumn: \"id\"\n * // }\n */\n resolve(fromTable: string, relationName: string): ResolvedRelationship | null {\n const tableSchema = this.getTableSchema(fromTable);\n if (!tableSchema) {\n return null;\n }\n\n // Check forward relationships (this table has the FK)\n // e.g., EquipmentUnit.projectDatabaseId -> ProjectDatabase\n for (const rel of tableSchema.relationships) {\n if (rel.referencedTable === relationName) {\n return {\n type: \"many-to-one\",\n fromTable,\n toTable: relationName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n };\n }\n }\n\n // Check reverse relationships (other table has FK to this table)\n // e.g., EquipmentUnit <- EquipmentFixture.equipmentUnitId\n const relatedTableSchema = this.getTableSchema(relationName);\n if (relatedTableSchema) {\n for (const rel of relatedTableSchema.relationships) {\n if (rel.referencedTable === fromTable) {\n return {\n type: \"one-to-many\",\n fromTable,\n toTable: relationName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n };\n }\n }\n }\n return null;\n }\n\n /**\n * Get all forward relationships for a table (many-to-one).\n * These are relationships where this table has a foreign key.\n */\n getForwardRelationships(tableName: string): ResolvedRelationship[] {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return [];\n }\n return tableSchema.relationships.map(rel => ({\n type: \"many-to-one\" as RelationshipType,\n fromTable: tableName,\n toTable: rel.referencedTable,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n }));\n }\n\n /**\n * Get all reverse relationships for a table (one-to-many).\n * These are relationships where other tables have FKs pointing to this table.\n */\n getReverseRelationships(tableName: string): ResolvedRelationship[] {\n const results: ResolvedRelationship[] = [];\n\n // Search all tables for FKs pointing to this table\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n for (const [otherTableName, otherTableSchema] of Object.entries(schemaDefinition.tables)) {\n if (otherTableName === tableName) continue;\n for (const rel of otherTableSchema.relationships) {\n if (rel.referencedTable === tableName) {\n results.push({\n type: \"one-to-many\",\n fromTable: tableName,\n toTable: otherTableName,\n foreignKey: rel.foreignKey,\n referencedColumn: rel.referencedColumn\n });\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Get all relationships for a table (both directions).\n */\n getAllRelationships(tableName: string): ResolvedRelationship[] {\n return [...this.getForwardRelationships(tableName), ...this.getReverseRelationships(tableName)];\n }\n\n /**\n * Check if a relationship exists between two tables.\n */\n hasRelationship(fromTable: string, toTable: string): boolean {\n return this.resolve(fromTable, toTable) !== null;\n }\n\n /**\n * Get the table schema from the database schema.\n * Searches across all schema namespaces (public, core, etc.).\n */\n getTableSchema(tableName: string): TableSchema | null {\n // Check each schema namespace\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n\n // Check tables\n if (schemaDefinition.tables[tableName]) {\n return schemaDefinition.tables[tableName];\n }\n\n // Check views\n if (schemaDefinition.views && schemaDefinition.views[tableName]) {\n return schemaDefinition.views[tableName];\n }\n }\n return null;\n }\n\n /**\n * Get the primary key column for a table.\n * Defaults to \"id\" if not explicitly found.\n */\n getPrimaryKey(tableName: string): string {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return \"id\";\n }\n\n // Look for an 'id' column (most common case)\n const idColumn = tableSchema.columns.find(col => col.name === \"id\");\n if (idColumn) {\n return \"id\";\n }\n\n // Fall back to first column (usually the primary key)\n if (tableSchema.columns.length > 0) {\n return tableSchema.columns[0].name;\n }\n return \"id\";\n }\n\n /**\n * Get all column names for a table.\n */\n getColumnNames(tableName: string): string[] {\n const tableSchema = this.getTableSchema(tableName);\n if (!tableSchema) {\n return [];\n }\n return tableSchema.columns.map(col => col.name);\n }\n\n /**\n * Check if a table exists in the schema.\n */\n hasTable(tableName: string): boolean {\n return this.getTableSchema(tableName) !== null;\n }\n\n /**\n * Get all table names in the schema.\n */\n getAllTableNames(): string[] {\n const tables: string[] = [];\n for (const schemaName of Object.keys(this.schema.schemas)) {\n const schemaDefinition = this.schema.schemas[schemaName];\n if (!schemaDefinition) continue;\n tables.push(...Object.keys(schemaDefinition.tables));\n }\n return tables;\n }\n}\n\n/**\n * Create a relationship resolver instance.\n * Convenience function for creating a resolver.\n */\nexport function createRelationshipResolver(schema: DatabaseSchema): RelationshipResolver {\n return new RelationshipResolver(schema);\n}","/**\n * SQL Builder\n *\n * Builds SQLite queries from parsed select statements and query options.\n * Produces parameterized queries for safe execution against PowerSync's local SQLite.\n *\n * Note: SQLite uses double quotes for identifiers (table/column names).\n * This builder only creates queries for single tables - relations are queried\n * separately and joined in code.\n */\n\nimport type { BuiltQuery, SelectColumn, WhereClause, WhereOperators, OrderBy } from \"../core/types\";\n\n/**\n * Check if a value is a where operator object\n */\nfunction isWhereOperator(value: unknown): value is WhereOperators {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const obj = value as Record<string, unknown>;\n return \"in\" in obj || \"gt\" in obj || \"gte\" in obj || \"lt\" in obj || \"lte\" in obj || \"like\" in obj || \"is\" in obj || \"neq\" in obj || \"notIn\" in obj;\n}\n\n/**\n * SQLite query builder.\n * Creates parameterized SQL queries for local SQLite execution.\n */\nexport class SQLBuilder {\n /**\n * Build a SELECT query for a single table.\n *\n * @param table - Table name\n * @param columns - Columns to select (\"*\" or array of column definitions)\n * @param options - Query options (where, orderBy, limit, offset)\n * @returns Built query with SQL and parameters\n *\n * @example\n * const builder = new SQLBuilder();\n * const query = builder.build(\"EquipmentUnit\", \"*\", {\n * where: { status: \"active\", projectDatabaseId: 123 },\n * orderBy: [{ field: \"name\", direction: \"asc\" }],\n * limit: 10\n * });\n * // query.sql: SELECT * FROM \"EquipmentUnit\" WHERE \"status\" = ? AND \"projectDatabaseId\" = ? ORDER BY \"name\" ASC LIMIT ?\n * // query.params: [\"active\", 123, 10]\n */\n build(table: string, columns: \"*\" | SelectColumn[], options: {\n where?: WhereClause;\n orderBy?: OrderBy[];\n limit?: number;\n offset?: number;\n } = {}): BuiltQuery {\n const params: (string | number | boolean | null)[] = [];\n\n // Build SELECT clause\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else if (columns.length === 0) {\n columnList = \"*\";\n } else {\n columnList = columns.map(c => {\n if (c.alias) {\n return `\"${c.name}\" AS \"${c.alias}\"`;\n }\n return `\"${c.name}\"`;\n }).join(\", \");\n }\n let sql = `SELECT ${columnList} FROM \"${table}\"`;\n\n // Build WHERE clause\n if (options.where && Object.keys(options.where).length > 0) {\n const whereClauses: string[] = [];\n for (const [field, value] of Object.entries(options.where)) {\n if (value === null) {\n // Direct null check\n whereClauses.push(`\"${field}\" IS NULL`);\n } else if (isWhereOperator(value)) {\n // Handle operator objects\n const operatorClauses = this.buildOperatorClauses(field, value, params);\n whereClauses.push(...operatorClauses);\n } else {\n // Simple equality\n whereClauses.push(`\"${field}\" = ?`);\n params.push(value as string | number | boolean);\n }\n }\n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n }\n\n // Build ORDER BY clause\n if (options.orderBy && options.orderBy.length > 0) {\n const orderClauses = options.orderBy.map(o => `\"${o.field}\" ${o.direction.toUpperCase()}`);\n sql += ` ORDER BY ${orderClauses.join(\", \")}`;\n }\n\n // Build LIMIT clause\n if (options.limit !== undefined) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n // Build OFFSET clause\n if (options.offset !== undefined) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n return {\n sql,\n params\n };\n }\n\n /**\n * Build WHERE clauses from operator objects.\n */\n private buildOperatorClauses(field: string, operators: WhereOperators, params: (string | number | boolean | null)[]): string[] {\n const clauses: string[] = [];\n if (\"in\" in operators && operators.in !== undefined) {\n if (operators.in.length === 0) {\n // Empty IN clause - always false\n clauses.push(\"1 = 0\");\n } else {\n const placeholders = operators.in.map(() => \"?\").join(\", \");\n clauses.push(`\"${field}\" IN (${placeholders})`);\n params.push(...operators.in);\n }\n }\n if (\"notIn\" in operators && operators.notIn !== undefined) {\n if (operators.notIn.length === 0) {\n // Empty NOT IN clause - always true, skip\n } else {\n const placeholders = operators.notIn.map(() => \"?\").join(\", \");\n clauses.push(`\"${field}\" NOT IN (${placeholders})`);\n params.push(...operators.notIn);\n }\n }\n if (\"gt\" in operators && operators.gt !== undefined) {\n clauses.push(`\"${field}\" > ?`);\n params.push(operators.gt);\n }\n if (\"gte\" in operators && operators.gte !== undefined) {\n clauses.push(`\"${field}\" >= ?`);\n params.push(operators.gte);\n }\n if (\"lt\" in operators && operators.lt !== undefined) {\n clauses.push(`\"${field}\" < ?`);\n params.push(operators.lt);\n }\n if (\"lte\" in operators && operators.lte !== undefined) {\n clauses.push(`\"${field}\" <= ?`);\n params.push(operators.lte);\n }\n if (\"like\" in operators && operators.like !== undefined) {\n clauses.push(`\"${field}\" LIKE ?`);\n // Add wildcards if not already present\n const pattern = operators.like.includes(\"%\") ? operators.like : `%${operators.like}%`;\n params.push(pattern);\n }\n if (\"is\" in operators && operators.is === null) {\n clauses.push(`\"${field}\" IS NULL`);\n }\n if (\"neq\" in operators && operators.neq !== undefined) {\n if (operators.neq === null) {\n clauses.push(`\"${field}\" IS NOT NULL`);\n } else {\n clauses.push(`\"${field}\" != ?`);\n params.push(operators.neq);\n }\n }\n return clauses;\n }\n\n /**\n * Build a query to fetch related records by foreign key.\n *\n * @param table - The related table name\n * @param foreignKey - The FK column to match against\n * @param parentIds - Array of parent IDs to fetch related records for\n * @param columns - Columns to select\n * @returns Built query\n *\n * @example\n * // Fetch all EquipmentFixtures for given EquipmentUnit IDs\n * const query = builder.buildRelationQuery(\n * \"EquipmentFixture\",\n * \"equipmentUnitId\",\n * [\"uuid-1\", \"uuid-2\"],\n * \"*\"\n * );\n * // query.sql: SELECT * FROM \"EquipmentFixture\" WHERE \"equipmentUnitId\" IN (?, ?)\n * // query.params: [\"uuid-1\", \"uuid-2\"]\n */\n buildRelationQuery(table: string, foreignKey: string, parentIds: (string | number)[], columns: \"*\" | SelectColumn[]): BuiltQuery {\n // Handle empty parent IDs\n if (parentIds.length === 0) {\n return {\n sql: `SELECT ${columns === \"*\" ? \"*\" : this.buildColumnList(columns, foreignKey)} FROM \"${table}\" WHERE 1 = 0`,\n params: []\n };\n }\n\n // Build column list, ensuring FK is included for joining\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else {\n columnList = this.buildColumnList(columns, foreignKey);\n }\n const placeholders = parentIds.map(() => \"?\").join(\", \");\n const sql = `SELECT ${columnList} FROM \"${table}\" WHERE \"${foreignKey}\" IN (${placeholders})`;\n return {\n sql,\n params: [...parentIds]\n };\n }\n\n /**\n * Build column list ensuring the foreign key is included.\n */\n private buildColumnList(columns: SelectColumn[], foreignKey: string): string {\n const colNames = columns.map(c => c.name);\n\n // Always include the foreign key for joining\n const columnList = columns.map(c => {\n if (c.alias) {\n return `\"${c.name}\" AS \"${c.alias}\"`;\n }\n return `\"${c.name}\"`;\n });\n\n // Add FK if not already present\n if (!colNames.includes(foreignKey)) {\n columnList.unshift(`\"${foreignKey}\"`);\n }\n return columnList.join(\", \");\n }\n\n /**\n * Build a SELECT query for a single record by ID.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param columns - Columns to select\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildByIdQuery(table: string, id: string | number, columns: \"*\" | SelectColumn[] = \"*\", idColumn: string = \"id\"): BuiltQuery {\n let columnList: string;\n if (columns === \"*\") {\n columnList = \"*\";\n } else if (columns.length === 0) {\n columnList = \"*\";\n } else {\n columnList = columns.map(c => c.alias ? `\"${c.name}\" AS \"${c.alias}\"` : `\"${c.name}\"`).join(\", \");\n }\n const sql = `SELECT ${columnList} FROM \"${table}\" WHERE \"${idColumn}\" = ? LIMIT 1`;\n return {\n sql,\n params: [id]\n };\n }\n\n /**\n * Build an INSERT query.\n *\n * @param table - Table name\n * @param data - Record data to insert\n * @returns Built query\n */\n buildInsertQuery(table: string, data: Record<string, unknown>): BuiltQuery {\n const columns = Object.keys(data).filter(k => data[k] !== undefined);\n const values = columns.map(k => data[k]);\n if (columns.length === 0) {\n throw new Error(\"Cannot insert empty record\");\n }\n const columnList = columns.map(c => `\"${c}\"`).join(\", \");\n const placeholders = columns.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO \"${table}\" (${columnList}) VALUES (${placeholders})`;\n return {\n sql,\n params: values as (string | number | boolean | null)[]\n };\n }\n\n /**\n * Build an UPDATE query.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param data - Fields to update\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildUpdateQuery(table: string, id: string | number, data: Record<string, unknown>, idColumn: string = \"id\"): BuiltQuery {\n const columns = Object.keys(data).filter(k => k !== idColumn && data[k] !== undefined);\n if (columns.length === 0) {\n throw new Error(\"No fields to update\");\n }\n const setClauses = columns.map(c => `\"${c}\" = ?`).join(\", \");\n const values = columns.map(k => data[k]);\n const sql = `UPDATE \"${table}\" SET ${setClauses} WHERE \"${idColumn}\" = ?`;\n return {\n sql,\n params: [...(values as (string | number | boolean | null)[]), id]\n };\n }\n\n /**\n * Build a DELETE query.\n *\n * @param table - Table name\n * @param id - Record ID\n * @param idColumn - Name of the ID column (defaults to \"id\")\n * @returns Built query\n */\n buildDeleteQuery(table: string, id: string | number, idColumn: string = \"id\"): BuiltQuery {\n const sql = `DELETE FROM \"${table}\" WHERE \"${idColumn}\" = ?`;\n return {\n sql,\n params: [id]\n };\n }\n\n /**\n * Build a COUNT query.\n *\n * @param table - Table name\n * @param where - Optional where clause\n * @returns Built query\n */\n buildCountQuery(table: string, where?: WhereClause): BuiltQuery {\n const params: (string | number | boolean | null)[] = [];\n let sql = `SELECT COUNT(*) as count FROM \"${table}\"`;\n if (where && Object.keys(where).length > 0) {\n const whereClauses: string[] = [];\n for (const [field, value] of Object.entries(where)) {\n if (value === null) {\n whereClauses.push(`\"${field}\" IS NULL`);\n } else if (isWhereOperator(value)) {\n const operatorClauses = this.buildOperatorClauses(field, value, params);\n whereClauses.push(...operatorClauses);\n } else {\n whereClauses.push(`\"${field}\" = ?`);\n params.push(value as string | number | boolean);\n }\n }\n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n }\n return {\n sql,\n params\n };\n }\n}\n\n/**\n * Create a new SQL builder instance.\n */\nexport function createSQLBuilder(): SQLBuilder {\n return new SQLBuilder();\n}","/**\n * Result Joiner\n *\n * After querying the base table and related tables separately,\n * this module joins them into a nested structure matching Supabase's format.\n */\n\nimport type { ResolvedRelationship } from \"../core/types\";\n\n/**\n * Data about a relation to be joined onto base records.\n */\nexport interface RelationJoinData {\n records: Record<string, unknown>[];\n relationship: ResolvedRelationship;\n nestedRelations: Map<string, RelationJoinData>;\n}\n\n/**\n * Result joiner for combining base records with related data.\n *\n * This class handles joining related data onto base records after\n * separate queries have been executed. It supports:\n * - One-to-many relationships (base gets array of related)\n * - Many-to-one relationships (base gets single related object or null)\n * - Nested relationships (recursive joining)\n */\nexport class ResultJoiner {\n /**\n * Join related data onto base records.\n *\n * @param baseRecords - The base table records\n * @param relatedRecords - Records from the related table\n * @param relationship - The relationship definition\n * @param relationName - The property name to use for the relation\n * @returns Base records with related data attached\n *\n * @example\n * // One-to-many: EquipmentUnit -> EquipmentFixture[]\n * const joiner = new ResultJoiner();\n * const result = joiner.join(\n * equipmentUnits,\n * equipmentFixtures,\n * { type: \"one-to-many\", foreignKey: \"equipmentUnitId\", referencedColumn: \"id\", ... },\n * \"EquipmentFixture\"\n * );\n * // Each equipmentUnit now has EquipmentFixture: [...]\n *\n * @example\n * // Many-to-one: EquipmentUnit -> ProjectDatabase\n * const result = joiner.join(\n * equipmentUnits,\n * projectDatabases,\n * { type: \"many-to-one\", foreignKey: \"projectDatabaseId\", referencedColumn: \"id\", ... },\n * \"ProjectDatabase\"\n * );\n * // Each equipmentUnit now has ProjectDatabase: {...} or null\n */\n join<T extends Record<string, unknown>>(baseRecords: T[], relatedRecords: Record<string, unknown>[], relationship: ResolvedRelationship, relationName: string): T[] {\n if (baseRecords.length === 0) {\n return baseRecords;\n }\n if (relationship.type === \"one-to-many\") {\n // Each base record gets an array of related records\n // The related table has a FK pointing to the base table\n // e.g., EquipmentFixture.equipmentUnitId -> EquipmentUnit.id\n return baseRecords.map(base => {\n const baseId = base[relationship.referencedColumn];\n const related = relatedRecords.filter(r => r[relationship.foreignKey] === baseId);\n return {\n ...base,\n [relationName]: related\n };\n });\n } else {\n // Many-to-one: Each base record gets a single related object or null\n // The base table has a FK pointing to the related table\n // e.g., EquipmentUnit.projectDatabaseId -> ProjectDatabase.id\n\n // Build a lookup map for faster joining\n const relatedMap = new Map<unknown, Record<string, unknown>>();\n for (const r of relatedRecords) {\n const refValue = r[relationship.referencedColumn];\n if (refValue !== null && refValue !== undefined) {\n relatedMap.set(refValue, r);\n }\n }\n return baseRecords.map(base => {\n const fkValue = base[relationship.foreignKey];\n const related = fkValue != null ? relatedMap.get(fkValue) ?? null : null;\n return {\n ...base,\n [relationName]: related\n };\n });\n }\n }\n\n /**\n * Recursively join nested relations onto records.\n *\n * @param baseRecords - The base records\n * @param relationData - Map of relation names to join data\n * @returns Base records with all nested relations attached\n *\n * @example\n * // Join EquipmentFixture and ProjectDatabase onto EquipmentUnit\n * // where EquipmentFixture has its own nested Organization relation\n * const result = joiner.joinNested(equipmentUnits, new Map([\n * [\"EquipmentFixture\", {\n * records: fixtures,\n * relationship: { type: \"one-to-many\", ... },\n * nestedRelations: new Map()\n * }],\n * [\"ProjectDatabase\", {\n * records: projects,\n * relationship: { type: \"many-to-one\", ... },\n * nestedRelations: new Map([\n * [\"Organization\", { records: orgs, relationship: ..., nestedRelations: new Map() }]\n * ])\n * }]\n * ]));\n */\n joinNested<T extends Record<string, unknown>>(baseRecords: T[], relationData: Map<string, RelationJoinData>): T[] {\n let result = [...baseRecords];\n const entries = Array.from(relationData.entries());\n for (const [relationName, data] of entries) {\n // First, recursively join nested relations onto the related records\n let relatedRecords = data.records;\n if (data.nestedRelations.size > 0) {\n relatedRecords = this.joinNested(relatedRecords, data.nestedRelations);\n }\n\n // Then join the related records onto the base records\n result = this.join(result, relatedRecords, data.relationship, relationName);\n }\n return result;\n }\n\n /**\n * Group records by a key field.\n * Useful for preparing data before joining.\n *\n * @param records - Records to group\n * @param keyField - Field to group by\n * @returns Map of key values to arrays of records\n */\n groupBy<T extends Record<string, unknown>>(records: T[], keyField: string): Map<unknown, T[]> {\n const groups = new Map<unknown, T[]>();\n for (const record of records) {\n const key = record[keyField];\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(record);\n }\n return groups;\n }\n\n /**\n * Index records by a unique key field.\n * Useful for many-to-one lookups.\n *\n * @param records - Records to index\n * @param keyField - Field to index by (should be unique)\n * @returns Map of key values to single records\n */\n indexBy<T extends Record<string, unknown>>(records: T[], keyField: string): Map<unknown, T> {\n const index = new Map<unknown, T>();\n for (const record of records) {\n const key = record[keyField];\n if (key !== null && key !== undefined) {\n index.set(key, record);\n }\n }\n return index;\n }\n\n /**\n * Extract unique values for a field from records.\n * Useful for building IN clauses for related queries.\n *\n * @param records - Records to extract from\n * @param field - Field to extract\n * @returns Array of unique non-null values\n */\n extractUniqueValues<T extends Record<string, unknown>>(records: T[], field: string): (string | number)[] {\n const values = new Set<string | number>();\n for (const record of records) {\n const value = record[field];\n if (value !== null && value !== undefined) {\n values.add(value as string | number);\n }\n }\n return Array.from(values);\n }\n\n /**\n * Remove a relation property from records (for cleanup).\n *\n * @param records - Records to process\n * @param relationName - Relation property to remove\n * @returns Records without the specified property\n */\n removeRelation<T extends Record<string, unknown>>(records: T[], relationName: string): Omit<T, typeof relationName>[] {\n return records.map(record => {\n const {\n [relationName]: _removed,\n ...rest\n } = record;\n return rest as Omit<T, typeof relationName>;\n });\n }\n\n /**\n * Flatten a nested relation into the parent record.\n * Useful for flattening many-to-one relations.\n *\n * @param records - Records with nested relation\n * @param relationName - Name of the relation to flatten\n * @param prefix - Prefix for flattened field names\n * @returns Records with flattened relation fields\n */\n flattenRelation<T extends Record<string, unknown>>(records: T[], relationName: string, prefix: string = \"\"): Record<string, unknown>[] {\n return records.map(record => {\n const relation = record[relationName] as Record<string, unknown> | null;\n const {\n [relationName]: _removed,\n ...rest\n } = record;\n if (!relation) {\n return rest;\n }\n const flattenedRelation: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(relation)) {\n const fieldName = prefix ? `${prefix}_${key}` : `${relationName}_${key}`;\n flattenedRelation[fieldName] = value;\n }\n return {\n ...rest,\n ...flattenedRelation\n };\n });\n }\n}\n\n/**\n * Create a new result joiner instance.\n */\nexport function createResultJoiner(): ResultJoiner {\n return new ResultJoiner();\n}","/**\n * Query Executor\n *\n * Orchestrates the full query execution pipeline:\n * 1. Parse select string\n * 2. Build SQL queries\n * 3. Execute against PowerSync database\n * 4. Join related data\n *\n * This provides a unified interface for executing Supabase-style queries\n * against the local SQLite database via PowerSync.\n */\n\nimport type { DatabaseSchema, QueryOptions, ResolvedRelationship, SelectRelation } from \"../core/types\";\nimport { parseSelect } from \"./select-parser\";\nimport { RelationshipResolver } from \"./relationship-resolver\";\nimport { SQLBuilder } from \"./sql-builder\";\nimport { RelationJoinData, ResultJoiner } from \"./result-joiner\";\n\n/**\n * Interface for PowerSync database.\n * This matches the getAll method signature from @powersync/react-native.\n */\nexport interface PowerSyncDatabase {\n getAll<T>(sql: string, params?: unknown[]): Promise<T[]>;\n get<T>(sql: string, params?: unknown[]): Promise<T | null>;\n execute(sql: string, params?: unknown[]): Promise<{\n rowsAffected: number;\n }>;\n}\n\n/**\n * Query executor that handles the full query lifecycle.\n *\n * @example\n * const executor = new QueryExecutor(db, databaseSchema);\n *\n * // Simple query\n * const units = await executor.execute<EquipmentUnit>(\"EquipmentUnit\", {\n * where: { status: \"active\" },\n * orderBy: [{ field: \"name\", direction: \"asc\" }],\n * limit: 10\n * });\n *\n * // Query with relations\n * const unitsWithRelations = await executor.execute<EquipmentUnitWithRelations>(\n * \"EquipmentUnit\",\n * {\n * select: \"*, EquipmentFixture(*), ProjectDatabase(name, Organization(*))\",\n * where: { status: \"active\" }\n * }\n * );\n */\nexport class QueryExecutor {\n private resolver: RelationshipResolver;\n private builder: SQLBuilder;\n private joiner: ResultJoiner;\n constructor(private db: PowerSyncDatabase, private schema: DatabaseSchema) {\n this.resolver = new RelationshipResolver(schema);\n this.builder = new SQLBuilder();\n this.joiner = new ResultJoiner();\n }\n\n /**\n * Execute a query and return results.\n *\n * @param table - The table to query\n * @param options - Query options including select, where, orderBy, limit, offset\n * @returns Array of records with relations attached\n */\n async execute<T>(table: string, options: QueryOptions = {}): Promise<T[]> {\n // Parse the select string\n const parsed = parseSelect(options.select ?? \"*\");\n\n // Build and execute base query\n const baseQuery = this.builder.build(table, parsed.columns, {\n where: options.where,\n orderBy: options.orderBy,\n limit: options.limit,\n offset: options.offset\n });\n const baseRecords = await this.db.getAll<Record<string, unknown>>(baseQuery.sql, baseQuery.params);\n\n // If no records or no relations, return early\n if (baseRecords.length === 0 || parsed.relations.length === 0) {\n return baseRecords as T[];\n }\n\n // Query and join relations\n const result = await this.queryAndJoinRelations(table, baseRecords, parsed.relations);\n return result as T[];\n }\n\n /**\n * Execute a query for a single record by ID.\n *\n * @param table - The table to query\n * @param id - The record ID\n * @param options - Query options (only select is used)\n * @returns Single record or null\n */\n async executeById<T>(table: string, id: string | number, options: Pick<QueryOptions, \"select\"> = {}): Promise<T | null> {\n const parsed = parseSelect(options.select ?? \"*\");\n const idColumn = this.resolver.getPrimaryKey(table);\n\n // Build and execute base query\n const baseQuery = this.builder.buildByIdQuery(table, id, parsed.columns, idColumn);\n const records = await this.db.getAll<Record<string, unknown>>(baseQuery.sql, baseQuery.params);\n if (records.length === 0) {\n return null;\n }\n\n // If no relations, return early\n if (parsed.relations.length === 0) {\n return records[0] as T;\n }\n\n // Query and join relations\n const result = await this.queryAndJoinRelations(table, records, parsed.relations);\n return result[0] as T;\n }\n\n /**\n * Execute a count query.\n *\n * @param table - The table to count\n * @param options - Query options (only where is used)\n * @returns Count of matching records\n */\n async count(table: string, options: Pick<QueryOptions, \"where\"> = {}): Promise<number> {\n const query = this.builder.buildCountQuery(table, options.where);\n const result = await this.db.getAll<{\n count: number;\n }>(query.sql, query.params);\n return result[0]?.count ?? 0;\n }\n\n /**\n * Insert a record.\n *\n * @param table - The table to insert into\n * @param data - The record data\n * @returns The inserted record (re-fetched to get defaults)\n */\n async insert<T>(table: string, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] insert called:`, {\n table,\n dataKeys: Object.keys(data),\n hasId: \"id\" in data\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n\n // Generate UUID client-side if not provided\n // PowerSync provides uuid() function in SQLite\n if (!data[idColumn]) {\n const [{\n id\n }] = await this.db.getAll<{\n id: string;\n }>(\"SELECT uuid() as id\");\n data = {\n ...data,\n [idColumn]: id\n };\n if (__DEV__) {\n console.log(`[QueryExecutor] insert generated UUID:`, {\n table,\n id\n });\n }\n }\n const query = this.builder.buildInsertQuery(table, data);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert executing SQL:`, {\n table,\n sql: query.sql,\n paramCount: query.params.length\n });\n }\n await this.db.execute(query.sql, query.params);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert SQL executed successfully:`, {\n table,\n id: data[idColumn]\n });\n }\n\n // Return with guaranteed ID\n const result = await this.executeById<T>(table, data[idColumn] as string);\n if (__DEV__) {\n console.log(`[QueryExecutor] insert completed:`, {\n table,\n operation: \"insert\",\n resultId: (result as Record<string, unknown>)?.[idColumn] ?? data[idColumn],\n refetchSucceeded: result !== null\n });\n }\n return result ?? data as T;\n }\n\n /**\n * Update a record.\n *\n * @param table - The table to update\n * @param id - The record ID\n * @param data - The fields to update\n * @returns The updated record\n */\n async update<T>(table: string, id: string | number, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] update called:`, {\n table,\n id,\n dataKeys: Object.keys(data)\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n const query = this.builder.buildUpdateQuery(table, id, data, idColumn);\n if (__DEV__) {\n console.log(`[QueryExecutor] update executing SQL:`, {\n table,\n id,\n sql: query.sql,\n paramCount: query.params.length\n });\n }\n await this.db.execute(query.sql, query.params);\n if (__DEV__) {\n console.log(`[QueryExecutor] update SQL executed successfully:`, {\n table,\n id\n });\n }\n\n // Re-fetch to get the updated record\n const result = await this.executeById<T>(table, id);\n if (__DEV__) {\n console.log(`[QueryExecutor] update completed:`, {\n table,\n operation: \"update\",\n id,\n refetchSucceeded: result !== null\n });\n }\n if (result) {\n return result;\n }\n\n // Fall back to returning merged data\n return {\n ...data,\n [idColumn]: id\n } as T;\n }\n\n /**\n * Upsert a record (insert or update).\n *\n * @param table - The table to upsert into\n * @param data - The record data (must include ID for update)\n * @returns The upserted record\n */\n async upsert<T>(table: string, data: Record<string, unknown>): Promise<T> {\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert called:`, {\n table,\n dataKeys: Object.keys(data),\n hasId: \"id\" in data,\n idValue: data.id ?? \"none\"\n });\n }\n const idColumn = this.resolver.getPrimaryKey(table);\n let id = data[idColumn];\n\n // Generate UUID client-side if not provided\n // PowerSync provides uuid() function in SQLite\n if (!id) {\n const [{\n id: generatedId\n }] = await this.db.getAll<{\n id: string;\n }>(\"SELECT uuid() as id\");\n id = generatedId;\n data = {\n ...data,\n [idColumn]: id\n };\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert generated UUID:`, {\n table,\n id\n });\n }\n }\n\n // Check if record exists\n const existing = await this.executeById(table, id as string | number);\n if (__DEV__) {\n console.log(`[QueryExecutor] upsert existence check:`, {\n table,\n id,\n exists: existing !== null,\n willPerform: existing ? \"update\" : \"insert\"\n });\n }\n if (existing) {\n return this.update<T>(table, id as string | number, data);\n }\n return this.insert<T>(table, data);\n }\n\n /**\n * Delete a record.\n *\n * @param table - The table to delete from\n * @param id - The record ID\n */\n async delete(table: string, id: string | number): Promise<void> {\n const idColumn = this.resolver.getPrimaryKey(table);\n const query = this.builder.buildDeleteQuery(table, id, idColumn);\n await this.db.execute(query.sql, query.params);\n }\n\n /**\n * Query and join relations onto parent records.\n *\n * @param parentTable - The parent table name\n * @param parentRecords - Parent records to add relations to\n * @param relations - Relations to query and join\n * @returns Parent records with relations attached\n */\n private async queryAndJoinRelations(parentTable: string, parentRecords: Record<string, unknown>[], relations: SelectRelation[]): Promise<Record<string, unknown>[]> {\n let result = [...parentRecords];\n for (const relation of relations) {\n // Resolve the relationship\n const resolved = this.resolver.resolve(parentTable, relation.name);\n if (!resolved) {\n console.warn(`Could not resolve relationship: ${parentTable} -> ${relation.name}`);\n continue;\n }\n\n // Get parent IDs for the query\n const parentIds = this.getParentIdsForRelation(parentRecords, resolved);\n if (parentIds.length === 0) {\n // No parents to join, add empty arrays/nulls\n result = result.map(r => ({\n ...r,\n [relation.alias ?? relation.name]: resolved.type === \"one-to-many\" ? [] : null\n }));\n continue;\n }\n\n // Query related table\n const relQuery = this.buildRelatedQuery(relation, resolved, parentIds);\n let relatedRecords = await this.db.getAll<Record<string, unknown>>(relQuery.sql, relQuery.params);\n\n // Recursively handle nested relations\n if (relation.relations.length > 0 && relatedRecords.length > 0) {\n relatedRecords = await this.queryAndJoinRelations(relation.name, relatedRecords, relation.relations);\n }\n\n // Join onto parent records\n result = this.joiner.join(result, relatedRecords, resolved, relation.alias ?? relation.name);\n }\n return result;\n }\n\n /**\n * Get parent IDs needed for a relation query.\n */\n private getParentIdsForRelation(parentRecords: Record<string, unknown>[], resolved: ResolvedRelationship): (string | number)[] {\n let parentIds: (string | number)[];\n if (resolved.type === \"one-to-many\") {\n // For one-to-many, we need the parent's referenced column (usually id)\n parentIds = this.joiner.extractUniqueValues(parentRecords, resolved.referencedColumn);\n } else {\n // For many-to-one, we need the parent's foreign key values\n parentIds = this.joiner.extractUniqueValues(parentRecords, resolved.foreignKey);\n }\n return parentIds;\n }\n\n /**\n * Build a query for related records.\n */\n private buildRelatedQuery(relation: SelectRelation, resolved: ResolvedRelationship, parentIds: (string | number)[]): {\n sql: string;\n params: (string | number | boolean | null)[];\n } {\n // Determine which column to filter on\n const filterColumn = resolved.type === \"one-to-many\" ? resolved.foreignKey // Filter by FK in the related table\n : resolved.referencedColumn; // Filter by PK in the related table\n\n // Dedupe parent IDs\n const uniqueIds = Array.from(new Set(parentIds));\n return this.builder.buildRelationQuery(relation.name, filterColumn, uniqueIds, relation.columns);\n }\n\n /**\n * Get the relationship resolver (for advanced use).\n */\n getResolver(): RelationshipResolver {\n return this.resolver;\n }\n\n /**\n * Get the SQL builder (for advanced use).\n */\n getBuilder(): SQLBuilder {\n return this.builder;\n }\n\n /**\n * Get the result joiner (for advanced use).\n */\n getJoiner(): ResultJoiner {\n return this.joiner;\n }\n}\n\n/**\n * Create a query executor instance.\n *\n * @param db - PowerSync database instance\n * @param schema - Database schema\n * @returns QueryExecutor instance\n */\nexport function createQueryExecutor(db: PowerSyncDatabase, schema: DatabaseSchema): QueryExecutor {\n return new QueryExecutor(db, schema);\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { PostgrestError, PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { useMemo } from \"react\";\nimport { ItemType } from \"@pol-studios/utils\";\nimport { encode, useQuery as useSupabaseQuery, UseQuerySingleReturn as BaseUseQuerySingleReturn } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { omit } from \"@pol-studios/utils\";\nimport { UseQueryOptions } from \"@tanstack/react-query\";\nimport { useDelayedValue } from \"@pol-studios/hooks/state\";\ntype ConfigurationOptions<T> = {\n crossOrganization?: boolean;\n filter?: (item: ItemType<T>) => boolean;\n};\nexport type UseQuerySingleReturn<T> = BaseUseQuerySingleReturn<T> & {\n data: T | null | undefined;\n};\nexport function useQuery(query, config) {\n const $ = _c(5);\n let t0;\n if ($[0] !== query) {\n const queryKey = encode(query, false);\n t0 = queryKey.join(\"-\");\n $[0] = query;\n $[1] = t0;\n } else {\n t0 = $[1];\n }\n const queryKeyString = t0;\n const debouncedKeyString = useDelayedValue(queryKeyString, 50);\n const isKeyStable = queryKeyString === debouncedKeyString;\n const effectiveEnabled = config?.enabled !== false && isKeyStable;\n let t1;\n if ($[2] !== config || $[3] !== effectiveEnabled) {\n t1 = omit({\n retry: 1,\n ...config,\n enabled: effectiveEnabled\n }, [\"queryKey\"]);\n $[2] = config;\n $[3] = effectiveEnabled;\n $[4] = t1;\n } else {\n t1 = $[4];\n }\n const request = useSupabaseQuery(query, t1 as any);\n return request as UseQuerySingleReturn<Result>;\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { UseQueryOptions } from \"@tanstack/react-query\";\nimport { PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { encode } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { useQuery } from \"./useQuery\";\nimport { useId, useMemo } from \"react\";\nimport { newUuid } from \"@pol-studios/utils\";\nimport { useSessionStorageState } from \"@pol-studios/hooks/storage\";\nexport type UsePartialQueryResult<T extends Record<string, any>> = ReturnType<typeof usePartialQuery<T[]>>;\ntype ItemType<T> = T extends Array<infer U> ? U : T;\nexport function usePartialQuery(query, itemCountPerPage, config) {\n const $ = _c(28);\n let t0;\n if ($[0] !== query) {\n t0 = encode(query, false);\n $[0] = query;\n $[1] = t0;\n } else {\n t0 = $[1];\n }\n const initialQuery = t0;\n let t1;\n if ($[2] !== initialQuery[7] || $[3] !== initialQuery[8]) {\n t1 = [initialQuery[7], initialQuery[8]];\n $[2] = initialQuery[7];\n $[3] = initialQuery[8];\n $[4] = t1;\n } else {\n t1 = $[4];\n }\n const id = t1.join(\"-\");\n const [currentPage, setCurrentPage] = useSessionStorageState(id, 1);\n const page = currentPage ?? 1;\n const t2 = query as any;\n let t3;\n if ($[5] !== itemCountPerPage || $[6] !== page || $[7] !== t2) {\n t3 = t2.range((page - 1) * itemCountPerPage, page * itemCountPerPage - 1);\n $[5] = itemCountPerPage;\n $[6] = page;\n $[7] = t2;\n $[8] = t3;\n } else {\n t3 = $[8];\n }\n const rangedQuery = t3;\n const baseQuery = useQuery(rangedQuery, config as any);\n let t4;\n if ($[9] !== setCurrentPage) {\n t4 = () => {\n setCurrentPage(_temp);\n };\n $[9] = setCurrentPage;\n $[10] = t4;\n } else {\n t4 = $[10];\n }\n const safeFetchNextPage = t4;\n let t5;\n if ($[11] !== setCurrentPage) {\n t5 = () => {\n setCurrentPage(_temp2);\n };\n $[11] = setCurrentPage;\n $[12] = t5;\n } else {\n t5 = $[12];\n }\n const fetchPreviousPage = t5;\n const pageCount = Math.max(Math.ceil((baseQuery.count ?? 0) / itemCountPerPage), 1);\n let t6;\n if ($[13] !== baseQuery.count || $[14] !== baseQuery.data || $[15] !== currentPage || $[16] !== itemCountPerPage) {\n t6 = baseQuery.data ? toPagedResponse(baseQuery.data as Result, currentPage, baseQuery.count ?? baseQuery.data.length, itemCountPerPage) : null;\n $[13] = baseQuery.count;\n $[14] = baseQuery.data;\n $[15] = currentPage;\n $[16] = itemCountPerPage;\n $[17] = t6;\n } else {\n t6 = $[17];\n }\n const t7 = currentPage < pageCount;\n const t8 = currentPage > 1;\n let t9;\n if ($[18] !== baseQuery || $[19] !== currentPage || $[20] !== fetchPreviousPage || $[21] !== pageCount || $[22] !== safeFetchNextPage || $[23] !== setCurrentPage || $[24] !== t6 || $[25] !== t7 || $[26] !== t8) {\n t9 = {\n ...baseQuery,\n fetchPreviousPage,\n fetchNextPage: safeFetchNextPage,\n currentPage,\n setCurrentPage,\n data: t6,\n pageCount,\n hasNextPage: t7,\n hasPreviousPage: t8\n };\n $[18] = baseQuery;\n $[19] = currentPage;\n $[20] = fetchPreviousPage;\n $[21] = pageCount;\n $[22] = safeFetchNextPage;\n $[23] = setCurrentPage;\n $[24] = t6;\n $[25] = t7;\n $[26] = t8;\n $[27] = t9;\n } else {\n t9 = $[27];\n }\n return t9;\n}\nfunction _temp2(currentPage_1) {\n return currentPage_1 - 1;\n}\nfunction _temp(currentPage_0) {\n return currentPage_0 + 1;\n}\nfunction toPagedResponse<Result extends any[]>(results: Result, currentPage: number, totalCount: number, itemPerPage: number) {\n const newPage = {\n Items: results,\n CurrentPage: currentPage,\n ItemCount: totalCount,\n MaxCountPerPage: itemPerPage,\n PageCount: Math.max(Math.ceil(totalCount / itemPerPage), 1)\n };\n return newPage;\n}\ninterface PagedResponse<T extends any[]> {\n Items: T;\n PageCount: number;\n CurrentPage: number;\n ItemCount: number;\n MaxCountPerPage: number;\n ContinuationToken: string;\n}","import { encode } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { PostgrestSingleResponse, SupabaseClient } from \"@supabase/supabase-js\";\nimport { Dispatch, SetStateAction, useEffect, useMemo, useRef, useState } from \"react\";\nimport useSupabase from \"../useSupabase\";\nimport { PostgrestParser } from \"../parser/PostgrestParser\";\nimport { generateUUID } from \"../utils/uuid\";\nimport { DefinedUseQueryResult, useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { isNullOrWhitespace, isUsable, omit } from \"@pol-studios/utils\";\nimport { useSessionStorageState } from \"@pol-studios/hooks/storage\";\nimport { getSupabaseUrl } from \"../config\";\nimport { FilterConfig, TableInfo, PropertyType, ValueForPropertyType } from \"../types\";\n\n// Re-export FilterConfig and TableInfo for backward compatibility\n// NOTE: PropertyType and ValueForPropertyType are NOT re-exported here to avoid duplicates\n// They are exported from \"@pol-studios/db/types\" which is re-exported in index.ts\nexport type { FilterConfig, TableInfo };\nexport const normalizeFilter = (filter: FilterInput): Filter | FilterGroup | null => {\n // Check if it's a group (using either new 'op' or legacy 'operator' property)\n const groupOp = filter.op || filter.operator;\n if (groupOp && (groupOp === \"AND\" || groupOp === \"OR\") && filter.filters) {\n // It's a group, recursively normalize children\n return {\n id: filter.id || generateUUID(),\n op: groupOp,\n not: filter.not || filter.inverted,\n // Support both 'not' and legacy 'inverted' for groups\n filters: filter.filters.map(normalizeFilter).filter(Boolean) as Array<Filter | FilterGroup>\n };\n }\n\n // Get the operator - either from op or condition field\n let operator = filter.op || filter.condition;\n\n // Track if we need to negate the filter (for != and operators)\n let shouldNegate = filter.not || filter.inverted || false;\n\n // Convert unicode symbols and legacy operators to string operators that edge function expects\n if (operator === \"\\u220B\") operator = \"in\"; // CONTAINS symbol\n // Handle NOT EQUALS: \"!=\" and \"not equals symbol\" are converted to \"=\" with not: true\n if (operator === \"\\u2260\" || operator === \"!=\") {\n operator = \"=\";\n shouldNegate = true;\n }\n if (operator === \"like\") operator = \"contains\"; // Legacy LIKE\n if (operator === \"regex\" || operator === \"regex_i\" || operator === \"similar_to\") {\n // These advanced text operators aren't supported by the edge function yet\n // Fall back to contains for now\n operator = \"contains\";\n }\n\n // Skip filters with undefined operators\n if (!operator) {\n console.error(\"Filter has undefined operator:\", JSON.stringify(filter, null, 2));\n return null;\n }\n\n // Convert old format to new format\n if (filter.propertyName) {\n return {\n id: filter.id || generateUUID(),\n field: filter.propertyName,\n op: operator as FilterOperator,\n value: filter.value as string | number | string[] | number[],\n not: shouldNegate,\n display: filter.display || filter.propertyName\n };\n }\n\n // Already in new format but may need operator normalization\n return {\n id: filter.id || generateUUID(),\n field: filter.field || \"\",\n op: operator as FilterOperator,\n value: filter.value as string | number | string[] | number[],\n not: shouldNegate,\n similarity: filter.similarity,\n where: filter.where,\n display: filter.display || filter.field || \"\"\n };\n};\n/**\n * Filter state for the UI - extends Filter with UI-specific metadata.\n * FilterState can always be assigned where Filter is expected since it\n * contains all Filter properties. The omitted properties (similarity, where, options)\n * are AI search-specific and not typically needed in the UI filter state.\n */\nexport interface FilterState extends Omit<Filter, 'similarity' | 'where' | 'options'> {\n // All base properties (id, field, op, value, not, display, info) are inherited from Filter.\n}\n\n// Allows single or array values for a given PropertyType\nexport type ValueOrArrayForPropertyType<T extends PropertyType> = ValueForPropertyType<T> | ValueForPropertyType<T>[];\n\n/**\n * State for tracking extra query metadata\n */\ninterface ExtraDataState {\n count?: number;\n key?: string;\n [key: string]: unknown;\n}\n\n/**\n * Body structure for query execution\n */\ninterface QueryBody {\n filters: Array<Filter | FilterGroup>;\n pagination: {\n from?: number | null;\n to?: number | null;\n offset?: number;\n limit?: number;\n };\n sort?: Sort[];\n op?: \"AND\" | \"OR\";\n id?: string;\n not?: boolean;\n distinctOn?: string[];\n naturalLanguageQuery?: string;\n isReady?: boolean;\n}\nexport type BooleanOperator = \"AND\" | \"OR\";\n\n/**\n * Filter operators supported by the edge function.\n * This is the single source of truth - matches /supabase/functions/_shared/query-sdk/types.ts\n *\n * Note: The following operators are normalized by normalizeFilter() before sending to the server:\n * - \"like\" -> \"contains\"\n * - \"regex\", \"regex_i\", \"similar_to\" -> \"contains\"\n * - \"!=\" and \"<>\" are NOT supported - use \"=\" with not: true instead\n */\nexport type FilterOperator =\n// Comparison operators\n\"=\" | \">\" | \">=\" | \"<\" | \"<=\"\n// Text search operators\n| \"contains\" | \"ilike\"\n// Null/boolean check\n| \"is\"\n// Array membership\n| \"in\"\n// AI/semantic search\n| \"ai_search\";\n\n// Type alias for backward compatibility\nexport type FilterConditionType = FilterOperator;\n\n/**\n * Filter interface - matches edge function API\n */\nexport interface Filter {\n /** Unique identifier */\n id: string;\n /** Field to filter on */\n field: string;\n /** Operator */\n op: FilterOperator;\n /** Value to compare */\n value: string | number | string[] | number[] | boolean | null;\n /** Negate the condition */\n not?: boolean;\n /** AI search options (when op = \"ai_search\") */\n similarity?: number;\n where?: string;\n display?: string;\n options?: {\n display: string;\n value: ValueForPropertyType<PropertyType>;\n }[];\n /** Filter configuration (UI metadata) */\n info?: FilterConfig<any>;\n}\n\n/**\n * Filter group - combine multiple filters\n */\nexport interface FilterGroup {\n /** Unique identifier */\n id: string;\n /** How to combine filters */\n op: \"AND\" | \"OR\";\n /** Filters in this group */\n filters: Array<Filter | FilterGroup>;\n /** Negate the entire group (NOT (A AND B)) */\n not?: boolean;\n}\n\n/**\n * Input type for normalizeFilter - accepts both legacy and new filter formats.\n * The normalizeFilter function handles legacy operators (like, regex, etc.) for data migration,\n * but the type only exposes the supported FilterOperator values.\n */\nexport type FilterInput = {\n id?: string;\n // New format fields (Filter)\n field?: string;\n value?: string | number | string[] | number[] | boolean | null;\n not?: boolean;\n similarity?: number;\n where?: string;\n display?: string;\n options?: {\n display: string;\n value: ValueForPropertyType<PropertyType>;\n }[];\n // FilterGroup fields\n filters?: Array<Filter | FilterGroup | FilterInput>;\n // Combined op field - can be either FilterOperator (for filters) or group operator\n op?: FilterOperator | \"AND\" | \"OR\";\n // Legacy fields\n propertyName?: string;\n condition?: string;\n operator?: \"AND\" | \"OR\";\n inverted?: boolean;\n};\n\n/**\n * Pagination settings\n */\nexport interface Pagination {\n offset?: number;\n limit?: number;\n}\n\n/**\n * Configuration for computed/aggregated field sorting\n */\nexport interface ComputedSortConfig {\n /** Aggregation function to apply */\n fn: \"SUM\" | \"COUNT\" | \"AVG\" | \"MIN\" | \"MAX\";\n /** Field to aggregate */\n field: string;\n /** Relationship path for related table aggregation (e.g., \"OrderItem\" or \"Order.OrderItem\") */\n relationship?: string;\n}\n\n/**\n * Sort order\n */\nexport interface Sort {\n field: string;\n direction: \"asc\" | \"desc\";\n /** Optional computed/aggregated sort configuration for sorting by aggregate values */\n computed?: ComputedSortConfig;\n}\n\n/**\n * Query state that includes FilterGroup plus pagination, sort, and isReady\n * Used by useAdvancedFilterQuery for managing filter state with query metadata\n */\nexport interface QueryState extends FilterGroup {\n /** Pagination settings */\n pagination?: Pagination;\n /** Sort order */\n sort?: Sort[];\n /** Distinct ON expressions - returns one record per unique combination */\n distinctOn?: string[];\n /** Natural language query - converts to filters automatically */\n naturalLanguageQuery?: string;\n /** Whether the query is ready to execute */\n isReady: boolean;\n}\nexport interface ClarificationSuggestion {\n interpretation: string;\n field_path: string;\n example: string;\n confidence: number;\n}\nexport interface ClarificationQuestion {\n question: string;\n suggestions: ClarificationSuggestion[];\n}\ninterface AdvancedQueryResult<T> {\n data: T;\n count: number;\n error?: Error | null;\n clarification?: ClarificationQuestion;\n}\nexport interface FilterContextType<T> {\n filters: FilterGroup;\n setFilters: Dispatch<SetStateAction<FilterGroup>>;\n}\n\n// Legacy types for backward compatibility\nexport interface OrderColumn {\n field: string;\n direction: \"asc\" | \"desc\";\n}\nexport function useAdvancedFilterQuery<Result>(query: PromiseLike<PostgrestSingleResponse<Result>>, config?: Omit<UseQueryOptions<PostgrestSingleResponse<Result>>, \"queryKey\" | \"queryFn\"> & {\n key?: string;\n filterKey?: string;\n searchByDefault?: boolean;\n timeout?: number;\n count?: \"exact\" | \"estimated\" | \"\";\n}): [DefinedUseQueryResult<Result, Error> & {\n count: number;\n clarification?: ClarificationQuestion;\n}, QueryState, Dispatch<SetStateAction<QueryState>>] {\n const filterKey = useMemo(() => config?.filterKey ?? window.location?.pathname, [config?.filterKey]);\n const [filterLayer, setFilterLayer] = useSessionStorageState<QueryState>(filterKey, {\n id: \"root\",\n op: \"AND\",\n filters: [],\n pagination: undefined,\n sort: [],\n isReady: isUsable(config?.searchByDefault) ? config.searchByDefault ? false : true : true\n });\n const parser = useMemo(() => new PostgrestParser<Result>(query as any), [query, config?.key]);\n useEffect(() => {\n const searchParam = parser.searchParams.get(\"order\");\n if (searchParam) {\n const orderColumns = searchParam.split(\",\");\n const orders: OrderColumn[] = [];\n orderColumns.forEach(x => {\n const values = x.split(\".\");\n orders.push({\n field: values[0],\n direction: values[1] === \"asc\" ? \"asc\" : \"desc\"\n });\n });\n setFilterLayer(pre => {\n if (!pre) {\n return {\n id: \"root\",\n op: \"AND\",\n filters: [],\n isReady: true,\n sort: orders\n };\n }\n return {\n ...pre,\n id: pre.id || \"root\",\n op: pre.op || \"AND\",\n filters: pre.filters || [],\n isReady: pre.isReady ?? true,\n sort: [...(pre.sort || []).filter(old => orders.some(o => o.field === old.field) === false), ...orders]\n };\n });\n }\n }, [JSON.stringify(parser.searchParams), config?.key]);\n const encodedQueryKeyRef = useRef<any[]>([]);\n const encodedQueryKey = useMemo(() => {\n const newEncoded = encode(query, false);\n const newEncodedString = JSON.stringify(newEncoded);\n const oldEncodedString = JSON.stringify(encodedQueryKeyRef.current);\n if (newEncodedString !== oldEncodedString) {\n encodedQueryKeyRef.current = newEncoded;\n }\n return encodedQueryKeyRef.current;\n }, [query, parser.offset, parser.limit]);\n\n // Stabilize filterLayer stringification using ref\n const filterLayerStringRef = useRef<string>(\"\");\n const currentFilterString = JSON.stringify(filterLayer, (key, value) => key === \"id\" ? \"redacted\" : value);\n if (filterLayerStringRef.current !== currentFilterString) {\n filterLayerStringRef.current = currentFilterString;\n }\n\n // Stabilize queryKey using ref - don't use useMemo, just ref\n const queryKeyRef = useRef<any[]>([]);\n const newKey = [encodedQueryKey[0], encodedQueryKey[1], encodedQueryKey[2], encodedQueryKey[3], encodedQueryKey[4], encodedQueryKey[5], \"count=\" + (config?.count ?? \"\"), encodedQueryKey[7], encodedQueryKey[8], filterLayerStringRef.current];\n\n // Only update ref if content actually changed\n const newKeyString = JSON.stringify(newKey);\n const oldKeyString = JSON.stringify(queryKeyRef.current);\n if (oldKeyString !== newKeyString) {\n queryKeyRef.current = newKey;\n }\n const queryKey = queryKeyRef.current;\n const [previousKey, setPreviousKey] = useState(queryKey);\n useEffect(() => {\n if (filterLayer?.isReady) {\n setPreviousKey(queryKey);\n }\n }, [...queryKey]);\n\n // const [local, setLocal] = useLocalStorageState(\"query\" + path, {});\n\n const loadingKey = filterLayer?.isReady ? queryKey : previousKey ?? queryKey;\n const supabase = useSupabase();\n const isEnabled = config?.enabled == null || config?.enabled === undefined ? true : config.enabled;\n const [extraData, setExtraData] = useState<ExtraDataState>({});\n const queryResponse = useQuery<AdvancedQueryResult<Result>>({\n ...(omit({\n retry: 0,\n // Changed from 1 to 0 to prevent retries\n ...(config ?? {}),\n // Override any config settings to prevent multiple executions\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n structuralSharing: false,\n enabled: filterLayer?.isReady && isEnabled\n }, [\"queryKey\", \"persister\", \"initialData\"]) as any),\n queryKey: loadingKey,\n queryFn: async props => {\n // Guard clause for type safety - query is only enabled when filterLayer exists\n if (!filterLayer) {\n throw new Error(\"Filter layer is not initialized\");\n }\n try {\n const searchParams = Array.from(parser.searchParams.entries());\n const body = {\n ...filterLayer,\n filters: [...filterLayer.filters],\n pagination: {\n ...filterLayer.pagination\n },\n sort: [...(filterLayer.sort || [])]\n };\n const currentKey = `${parser.schema}${parser.table}${parser.select}${JSON.stringify(omit(body, \"pagination\"))}`;\n\n // For now, assume we don't need edge function for ordering\n // (simplified ordering logic removed complex manyToOneTableInfo handling)\n const requiresEdgeForOrdering = false;\n\n // Always use edge function if natural language query is present\n const hasNaturalLanguageQuery = !!filterLayer.naturalLanguageQuery;\n if (filterLayer.filters.length == 0 && requiresEdgeForOrdering === false && !hasNaturalLanguageQuery) {\n const result = await executeSupabaseQuery(supabase, body, parser, extraData, props.signal, config?.count);\n setExtraData(pre_0 => ({\n ...omit(result, \"data\"),\n count: result.count ? result.count : pre_0.count,\n key: currentKey\n }));\n return result;\n }\n searchParams.forEach(([k, v]) => {\n if (k.includes(\"offset\")) {\n body.pagination.offset = Number(v);\n return;\n }\n if (k.includes(\"limit\")) {\n body.pagination.limit = Number(v);\n return;\n }\n if (k.includes(\"order\")) {\n // const orderColumns = v.split(\",\");\n // orderColumns.forEach((x) => {\n // const values = x.split(\".\");\n // body.order.push({\n // propertyName: values[0],\n // isAscending: values[1] === \"asc\",\n // });\n // });\n return;\n }\n // Skip .or() filters - they're handled separately below for edge function\n if (k === \"or\") {\n return;\n }\n if (v.includes(\".\") === false) return;\n const values_0 = v.split(\".\");\n const column = k;\n let rawCondition = values_0[0];\n let condition = \"\";\n let value_0: any = values_0[1];\n const inverted = values_0[0] === \"not\";\n if (column == \"select\") return;\n if (rawCondition === \"not\") {\n rawCondition = values_0[1];\n value_0 = values_0[2];\n }\n switch (rawCondition) {\n case \"eq\":\n condition = \"=\";\n break;\n case \"in\":\n condition = \"in\";\n value_0 = value_0.slice(1, value_0.length - 1).split(\",\").filter((x_0: string) => isNullOrWhitespace(x_0) === false);\n break;\n case \"lt\":\n condition = \"<\";\n break;\n case \"gt\":\n condition = \">\";\n break;\n case \"lte\":\n condition = \"<=\";\n break;\n case \"gte\":\n condition = \">=\";\n break;\n case \"is\":\n condition = \"is\";\n if (value_0 == \"null\") {\n value_0 = null;\n }\n break;\n }\n body.filters = [{\n id: `filter_${column}_${Date.now()}`,\n field: column,\n op: condition as FilterOperator,\n value: value_0,\n not: inverted,\n display: column\n }, {\n filters: [...body.filters] as Filter[],\n op: body.op ?? \"AND\",\n id: \"filterstate\"\n }];\n body.op = \"AND\";\n\n // Keep the base query in the query you are saving but not the pagination settings\n const bodyCopy = JSON.parse(JSON.stringify(body));\n bodyCopy.pagination = {\n page: 0,\n pageSize: 50\n };\n bodyCopy.isReady = true;\n\n // setLocal(bodyCopy);\n });\n const {\n data: {\n session\n }\n } = await supabase.auth.getSession();\n if (!session?.access_token) {\n throw new Error(\"No active session\");\n }\n const controller = new AbortController();\n props.signal.addEventListener(\"abort\", () => {\n controller.abort();\n });\n const timeout = setTimeout(() => controller.abort(), config?.timeout ?? 15_000);\n let result_0: any = null;\n let response: {\n error: Error | null;\n data: any;\n } = {\n error: null,\n data: null\n };\n try {\n // Strip UI-only properties from filters before sending to server\n // These properties are for UI metadata and should never be sent to the edge function\n const UI_ONLY_KEYS = new Set([\"info\", \"options\", \"display\"]);\n const filteredBody = JSON.parse(JSON.stringify(body, (key_0, value_1) => {\n // Unconditionally remove UI-only properties from all filters\n if (UI_ONLY_KEYS.has(key_0)) {\n return undefined;\n }\n return value_1;\n }));\n\n // Normalize all filters to use the new format (field, op) instead of (propertyName, condition)\n // Also convert unicode symbols to string operators\n\n filteredBody.filters = filteredBody.filters.map(normalizeFilter).filter(Boolean);\n\n // Handle .or() filters from searchParams by converting to filter format\n // Extract the .or() condition if it exists\n const orParam = parser.searchParams.get(\"or\");\n if (orParam) {\n // Parse the or condition\n // Example: \"(oldRecord->projectDatabaseId.eq.40,newRecord->projectDatabaseId.eq.40)\"\n // Strip parentheses first\n const cleanedOrParam = orParam.replace(/^\\(|\\)$/g, \"\");\n\n // Split by comma to get individual conditions\n const orConditions = cleanedOrParam.split(\",\");\n const orFilters = orConditions.map((condition_0, idx) => {\n // Parse each condition: \"oldRecord->projectDatabaseId.eq.40\"\n // The format is: field.operator.value\n const match = condition_0.match(/^(.+?)\\.([^.]+)\\.(.+)$/);\n if (match) {\n const [_, field, rawOp, value_2] = match;\n\n // Convert Supabase operators to edge function operators\n let op = rawOp.trim();\n switch (op) {\n case \"eq\":\n op = \"=\";\n break;\n case \"neq\":\n op = \"!=\";\n break;\n case \"gt\":\n op = \">\";\n break;\n case \"gte\":\n op = \">=\";\n break;\n case \"lt\":\n op = \"<\";\n break;\n case \"lte\":\n op = \"<=\";\n break;\n case \"like\":\n op = \"contains\";\n break;\n case \"ilike\":\n op = \"contains\";\n break;\n case \"in\":\n op = \"in\";\n break;\n // default: keep as-is\n }\n return {\n id: `or-${idx}`,\n field: field.trim(),\n op: op,\n value: value_2.trim()\n };\n }\n return null;\n }).filter(Boolean);\n if (orFilters.length > 0) {\n // Add OR group to filters\n filteredBody.filters = [...filteredBody.filters, {\n id: \"base-or-group\",\n op: \"OR\" as const,\n filters: orFilters,\n pagination: undefined,\n sort: undefined,\n isReady: true\n }];\n }\n }\n const res = await fetch(`${getSupabaseUrl()}/functions/v1/query?forceDenoVersion=2`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${session.access_token}`\n },\n body: JSON.stringify({\n table: parser.table,\n schema: parser.schema,\n select: parser.select,\n filters: {\n id: filteredBody.id || \"root\",\n op: filteredBody.op || filteredBody.operator || \"AND\",\n not: filteredBody.not || filteredBody.inverted,\n // Support both 'not' and legacy 'inverted'\n filters: filteredBody.filters || []\n },\n pagination: filteredBody.pagination,\n sort: filteredBody.sort,\n distinctOn: filteredBody.distinctOn,\n naturalLanguageQuery: filteredBody.naturalLanguageQuery,\n count: currentKey === extraData.key ? \"\" : config?.count ?? \"\",\n debug: true\n }),\n signal: controller.signal\n });\n if (!res.ok) {\n const errorData = await res.json();\n // Extract error message from response - edge function returns { error: string }\n const errorMessage_0 = typeof errorData?.error === \"string\" ? errorData.error : errorData?.error?.message || errorData?.message || \"An error occurred while processing your request\";\n throw new Error(errorMessage_0);\n }\n const data = await res.json();\n\n // Check if this is a clarification response\n if (data.clarification) {\n // Return clarification response - don't process as regular data\n return {\n data: [] as Result[],\n // Empty data array\n count: 0,\n clarification: data.clarification as ClarificationQuestion,\n error: undefined\n };\n }\n result_0 = data;\n response = {\n error: null,\n data: data\n };\n } catch (err: any) {\n if (err.name === \"AbortError\") {\n console.error(\"Fetch aborted/time-out\");\n response = {\n error: new Error(\"This query timed out\"),\n data: null\n };\n } else if (err instanceof Error) {\n // Already an Error instance\n response = {\n error: err,\n data: null\n };\n } else {\n // Convert plain object or string to Error\n const errorMessage = err?.error || err?.message || String(err);\n response = {\n error: new Error(errorMessage),\n data: null\n };\n }\n } finally {\n clearTimeout(timeout);\n }\n\n // const response = await supabase.functions.invoke(\"query\", {\n // body: {\n // tableName: parser.table,\n // schema: parser.schema,\n // query: parser.select,\n // filter: body,\n // },\n // method: \"POST\",\n // });\n\n if (response.error) {\n throw response.error;\n } else if ((response.data as any)?.error) {\n throw new Error((response.data as any).error);\n }\n\n // Check if result contains clarification (should have been handled above, but double-check)\n if (result_0.clarification) {\n return {\n data: [] as Result[],\n count: 0,\n clarification: result_0.clarification as ClarificationQuestion,\n error: undefined\n };\n }\n setExtraData(pre_1 => ({\n ...omit(result_0, \"data\"),\n count: pre_1.key === currentKey ? pre_1.count : result_0.count,\n key: currentKey\n }));\n return {\n ...result_0,\n statusText: \"\",\n status: result_0.data?.length > result_0.count ? 206 : 200,\n error: (response.data as any)?.error ?? null,\n hasMore: result_0.data?.length < result_0.count ? true : false\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n console.log(\"Fetch aborted\");\n } else {\n console.error(\"Error fetching data:\", error);\n }\n if (error instanceof Error && error.message === \"Failed to send a request to the Edge Function\") {\n throw new Error(\"Could not contact query server\");\n }\n throw error;\n }\n }\n });\n const response_0 = {\n ...queryResponse,\n data: (queryResponse.data as any)?.data,\n count: extraData.count,\n clarification: (queryResponse.data as any)?.clarification\n } as DefinedUseQueryResult<Result, Error> & {\n count: number;\n clarification?: ClarificationQuestion;\n };\n useEffect(() => {\n if (queryResponse.isFetched && response_0.count == null) {\n queryResponse.refetch();\n }\n }, [response_0.count]);\n useEffect(() => {\n if ((queryResponse.data as any)?.error == null) return;\n if ((queryResponse.data as any)?.error?.message?.includes(\" does not exist\")) {\n setFilterLayer({\n id: \"root\",\n op: \"AND\",\n filters: [],\n pagination: undefined,\n sort: [],\n isReady: isUsable(config?.searchByDefault) ? config.searchByDefault ? false : true : true\n });\n }\n }, [(queryResponse.data as any)?.error]);\n return [response_0, filterLayer!, setFilterLayer as any];\n}\n\n// Helper function to check if a column is searchable\n// This is now handled at the FilterBuilder level, but keeping for backward compatibility\nfunction isSearchableColumn(columnName: string): boolean {\n // Since search is now handled at the FilterBuilder level,\n // we'll allow all searches to pass through here\n return true;\n}\nasync function executeSupabaseQuery<Result>(supabase: SupabaseClient, body: QueryBody, parser: PostgrestParser<Result>, extraData: ExtraDataState, signal: AbortSignal, count?: \"exact\" | \"estimated\" | \"\") {\n const searchParams = Array.from(parser.searchParams.entries());\n const currentKey = `${parser.schema}${parser.table}${parser.select}${JSON.stringify(omit(body, \"pagination\"))}`;\n const query = supabase.schema(parser.schema).from(parser.table).select(parser.select, {\n count: currentKey === extraData.key ? undefined : count || undefined\n });\n\n // Handle sort array from FilterGroup\n if (body.sort && Array.isArray(body.sort)) {\n body.sort.forEach((s: Sort) => {\n query.order(s.field, {\n ascending: s.direction === \"asc\"\n });\n });\n }\n const from = searchParams.find(x => x[0].includes(\"offset\"))?.[1];\n const to = searchParams.find(x => x[0].includes(\"limit\"))?.[1];\n searchParams.forEach(([k, v]) => {\n if (k.includes(\"offset\") && isUsable(v)) {\n body.pagination.from = Number(v);\n return;\n }\n if (k.includes(\"limit\") && isUsable(v)) {\n body.pagination.to = Number(from) + Number(v) - 1;\n return;\n }\n\n // Special handling for .or() filters - pass through as-is\n if (k === \"or\") {\n query.or(v.slice(1, v.length - 1)); // Strip surrounding parentheses\n return;\n }\n const values = v.split(\".\");\n const column = k;\n let rawCondition = values[0];\n let value: any = values[1];\n if (column == \"select\") return;\n // Skip 'order' param - ordering is handled separately via body.sort\n if (column == \"order\") return;\n if (v.includes(\".\") === false) return;\n\n // Skip non-searchable fields from search to avoid ILIKE errors\n // This is now handled at the FilterBuilder level, so we'll allow all searches\n if (rawCondition === \"ilike\" && !isSearchableColumn(column)) {\n return;\n }\n if (rawCondition === \"not\") {\n rawCondition = values[1];\n value = values[2];\n query.not(column, rawCondition, value);\n } else {\n query.filter(column, rawCondition, value);\n }\n });\n if (body.pagination.from !== null && body.pagination.from !== undefined && body.pagination.to !== null && body.pagination.to !== undefined && isNaN(body.pagination.from) === false && isNaN(body.pagination.to) === false) {\n query.range(body.pagination.from, body.pagination.to);\n }\n const result = await query.abortSignal(signal);\n const dataLength = result.data?.length ?? 0;\n const totalCount = result.count ?? 0;\n return {\n ...result,\n statusText: \"\",\n status: dataLength > totalCount ? 206 : 200,\n error: result.error,\n hasMore: dataLength < totalCount\n };\n}\n\n// Alias for backward compatibility - renamed from useDbAdvanceFilterQuery\nexport const useAdvancedQuery = useAdvancedFilterQuery;","import { InfiniteData, useInfiniteQuery as useTanstackInfiniteQuery, UseInfiniteQueryOptions } from \"@tanstack/react-query\";\nimport { isUsable } from \"@pol-studios/utils\";\nimport { useMemo, useRef } from \"react\";\nimport { PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { GenericTable, GenericView } from \"../parser/types\";\nimport { encode } from \"@supabase-cache-helpers/postgrest-react-query\";\ntype DataType = Record<string, any>;\nexport function useInfiniteQuery<Relation extends GenericTable | GenericView, Result extends DataType, Query extends string = \"*\", RelationName = unknown, Relationships = (Relation extends {\n Relationships: infer R;\n} ? R : unknown), Builder = PromiseLike<PostgrestSingleResponse<Result>>>(query: PromiseLike<PostgrestSingleResponse<Result>>, countPerLoad: number, config?: Omit<UseInfiniteQueryOptions<PostgrestSingleResponse<Result>, Error, InfiniteData<PostgrestSingleResponse<Result>, number>>, \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"> & {\n crossOrganization?: boolean;\n onQuery?: ({\n pageParam,\n query\n }: {\n pageParam: number;\n query: Builder;\n }) => any;\n enableOnQuery?: boolean;\n}) {\n const initialQueryKey = encode(query, false).join(\"-\");\n const lastKnownQuery = useRef(initialQueryKey);\n const currentPageNumber = useRef(1);\n if (lastKnownQuery.current != initialQueryKey) {\n lastKnownQuery.current = initialQueryKey;\n currentPageNumber.current = 1;\n }\n const isFetching = useRef(false);\n const queryKey = useMemo(() => encode(query, false), [initialQueryKey, config?.crossOrganization]);\n const getQuery = useTanstackInfiniteQuery<PostgrestSingleResponse<Result>>({\n ...config,\n queryKey: queryKey,\n queryFn: async ({\n pageParam,\n signal\n }) => {\n let adjustableQuery = query as any;\n const pageNumber = pageParam as number;\n if (config?.onQuery && config?.enableOnQuery) {\n config?.onQuery({\n query: adjustableQuery,\n pageParam: pageNumber\n });\n } else {\n adjustableQuery = adjustableQuery.range((pageNumber - 1) * countPerLoad, pageNumber * countPerLoad - 1);\n }\n adjustableQuery = adjustableQuery.abortSignal(signal);\n updatedCache.current = false;\n const response = (await adjustableQuery) as PostgrestSingleResponse<Result>;\n currentPageNumber.current = pageNumber;\n if (response.error) {\n throw response.error;\n } else {\n return response;\n }\n },\n initialPageParam: 1,\n getNextPageParam: (response_0, allResponses, lastParam) => {\n const pageParam_0 = lastParam as number;\n const resp = response_0 as PostgrestSingleResponse<Result> & {\n count?: number | null;\n };\n if (allResponses.length * countPerLoad >= (resp?.count ?? 0)) {\n return undefined;\n }\n return pageParam_0 + 1;\n }\n });\n const updatedCache = useRef(true);\n return useMemo(() => {\n type PageType = PostgrestSingleResponse<Result> & {\n count?: number | null;\n };\n const pages = getQuery.data?.pages as PageType[] | undefined;\n return {\n ...getQuery,\n count: pages?.[pages.length - 1]?.count,\n data: pages?.flatMap(x => x.data ?? []) as unknown as Result\n };\n }, [getQuery.data, currentPageNumber.current]);\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { UseQueryOptions, UseQueryResult } from \"@tanstack/react-query\";\nimport { PostgrestSingleResponse } from \"@supabase/supabase-js\";\nimport { encode } from \"@supabase-cache-helpers/postgrest-react-query\";\nimport { useLayoutEffect, useMemo, useState } from \"react\";\nimport { newUuid, omit } from \"@pol-studios/utils\";\nimport { useSessionStorageState } from \"@pol-studios/hooks/storage\";\nimport { QueryState, useAdvancedFilterQuery } from \"./useAdvancedQuery\";\nexport type UsePartialAdvancedQueryResult<T extends Record<string, any>> = ReturnType<typeof usePartialAdvancedQuery<T[]>>;\nexport function usePartialAdvancedQuery(query, itemCountPerPage, config) {\n const $ = _c(54);\n const initialQuery = encode(query, false);\n const [id, setId] = useState(window.location.pathname);\n const [currentPage, setCurrentPage] = useSessionStorageState(`${id}-currentPage`, 1);\n const page = currentPage ?? 1;\n const t0 = query as any;\n let t1;\n if ($[0] !== itemCountPerPage || $[1] !== page || $[2] !== t0) {\n t1 = t0.range((page - 1) * itemCountPerPage, page * itemCountPerPage - 1);\n $[0] = itemCountPerPage;\n $[1] = page;\n $[2] = t0;\n $[3] = t1;\n } else {\n t1 = $[3];\n }\n const rangedQuery = t1;\n const t2 = config?.filterKey;\n const t3 = currentPage ?? 1;\n let t4;\n if ($[4] !== t3) {\n t4 = t3.toString();\n $[4] = t3;\n $[5] = t4;\n } else {\n t4 = $[5];\n }\n let t5;\n if ($[6] !== config || $[7] !== t2 || $[8] !== t4) {\n t5 = {\n ...config,\n filterKey: t2,\n count: \"exact\",\n key: t4\n };\n $[6] = config;\n $[7] = t2;\n $[8] = t4;\n $[9] = t5;\n } else {\n t5 = $[9];\n }\n const [baseQuery, filter, setFilters] = useAdvancedFilterQuery(rangedQuery, t5);\n let t6;\n if ($[10] !== filter) {\n t6 = JSON.stringify(omit(filter, [\"pagination\"]));\n $[10] = filter;\n $[11] = t6;\n } else {\n t6 = $[11];\n }\n const filterKey = t6;\n const select = initialQuery[4].split(\"&\").find(_temp);\n let t7;\n if ($[12] !== filterKey || $[13] !== id || $[14] !== initialQuery[3] || $[15] !== initialQuery[5] || $[16] !== initialQuery[6] || $[17] !== initialQuery[7] || $[18] !== initialQuery[8] || $[19] !== select || $[20] !== setId) {\n t7 = () => {\n const newId = [initialQuery[3], select, initialQuery[5], initialQuery[6], initialQuery[7], initialQuery[8], filterKey].join(\"-\");\n console.log({\n newId,\n id\n });\n setId(newId);\n };\n $[12] = filterKey;\n $[13] = id;\n $[14] = initialQuery[3];\n $[15] = initialQuery[5];\n $[16] = initialQuery[6];\n $[17] = initialQuery[7];\n $[18] = initialQuery[8];\n $[19] = select;\n $[20] = setId;\n $[21] = t7;\n } else {\n t7 = $[21];\n }\n let t8;\n if ($[22] !== filterKey || $[23] !== initialQuery[3] || $[24] !== initialQuery[5] || $[25] !== initialQuery[6] || $[26] !== initialQuery[7] || $[27] !== initialQuery[8] || $[28] !== select) {\n t8 = [initialQuery[3], select, initialQuery[5], initialQuery[6], initialQuery[7], initialQuery[8], filterKey];\n $[22] = filterKey;\n $[23] = initialQuery[3];\n $[24] = initialQuery[5];\n $[25] = initialQuery[6];\n $[26] = initialQuery[7];\n $[27] = initialQuery[8];\n $[28] = select;\n $[29] = t8;\n } else {\n t8 = $[29];\n }\n useLayoutEffect(t7, t8);\n let t9;\n if ($[30] !== setCurrentPage) {\n t9 = () => {\n setCurrentPage(_temp2);\n };\n $[30] = setCurrentPage;\n $[31] = t9;\n } else {\n t9 = $[31];\n }\n const safeFetchNextPage = t9;\n let t10;\n if ($[32] !== setCurrentPage) {\n t10 = () => {\n setCurrentPage(_temp3);\n };\n $[32] = setCurrentPage;\n $[33] = t10;\n } else {\n t10 = $[33];\n }\n const fetchPreviousPage = t10;\n const pageCount = Math.max(Math.ceil((baseQuery.count ?? 0) / itemCountPerPage), 1);\n let t11;\n if ($[34] !== baseQuery.count || $[35] !== baseQuery.data || $[36] !== currentPage || $[37] !== itemCountPerPage) {\n t11 = baseQuery.data ? toPagedResponse(baseQuery.data as Result, currentPage ?? 1, baseQuery.count ?? baseQuery.data.length, itemCountPerPage) : null;\n $[34] = baseQuery.count;\n $[35] = baseQuery.data;\n $[36] = currentPage;\n $[37] = itemCountPerPage;\n $[38] = t11;\n } else {\n t11 = $[38];\n }\n const t12 = (currentPage ?? 1) < pageCount;\n const t13 = (currentPage ?? 1) > 1;\n const t14 = baseQuery.count ?? baseQuery.data?.length;\n let t15;\n if ($[39] !== baseQuery || $[40] !== currentPage || $[41] !== fetchPreviousPage || $[42] !== pageCount || $[43] !== safeFetchNextPage || $[44] !== setCurrentPage || $[45] !== t11 || $[46] !== t12 || $[47] !== t13 || $[48] !== t14) {\n t15 = {\n ...baseQuery,\n clarification: baseQuery.clarification,\n fetchPreviousPage,\n fetchNextPage: safeFetchNextPage,\n currentPage,\n setCurrentPage,\n data: t11,\n pageCount,\n hasNextPage: t12,\n hasPreviousPage: t13,\n count: t14\n };\n $[39] = baseQuery;\n $[40] = currentPage;\n $[41] = fetchPreviousPage;\n $[42] = pageCount;\n $[43] = safeFetchNextPage;\n $[44] = setCurrentPage;\n $[45] = t11;\n $[46] = t12;\n $[47] = t13;\n $[48] = t14;\n $[49] = t15;\n } else {\n t15 = $[49];\n }\n const request = t15 as ReturnType<typeof useAdvancedFilterQuery<Result>>[0] & {\n currentPage: number;\n setCurrentPage: (value: React.SetStateAction<number>) => void;\n fetchNextPage: () => any;\n fetchPreviousPage: () => any;\n data: {\n Items: Result;\n CurrentPage: number;\n ItemCount: number;\n MaxCountPerPage: number;\n PageCount: number;\n };\n pageCount: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n count: number;\n clarification?: ReturnType<typeof useAdvancedFilterQuery<Result>>[0][\"clarification\"];\n };\n let t16;\n if ($[50] !== filter || $[51] !== request || $[52] !== setFilters) {\n t16 = [request, filter, setFilters];\n $[50] = filter;\n $[51] = request;\n $[52] = setFilters;\n $[53] = t16;\n } else {\n t16 = $[53];\n }\n return t16;\n}\nfunction _temp3(currentPage_1) {\n return (currentPage_1 ?? 1) - 1;\n}\nfunction _temp2(currentPage_0) {\n return (currentPage_0 ?? 1) + 1;\n}\nfunction _temp(x) {\n return x.startsWith(\"select=\");\n}\nfunction toPagedResponse<Result extends any[]>(results: Result, currentPage: number, totalCount: number, itemPerPage: number) {\n const newPage = {\n Items: results,\n CurrentPage: currentPage,\n ItemCount: totalCount,\n MaxCountPerPage: itemPerPage,\n PageCount: Math.max(Math.ceil(totalCount / itemPerPage), 1)\n };\n return newPage;\n}\ninterface PagedResponse<T extends any[]> {\n Items: T;\n PageCount: number;\n CurrentPage: number;\n ItemCount: number;\n MaxCountPerPage: number;\n ContinuationToken: string;\n}"],"mappings":"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","names":["trimmed","useQuery","_c","_c","useQuery","useQuery","useSessionStorageState","useSessionStorageState","useQuery","useMemo","useRef","useRef","useMemo","_c","useState","useSessionStorageState","_c","useState","useSessionStorageState","_temp","_temp2","toPagedResponse"]}