@mateusseiboth/ember-orm 0.1.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/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/cli/bin.cjs +3265 -0
- package/dist/cli/bin.cjs.map +1 -0
- package/dist/cli/bin.d.cts +1 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +3241 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/client/index.cjs +2434 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +2 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +2396 -0
- package/dist/client/index.js.map +1 -0
- package/dist/editor.cjs +1113 -0
- package/dist/editor.cjs.map +1 -0
- package/dist/editor.d.cts +22 -0
- package/dist/editor.d.ts +22 -0
- package/dist/editor.js +1077 -0
- package/dist/editor.js.map +1 -0
- package/dist/index-0lWi8TMM.d.ts +72 -0
- package/dist/index-BSXZjDUd.d.ts +459 -0
- package/dist/index-CKqkQhZx.d.cts +459 -0
- package/dist/index-CMeqhmVc.d.cts +72 -0
- package/dist/index-D0xIdtCl.d.cts +145 -0
- package/dist/index-D0xIdtCl.d.ts +145 -0
- package/dist/index.cjs +5013 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +288 -0
- package/dist/index.d.ts +288 -0
- package/dist/index.js +4935 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/driver/firebird-driver.ts","../../src/errors/index.ts","../../src/driver/url.ts","../../src/driver/index.ts","../../src/sql/fragment.ts","../../src/sql/dialect.ts","../../src/ast/index.ts","../../src/utils/index.ts","../../src/query/order.ts","../../src/query/relations.ts","../../src/query/where.ts","../../src/query/having.ts","../../src/query/compiler.ts","../../src/query/coerce.ts","../../src/query/defaults.ts","../../src/query/writer.ts","../../src/query/engine.ts","../../src/schema/index.ts","../../src/client/runtime.ts","../../src/client/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport Firebird from \"node-firebird\";\nimport { DatabaseError } from \"@ember/errors\";\nimport type {\n ConnectionConfig,\n DriverOptions,\n IsolationLevel,\n SqlDriver,\n SqlValue,\n TransactionContext,\n TransactionOptions,\n} from \"./types\";\n\n// node-firebird is callback-based and weakly typed; these aliases keep the\n// rest of the file readable without leaking `any` outward.\ntype FbDatabase = {\n query(sql: string, params: unknown[], cb: (err: unknown, result: unknown) => void): void;\n transaction(isolation: unknown, cb: (err: unknown, tr: FbTransaction) => void): void;\n detach(cb?: (err: unknown) => void): void;\n};\ntype FbTransaction = {\n query(sql: string, params: unknown[], cb: (err: unknown, result: unknown) => void): void;\n commit(cb: (err: unknown) => void): void;\n rollback(cb: (err: unknown) => void): void;\n};\ntype FbPool = {\n get(cb: (err: unknown, db: FbDatabase) => void): void;\n destroy(): void;\n};\n\nconst fb = Firebird as unknown as {\n pool(max: number, options: unknown, cb?: unknown): FbPool;\n ISOLATION_READ_COMMITTED: unknown;\n ISOLATION_READ_COMMITTED_READ_ONLY: unknown;\n ISOLATION_REPEATABLE_READ: unknown;\n ISOLATION_SERIALIZABLE: unknown;\n};\n\nfunction isolationConstant(level: IsolationLevel | undefined): unknown {\n switch (level) {\n case \"READ_COMMITTED_READ_ONLY\":\n return fb.ISOLATION_READ_COMMITTED_READ_ONLY;\n case \"REPEATABLE_READ\":\n return fb.ISOLATION_REPEATABLE_READ;\n case \"SERIALIZABLE\":\n return fb.ISOLATION_SERIALIZABLE;\n case \"READ_COMMITTED\":\n default:\n return fb.ISOLATION_READ_COMMITTED;\n }\n}\n\n/**\n * Firebird implementation of SqlDriver. Wraps node-firebird's callback API in\n * promises, manages a connection pool, and guarantees every query executes\n * inside a transaction. Nested `transaction()` calls reuse the active one via\n * AsyncLocalStorage so `client.$transaction(...)` composes naturally.\n */\nexport class FirebirdDriver implements SqlDriver {\n private pool: FbPool | null = null;\n private readonly options: Record<string, unknown>;\n private readonly poolMax: number;\n private readonly onQuery?: DriverOptions[\"onQuery\"];\n private readonly activeTx = new AsyncLocalStorage<TransactionContext>();\n\n constructor(config: ConnectionConfig, driverOptions?: DriverOptions) {\n this.poolMax = config.poolMax ?? 5;\n this.onQuery = driverOptions?.onQuery;\n this.options = {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n role: config.role ?? \"\",\n pageSize: config.pageSize ?? 4096,\n encoding: config.encoding ?? \"UTF8\",\n blobAsText: config.blobAsText ?? true,\n lowercase_keys: config.lowercaseKeys ?? false,\n retryConnectionInterval: 1000,\n // FB3+ secure auth (Srp) is negotiated by default; set explicitly to force\n // a plugin, or \"Legacy_Auth\" for Firebird 2.1/2.5 servers.\n ...(config.authPlugin ? { pluginName: config.authPlugin } : {}),\n ...(config.wireCompression != null\n ? { wireCompression: config.wireCompression }\n : {}),\n };\n }\n\n async connect(): Promise<void> {\n if (this.pool) return;\n this.pool = fb.pool(this.poolMax, this.options);\n }\n\n async disconnect(): Promise<void> {\n if (!this.pool) return;\n this.pool.destroy();\n this.pool = null;\n }\n\n async transaction<T>(\n fn: (tx: TransactionContext) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n const existing = this.activeTx.getStore();\n if (existing) {\n // Reuse the enclosing transaction; do not commit here.\n return fn(existing);\n }\n await this.connect();\n const db = await this.acquire();\n const tr = await this.begin(db, options?.isolation);\n const ctx: TransactionContext = {\n query: (sql, params) => this.runOnTransaction(tr, sql, params),\n };\n try {\n const result = await this.activeTx.run(ctx, () => fn(ctx));\n await this.commit(tr);\n return result;\n } catch (err) {\n await this.safeRollback(tr);\n throw err;\n } finally {\n db.detach();\n }\n }\n\n // ---- promise wrappers over node-firebird -------------------------------\n\n private acquire(): Promise<FbDatabase> {\n return new Promise((resolve, reject) => {\n this.pool!.get((err, db) => {\n if (err) return reject(wrap(err, \"Failed to acquire connection\"));\n resolve(db);\n });\n });\n }\n\n private begin(\n db: FbDatabase,\n isolation?: IsolationLevel,\n ): Promise<FbTransaction> {\n return new Promise((resolve, reject) => {\n db.transaction(isolationConstant(isolation), (err, tr) => {\n if (err) return reject(wrap(err, \"Failed to start transaction\"));\n resolve(tr);\n });\n });\n }\n\n private runOnTransaction<T>(\n tr: FbTransaction,\n sql: string,\n params: readonly SqlValue[] = [],\n ): Promise<T[]> {\n const start = this.onQuery ? performance.now() : 0;\n return new Promise((resolve, reject) => {\n tr.query(sql, [...params], (err, result) => {\n if (err) return reject(wrap(err, \"Query failed\", sql));\n const rows = normalizeRows<T>(result);\n if (this.onQuery) {\n this.onQuery({\n sql,\n params,\n durationMs: performance.now() - start,\n rowCount: rows.length,\n });\n }\n resolve(rows);\n });\n });\n }\n\n private commit(tr: FbTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tr.commit((err) => {\n if (err) return reject(wrap(err, \"Failed to commit transaction\"));\n resolve();\n });\n });\n }\n\n private safeRollback(tr: FbTransaction): Promise<void> {\n return new Promise((resolve) => {\n tr.rollback(() => resolve());\n });\n }\n}\n\nfunction normalizeRows<T>(result: unknown): T[] {\n if (Array.isArray(result)) return result as T[];\n if (result === undefined || result === null) return [];\n return [result as T];\n}\n\nfunction wrap(err: unknown, message: string, sql?: string): DatabaseError {\n const detail =\n err && typeof err === \"object\" && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return new DatabaseError(`${message}: ${detail}`, err, sql);\n}\n","/** Base class for every error thrown by EmberORM. */\nexport class EmberError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised while lexing/parsing a `.ember` schema file. */\nexport class SchemaParseError extends EmberError {\n constructor(\n message: string,\n public readonly line: number,\n public readonly column: number,\n public readonly file?: string,\n ) {\n super(\n `${message} (at ${file ? `${file}:` : \"\"}${line}:${column})`,\n );\n }\n}\n\n/** Raised when a parsed schema is structurally invalid. */\nexport class SchemaValidationError extends EmberError {\n constructor(\n message: string,\n public readonly details: string[] = [],\n ) {\n super(\n details.length > 0 ? `${message}\\n - ${details.join(\"\\n - \")}` : message,\n );\n }\n}\n\n/** Raised when a query is malformed before it reaches the database. */\nexport class QueryValidationError extends EmberError {}\n\n/** Wraps a low-level driver/database failure with EmberORM context. */\nexport class DatabaseError extends EmberError {\n constructor(\n message: string,\n public override readonly cause?: unknown,\n public readonly sql?: string,\n ) {\n super(message);\n }\n}\n\n/** Thrown by `*OrThrow` operations when no record matches. */\nexport class RecordNotFoundError extends EmberError {\n constructor(model: string) {\n super(`No '${model}' record found matching the given criteria.`);\n }\n}\n\n/** Thrown on unique constraint violations (mapped from Firebird errors). */\nexport class UniqueConstraintError extends EmberError {\n constructor(\n public readonly target: string,\n cause?: unknown,\n ) {\n super(`Unique constraint failed on: ${target}`);\n if (cause !== undefined) this.cause = cause;\n }\n}\n","import { EmberError } from \"@ember/errors\";\nimport type { ConnectionConfig } from \"./types\";\n\n/**\n * Parse a Firebird connection URL into a ConnectionConfig.\n *\n * Supported forms:\n * firebird://user:password@host:port/path/to/database.fdb?role=RDB$ADMIN\n * firebird://SYSDBA:masterkey@localhost:3050//var/lib/firebird/data/app.fdb\n *\n * The path after the host is treated as the absolute database path. A leading\n * double slash (`//var/...`) yields an absolute POSIX path; a single slash with\n * a Windows drive (`/C:/...`) is normalized too.\n */\nexport function parseConnectionUrl(url: string): ConnectionConfig {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new EmberError(`Invalid Firebird connection URL: ${url}`);\n }\n\n if (!/^firebird:?$/.test(parsed.protocol.replace(\":\", \"\") + \":\")) {\n if (parsed.protocol !== \"firebird:\") {\n throw new EmberError(\n `Unsupported protocol '${parsed.protocol}'. Expected 'firebird:'.`,\n );\n }\n }\n\n const database = normalizeDatabasePath(parsed.pathname);\n if (!database) {\n throw new EmberError(`Connection URL is missing a database path: ${url}`);\n }\n\n const params = parsed.searchParams;\n const config: ConnectionConfig = {\n host: parsed.hostname || \"127.0.0.1\",\n port: parsed.port ? Number(parsed.port) : 3050,\n database,\n user: decodeURIComponent(parsed.username || \"SYSDBA\"),\n password: decodeURIComponent(parsed.password || \"masterkey\"),\n encoding: params.get(\"encoding\") ?? \"UTF8\",\n };\n\n const role = params.get(\"role\");\n if (role) config.role = role;\n const poolMax = params.get(\"poolMax\") ?? params.get(\"connection_limit\");\n if (poolMax) config.poolMax = Number(poolMax);\n const pageSize = params.get(\"pageSize\");\n if (pageSize) config.pageSize = Number(pageSize);\n\n const auth = (params.get(\"authPlugin\") ?? params.get(\"auth\"))?.toLowerCase();\n if (auth === \"legacy\" || auth === \"legacy_auth\") config.authPlugin = \"Legacy_Auth\";\n else if (auth === \"srp\") config.authPlugin = \"Srp\";\n\n const wireCompression = params.get(\"wireCompression\");\n if (wireCompression != null) {\n config.wireCompression = wireCompression !== \"false\" && wireCompression !== \"0\";\n }\n\n const version = params.get(\"version\");\n if (version) config.version = normalizeVersion(version);\n\n return config;\n}\n\nconst VERSIONS = new Set([\"2.1\", \"2.5\", \"3\", \"4\", \"5\"]);\n\nfunction normalizeVersion(raw: string): ConnectionConfig[\"version\"] {\n const trimmed = raw.trim();\n if (VERSIONS.has(trimmed)) return trimmed as ConnectionConfig[\"version\"];\n // Accept \"3.0\", \"4.0.1\" etc. by taking the major (or major.minor for 2.x).\n if (/^2\\.1/.test(trimmed)) return \"2.1\";\n if (/^2\\.5/.test(trimmed)) return \"2.5\";\n const major = trimmed.split(\".\")[0];\n if (major && VERSIONS.has(major)) return major as ConnectionConfig[\"version\"];\n return undefined;\n}\n\nfunction normalizeDatabasePath(pathname: string): string {\n let p = decodeURIComponent(pathname);\n // `//var/lib/app.fdb` -> `/var/lib/app.fdb`\n if (p.startsWith(\"//\")) p = p.slice(1);\n // `/C:/db.fdb` -> `C:/db.fdb`\n if (/^\\/[A-Za-z]:\\//.test(p)) p = p.slice(1);\n return p;\n}\n\nexport function buildConnectionUrl(config: ConnectionConfig): string {\n const auth = `${encodeURIComponent(config.user)}:${encodeURIComponent(\n config.password,\n )}`;\n const dbPath = config.database.startsWith(\"/\")\n ? `/${config.database}`\n : `/${config.database}`;\n const url = new URL(`firebird://${auth}@${config.host}:${config.port}${dbPath}`);\n if (config.role) url.searchParams.set(\"role\", config.role);\n return url.toString();\n}\n","export type {\n ConnectionConfig,\n FirebirdVersion,\n DriverOptions,\n QueryEvent,\n QueryLogger,\n SqlDriver,\n SqlValue,\n TransactionContext,\n TransactionOptions,\n IsolationLevel,\n} from \"./types\";\nexport { FirebirdDriver } from \"./firebird-driver\";\nexport { parseConnectionUrl, buildConnectionUrl } from \"./url\";\n\nimport type { ConnectionConfig, DriverOptions, SqlDriver } from \"./types\";\nimport { FirebirdDriver } from \"./firebird-driver\";\nimport { parseConnectionUrl } from \"./url\";\n\n/**\n * Factory that builds a driver from either a connection URL or an explicit\n * config object. Centralizing creation here keeps the client decoupled from a\n * concrete driver class (Factory pattern / DIP).\n */\nexport function createDriver(\n source: string | ConnectionConfig,\n options?: DriverOptions,\n): SqlDriver {\n const config =\n typeof source === \"string\" ? parseConnectionUrl(source) : source;\n return new FirebirdDriver(config, options);\n}\n","import type { SqlValue } from \"@ember/driver\";\n\n/**\n * An accumulating SQL fragment that keeps text and bound parameters together,\n * so values are always parameterized (`?`) and never string-interpolated.\n * This is the core defense against SQL injection in the query layer.\n */\nexport class Sql {\n private parts: string[] = [];\n public readonly params: SqlValue[] = [];\n\n static raw(text: string): Sql {\n return new Sql().push(text);\n }\n\n static value(value: SqlValue): Sql {\n return new Sql().bind(value);\n }\n\n static join(fragments: Sql[], separator: string): Sql {\n const out = new Sql();\n fragments.forEach((frag, i) => {\n if (i > 0) out.push(separator);\n out.append(frag);\n });\n return out;\n }\n\n /** Append raw, trusted SQL text (keywords, already-escaped identifiers). */\n push(text: string): this {\n this.parts.push(text);\n return this;\n }\n\n /** Append a `?` placeholder bound to `value`. */\n bind(value: SqlValue): this {\n this.parts.push(\"?\");\n this.params.push(value);\n return this;\n }\n\n /** Append a comma-separated list of placeholders bound to `values`. */\n bindList(values: readonly SqlValue[]): this {\n this.parts.push(values.map(() => \"?\").join(\", \"));\n this.params.push(...values);\n return this;\n }\n\n /** Merge another fragment (text + params) into this one. */\n append(other: Sql): this {\n this.parts.push(other.text);\n this.params.push(...other.params);\n return this;\n }\n\n get text(): string {\n return this.parts.join(\"\");\n }\n\n isEmpty(): boolean {\n return this.text.trim().length === 0;\n }\n\n toQuery(): { sql: string; params: SqlValue[] } {\n return { sql: this.text, params: this.params };\n }\n}\n","import type { FirebirdVersion, SqlValue } from \"@ember/driver\";\nimport { Sql } from \"./fragment\";\n\n/**\n * Strategy interface for SQL generation. Encapsulates every dialect-specific\n * decision so the query compiler stays backend-agnostic. Only FirebirdDialect\n * is implemented today, but the engine never assumes Firebird directly.\n */\nexport interface SqlDialect {\n /** Quote an identifier (table/column/alias). */\n quoteId(name: string): string;\n /** Quote a `table.column` reference. */\n quoteRef(table: string, column: string): string;\n /** Pagination clause placed right after SELECT (e.g. `FIRST 10 SKIP 5`). */\n paginationClause(take?: number, skip?: number): string;\n /** Wrap a value for LIKE with case-insensitive mode. */\n caseInsensitive(expr: string): string;\n /** Map a default function name (now/uuid/...) to a SQL expression, if any. */\n defaultFunctionSql(name: string): string | null;\n /** Coerce a JS value into a driver-bindable SqlValue. */\n coerceValue(value: unknown): SqlValue;\n /** True if the dialect can paginate (controls FIRST/SKIP usage). */\n readonly supportsReturning: boolean;\n /** Native BOOLEAN type (Firebird 3+) vs SMALLINT fallback (2.1/2.5). */\n readonly supportsBooleanType: boolean;\n /** IDENTITY columns (Firebird 3+) vs generator+trigger (2.1/2.5). */\n readonly supportsIdentity: boolean;\n /** Window functions like ROW_NUMBER() OVER (...) (Firebird 3+). */\n readonly supportsWindowFunctions: boolean;\n /** DDL type used for boolean columns. */\n booleanColumnType(): string;\n}\n\n/**\n * Firebird 3+/4+ dialect.\n * - Identifiers are double-quoted to preserve case (introspection yields\n * UPPER-CASE names and quoting avoids accidental folding).\n * - Pagination uses `FIRST n SKIP m` after the SELECT keyword.\n * - Case-insensitive matching uses UPPER() on both sides.\n */\nexport interface FirebirdDialectOptions {\n version?: FirebirdVersion;\n}\n\nexport class FirebirdDialect implements SqlDialect {\n readonly supportsReturning = true;\n readonly version: FirebirdVersion;\n readonly supportsBooleanType: boolean;\n readonly supportsIdentity: boolean;\n readonly supportsWindowFunctions: boolean;\n\n constructor(options: FirebirdDialectOptions = {}) {\n this.version = options.version ?? \"3\";\n const rank = versionRank(this.version);\n this.supportsBooleanType = rank >= 30;\n this.supportsIdentity = rank >= 30;\n this.supportsWindowFunctions = rank >= 30;\n }\n\n booleanColumnType(): string {\n return this.supportsBooleanType ? \"BOOLEAN\" : \"SMALLINT\";\n }\n\n quoteId(name: string): string {\n // Escape embedded double quotes by doubling them.\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n }\n\n quoteRef(table: string, column: string): string {\n return `${this.quoteId(table)}.${this.quoteId(column)}`;\n }\n\n paginationClause(take?: number, skip?: number): string {\n const parts: string[] = [];\n if (typeof take === \"number\" && take >= 0) {\n parts.push(`FIRST ${Math.trunc(take)}`);\n }\n if (typeof skip === \"number\" && skip > 0) {\n parts.push(`SKIP ${Math.trunc(skip)}`);\n }\n return parts.join(\" \");\n }\n\n caseInsensitive(expr: string): string {\n return `UPPER(${expr})`;\n }\n\n defaultFunctionSql(name: string): string | null {\n switch (name) {\n case \"now\":\n return \"CURRENT_TIMESTAMP\";\n case \"uuid\":\n case \"cuid\":\n // Firebird can generate a 16-byte GUID; expose as a string-friendly UUID.\n return \"UUID_TO_CHAR(GEN_UUID())\";\n case \"autoincrement\":\n return null; // handled via generators/identity, not an inline default\n default:\n return null;\n }\n }\n\n coerceValue(value: unknown): SqlValue {\n if (value === null || value === undefined) return null;\n if (value instanceof Date) return value;\n if (Buffer.isBuffer(value)) return value;\n if (typeof value === \"boolean\") {\n // Firebird 2.1/2.5 have no BOOLEAN type: store as SMALLINT 0/1.\n return this.supportsBooleanType ? value : value ? 1 : 0;\n }\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value;\n // Json / objects are serialized to text.\n return JSON.stringify(value);\n }\n}\n\nfunction versionRank(version: FirebirdVersion): number {\n switch (version) {\n case \"2.1\":\n return 21;\n case \"2.5\":\n return 25;\n case \"3\":\n return 30;\n case \"4\":\n return 40;\n case \"5\":\n return 50;\n default:\n return 30;\n }\n}\n\n/** Helper to build `SELECT <pagination> ...` with the dialect's clause. */\nexport function selectKeyword(\n dialect: SqlDialect,\n take?: number,\n skip?: number,\n): Sql {\n const pagination = dialect.paginationClause(take, skip);\n return Sql.raw(pagination ? `SELECT ${pagination}` : \"SELECT\");\n}\n","/**\n * EmberORM schema AST (DMMF-like).\n *\n * This is the single in-memory source of truth that every other layer\n * (parser, validator, query engine, generator, introspection) depends on.\n * It is intentionally decoupled from Firebird specifics so it can be reused\n * for other dialects in the future.\n */\n\nexport type ScalarType =\n | \"String\"\n | \"Boolean\"\n | \"Int\"\n | \"BigInt\"\n | \"Float\"\n | \"Decimal\"\n | \"DateTime\"\n | \"Bytes\"\n | \"Json\";\n\nexport const SCALAR_TYPES: readonly ScalarType[] = [\n \"String\",\n \"Boolean\",\n \"Int\",\n \"BigInt\",\n \"Float\",\n \"Decimal\",\n \"DateTime\",\n \"Bytes\",\n \"Json\",\n] as const;\n\nexport type FieldKind = \"scalar\" | \"enum\" | \"object\";\n\n/** Value of an attribute argument, e.g. `@default(now())` or `@map(\"USER_ID\")`. */\nexport type AttributeArgValue =\n | { kind: \"string\"; value: string }\n | { kind: \"number\"; value: number }\n | { kind: \"boolean\"; value: boolean }\n | { kind: \"ref\"; value: string } // bare identifier, e.g. an enum value or field name\n | { kind: \"function\"; name: string; args: AttributeArgValue[] } // e.g. now(), autoincrement()\n | { kind: \"array\"; items: AttributeArgValue[] };\n\nexport interface DefaultValue {\n /** A scalar literal default. */\n literal?: string | number | boolean;\n /** A function default such as now(), uuid(), cuid(), autoincrement(). */\n function?: { name: string; args: AttributeArgValue[] };\n}\n\nexport interface RelationInfo {\n /** Relation name (@relation(\"name\")). */\n name?: string;\n /** Local fields participating in the FK (`fields: [...]`). */\n fields?: string[];\n /** Referenced fields on the other model (`references: [...]`). */\n references?: string[];\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n}\n\nexport type ReferentialAction =\n | \"Cascade\"\n | \"Restrict\"\n | \"NoAction\"\n | \"SetNull\"\n | \"SetDefault\";\n\nexport interface NativeType {\n /** e.g. \"VarChar\", \"Decimal\". */\n name: string;\n /** e.g. [255] or [18, 4]. */\n args: number[];\n}\n\nexport interface FieldNode {\n name: string;\n /** Resolved type name: a ScalarType, an enum name, or a model name. */\n type: string;\n kind: FieldKind;\n isList: boolean;\n isRequired: boolean;\n isId: boolean;\n isUnique: boolean;\n isUpdatedAt: boolean;\n /** Column name in the database (@map). Defaults to `name`. */\n dbName?: string;\n default?: DefaultValue;\n relation?: RelationInfo;\n nativeType?: NativeType;\n /** documentation/comment attached above the field (///). */\n documentation?: string;\n}\n\nexport interface UniqueIndex {\n name?: string;\n fields: string[];\n}\n\nexport interface IndexNode {\n name?: string;\n fields: string[];\n unique: boolean;\n}\n\nexport interface ModelNode {\n name: string;\n /** Table name in the database (@@map). Defaults to `name`. */\n dbName?: string;\n fields: FieldNode[];\n /** Names of fields forming the primary key (composite supported via @@id). */\n primaryKey: string[];\n uniqueIndexes: UniqueIndex[];\n indexes: IndexNode[];\n documentation?: string;\n}\n\nexport interface EnumNode {\n name: string;\n dbName?: string;\n values: { name: string; dbName?: string }[];\n documentation?: string;\n}\n\nexport interface DatasourceNode {\n name: string;\n provider: string;\n /** Raw url expression; env(\"X\") resolved at runtime. */\n url: { kind: \"literal\" | \"env\"; value: string };\n}\n\nexport interface GeneratorNode {\n name: string;\n provider: string;\n output?: string;\n config: Record<string, string>;\n}\n\nexport interface SchemaDocument {\n datasource?: DatasourceNode;\n generators: GeneratorNode[];\n models: ModelNode[];\n enums: EnumNode[];\n}\n\nexport function emptySchema(): SchemaDocument {\n return { generators: [], models: [], enums: [] };\n}\n\nexport function findModel(\n schema: SchemaDocument,\n name: string,\n): ModelNode | undefined {\n return schema.models.find((m) => m.name === name);\n}\n\nexport function findEnum(\n schema: SchemaDocument,\n name: string,\n): EnumNode | undefined {\n return schema.enums.find((e) => e.name === name);\n}\n\n/**\n * Physical column name. Firebird folds unquoted identifiers to UPPER CASE, and\n * EmberORM always quotes identifiers, so a field without an explicit `@map`\n * resolves to its UPPER-CASED name to match the stored column. Use `@map` to\n * target a column created with case-sensitive (quoted) lower/mixed case.\n */\nexport function fieldColumn(field: FieldNode): string {\n return field.dbName ?? field.name.toUpperCase();\n}\n\n/** Physical table name; same UPPER-CASE folding rule as {@link fieldColumn}. */\nexport function modelTable(model: ModelNode): string {\n return model.dbName ?? model.name.toUpperCase();\n}\n\n/** Returns scalar fields only (excludes relation/object fields). */\nexport function scalarFields(model: ModelNode): FieldNode[] {\n return model.fields.filter((f) => f.kind !== \"object\");\n}\n\n/** Returns relation (object) fields only. */\nexport function relationFields(model: ModelNode): FieldNode[] {\n return model.fields.filter((f) => f.kind === \"object\");\n}\n\nexport function idFields(model: ModelNode): FieldNode[] {\n if (model.primaryKey.length > 0) {\n return model.primaryKey\n .map((n) => model.fields.find((f) => f.name === n))\n .filter((f): f is FieldNode => !!f);\n }\n return model.fields.filter((f) => f.isId);\n}\n","/** Small, dependency-free helpers shared across layers. */\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v)\n );\n}\n\nexport function isEmptyObject(v: unknown): boolean {\n return isPlainObject(v) && Object.keys(v).length === 0;\n}\n\nexport function uniq<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function pascalCase(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)?/g, (_, c: string | undefined) =>\n c ? c.toUpperCase() : \"\",\n )\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n}\n\nexport function camelCase(input: string): string {\n const pascal = pascalCase(input);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function pluralize(word: string): string {\n if (/[^aeiou]y$/i.test(word)) return word.replace(/y$/i, \"ies\");\n if (/(s|x|z|ch|sh)$/i.test(word)) return `${word}es`;\n return `${word}s`;\n}\n\n/** First char lowercased — used to derive delegate names from model names. */\nexport function lowerFirst(input: string): string {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n\nexport function indent(text: string, level = 1, unit = \" \"): string {\n const pad = unit.repeat(level);\n return text\n .split(\"\\n\")\n .map((l) => (l.length > 0 ? pad + l : l))\n .join(\"\\n\");\n}\n\nexport function assertNever(value: never, message = \"Unexpected value\"): never {\n throw new Error(`${message}: ${JSON.stringify(value)}`);\n}\n","import { type ModelNode, fieldColumn } from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport type { OrderByInput, SortOrder } from \"./args\";\n\n/**\n * Compile an `orderBy` argument into an `ORDER BY` fragment (without the\n * keyword). Accepts a single object or an ordered array of single-key objects,\n * matching Prisma's deterministic ordering semantics.\n */\nexport function compileOrderBy(\n model: ModelNode,\n tableAlias: string,\n orderBy: OrderByInput | undefined,\n dialect: SqlDialect,\n): Sql {\n if (!orderBy) return new Sql();\n const entries = normalize(orderBy);\n if (entries.length === 0) return new Sql();\n\n const parts = entries.map(([fieldName, dir]) => {\n const field = model.fields.find((f) => f.name === fieldName);\n if (!field || field.kind === \"object\") {\n throw new QueryValidationError(\n `Cannot order '${model.name}' by '${fieldName}'.`,\n );\n }\n const ref = dialect.quoteRef(tableAlias, fieldColumn(field));\n return Sql.raw(`${ref} ${dir === \"desc\" ? \"DESC\" : \"ASC\"}`);\n });\n\n return Sql.join(parts, \", \");\n}\n\nfunction normalize(orderBy: OrderByInput): [string, SortOrder][] {\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const out: [string, SortOrder][] = [];\n for (const obj of list) {\n for (const [key, value] of Object.entries(obj)) {\n if (value === \"asc\" || value === \"desc\") out.push([key, value]);\n }\n }\n return out;\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n fieldColumn,\n findModel,\n idFields,\n} from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\n\nexport interface ResolvedRelation {\n field: FieldNode;\n relatedModel: ModelNode;\n /** Field names on the owning model joined to the related model. */\n fromFields: string[];\n /** Field names on the related model. */\n toFields: string[];\n /** Column names (db) on the owning model. */\n fromColumns: string[];\n /** Column names (db) on the related model. */\n toColumns: string[];\n isList: boolean;\n /** True when this side physically holds the foreign key. */\n owns: boolean;\n}\n\n/**\n * Resolve how a relation field joins its two models, regardless of which side\n * declared `@relation(fields/references)`. Returns the column pairs the engine\n * uses to load and stitch related rows.\n */\nexport function resolveRelation(\n schema: SchemaDocument,\n model: ModelNode,\n field: FieldNode,\n): ResolvedRelation {\n if (field.kind !== \"object\") {\n throw new QueryValidationError(\n `Field '${model.name}.${field.name}' is not a relation.`,\n );\n }\n const relatedModel = findModel(schema, field.type);\n if (!relatedModel) {\n throw new QueryValidationError(\n `Relation '${model.name}.${field.name}' points to unknown model '${field.type}'.`,\n );\n }\n\n // Owning side: this field declares fields/references directly.\n if (field.relation?.fields?.length) {\n const fromFields = field.relation.fields;\n const toFields =\n field.relation.references ?? idFields(relatedModel).map((f) => f.name);\n return build(field, model, relatedModel, fromFields, toFields, true);\n }\n\n // Back side: find the partner field on the related model that owns the FK.\n const partner = findPartnerField(schema, model, field, relatedModel);\n if (partner?.relation?.fields?.length) {\n // related.partner.fields -> related columns; references -> this model columns\n const toFields = partner.relation.fields;\n const fromFields =\n partner.relation.references ?? idFields(model).map((f) => f.name);\n return build(field, model, relatedModel, fromFields, toFields, false);\n }\n\n // Fallback: implicit relation by primary keys (rare, e.g. 1:1 by id).\n const fromFields = idFields(model).map((f) => f.name);\n const toFields = idFields(relatedModel).map((f) => f.name);\n return build(field, model, relatedModel, fromFields, toFields, false);\n}\n\nfunction build(\n field: FieldNode,\n model: ModelNode,\n relatedModel: ModelNode,\n fromFields: string[],\n toFields: string[],\n owns: boolean,\n): ResolvedRelation {\n return {\n field,\n relatedModel,\n fromFields,\n toFields,\n fromColumns: fromFields.map((n) => columnOf(model, n)),\n toColumns: toFields.map((n) => columnOf(relatedModel, n)),\n isList: field.isList,\n owns,\n };\n}\n\nfunction columnOf(model: ModelNode, fieldName: string): string {\n const f = model.fields.find((x) => x.name === fieldName);\n if (!f) {\n throw new QueryValidationError(\n `Field '${fieldName}' not found on model '${model.name}'.`,\n );\n }\n return fieldColumn(f);\n}\n\nfunction findPartnerField(\n _schema: SchemaDocument,\n model: ModelNode,\n field: FieldNode,\n relatedModel: ModelNode,\n): FieldNode | undefined {\n const candidates = relatedModel.fields.filter(\n (f) => f.kind === \"object\" && f.type === model.name,\n );\n if (field.relation?.name) {\n const byName = candidates.find(\n (f) => f.relation?.name === field.relation?.name,\n );\n if (byName) return byName;\n }\n // Prefer the side that owns the FK.\n const owning = candidates.find((f) => f.relation?.fields?.length);\n return owning ?? candidates[0];\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n fieldColumn,\n modelTable,\n} from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport { isPlainObject } from \"@ember/utils\";\nimport type { ScalarFilter, WhereInput } from \"./args\";\nimport { resolveRelation } from \"./relations\";\n\nexport interface CompileContext {\n schema: SchemaDocument;\n dialect: SqlDialect;\n alias: { next: number };\n}\n\nconst SCALAR_OPERATORS = new Set([\n \"equals\",\n \"not\",\n \"in\",\n \"notIn\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"mode\",\n]);\n\n/**\n * Compile a `where` object for `model` (referenced by `tableAlias`) into a\n * boolean Sql fragment. All literal values are bound as `?` parameters.\n * Returns an empty fragment when the filter is empty (caller omits WHERE).\n */\nexport function compileWhere(\n model: ModelNode,\n tableAlias: string,\n where: WhereInput | undefined,\n ctx: CompileContext,\n): Sql {\n if (!where || Object.keys(where).length === 0) return new Sql();\n const conditions: Sql[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n\n if (key === \"AND\") {\n conditions.push(combineList(asArray(value), model, tableAlias, ctx, \"AND\"));\n continue;\n }\n if (key === \"OR\") {\n conditions.push(combineList(asArray(value), model, tableAlias, ctx, \"OR\"));\n continue;\n }\n if (key === \"NOT\") {\n const inner = combineList(asArray(value), model, tableAlias, ctx, \"AND\");\n if (!inner.isEmpty()) {\n conditions.push(new Sql().push(\"NOT (\").append(inner).push(\")\"));\n }\n continue;\n }\n\n const field = model.fields.find((f) => f.name === key);\n if (!field) {\n throw new QueryValidationError(\n `Unknown field '${key}' in where clause of model '${model.name}'.`,\n );\n }\n\n if (field.kind === \"object\") {\n conditions.push(\n compileRelationFilter(model, tableAlias, field, value, ctx),\n );\n } else {\n conditions.push(compileScalar(tableAlias, field, value, ctx));\n }\n }\n\n const nonEmpty = conditions.filter((c) => !c.isEmpty());\n if (nonEmpty.length === 0) return new Sql();\n return wrapAnd(nonEmpty);\n}\n\nfunction combineList(\n list: WhereInput[],\n model: ModelNode,\n tableAlias: string,\n ctx: CompileContext,\n op: \"AND\" | \"OR\",\n): Sql {\n const parts = list\n .map((w) => compileWhere(model, tableAlias, w, ctx))\n .filter((p) => !p.isEmpty());\n if (parts.length === 0) return new Sql();\n if (parts.length === 1) return parts[0]!;\n const joined = Sql.join(\n parts.map((p) => new Sql().push(\"(\").append(p).push(\")\")),\n ` ${op} `,\n );\n return new Sql().push(\"(\").append(joined).push(\")\");\n}\n\nfunction wrapAnd(parts: Sql[]): Sql {\n if (parts.length === 1) return parts[0]!;\n const joined = Sql.join(\n parts.map((p) => new Sql().push(\"(\").append(p).push(\")\")),\n \" AND \",\n );\n return new Sql().push(\"(\").append(joined).push(\")\");\n}\n\nfunction compileScalar(\n tableAlias: string,\n field: FieldNode,\n value: unknown,\n ctx: CompileContext,\n): Sql {\n const ref = ctx.dialect.quoteRef(tableAlias, fieldColumn(field));\n\n // JSON fields are stored as text; filter on the serialized representation.\n if (field.type === \"Json\" && isJsonFilterObject(value)) {\n return compileJsonFilter(ref, field, value as Record<string, unknown>, ctx);\n }\n\n // Direct value shorthand: `{ field: value }` == `{ field: { equals: value } }`.\n if (!isFilterObject(value)) {\n if (value === null) return Sql.raw(`${ref} IS NULL`);\n return new Sql().push(`${ref} = `).bind(ctx.dialect.coerceValue(value));\n }\n\n const filter = value as ScalarFilter;\n const insensitive = filter.mode === \"insensitive\";\n const parts: Sql[] = [];\n\n for (const [op, opValue] of Object.entries(filter)) {\n if (op === \"mode\") continue;\n if (opValue === undefined) continue;\n parts.push(compileOperator(ref, op, opValue, insensitive, ctx));\n }\n if (parts.length === 0) return new Sql();\n return wrapAnd(parts);\n}\n\nconst JSON_OPERATORS = new Set([\n \"equals\",\n \"not\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"path\",\n]);\n\nfunction isJsonFilterObject(value: unknown): boolean {\n return (\n isPlainObject(value) &&\n Object.keys(value).some((k) => JSON_OPERATORS.has(k))\n );\n}\n\n/**\n * Filter a Json field. Firebird has no JSON SQL functions, so filtering works\n * on the serialized text: `equals`/`not` compare the stored JSON string and\n * `string_contains`/`string_starts_with`/`string_ends_with` use LIKE. The\n * `path` operator is rejected (no JSON path support in Firebird).\n */\nfunction compileJsonFilter(\n ref: string,\n field: FieldNode,\n filter: Record<string, unknown>,\n ctx: CompileContext,\n): Sql {\n const parts: Sql[] = [];\n for (const [op, raw] of Object.entries(filter)) {\n if (raw === undefined) continue;\n switch (op) {\n case \"path\":\n throw new QueryValidationError(\n `JSON 'path' filtering is not supported on Firebird (no JSON SQL functions). ` +\n `Filter '${field.name}' in application code or with a generated column.`,\n );\n case \"equals\":\n parts.push(\n raw === null\n ? Sql.raw(`${ref} IS NULL`)\n : new Sql().push(`${ref} = `).bind(jsonText(raw)),\n );\n break;\n case \"not\":\n parts.push(\n raw === null\n ? Sql.raw(`${ref} IS NOT NULL`)\n : new Sql().push(`${ref} <> `).bind(jsonText(raw)),\n );\n break;\n case \"string_contains\":\n parts.push(jsonLike(ref, `%${escapeLike(String(raw))}%`));\n break;\n case \"string_starts_with\":\n parts.push(jsonLike(ref, `${escapeLike(String(raw))}%`));\n break;\n case \"string_ends_with\":\n parts.push(jsonLike(ref, `%${escapeLike(String(raw))}`));\n break;\n default:\n throw new QueryValidationError(`Unsupported JSON filter operator '${op}'.`);\n }\n }\n return parts.length ? wrapAnd(parts) : new Sql();\n}\n\nfunction jsonText(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction jsonLike(ref: string, pattern: string): Sql {\n return new Sql().push(`${ref} LIKE `).bind(pattern).push(\" ESCAPE '\\\\'\");\n}\n\nfunction compileOperator(\n ref: string,\n op: string,\n value: unknown,\n insensitive: boolean,\n ctx: CompileContext,\n): Sql {\n const d = ctx.dialect;\n const bound = (v: unknown) => d.coerceValue(v);\n const lhs = insensitive ? d.caseInsensitive(ref) : ref;\n const rhs = (v: unknown) =>\n insensitive && typeof v === \"string\"\n ? new Sql().push(\"UPPER(\").bind(bound(v)).push(\")\")\n : Sql.value(bound(v));\n\n switch (op) {\n case \"equals\":\n if (value === null) return Sql.raw(`${ref} IS NULL`);\n return new Sql().push(`${lhs} = `).append(rhs(value));\n case \"not\":\n if (value === null) return Sql.raw(`${ref} IS NOT NULL`);\n if (isFilterObject(value)) {\n const inner = compileScalarFromRef(ref, value as ScalarFilter, insensitive, ctx);\n return new Sql().push(\"NOT (\").append(inner).push(\")\");\n }\n return new Sql().push(`${lhs} <> `).append(rhs(value));\n case \"in\":\n return inClause(lhs, asUnknownArray(value), insensitive, ctx, false);\n case \"notIn\":\n return inClause(lhs, asUnknownArray(value), insensitive, ctx, true);\n case \"lt\":\n return new Sql().push(`${lhs} < `).append(rhs(value));\n case \"lte\":\n return new Sql().push(`${lhs} <= `).append(rhs(value));\n case \"gt\":\n return new Sql().push(`${lhs} > `).append(rhs(value));\n case \"gte\":\n return new Sql().push(`${lhs} >= `).append(rhs(value));\n case \"contains\":\n return likeClause(lhs, `%${escapeLike(String(value))}%`, insensitive);\n case \"startsWith\":\n return likeClause(lhs, `${escapeLike(String(value))}%`, insensitive);\n case \"endsWith\":\n return likeClause(lhs, `%${escapeLike(String(value))}`, insensitive);\n default:\n throw new QueryValidationError(`Unsupported filter operator '${op}'.`);\n }\n}\n\nfunction compileScalarFromRef(\n ref: string,\n filter: ScalarFilter,\n insensitive: boolean,\n ctx: CompileContext,\n): Sql {\n const parts: Sql[] = [];\n for (const [op, opValue] of Object.entries(filter)) {\n if (op === \"mode\" || opValue === undefined) continue;\n parts.push(compileOperator(ref, op, opValue, insensitive, ctx));\n }\n return parts.length ? wrapAnd(parts) : new Sql();\n}\n\nfunction inClause(\n lhs: string,\n values: unknown[],\n insensitive: boolean,\n ctx: CompileContext,\n negate: boolean,\n): Sql {\n if (values.length === 0) {\n // `IN ()` is invalid; emulate the empty-set semantics.\n return Sql.raw(negate ? \"1 = 1\" : \"1 = 0\");\n }\n const coerced = values.map((v) =>\n insensitive && typeof v === \"string\"\n ? String(v).toUpperCase()\n : ctx.dialect.coerceValue(v),\n );\n const sql = new Sql().push(`${lhs} ${negate ? \"NOT IN\" : \"IN\"} (`);\n sql.bindList(coerced);\n sql.push(\")\");\n return sql;\n}\n\nfunction likeClause(lhs: string, pattern: string, insensitive: boolean): Sql {\n const value = insensitive ? pattern.toUpperCase() : pattern;\n return new Sql().push(`${lhs} LIKE `).bind(value).push(\" ESCAPE '\\\\'\");\n}\n\nfunction compileRelationFilter(\n model: ModelNode,\n tableAlias: string,\n field: FieldNode,\n value: unknown,\n ctx: CompileContext,\n): Sql {\n const rel = resolveRelation(ctx.schema, model, field);\n const filter = (isPlainObject(value) ? value : {}) as Record<string, WhereInput | null>;\n\n // To-one shorthand: `{ author: { name: \"x\" } }` behaves like `is`.\n const hasOperator =\n \"some\" in filter || \"every\" in filter || \"none\" in filter ||\n \"is\" in filter || \"isNot\" in filter;\n\n if (!rel.isList && !hasOperator) {\n return existsClause(model, tableAlias, rel, value as WhereInput, ctx, false);\n }\n\n const parts: Sql[] = [];\n if (filter.some !== undefined) {\n parts.push(existsClause(model, tableAlias, rel, filter.some ?? {}, ctx, false));\n }\n if (filter.none !== undefined) {\n parts.push(existsClause(model, tableAlias, rel, filter.none ?? {}, ctx, true));\n }\n if (filter.every !== undefined) {\n // NOT EXISTS (related WHERE join AND NOT (sub))\n parts.push(\n existsClause(model, tableAlias, rel, filter.every ?? {}, ctx, true, true),\n );\n }\n if (filter.is !== undefined) {\n if (filter.is === null) {\n parts.push(notExists(model, tableAlias, rel, {}, ctx));\n } else {\n parts.push(existsClause(model, tableAlias, rel, filter.is, ctx, false));\n }\n }\n if (filter.isNot !== undefined) {\n if (filter.isNot === null) {\n parts.push(existsClause(model, tableAlias, rel, {}, ctx, false));\n } else {\n parts.push(existsClause(model, tableAlias, rel, filter.isNot, ctx, true));\n }\n }\n return parts.length ? wrapAnd(parts) : new Sql();\n}\n\nfunction notExists(\n model: ModelNode,\n tableAlias: string,\n rel: ReturnType<typeof resolveRelation>,\n sub: WhereInput,\n ctx: CompileContext,\n): Sql {\n return existsClause(model, tableAlias, rel, sub, ctx, true);\n}\n\n/**\n * Build `[NOT] EXISTS (SELECT 1 FROM related child WHERE join [AND sub])`.\n * When `everyMode` is set, the subfilter is negated to express `every`.\n */\nfunction existsClause(\n _model: ModelNode,\n tableAlias: string,\n rel: ReturnType<typeof resolveRelation>,\n sub: WhereInput,\n ctx: CompileContext,\n negate: boolean,\n everyMode = false,\n): Sql {\n const childAlias = `r${ctx.alias.next++}`;\n const childTable = ctx.dialect.quoteId(modelTable(rel.relatedModel));\n const sql = new Sql();\n sql.push(`${negate ? \"NOT EXISTS\" : \"EXISTS\"} (SELECT 1 FROM ${childTable} ${ctx.dialect.quoteId(childAlias)} WHERE `);\n\n const joins = rel.fromColumns.map((fromCol, i) => {\n const toCol = rel.toColumns[i]!;\n return `${ctx.dialect.quoteRef(childAlias, toCol)} = ${ctx.dialect.quoteRef(tableAlias, fromCol)}`;\n });\n sql.push(joins.join(\" AND \"));\n\n const subSql = compileWhere(rel.relatedModel, childAlias, sub, ctx);\n if (!subSql.isEmpty()) {\n if (everyMode) {\n sql.push(\" AND NOT (\").append(subSql).push(\")\");\n } else {\n sql.push(\" AND \").append(subSql);\n }\n }\n sql.push(\")\");\n return sql;\n}\n\n// ---- helpers ------------------------------------------------------------\n\nfunction isFilterObject(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n return Object.keys(value).some((k) => SCALAR_OPERATORS.has(k));\n}\n\nfunction asArray(value: unknown): WhereInput[] {\n const list = Array.isArray(value) ? value : [value];\n return list.filter(\n (v): v is WhereInput => v !== null && typeof v === \"object\",\n );\n}\n\nfunction asUnknownArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction escapeLike(input: string): string {\n return input.replace(/[\\\\%_]/g, (c) => `\\\\${c}`);\n}\n","import { type ModelNode, fieldColumn } from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport { isPlainObject } from \"@ember/utils\";\nimport type { WhereInput } from \"./args\";\nimport { type CompileContext, compileWhere } from \"./where\";\n\nconst AGG_FN: Record<string, string> = {\n _count: \"COUNT\",\n _sum: \"SUM\",\n _avg: \"AVG\",\n _min: \"MIN\",\n _max: \"MAX\",\n};\n\nconst COMPARATORS: Record<string, string> = {\n equals: \"=\",\n not: \"<>\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n/**\n * Compile a groupBy `having` clause. Keys may be:\n * - `AND` / `OR` / `NOT` — boolean composition;\n * - a scalar field with a normal filter — a condition on the group column;\n * - a scalar field wrapping aggregates (`{ field: { _sum: { gt } } }`) — a\n * condition on `SUM(col)`, `AVG(col)`, etc.;\n * - a top-level aggregate (`{ _count: { field: { gt } } }`).\n */\nexport function compileHaving(\n model: ModelNode,\n alias: string,\n having: WhereInput | undefined,\n ctx: CompileContext,\n): Sql {\n if (!having || Object.keys(having).length === 0) return new Sql();\n const parts: Sql[] = [];\n\n for (const [key, value] of Object.entries(having)) {\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\") {\n const list = (Array.isArray(value) ? value : [value]) as WhereInput[];\n const compiled = list\n .map((w) => compileHaving(model, alias, w, ctx))\n .filter((s) => !s.isEmpty());\n if (compiled.length) parts.push(joinBool(compiled, key));\n continue;\n }\n if (key === \"NOT\") {\n const inner = compileHaving(model, alias, value as WhereInput, ctx);\n if (!inner.isEmpty()) parts.push(new Sql().push(\"NOT (\").append(inner).push(\")\"));\n continue;\n }\n\n // Top-level aggregate, e.g. { _count: { id: { gt: 1 } } }.\n if (key in AGG_FN) {\n parts.push(...aggregateConditions(model, alias, key, value, ctx));\n continue;\n }\n\n const field = model.fields.find((f) => f.name === key && f.kind !== \"object\");\n if (!field) {\n throw new QueryValidationError(\n `Unknown having field '${model.name}.${key}'.`,\n );\n }\n\n if (isAggregateWrapper(value)) {\n const ref = ctx.dialect.quoteRef(alias, fieldColumn(field));\n for (const [agg, filter] of Object.entries(value as Record<string, unknown>)) {\n if (!(agg in AGG_FN)) continue;\n parts.push(comparison(`${AGG_FN[agg]}(${ref})`, filter, ctx.dialect));\n }\n } else {\n // Plain condition on the group column — reuse the where compiler.\n const cond = compileWhere(model, alias, { [key]: value }, ctx);\n if (!cond.isEmpty()) parts.push(cond);\n }\n }\n\n const nonEmpty = parts.filter((p) => !p.isEmpty());\n if (nonEmpty.length === 0) return new Sql();\n return joinBool(nonEmpty, \"AND\");\n}\n\nfunction aggregateConditions(\n model: ModelNode,\n alias: string,\n agg: string,\n spec: unknown,\n ctx: CompileContext,\n): Sql[] {\n if (!isPlainObject(spec)) return [];\n const out: Sql[] = [];\n for (const [fieldName, filter] of Object.entries(spec)) {\n const field = model.fields.find((f) => f.name === fieldName && f.kind !== \"object\");\n if (!field) continue;\n const ref = ctx.dialect.quoteRef(alias, fieldColumn(field));\n out.push(comparison(`${AGG_FN[agg]}(${ref})`, filter, ctx.dialect));\n }\n return out;\n}\n\nfunction comparison(lhs: string, filter: unknown, dialect: SqlDialect): Sql {\n if (!isPlainObject(filter)) {\n return new Sql().push(`${lhs} = `).bind(dialect.coerceValue(filter));\n }\n const parts: Sql[] = [];\n for (const [op, v] of Object.entries(filter)) {\n const sqlOp = COMPARATORS[op];\n if (!sqlOp) {\n throw new QueryValidationError(`Unsupported having operator '${op}'.`);\n }\n parts.push(new Sql().push(`${lhs} ${sqlOp} `).bind(dialect.coerceValue(v)));\n }\n return parts.length === 1 ? parts[0]! : joinBool(parts, \"AND\");\n}\n\nfunction isAggregateWrapper(value: unknown): boolean {\n return isPlainObject(value) && Object.keys(value).some((k) => k in AGG_FN);\n}\n\nfunction joinBool(parts: Sql[], op: \"AND\" | \"OR\"): Sql {\n if (parts.length === 1) return parts[0]!;\n const joined = Sql.join(\n parts.map((p) => new Sql().push(\"(\").append(p).push(\")\")),\n ` ${op} `,\n );\n return new Sql().push(\"(\").append(joined).push(\")\");\n}\n","import {\n type FieldNode,\n type ModelNode,\n fieldColumn,\n idFields,\n modelTable,\n} from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport type { SqlValue } from \"@ember/driver\";\nimport type { AggregateArgs, OrderByInput, SortOrder, WhereInput } from \"./args\";\nimport { compileOrderBy } from \"./order\";\nimport { compileHaving } from \"./having\";\nimport { type CompileContext, compileWhere } from \"./where\";\n\nexport interface SelectStatement {\n sql: Sql;\n /** Scalar fields projected, in result order. */\n columns: FieldNode[];\n}\n\n/**\n * A single column assignment in an UPDATE. `set` binds a literal value;\n * `arith` produces `\"COL\" = \"COL\" <op> ?` for atomic numeric operators\n * (increment/decrement/multiply/divide).\n */\nexport type ColumnUpdate =\n | { kind: \"set\"; value: SqlValue }\n | { kind: \"arith\"; op: \"+\" | \"-\" | \"*\" | \"/\"; value: SqlValue };\n\n/** Wrap a plain column→value map as a set-only ColumnUpdate map. */\nexport function setAssignments(\n values: Map<string, SqlValue>,\n): Map<string, ColumnUpdate> {\n const out = new Map<string, ColumnUpdate>();\n for (const [col, value] of values) out.set(col, { kind: \"set\", value });\n return out;\n}\n\nconst ROOT_ALIAS = \"t0\";\n\nexport function newContext(\n schema: CompileContext[\"schema\"],\n dialect: SqlDialect,\n): CompileContext {\n return { schema, dialect, alias: { next: 1 } };\n}\n\ninterface FindOptions {\n where?: WhereInput;\n orderBy?: OrderByInput;\n take?: number;\n skip?: number;\n}\n\n/** SELECT <projection> FROM model [WHERE] [ORDER BY] with FIRST/SKIP pagination. */\nexport function compileFindMany(\n model: ModelNode,\n options: FindOptions,\n projection: FieldNode[],\n ctx: CompileContext,\n): SelectStatement {\n const d = ctx.dialect;\n const cols = projection.map(\n (f) =>\n `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} AS ${d.quoteId(f.name)}`,\n );\n const sql = new Sql();\n const pagination = d.paginationClause(options.take, options.skip);\n sql.push(pagination ? `SELECT ${pagination} ` : \"SELECT \");\n sql.push(cols.join(\", \"));\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n\n appendWhere(sql, model, options.where, ctx);\n const order = compileOrderBy(model, ROOT_ALIAS, options.orderBy, d);\n if (!order.isEmpty()) sql.push(\" ORDER BY \").append(order);\n\n return { sql, columns: projection };\n}\n\n/**\n * SELECT ... with `distinct` pushed to SQL via ROW_NUMBER() (Firebird 3+).\n * Keeps the first row per distinct-field tuple in `orderBy` order, then applies\n * pagination on the outer query:\n *\n * SELECT FIRST/SKIP <cols> FROM (\n * SELECT <cols>, ROW_NUMBER() OVER (PARTITION BY <distinct> ORDER BY <ord>) \"__rn\"\n * FROM <table> t0 [WHERE ...]\n * ) sub WHERE sub.\"__rn\" = 1 [ORDER BY ...]\n */\nexport function compileDistinctFindMany(\n model: ModelNode,\n options: FindOptions,\n projection: FieldNode[],\n distinctFields: FieldNode[],\n ctx: CompileContext,\n): SelectStatement {\n const d = ctx.dialect;\n const innerOrder = options.orderBy\n ? compileOrderBy(model, ROOT_ALIAS, options.orderBy, d)\n : defaultOrder(model, d);\n const partitionBy = distinctFields\n .map((f) => d.quoteRef(ROOT_ALIAS, fieldColumn(f)))\n .join(\", \");\n\n const inner = new Sql();\n const innerCols = projection.map(\n (f) => `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} AS ${d.quoteId(f.name)}`,\n );\n inner.push(`SELECT ${innerCols.join(\", \")}, ROW_NUMBER() OVER (PARTITION BY ${partitionBy} ORDER BY `);\n inner.append(innerOrder);\n inner.push(`) AS ${d.quoteId(\"__rn\")}`);\n inner.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(inner, model, options.where, ctx);\n\n const sql = new Sql();\n const pagination = d.paginationClause(options.take, options.skip);\n const sub = \"sub\";\n const outerCols = projection\n .map((f) => `${d.quoteRef(sub, f.name)} AS ${d.quoteId(f.name)}`)\n .join(\", \");\n sql.push(pagination ? `SELECT ${pagination} ` : \"SELECT \");\n sql.push(outerCols);\n sql.push(` FROM (`).append(inner).push(`) ${d.quoteId(sub)}`);\n sql.push(` WHERE ${d.quoteRef(sub, \"__rn\")} = 1`);\n\n // Re-apply ordering on the outer query (referencing the projected aliases).\n const outerOrder = outerOrderBy(model, sub, options.orderBy, d);\n if (!outerOrder.isEmpty()) sql.push(\" ORDER BY \").append(outerOrder);\n\n return { sql, columns: projection };\n}\n\n/** SELECT COUNT(*) ... */\nexport function compileCount(\n model: ModelNode,\n where: WhereInput | undefined,\n ctx: CompileContext,\n pagination?: { take?: number; skip?: number },\n): Sql {\n const d = ctx.dialect;\n const sql = new Sql();\n const clause = pagination\n ? d.paginationClause(pagination.take, pagination.skip)\n : \"\";\n sql.push(clause ? `SELECT ${clause} COUNT(*) AS \"_count\"` : `SELECT COUNT(*) AS \"_count\"`);\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(sql, model, where, ctx);\n return sql;\n}\n\n/** Aggregate functions (_count/_avg/_sum/_min/_max) over a filtered set. */\nexport function compileAggregate(\n model: ModelNode,\n args: AggregateArgs,\n ctx: CompileContext,\n): Sql {\n const d = ctx.dialect;\n const selects = aggregateSelections(model, args, d);\n if (selects.length === 0) {\n throw new QueryValidationError(\"Aggregate requires at least one operator.\");\n }\n const sql = new Sql();\n sql.push(`SELECT ${selects.join(\", \")}`);\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(sql, model, args.where, ctx);\n return sql;\n}\n\n/** GROUP BY with aggregates and optional HAVING. */\nexport function compileGroupBy(\n model: ModelNode,\n args: AggregateArgs & { by: string[]; having?: WhereInput },\n ctx: CompileContext,\n): { sql: Sql; groupColumns: FieldNode[] } {\n const d = ctx.dialect;\n const groupColumns = args.by.map((name) => requireScalar(model, name));\n const groupSelects = groupColumns.map(\n (f) => `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} AS ${d.quoteId(f.name)}`,\n );\n const aggSelects = aggregateSelections(model, args, d);\n\n const sql = new Sql();\n sql.push(`SELECT ${[...groupSelects, ...aggSelects].join(\", \")}`);\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(sql, model, args.where, ctx);\n sql.push(\n ` GROUP BY ${groupColumns\n .map((f) => d.quoteRef(ROOT_ALIAS, fieldColumn(f)))\n .join(\", \")}`,\n );\n\n const having = compileHaving(model, ROOT_ALIAS, args.having, ctx);\n if (!having.isEmpty()) sql.push(\" HAVING \").append(having);\n\n const order = compileOrderBy(model, ROOT_ALIAS, args.orderBy, d);\n if (!order.isEmpty()) sql.push(\" ORDER BY \").append(order);\n return { sql, groupColumns };\n}\n\n/** INSERT ... [RETURNING ...]. `row` maps column->value (already coerced upstream). */\nexport function compileInsert(\n model: ModelNode,\n row: Map<string, SqlValue>,\n ctx: CompileContext,\n returning: FieldNode[],\n): SelectStatement {\n const d = ctx.dialect;\n const sql = new Sql();\n const columns = [...row.keys()];\n sql.push(`INSERT INTO ${d.quoteId(modelTable(model))} (`);\n sql.push(columns.map((c) => d.quoteId(c)).join(\", \"));\n sql.push(\") VALUES (\");\n sql.bindList(columns.map((c) => row.get(c)!));\n sql.push(\")\");\n appendReturning(sql, d, returning);\n return { sql, columns: returning };\n}\n\n/** UPDATE table alias SET ... WHERE ... [RETURNING ...]. */\nexport function compileUpdate(\n model: ModelNode,\n where: WhereInput | undefined,\n assignments: Map<string, ColumnUpdate>,\n ctx: CompileContext,\n returning?: FieldNode[],\n): SelectStatement {\n const d = ctx.dialect;\n if (assignments.size === 0) {\n throw new QueryValidationError(\"Update requires at least one field to set.\");\n }\n const sql = new Sql();\n sql.push(`UPDATE ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)} SET `);\n const cols = [...assignments.keys()];\n cols.forEach((col, i) => {\n if (i > 0) sql.push(\", \");\n const assignment = assignments.get(col)!;\n const quoted = d.quoteId(col);\n if (assignment.kind === \"arith\") {\n sql.push(`${quoted} = ${quoted} ${assignment.op} `).bind(assignment.value);\n } else {\n sql.push(`${quoted} = `).bind(assignment.value);\n }\n });\n appendWhere(sql, model, where, ctx);\n if (returning) appendReturning(sql, d, returning);\n return { sql, columns: returning ?? [] };\n}\n\n/** DELETE FROM table alias WHERE ... [RETURNING ...]. */\nexport function compileDelete(\n model: ModelNode,\n where: WhereInput | undefined,\n ctx: CompileContext,\n returning?: FieldNode[],\n): SelectStatement {\n const d = ctx.dialect;\n const sql = new Sql();\n sql.push(\n `DELETE FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`,\n );\n appendWhere(sql, model, where, ctx);\n if (returning) appendReturning(sql, d, returning);\n return { sql, columns: returning ?? [] };\n}\n\n// ---- internals ----------------------------------------------------------\n\nfunction appendWhere(\n sql: Sql,\n model: ModelNode,\n where: WhereInput | undefined,\n ctx: CompileContext,\n): void {\n const compiled = compileWhere(model, ROOT_ALIAS, where, ctx);\n if (!compiled.isEmpty()) sql.push(\" WHERE \").append(compiled);\n}\n\n/** Deterministic default ordering (primary key, ascending) on the inner alias. */\nfunction defaultOrder(model: ModelNode, d: SqlDialect): Sql {\n const ids = idFields(model);\n const cols = (ids.length ? ids : model.fields.filter((f) => f.kind !== \"object\"))\n .map((f) => `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} ASC`);\n return Sql.raw(cols.join(\", \"));\n}\n\n/** ORDER BY for the outer distinct query, referencing projected name aliases. */\nfunction outerOrderBy(\n model: ModelNode,\n alias: string,\n orderBy: OrderByInput | undefined,\n d: SqlDialect,\n): Sql {\n if (!orderBy) return new Sql();\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const parts: Sql[] = [];\n for (const obj of list) {\n for (const [name, dir] of Object.entries(obj)) {\n if (dir !== \"asc\" && dir !== \"desc\") continue;\n if (!model.fields.some((f) => f.name === name && f.kind !== \"object\")) {\n continue;\n }\n parts.push(\n Sql.raw(`${d.quoteRef(alias, name)} ${(dir as SortOrder) === \"desc\" ? \"DESC\" : \"ASC\"}`),\n );\n }\n }\n return Sql.join(parts, \", \");\n}\n\nfunction appendReturning(sql: Sql, d: SqlDialect, returning: FieldNode[]): void {\n if (returning.length === 0) return;\n sql.push(\" RETURNING \");\n sql.push(\n returning\n .map((f) => `${d.quoteId(fieldColumn(f))} AS ${d.quoteId(f.name)}`)\n .join(\", \"),\n );\n}\n\nfunction aggregateSelections(\n model: ModelNode,\n args: AggregateArgs,\n d: SqlDialect,\n): string[] {\n const out: string[] = [];\n if (args._count) {\n if (args._count === true) {\n out.push(`COUNT(*) AS \"_count_all\"`);\n } else {\n for (const field of trueKeys(args._count)) {\n const col = d.quoteRef(ROOT_ALIAS, fieldColumn(requireScalar(model, field)));\n out.push(`COUNT(${col}) AS ${d.quoteId(`_count_${field}`)}`);\n }\n }\n }\n pushAgg(out, \"SUM\", \"_sum\", model, args._sum, d);\n pushAgg(out, \"AVG\", \"_avg\", model, args._avg, d);\n pushAgg(out, \"MIN\", \"_min\", model, args._min, d);\n pushAgg(out, \"MAX\", \"_max\", model, args._max, d);\n return out;\n}\n\nfunction pushAgg(\n out: string[],\n fn: string,\n prefix: string,\n model: ModelNode,\n spec: Record<string, boolean> | undefined,\n d: SqlDialect,\n): void {\n if (!spec) return;\n for (const field of trueKeys(spec)) {\n const col = d.quoteRef(ROOT_ALIAS, fieldColumn(requireScalar(model, field)));\n out.push(`${fn}(${col}) AS ${d.quoteId(`${prefix}_${field}`)}`);\n }\n}\n\nfunction trueKeys(spec: Record<string, boolean>): string[] {\n return Object.entries(spec)\n .filter(([, v]) => v === true)\n .map(([k]) => k);\n}\n\nfunction requireScalar(model: ModelNode, name: string): FieldNode {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") {\n throw new QueryValidationError(\n `'${name}' is not a scalar field on model '${model.name}'.`,\n );\n }\n return field;\n}\n","import { type FieldNode } from \"@ember/ast\";\n\n/**\n * Map a raw value returned by node-firebird into the JS type implied by the\n * field's schema type. Firebird has no native boolean in older versions and\n * returns JSON/decimal as text, so normalization happens here in one place.\n */\nexport function coerceFromDb(value: unknown, field: FieldNode): unknown {\n if (value === null || value === undefined) return null;\n\n switch (field.type) {\n case \"Boolean\":\n return toBoolean(value);\n case \"Int\":\n return typeof value === \"number\" ? value : Number(value);\n case \"BigInt\":\n return typeof value === \"bigint\" ? value : BigInt(String(value));\n case \"Float\":\n case \"Decimal\":\n return typeof value === \"number\" ? value : Number(value);\n case \"DateTime\":\n return value instanceof Date ? value : new Date(String(value));\n case \"Json\":\n return parseJson(value);\n case \"Bytes\":\n return Buffer.isBuffer(value) ? value : Buffer.from(String(value));\n case \"String\":\n default:\n return typeof value === \"string\" ? value : String(value);\n }\n}\n\n/** Map a full DB row keyed by field name into a typed plain object. */\nexport function coerceRow(\n row: Record<string, unknown>,\n fields: FieldNode[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const field of fields) {\n if (field.name in row) {\n out[field.name] = coerceFromDb(row[field.name], field);\n }\n }\n return out;\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n const s = String(value).trim().toUpperCase();\n return s === \"1\" || s === \"T\" || s === \"TRUE\" || s === \"Y\";\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { type FieldNode, type ModelNode } from \"@ember/ast\";\n\n/**\n * Compute default values in JS at write time. Computing here (rather than\n * relying on DB-side DEFAULT clauses) keeps behavior identical across Firebird\n * versions and lets EmberORM return the generated values without extra reads.\n *\n * `autoincrement()` is intentionally skipped: it is produced by the database\n * identity/generator and read back via RETURNING.\n */\nexport function applyCreateDefaults(\n model: ModelNode,\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...data };\n for (const field of model.fields) {\n if (field.kind === \"object\") continue;\n\n if (field.isUpdatedAt && out[field.name] === undefined) {\n out[field.name] = new Date();\n continue;\n }\n if (out[field.name] !== undefined) continue;\n\n const def = field.default;\n if (!def) continue;\n\n if (def.function) {\n const computed = computeFunctionDefault(def.function.name);\n if (computed !== SKIP) out[field.name] = computed;\n continue;\n }\n if (def.literal !== undefined) {\n out[field.name] = def.literal;\n }\n }\n return out;\n}\n\n/** Set @updatedAt fields on update operations. */\nexport function applyUpdateDefaults(\n model: ModelNode,\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...data };\n for (const field of model.fields) {\n if (field.isUpdatedAt && out[field.name] === undefined) {\n out[field.name] = new Date();\n }\n }\n return out;\n}\n\nconst SKIP = Symbol(\"skip-default\");\n\nfunction computeFunctionDefault(name: string): unknown {\n switch (name) {\n case \"now\":\n return new Date();\n case \"uuid\":\n return randomUUID();\n case \"cuid\":\n return generateCuid();\n case \"autoincrement\":\n return SKIP;\n default:\n return SKIP;\n }\n}\n\n/** Minimal collision-resistant id (cuid-like) without external deps. */\nfunction generateCuid(): string {\n const time = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 10);\n return `c${time}${rand}`;\n}\n\nexport function isAutoincrement(field: FieldNode): boolean {\n return field.default?.function?.name === \"autoincrement\";\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n fieldColumn,\n idFields,\n modelTable,\n} from \"@ember/ast\";\nimport { QueryValidationError, RecordNotFoundError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport type { SqlValue } from \"@ember/driver\";\nimport { isPlainObject } from \"@ember/utils\";\nimport type { WhereInput } from \"./args\";\nimport {\n type ColumnUpdate,\n compileDelete,\n compileInsert,\n compileUpdate,\n newContext,\n setAssignments,\n} from \"./compiler\";\nimport { type CompileContext, compileWhere } from \"./where\";\nimport {\n applyCreateDefaults,\n applyUpdateDefaults,\n isAutoincrement,\n} from \"./defaults\";\nimport { resolveRelation, type ResolvedRelation } from \"./relations\";\n\nexport type Executor = (sql: Sql) => Promise<Record<string, unknown>[]>;\n\n/**\n * Handles INSERT/UPDATE with nested relation writes (connect/create/disconnect/\n * set/delete). Owning-side relations are resolved before the row is written so\n * the foreign key is part of the INSERT; child-side relations are written after\n * the parent exists so their foreign keys can point back.\n *\n * All FK maps are keyed by *field name* when feeding the scalar pipeline and by\n * *column name* when feeding compileUpdate directly (which expects columns).\n */\nexport class WriteProcessor {\n constructor(\n private readonly schema: SchemaDocument,\n private readonly dialect: SqlDialect,\n private readonly exec: Executor,\n ) {}\n\n private ctx(): CompileContext {\n return newContext(this.schema, this.dialect);\n }\n\n /** Insert one row (with nested writes) and return its key values. */\n async create(\n model: ModelNode,\n data: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n const { scalars, owning, children } = this.partition(model, data);\n\n for (const [field, op] of owning) {\n for (const [fieldName, value] of await this.resolveOwning(model, field, op)) {\n scalars.set(fieldName, value);\n }\n }\n\n const withDefaults = applyCreateDefaults(model, recordOf(scalars));\n const row = this.toColumnMap(model, withDefaults);\n\n const returning = idFields(model);\n const stmt = compileInsert(model, row, this.ctx(), returning);\n const result = await this.exec(stmt.sql);\n const keys = this.keyValues(model, result[0] ?? {}, withDefaults);\n\n for (const [field, op] of children) {\n await this.writeChildren(model, keys, field, op);\n }\n return keys;\n }\n\n /** Update rows matched by `where` (with nested writes). */\n async updateRow(\n model: ModelNode,\n where: WhereInput,\n data: Record<string, unknown>,\n keys: Record<string, unknown>,\n ): Promise<void> {\n const { scalars, owning, children } = this.partition(model, data, true);\n\n for (const [field, op] of owning) {\n for (const [fieldName, value] of await this.resolveOwningForUpdate(\n model,\n field,\n op,\n )) {\n scalars.set(fieldName, value);\n }\n }\n\n const withDefaults = applyUpdateDefaults(model, recordOf(scalars));\n const assignments = this.toUpdateColumnMap(model, withDefaults);\n\n if (assignments.size > 0) {\n const stmt = compileUpdate(model, where, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n\n for (const [field, op] of children) {\n await this.writeChildren(model, keys, field, op);\n }\n }\n\n /**\n * Scalar-only bulk update (for `updateMany`). Atomic operators are supported;\n * nested relation writes are rejected, matching Prisma's `updateMany`.\n */\n async updateManyRows(\n model: ModelNode,\n where: WhereInput | undefined,\n data: Record<string, unknown>,\n ): Promise<void> {\n for (const key of Object.keys(data)) {\n const field = model.fields.find((f) => f.name === key);\n if (field?.kind === \"object\") {\n throw new QueryValidationError(\n `updateMany does not support nested relation writes ('${model.name}.${key}'). Use update() per record.`,\n );\n }\n }\n const withDefaults = applyUpdateDefaults(model, data);\n const assignments = this.toUpdateColumnMap(model, withDefaults);\n if (assignments.size > 0) {\n const stmt = compileUpdate(model, where, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n }\n\n // ---- partition & mapping ------------------------------------------------\n\n private partition(\n model: ModelNode,\n data: Record<string, unknown>,\n isUpdate = false,\n ): {\n scalars: Map<string, unknown>;\n owning: [FieldNode, Record<string, unknown>][];\n children: [FieldNode, Record<string, unknown>][];\n } {\n const scalars = new Map<string, unknown>();\n const owning: [FieldNode, Record<string, unknown>][] = [];\n const children: [FieldNode, Record<string, unknown>][] = [];\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields.find((f) => f.name === key);\n if (!field) {\n throw new QueryValidationError(\n `Unknown field '${key}' on model '${model.name}'.`,\n );\n }\n if (field.kind !== \"object\") {\n // For updates the raw value is preserved so atomic operators\n // ({ increment }, { set }, ...) can be interpreted later.\n scalars.set(key, value);\n continue;\n }\n if (!isPlainObject(value)) {\n throw new QueryValidationError(\n `Relation '${model.name}.${key}' expects a nested write object.`,\n );\n }\n const rel = resolveRelation(this.schema, model, field);\n if (rel.owns) owning.push([field, value]);\n else children.push([field, value]);\n }\n return { scalars, owning, children };\n }\n\n private toColumnMap(\n model: ModelNode,\n record: Record<string, unknown>,\n ): Map<string, SqlValue> {\n const out = new Map<string, SqlValue>();\n for (const [name, value] of Object.entries(record)) {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") continue;\n if (isAutoincrement(field) && (value === undefined || value === null)) {\n continue;\n }\n out.set(fieldColumn(field), this.dialect.coerceValue(value));\n }\n return out;\n }\n\n /**\n * Build UPDATE assignments, interpreting atomic scalar operators:\n * `{ set }`, `{ increment }`, `{ decrement }`, `{ multiply }`, `{ divide }`.\n * A bare value is a plain `set`.\n */\n private toUpdateColumnMap(\n model: ModelNode,\n record: Record<string, unknown>,\n ): Map<string, ColumnUpdate> {\n const out = new Map<string, ColumnUpdate>();\n for (const [name, value] of Object.entries(record)) {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") continue;\n out.set(fieldColumn(field), this.toColumnUpdate(field, value));\n }\n return out;\n }\n\n private toColumnUpdate(field: FieldNode, value: unknown): ColumnUpdate {\n const coerce = (v: unknown): SqlValue => this.dialect.coerceValue(v);\n if (isPlainObject(value)) {\n if (\"set\" in value) return { kind: \"set\", value: coerce(value.set) };\n const arith = ARITH_OPS.find((op) => op.key in value);\n if (arith) {\n requireNumeric(field, arith.key);\n return { kind: \"arith\", op: arith.op, value: coerce(value[arith.key]) };\n }\n }\n return { kind: \"set\", value: coerce(value) };\n }\n\n private keyValues(\n model: ModelNode,\n returnedRow: Record<string, unknown>,\n writtenData: Record<string, unknown>,\n ): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const f of idFields(model)) {\n out[f.name] =\n returnedRow[f.name] ??\n returnedRow[fieldColumn(f)] ??\n writtenData[f.name];\n }\n return out;\n }\n\n // ---- owning-side relations ---------------------------------------------\n\n private async resolveOwning(\n model: ModelNode,\n field: FieldNode,\n op: Record<string, unknown>,\n ): Promise<[string, SqlValue][]> {\n const rel = resolveRelation(this.schema, model, field);\n if (op.connect) {\n const ref = await this.lookupReference(rel, op.connect as WhereInput);\n return this.mapFkByField(rel, ref);\n }\n if (op.create) {\n const childKeys = await this.create(\n rel.relatedModel,\n op.create as Record<string, unknown>,\n );\n return this.mapFkByField(rel, childKeys);\n }\n if (op.connectOrCreate) {\n const spec = op.connectOrCreate as {\n where: WhereInput;\n create: Record<string, unknown>;\n };\n const existing = await this.tryLookupReference(rel, spec.where);\n const ref = existing ?? (await this.create(rel.relatedModel, spec.create));\n return this.mapFkByField(rel, ref);\n }\n throw new QueryValidationError(\n `Unsupported nested write on '${model.name}.${field.name}'.`,\n );\n }\n\n private async resolveOwningForUpdate(\n model: ModelNode,\n field: FieldNode,\n op: Record<string, unknown>,\n ): Promise<[string, SqlValue][]> {\n if (op.disconnect) {\n const rel = resolveRelation(this.schema, model, field);\n return rel.fromFields.map((name) => [name, null] as [string, SqlValue]);\n }\n return this.resolveOwning(model, field, op);\n }\n\n /** [localFieldName, value] pairs from the referenced model's key values. */\n private mapFkByField(\n rel: ResolvedRelation,\n refValues: Record<string, unknown>,\n ): [string, SqlValue][] {\n return rel.fromFields.map((fromField, i) => {\n const toField = rel.toFields[i]!;\n return [fromField, this.dialect.coerceValue(refValues[toField] ?? null)];\n });\n }\n\n private async lookupReference(\n rel: ResolvedRelation,\n where: WhereInput,\n ): Promise<Record<string, unknown>> {\n const found = await this.tryLookupReference(rel, where);\n if (!found) throw new RecordNotFoundError(rel.relatedModel.name);\n return found;\n }\n\n private async tryLookupReference(\n rel: ResolvedRelation,\n where: WhereInput,\n ): Promise<Record<string, unknown> | null> {\n const fields = rel.toFields.map((n) => requireField(rel.relatedModel, n));\n const stmt = this.selectKeys(rel.relatedModel, fields, where);\n const rows = await this.exec(stmt);\n return rows[0] ?? null;\n }\n\n private selectKeys(\n model: ModelNode,\n fields: FieldNode[],\n where: WhereInput,\n ): Sql {\n const d = this.dialect;\n const alias = \"t0\";\n const sql = new Sql();\n sql.push(\"SELECT FIRST 1 \");\n sql.push(\n fields\n .map((f) => `${d.quoteRef(alias, fieldColumn(f))} AS ${d.quoteId(f.name)}`)\n .join(\", \"),\n );\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(alias)}`);\n const cond = compileWhere(model, alias, where, this.ctx());\n if (!cond.isEmpty()) sql.push(\" WHERE \").append(cond);\n return sql;\n }\n\n // ---- child-side relations ----------------------------------------------\n\n private async writeChildren(\n parentModel: ModelNode,\n parentKeys: Record<string, unknown>,\n field: FieldNode,\n op: Record<string, unknown>,\n ): Promise<void> {\n const rel = resolveRelation(this.schema, parentModel, field);\n const fkColumns: [string, SqlValue][] = rel.toColumns.map((toCol, i) => {\n const fromField = rel.fromFields[i]!;\n return [toCol, this.dialect.coerceValue(parentKeys[fromField] ?? null)];\n });\n\n for (const childData of toArray(op.create)) {\n await this.create(rel.relatedModel, { ...childData, ...fkRecord(rel, parentKeys) });\n }\n for (const where of toArray(op.connect)) {\n await this.setChildForeignKey(rel, where as WhereInput, fkColumns);\n }\n if (op.set !== undefined) {\n await this.clearChildren(rel, parentKeys);\n for (const where of toArray(op.set)) {\n await this.setChildForeignKey(rel, where as WhereInput, fkColumns);\n }\n }\n for (const where of toArray(op.disconnect)) {\n await this.setChildForeignKey(\n rel,\n where as WhereInput,\n rel.toColumns.map((c) => [c, null] as [string, SqlValue]),\n );\n }\n for (const where of toArray(op.delete)) {\n const stmt = compileDelete(rel.relatedModel, where as WhereInput, this.ctx());\n await this.exec(stmt.sql);\n }\n }\n\n private async setChildForeignKey(\n rel: ResolvedRelation,\n where: WhereInput,\n fkColumns: [string, SqlValue][],\n ): Promise<void> {\n const assignments = setAssignments(new Map<string, SqlValue>(fkColumns));\n const stmt = compileUpdate(rel.relatedModel, where, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n\n private async clearChildren(\n rel: ResolvedRelation,\n parentKeys: Record<string, unknown>,\n ): Promise<void> {\n const matchWhere: WhereInput = {};\n rel.toFields.forEach((toField, i) => {\n const fromField = rel.fromFields[i]!;\n matchWhere[toField] = parentKeys[fromField];\n });\n const assignments = setAssignments(\n new Map<string, SqlValue>(\n rel.toColumns.map((c) => [c, null] as [string, SqlValue]),\n ),\n );\n const stmt = compileUpdate(rel.relatedModel, matchWhere, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n}\n\nconst ARITH_OPS = [\n { key: \"increment\", op: \"+\" as const },\n { key: \"decrement\", op: \"-\" as const },\n { key: \"multiply\", op: \"*\" as const },\n { key: \"divide\", op: \"/\" as const },\n];\n\nconst NUMERIC_TYPES = new Set([\"Int\", \"BigInt\", \"Float\", \"Decimal\"]);\n\nfunction requireNumeric(field: FieldNode, op: string): void {\n if (!NUMERIC_TYPES.has(field.type)) {\n throw new QueryValidationError(\n `Operator '${op}' is only valid on numeric fields, not '${field.name}' (${field.type}).`,\n );\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction requireField(model: ModelNode, name: string): FieldNode {\n const f = model.fields.find((x) => x.name === name);\n if (!f) {\n throw new QueryValidationError(`Field '${name}' not found on '${model.name}'.`);\n }\n return f;\n}\n\nfunction fkRecord(\n rel: ResolvedRelation,\n parentKeys: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n rel.toFields.forEach((toField, i) => {\n const fromField = rel.fromFields[i]!;\n out[toField] = parentKeys[fromField];\n });\n return out;\n}\n\nfunction recordOf(scalars: Map<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of scalars) out[k] = v;\n return out;\n}\n\nfunction toArray<T = Record<string, unknown>>(value: unknown): T[] {\n if (value === undefined || value === null) return [];\n return (Array.isArray(value) ? value : [value]) as T[];\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n findModel,\n idFields,\n scalarFields,\n} from \"@ember/ast\";\nimport {\n type SqlDriver,\n type TransactionContext,\n type TransactionOptions,\n} from \"@ember/driver\";\nimport { QueryValidationError, RecordNotFoundError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport { uniq } from \"@ember/utils\";\nimport type {\n AggregateArgs,\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n CreateManyAndReturnArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n GroupByArgs,\n IncludeInput,\n NestedReadArgs,\n OmitInput,\n SelectInput,\n SortOrder,\n UpdateArgs,\n UpdateManyArgs,\n UpsertArgs,\n WhereInput,\n} from \"./args\";\nimport {\n compileAggregate,\n compileCount,\n compileDelete,\n compileDistinctFindMany,\n compileFindMany,\n compileGroupBy,\n newContext,\n} from \"./compiler\";\nimport { coerceRow } from \"./coerce\";\nimport { resolveRelation } from \"./relations\";\nimport { WriteProcessor, type Executor } from \"./writer\";\n\ninterface RelationRead {\n field: FieldNode;\n args: NestedReadArgs;\n}\n\n/** The projection-shaping options shared by read-back of writes. */\ninterface ReadShape {\n select?: SelectInput;\n include?: IncludeInput;\n omit?: OmitInput;\n}\n\nfunction readShape(args: {\n select?: SelectInput;\n include?: IncludeInput;\n omit?: OmitInput;\n}): ReadShape {\n return { select: args.select, include: args.include, omit: args.omit };\n}\n\n/**\n * The query engine executes high-level operations against a driver. Reads use\n * a projection + relation-stitching pipeline (relations are loaded with\n * separate batched queries, Prisma-style). Writes are delegated to\n * WriteProcessor. Every operation runs inside a driver transaction.\n */\nexport class QueryEngine {\n constructor(\n private readonly schema: SchemaDocument,\n private readonly dialect: SqlDialect,\n private readonly driver: SqlDriver,\n ) {}\n\n model(name: string): ModelNode {\n const model = findModel(this.schema, name);\n if (!model) throw new QueryValidationError(`Unknown model '${name}'.`);\n return model;\n }\n\n private run<T>(\n fn: (tx: TransactionContext) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n return this.driver.transaction(fn, options);\n }\n\n private execOn(tx: TransactionContext): Executor {\n return (sql: Sql) => tx.query(sql.text, sql.params);\n }\n\n // ---- reads --------------------------------------------------------------\n\n findMany(name: string, args: FindManyArgs = {}): Promise<Record<string, unknown>[]> {\n const model = this.model(name);\n return this.run((tx) => this.readMany(model, args, this.execOn(tx)));\n }\n\n async findFirst(\n name: string,\n args: FindFirstArgs = {},\n ): Promise<Record<string, unknown> | null> {\n const rows = await this.findMany(name, { ...args, take: 1 });\n return rows[0] ?? null;\n }\n\n async findFirstOrThrow(name: string, args: FindFirstArgs = {}) {\n const row = await this.findFirst(name, args);\n if (!row) throw new RecordNotFoundError(name);\n return row;\n }\n\n async findUnique(\n name: string,\n args: FindUniqueArgs,\n ): Promise<Record<string, unknown> | null> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n const rows = await this.run((tx) =>\n this.readMany(\n model,\n { where: args.where, select: args.select, include: args.include, take: 1 },\n this.execOn(tx),\n ),\n );\n return rows[0] ?? null;\n }\n\n async findUniqueOrThrow(name: string, args: FindUniqueArgs) {\n const row = await this.findUnique(name, args);\n if (!row) throw new RecordNotFoundError(name);\n return row;\n }\n\n // ---- aggregations -------------------------------------------------------\n\n count(name: string, args: CountArgs = {}): Promise<number> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const stmt = compileCount(model, args.where, newContext(this.schema, this.dialect), {\n take: args.take,\n skip: args.skip,\n });\n const rows = await tx.query<{ _count: unknown }>(stmt.text, stmt.params);\n return Number(rows[0]?._count ?? 0);\n });\n }\n\n aggregate(name: string, args: AggregateArgs = {}): Promise<Record<string, unknown>> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const stmt = compileAggregate(model, args, newContext(this.schema, this.dialect));\n const rows = await tx.query<Record<string, unknown>>(stmt.text, stmt.params);\n return reshapeAggregate(rows[0] ?? {});\n });\n }\n\n groupBy(name: string, args: GroupByArgs): Promise<Record<string, unknown>[]> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const { sql } = compileGroupBy(model, args, newContext(this.schema, this.dialect));\n const rows = await tx.query<Record<string, unknown>>(sql.text, sql.params);\n return rows.map((r) => reshapeGroupRow(model, args.by, r));\n });\n }\n\n // ---- writes -------------------------------------------------------------\n\n create(name: string, args: CreateArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const writer = new WriteProcessor(this.schema, this.dialect, this.execOn(tx));\n const keys = await writer.create(model, args.data);\n return this.readBack(model, keys, readShape(args), this.execOn(tx));\n });\n }\n\n createMany(name: string, args: CreateManyArgs): Promise<{ count: number }> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const writer = new WriteProcessor(this.schema, this.dialect, this.execOn(tx));\n let count = 0;\n for (const data of args.data) {\n await writer.create(model, data);\n count++;\n }\n return { count };\n });\n }\n\n /** Like createMany, but returns the created records (no nested relations). */\n createManyAndReturn(\n name: string,\n args: CreateManyAndReturnArgs,\n ): Promise<Record<string, unknown>[]> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n const out: Record<string, unknown>[] = [];\n const shape: ReadShape = { select: args.select, omit: args.omit };\n for (const data of args.data) {\n const keys = await writer.create(model, data);\n out.push(await this.readBack(model, keys, shape, exec));\n }\n return out;\n });\n }\n\n update(name: string, args: UpdateArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const target = await this.requireOne(model, args.where, exec);\n const keys = this.pickKeys(model, target);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n await writer.updateRow(model, args.where, args.data, keys);\n return this.readBack(model, keys, readShape(args), exec);\n });\n }\n\n updateMany(name: string, args: UpdateManyArgs): Promise<{ count: number }> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const count = await this.countMatching(model, args.where, exec);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n // updateMany is scalar-only (atomic operators allowed); relation writes\n // are rejected. Applies to the whole matched set.\n await writer.updateManyRows(model, args.where, args.data);\n return { count };\n });\n }\n\n upsert(name: string, args: UpsertArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const existing = await this.findOneRaw(model, args.where, exec);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n if (existing) {\n const keys = this.pickKeys(model, existing);\n await writer.updateRow(model, args.where, args.update, keys);\n return this.readBack(model, keys, readShape(args), exec);\n }\n const keys = await writer.create(model, args.create);\n return this.readBack(model, keys, readShape(args), exec);\n });\n }\n\n delete(name: string, args: DeleteArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const row = await this.readBackOne(model, args.where, readShape(args), exec);\n if (!row) throw new RecordNotFoundError(name);\n const stmt = compileDelete(model, args.where, newContext(this.schema, this.dialect));\n await exec(stmt.sql);\n return row;\n });\n }\n\n deleteMany(name: string, args: DeleteManyArgs = {}): Promise<{ count: number }> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const count = await this.countMatching(model, args.where, exec);\n const stmt = compileDelete(model, args.where, newContext(this.schema, this.dialect));\n await exec(stmt.sql);\n return { count };\n });\n }\n\n // ---- read pipeline ------------------------------------------------------\n\n private async readMany(\n model: ModelNode,\n args: FindManyArgs,\n exec: Executor,\n forceKeep: string[] = [],\n ): Promise<Record<string, unknown>[]> {\n const relations = this.readRelations(model, args.select, args.include);\n const countFields = this.readCountRelations(model, args.select, args.include);\n const selectedScalars = applyOmit(\n model,\n selectedScalarNames(model, args.select),\n args.omit,\n );\n const distinctFields = normalizeDistinct(model, args.distinct);\n // On Firebird 3+ `distinct` is pushed to SQL via ROW_NUMBER(); on 2.x it is\n // de-duplicated in memory (and pagination is therefore also done in memory).\n const useWindowDistinct =\n distinctFields.length > 0 && this.dialect.supportsWindowFunctions;\n const memoryPaginate = distinctFields.length > 0 && !useWindowDistinct;\n\n // `cursor` augments the filter/order so SQL can start at the cursor row.\n const { where, orderBy } = applyCursor(model, args, distinctFields);\n\n const relationKeyFields = uniq(\n [...relations.map((r) => r.field), ...countFields].flatMap(\n (field) => resolveRelation(this.schema, model, field).fromFields,\n ),\n );\n const internalKeys = uniq([\n ...relationKeyFields,\n ...distinctFields, // fetched for de-dup; stripped below if not selected\n ]);\n const projectionNames = uniq([\n ...(selectedScalars ?? scalarFields(model).map((f) => f.name)),\n ...internalKeys,\n ...forceKeep,\n ]);\n const projection = projectionNames.map((n) => fieldByName(model, n));\n\n const findOptions = {\n where,\n orderBy,\n take: memoryPaginate ? undefined : args.take,\n skip: memoryPaginate ? undefined : args.skip,\n };\n const stmt = useWindowDistinct\n ? compileDistinctFindMany(\n model,\n findOptions,\n projection,\n distinctFields.map((n) => fieldByName(model, n)),\n newContext(this.schema, this.dialect),\n )\n : compileFindMany(\n model,\n findOptions,\n projection,\n newContext(this.schema, this.dialect),\n );\n const rawRows = await exec(stmt.sql);\n let rows = rawRows.map((r) => coerceRow(r, projection));\n\n if (memoryPaginate) {\n rows = dedupeBy(rows, distinctFields);\n rows = applyPagination(rows, args.take, args.skip);\n }\n\n for (const relation of relations) {\n await this.loadRelation(model, rows, relation, exec);\n }\n if (countFields.length > 0) {\n await this.loadCounts(model, rows, countFields, exec);\n }\n\n // Strip internal scalar keys added only for stitching/de-dup.\n if (selectedScalars) {\n const visible = new Set([...selectedScalars, ...forceKeep]);\n for (const row of rows) {\n for (const name of internalKeys) {\n if (!visible.has(name)) delete row[name];\n }\n }\n }\n return rows;\n }\n\n private async loadRelation(\n parentModel: ModelNode,\n parentRows: Record<string, unknown>[],\n relation: RelationRead,\n exec: Executor,\n ): Promise<void> {\n if (parentRows.length === 0) return;\n const rel = resolveRelation(this.schema, parentModel, relation.field);\n const fieldName = relation.field.name;\n const { fromFields, toFields } = rel;\n\n // Distinct parent key tuples (rows with a null key part can't match).\n const parentTuples = uniqueTuples(parentRows, fromFields);\n\n const grouped = new Map<string, Record<string, unknown>[]>();\n if (parentTuples.length > 0) {\n const childWhere = relationKeyWhere(\n toFields,\n parentTuples,\n relation.args.where,\n );\n const childRows = await this.readMany(\n rel.relatedModel,\n {\n where: childWhere,\n orderBy: relation.args.orderBy,\n select: relation.args.select,\n include: relation.args.include,\n // take/skip on to-many are applied per parent below; skip here.\n ...(rel.isList ? {} : { take: relation.args.take, skip: relation.args.skip }),\n },\n exec,\n toFields,\n );\n for (const child of childRows) {\n const k = tupleKey(child, toFields);\n const list = grouped.get(k) ?? [];\n list.push(child);\n grouped.set(k, list);\n }\n }\n\n // Strip the join key columns added only for stitching when not selected.\n const visible = selectedScalarNames(rel.relatedModel, relation.args.select);\n const stripFields = visible\n ? toFields.filter((f) => !visible.has(f))\n : [];\n\n for (const parent of parentRows) {\n const k = tupleKey(parent, fromFields);\n let matches = grouped.get(k) ?? [];\n if (rel.isList && (relation.args.take != null || relation.args.skip != null)) {\n matches = applyPagination(matches, relation.args.take, relation.args.skip);\n }\n const attached = stripFields.length\n ? matches.map((m) => omitAll(m, stripFields))\n : matches;\n parent[fieldName] = rel.isList ? attached : (attached[0] ?? null);\n }\n }\n\n private readRelations(\n model: ModelNode,\n select?: SelectInput,\n include?: IncludeInput,\n ): RelationRead[] {\n const out: RelationRead[] = [];\n const add = (key: string, value: boolean | NestedReadArgs) => {\n if (!value) return;\n const field = model.fields.find((f) => f.name === key && f.kind === \"object\");\n if (!field) return;\n out.push({ field, args: typeof value === \"object\" ? value : {} });\n };\n if (include) for (const [k, v] of Object.entries(include)) add(k, v);\n if (select) {\n for (const [k, v] of Object.entries(select)) {\n const field = model.fields.find((f) => f.name === k);\n if (field?.kind === \"object\") add(k, v);\n }\n }\n return out;\n }\n\n /**\n * Resolve which to-many relations to count for `_count` in select/include.\n * `_count: true` counts every list relation; `_count: { select: { rel } }`\n * counts the named ones.\n */\n private readCountRelations(\n model: ModelNode,\n select?: SelectInput,\n include?: IncludeInput,\n ): FieldNode[] {\n const spec =\n (include?._count as boolean | NestedReadArgs | undefined) ??\n (select?._count as boolean | NestedReadArgs | undefined);\n if (!spec) return [];\n const listRelations = model.fields.filter(\n (f) => f.kind === \"object\" && f.isList,\n );\n if (spec === true) return listRelations;\n const selected = (spec as { select?: Record<string, unknown> }).select;\n if (!selected) return listRelations;\n return listRelations.filter((f) => selected[f.name]);\n }\n\n /** Attach a `_count` object to each row with per-relation child counts. */\n private async loadCounts(\n model: ModelNode,\n rows: Record<string, unknown>[],\n countFields: FieldNode[],\n exec: Executor,\n ): Promise<void> {\n for (const row of rows) row._count = {};\n\n for (const field of countFields) {\n const rel = resolveRelation(this.schema, model, field);\n const tuples = uniqueTuples(rows, rel.fromFields);\n const grouped = new Map<string, number>();\n\n if (tuples.length > 0) {\n const where = relationKeyWhere(rel.toFields, tuples, undefined);\n const { sql } = compileGroupBy(\n rel.relatedModel,\n { by: rel.toFields, _count: true, where },\n newContext(this.schema, this.dialect),\n );\n const countRows = await exec(sql);\n for (const cr of countRows) {\n grouped.set(tupleKey(cr, rel.toFields), Number(cr._count_all ?? 0));\n }\n }\n\n for (const row of rows) {\n const count = grouped.get(tupleKey(row, rel.fromFields)) ?? 0;\n (row._count as Record<string, number>)[field.name] = count;\n }\n }\n }\n\n // ---- read-back & helpers ------------------------------------------------\n\n private async readBack(\n model: ModelNode,\n keys: Record<string, unknown>,\n shape: ReadShape,\n exec: Executor,\n ): Promise<Record<string, unknown>> {\n const where = keysToWhere(model, keys);\n const row = await this.readBackOne(model, where, shape, exec);\n if (!row) throw new RecordNotFoundError(model.name);\n return row;\n }\n\n private async readBackOne(\n model: ModelNode,\n where: WhereInput,\n shape: ReadShape,\n exec: Executor,\n ): Promise<Record<string, unknown> | null> {\n const rows = await this.readMany(\n model,\n { where, select: shape.select, include: shape.include, omit: shape.omit, take: 1 },\n exec,\n );\n return rows[0] ?? null;\n }\n\n private async requireOne(\n model: ModelNode,\n where: WhereInput,\n exec: Executor,\n ): Promise<Record<string, unknown>> {\n const row = await this.findOneRaw(model, where, exec);\n if (!row) throw new RecordNotFoundError(model.name);\n return row;\n }\n\n private async findOneRaw(\n model: ModelNode,\n where: WhereInput,\n exec: Executor,\n ): Promise<Record<string, unknown> | null> {\n const rows = await this.readMany(model, { where, take: 1 }, exec);\n return rows[0] ?? null;\n }\n\n private async countMatching(\n model: ModelNode,\n where: WhereInput | undefined,\n exec: Executor,\n ): Promise<number> {\n const stmt = compileCount(model, where, newContext(this.schema, this.dialect));\n const rows = await exec(stmt);\n return Number((rows[0] as { _count?: unknown })?._count ?? 0);\n }\n\n private pickKeys(\n model: ModelNode,\n row: Record<string, unknown>,\n ): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const f of idFields(model)) out[f.name] = row[f.name];\n return out;\n }\n\n private assertUniqueWhere(model: ModelNode, where: WhereInput): void {\n if (!where || Object.keys(where).length === 0) {\n throw new QueryValidationError(\n `A unique 'where' is required for this operation on '${model.name}'.`,\n );\n }\n }\n}\n\n// ---- pure helpers ---------------------------------------------------------\n\nfunction fieldByName(model: ModelNode, name: string): FieldNode {\n const f = model.fields.find((x) => x.name === name);\n if (!f) throw new QueryValidationError(`Field '${name}' not found on '${model.name}'.`);\n return f;\n}\n\nfunction selectedScalarNames(\n model: ModelNode,\n select?: SelectInput,\n): Set<string> | null {\n if (!select) return null;\n const names = new Set<string>();\n for (const [k, v] of Object.entries(select)) {\n if (!v) continue;\n const field = model.fields.find((f) => f.name === k);\n if (field && field.kind !== \"object\") names.add(k);\n }\n return names;\n}\n\n/**\n * Apply `omit` (the inverse of select). Only used when `select` is absent —\n * with select, the selection already determines visible fields. Returns the set\n * of scalar field names that remain visible.\n */\nfunction applyOmit(\n model: ModelNode,\n selected: Set<string> | null,\n omit: Record<string, boolean> | undefined,\n): Set<string> | null {\n if (selected || !omit) return selected;\n const omitted = new Set(\n Object.entries(omit)\n .filter(([, v]) => v)\n .map(([k]) => k),\n );\n if (omitted.size === 0) return null;\n return new Set(\n scalarFields(model)\n .map((f) => f.name)\n .filter((n) => !omitted.has(n)),\n );\n}\n\nfunction keysToWhere(\n model: ModelNode,\n keys: Record<string, unknown>,\n): WhereInput {\n const where: WhereInput = {};\n for (const f of idFields(model)) where[f.name] = keys[f.name];\n return where;\n}\n\nfunction keyOf(value: unknown): string {\n return value instanceof Date ? value.toISOString() : String(value);\n}\n\n/** Stable string key for a tuple of field values (composite-key grouping). */\nfunction tupleKey(row: Record<string, unknown>, fields: string[]): string {\n return fields.map((f) => keyOf(row[f])).join(\"\u0000\");\n}\n\n/** Distinct non-null parent key tuples, preserving field order. */\nfunction uniqueTuples(\n rows: Record<string, unknown>[],\n fields: string[],\n): unknown[][] {\n const seen = new Set<string>();\n const out: unknown[][] = [];\n for (const row of rows) {\n const tuple = fields.map((f) => row[f]);\n if (tuple.some((v) => v === null || v === undefined)) continue;\n const key = tuple.map(keyOf).join(\"\u0000\");\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(tuple);\n }\n return out;\n}\n\n/**\n * Build the child filter that matches any parent key tuple. Single-column keys\n * use an efficient `IN (...)`; composite keys expand to an `OR` of equality\n * groups, since Firebird has no portable row-value `IN`.\n */\nfunction relationKeyWhere(\n toFields: string[],\n parentTuples: unknown[][],\n baseWhere: WhereInput | undefined,\n): WhereInput {\n const base = baseWhere ?? {};\n if (toFields.length === 1) {\n const field = toFields[0]!;\n return { ...base, [field]: { in: parentTuples.map((t) => t[0]) } };\n }\n const or: WhereInput[] = parentTuples.map((tuple) => {\n const cond: WhereInput = {};\n toFields.forEach((f, i) => {\n cond[f] = tuple[i] as never;\n });\n return cond;\n });\n // Combine with any user-provided where via AND so both constraints hold.\n if (Object.keys(base).length === 0) return { OR: or };\n return { AND: [base, { OR: or }] };\n}\n\nfunction omitAll(\n obj: Record<string, unknown>,\n keys: string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...obj };\n for (const k of keys) delete out[k];\n return out;\n}\n\nfunction applyPagination(\n rows: Record<string, unknown>[],\n take?: number,\n skip?: number,\n): Record<string, unknown>[] {\n const start = skip ?? 0;\n const end = take != null ? start + take : undefined;\n return rows.slice(start, end);\n}\n\n/** Validate and return the scalar field names for a `distinct` argument. */\nfunction normalizeDistinct(\n model: ModelNode,\n distinct: string[] | undefined,\n): string[] {\n if (!distinct || distinct.length === 0) return [];\n for (const name of distinct) {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") {\n throw new QueryValidationError(\n `Cannot apply distinct on '${model.name}.${name}' (not a scalar field).`,\n );\n }\n }\n return uniq(distinct);\n}\n\n/** Keep the first row for each distinct tuple, preserving order. */\nfunction dedupeBy(\n rows: Record<string, unknown>[],\n fields: string[],\n): Record<string, unknown>[] {\n const seen = new Set<string>();\n const out: Record<string, unknown>[] = [];\n for (const row of rows) {\n const key = tupleKey(row, fields);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(row);\n }\n return out;\n}\n\ninterface CursorField {\n name: string;\n value: unknown;\n direction: SortOrder;\n}\n\n/**\n * Translate a `cursor` into an extra filter + ordering so SQL starts at the\n * cursor row. Supports composite cursors via a lexicographic keyset expansion:\n * for ordered fields (f1..fn) the condition is `(f1..fn) >= (v1..vn)` relative\n * to each field's direction, expanded into an OR of AND-ed comparisons so it\n * works without row-value comparisons (which Firebird lacks).\n */\nfunction applyCursor(\n model: ModelNode,\n args: FindManyArgs,\n _distinctFields: string[],\n): { where: WhereInput | undefined; orderBy: FindManyArgs[\"orderBy\"] } {\n if (!args.cursor || Object.keys(args.cursor).length === 0) {\n return { where: args.where, orderBy: args.orderBy };\n }\n const entries = Object.entries(args.cursor).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return { where: args.where, orderBy: args.orderBy };\n\n const fields: CursorField[] = entries.map(([name, value]) => {\n if (!model.fields.some((f) => f.name === name && f.kind !== \"object\")) {\n throw new QueryValidationError(\n `Cursor field '${model.name}.${name}' must be a scalar field.`,\n );\n }\n return { name, value, direction: directionForField(args.orderBy, name) ?? \"asc\" };\n });\n\n const cursorCond = keysetCondition(fields);\n const where: WhereInput = args.where\n ? { AND: [args.where, cursorCond] }\n : cursorCond;\n const orderBy =\n args.orderBy ?? fields.map((f) => ({ [f.name]: f.direction }));\n return { where, orderBy };\n}\n\n/** Lexicographic `>=`/`<=` keyset comparison expanded to an OR of AND groups. */\nfunction keysetCondition(fields: CursorField[]): WhereInput {\n const clauses: WhereInput[] = [];\n for (let i = 0; i < fields.length; i++) {\n const clause: WhereInput = {};\n for (let j = 0; j < i; j++) {\n clause[fields[j]!.name] = fields[j]!.value;\n }\n const last = i === fields.length - 1;\n const f = fields[i]!;\n const op = comparator(f.direction, last);\n clause[f.name] = { [op]: f.value };\n clauses.push(clause);\n }\n return clauses.length === 1 ? clauses[0]! : { OR: clauses };\n}\n\nfunction comparator(direction: SortOrder, inclusive: boolean): string {\n if (direction === \"desc\") return inclusive ? \"lte\" : \"lt\";\n return inclusive ? \"gte\" : \"gt\";\n}\n\nfunction directionForField(\n orderBy: FindManyArgs[\"orderBy\"],\n field: string,\n): SortOrder | undefined {\n if (!orderBy) return undefined;\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n for (const obj of list) {\n const dir = obj[field];\n if (dir === \"asc\" || dir === \"desc\") return dir;\n }\n return undefined;\n}\n\nfunction reshapeAggregate(row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n if (key === \"_count_all\") {\n (out._count ??= {} as Record<string, unknown>);\n (out._count as Record<string, unknown>)._all = Number(value);\n continue;\n }\n const m = /^(_count|_sum|_avg|_min|_max)_(.+)$/.exec(key);\n if (m) {\n const group = (out[m[1]!] ??= {}) as Record<string, unknown>;\n group[m[2]!] = value === null ? null : Number(value);\n }\n }\n return out;\n}\n\nfunction reshapeGroupRow(\n model: ModelNode,\n by: string[],\n row: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const groupFields = scalarFields(model).filter((f) => by.includes(f.name));\n for (const f of groupFields) {\n out[f.name] = f.name in row ? coerceField(row[f.name], f) : row[f.name];\n }\n const aggregates = reshapeAggregate(row);\n return { ...out, ...aggregates };\n}\n\nfunction coerceField(value: unknown, field: FieldNode): unknown {\n return coerceRow({ [field.name]: value }, [field])[field.name];\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport type { SchemaDocument } from \"@ember/ast\";\nimport { Parser } from \"./parser\";\nimport { validateSchema } from \"./validator\";\nimport { printSchema } from \"./printer\";\nimport { completeRelations } from \"./relations-complete\";\n\nexport { Parser } from \"./parser\";\nexport { Lexer } from \"./lexer\";\nexport { validateSchema, printSchema, completeRelations };\n\n/**\n * Canonical formatter: parse, auto-complete missing relation sides (like\n * Prisma's formatter), validate, and re-print with aligned formatting.\n */\nexport function formatSchema(source: string, file?: string): string {\n const doc = completeRelations(parseSchema(source, file));\n validateSchema(doc);\n return printSchema(doc);\n}\n\n/** Parse schema source text into an AST (no validation). */\nexport function parseSchema(source: string, file?: string): SchemaDocument {\n return new Parser(source, file).parse();\n}\n\n/** Parse and validate schema source text. */\nexport function parseAndValidate(source: string, file?: string): SchemaDocument {\n const doc = parseSchema(source, file);\n validateSchema(doc);\n return doc;\n}\n\nexport interface LoadedSchema {\n document: SchemaDocument;\n path: string;\n /** Resolved connection URL (env() expanded). */\n databaseUrl?: string;\n}\n\nconst DEFAULT_SCHEMA_PATHS = [\n \"ember/schema.ember\",\n \"schema.ember\",\n \"prisma/schema.ember\",\n];\n\n/** Locate the schema file relative to a base directory. */\nexport function findSchemaPath(\n base = process.cwd(),\n explicit?: string,\n): string | undefined {\n if (explicit) {\n const p = resolve(base, explicit);\n return existsSync(p) ? p : undefined;\n }\n for (const candidate of DEFAULT_SCHEMA_PATHS) {\n const p = resolve(base, candidate);\n if (existsSync(p)) return p;\n }\n return undefined;\n}\n\n/** Load, parse, validate a schema file and resolve its datasource URL. */\nexport function loadSchema(path: string): LoadedSchema {\n const source = readFileSync(path, \"utf8\");\n const document = parseAndValidate(source, path);\n return {\n document,\n path,\n databaseUrl: resolveDatasourceUrl(document, dirname(path)),\n };\n}\n\nexport function resolveDatasourceUrl(\n doc: SchemaDocument,\n _base: string,\n): string | undefined {\n const ds = doc.datasource;\n if (!ds) return undefined;\n if (ds.url.kind === \"literal\") return ds.url.value;\n return process.env[ds.url.value];\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n findModel,\n relationFields,\n} from \"@ember/ast\";\nimport type { QueryEngine } from \"@ember/query\";\n\n/**\n * Client Extensions ($extends), middleware ($use) and the fluent API live here.\n * The delegate factory composes per-operation query hooks, computes `result`\n * fields, and returns fluent thenables for single-record reads.\n */\n\nexport interface ResultFieldExtension {\n needs?: Record<string, boolean>;\n compute: (record: Record<string, unknown>) => unknown;\n}\n\nexport interface QueryHookParams {\n model: string;\n operation: string;\n args: Record<string, unknown>;\n query: (args: Record<string, unknown>) => Promise<unknown>;\n}\n\nexport type QueryHook = (params: QueryHookParams) => Promise<unknown>;\n\ntype HookMap = Record<string, QueryHook>;\n\nexport interface EmberExtensionArgs {\n name?: string;\n result?: Record<string, Record<string, ResultFieldExtension>>;\n model?: Record<string, Record<string, (...args: unknown[]) => unknown>>;\n query?: Record<string, HookMap>;\n client?: Record<string, unknown>;\n}\n\n/** Prisma-style middleware: `(params, next) => next(params)`. */\nexport type Middleware = (\n params: { model?: string; action: string; args: unknown },\n next: (params: { model?: string; action: string; args: unknown }) => Promise<unknown>,\n) => Promise<unknown>;\n\n/** Operations whose result is one or more records of the delegate's model. */\nconst RECORD_OPS = new Set([\n \"findMany\",\n \"findFirst\",\n \"findFirstOrThrow\",\n \"findUnique\",\n \"findUniqueOrThrow\",\n \"create\",\n \"createManyAndReturn\",\n \"update\",\n \"upsert\",\n \"delete\",\n]);\n\nconst ALL_OPS = [\n \"findMany\",\n \"findFirst\",\n \"findFirstOrThrow\",\n \"findUnique\",\n \"findUniqueOrThrow\",\n \"create\",\n \"createMany\",\n \"createManyAndReturn\",\n \"update\",\n \"updateMany\",\n \"upsert\",\n \"delete\",\n \"deleteMany\",\n \"count\",\n \"aggregate\",\n \"groupBy\",\n] as const;\n\nconst FLUENT_OPS = new Set([\n \"findUnique\",\n \"findUniqueOrThrow\",\n \"findFirst\",\n \"findFirstOrThrow\",\n]);\n\nexport interface DelegateContext {\n engine: QueryEngine;\n schema: SchemaDocument;\n extensions: EmberExtensionArgs[];\n middlewares: Middleware[];\n}\n\n/** Build a model delegate with extensions, middleware and fluent reads applied. */\nexport function buildDelegate(\n ctx: DelegateContext,\n modelName: string,\n): Record<string, unknown> {\n const model = findModel(ctx.schema, modelName);\n const delegate: Record<string, unknown> = {};\n\n for (const operation of ALL_OPS) {\n delegate[operation] = (args: Record<string, unknown> = {}) =>\n runOperation(ctx, modelName, operation, args, delegate);\n }\n\n // model extensions add/override delegate methods (bound to the delegate).\n for (const ext of ctx.extensions) {\n const methods = {\n ...(ext.model?.$allModels ?? {}),\n ...(ext.model?.[modelName] ?? {}),\n };\n for (const [name, fn] of Object.entries(methods)) {\n delegate[name] = (...args: unknown[]) => fn.apply(delegate, args);\n }\n }\n\n void model;\n return delegate;\n}\n\nfunction runOperation(\n ctx: DelegateContext,\n modelName: string,\n operation: string,\n args: Record<string, unknown>,\n delegate: Record<string, unknown>,\n): unknown {\n // The core executor: middleware -> engine, then compute result fields.\n const base = async (a: Record<string, unknown>): Promise<unknown> => {\n const expanded = expandComputedSelect(ctx, modelName, operation, a);\n const raw = await runMiddleware(ctx, modelName, operation, expanded.args);\n return applyResultExtensions(ctx, modelName, operation, raw, expanded.computeOnly);\n };\n\n const hooks = gatherQueryHooks(ctx, modelName, operation);\n const run = composeHooks(hooks, modelName, operation, base);\n\n if (FLUENT_OPS.has(operation)) {\n return makeFluent(ctx, modelName, args, () => run(args) as Promise<Record<string, unknown> | null>);\n }\n void delegate;\n return run(args);\n}\n\n// ---- query hooks ($extends.query) -----------------------------------------\n\nfunction gatherQueryHooks(\n ctx: DelegateContext,\n model: string,\n operation: string,\n): QueryHook[] {\n const hooks: QueryHook[] = [];\n for (const ext of ctx.extensions) {\n const q = ext.query;\n if (!q) continue;\n pushHook(hooks, q[model], operation);\n pushHook(hooks, q.$allModels, operation);\n }\n return hooks;\n}\n\nfunction pushHook(hooks: QueryHook[], map: HookMap | undefined, operation: string): void {\n if (!map) return;\n if (map[operation]) hooks.push(map[operation]!);\n if (map.$allOperations) hooks.push(map.$allOperations);\n}\n\nfunction composeHooks(\n hooks: QueryHook[],\n model: string,\n operation: string,\n base: (args: Record<string, unknown>) => Promise<unknown>,\n): (args: Record<string, unknown>) => Promise<unknown> {\n // Later-registered hooks wrap earlier ones (outermost = last registered).\n let next = base;\n for (const hook of hooks) {\n const inner = next;\n next = (args: Record<string, unknown>) =>\n hook({ model, operation, args, query: (a) => inner(a) }) as Promise<unknown>;\n }\n return next;\n}\n\n// ---- middleware ($use) ----------------------------------------------------\n\nfunction runMiddleware(\n ctx: DelegateContext,\n model: string,\n action: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const engine = ctx.engine as unknown as Record<\n string,\n (m: string, x: unknown) => Promise<unknown>\n >;\n const engineCall = (a: { model?: string; action: string; args: unknown }) =>\n engine[a.action]!(model, a.args);\n\n let next = engineCall;\n for (const mw of ctx.middlewares) {\n const inner = next;\n next = (params) => mw(params, inner) as Promise<unknown>;\n }\n return next({ model, action, args });\n}\n\n// ---- result extensions ($extends.result) ----------------------------------\n\ninterface ResultComputer {\n field: string;\n compute: (record: Record<string, unknown>) => unknown;\n}\n\nfunction resultComputers(ctx: DelegateContext, model: string): ResultComputer[] {\n const out: ResultComputer[] = [];\n for (const ext of ctx.extensions) {\n const r = ext.result?.[model];\n if (!r) continue;\n for (const [field, def] of Object.entries(r)) {\n out.push({ field, compute: def.compute });\n }\n }\n return out;\n}\n\nfunction applyResultExtensions(\n ctx: DelegateContext,\n model: string,\n operation: string,\n value: unknown,\n computeFields: Set<string> | null,\n): unknown {\n if (!RECORD_OPS.has(operation)) return value;\n const computers = resultComputers(ctx, model).filter(\n (c) => !computeFields || computeFields.has(c.field),\n );\n if (computers.length === 0) return value;\n\n const compute = (rec: unknown): unknown => {\n if (!rec || typeof rec !== \"object\") return rec;\n const record = rec as Record<string, unknown>;\n for (const c of computers) {\n try {\n record[c.field] = c.compute(record);\n } catch {\n /* leave field unset if compute throws (e.g. missing `needs`) */\n }\n }\n return record;\n };\n\n return Array.isArray(value) ? value.map(compute) : compute(value);\n}\n\n/**\n * When `select` references a computed result field, replace it with the\n * field's `needs` (real columns) so the engine can fetch them, and remember to\n * compute only the requested computed fields.\n */\nfunction expandComputedSelect(\n ctx: DelegateContext,\n model: string,\n operation: string,\n args: Record<string, unknown>,\n): { args: Record<string, unknown>; computeOnly: Set<string> | null } {\n const computers = resultComputers(ctx, model);\n if (computers.length === 0) return { args, computeOnly: null };\n\n const select = args.select as Record<string, unknown> | undefined;\n if (!select) return { args, computeOnly: null };\n\n const byField = new Map(\n ctx.extensions\n .flatMap((e) => Object.entries(e.result?.[model] ?? {}))\n .map(([f, def]) => [f, def] as const),\n );\n\n const computeOnly = new Set<string>();\n const newSelect: Record<string, unknown> = { ...select };\n for (const key of Object.keys(select)) {\n const def = byField.get(key);\n if (!def) continue;\n computeOnly.add(key);\n delete newSelect[key];\n for (const need of Object.keys(def.needs ?? {})) newSelect[need] = true;\n }\n if (computeOnly.size === 0) return { args, computeOnly: null };\n return { args: { ...args, select: newSelect }, computeOnly };\n}\n\n// ---- fluent API -----------------------------------------------------------\n\ninterface Fluent {\n then: Promise<unknown>[\"then\"];\n catch: Promise<unknown>[\"catch\"];\n finally: Promise<unknown>[\"finally\"];\n [relation: string]: unknown;\n}\n\nfunction makeFluent(\n ctx: DelegateContext,\n modelName: string,\n args: Record<string, unknown>,\n exec: () => Promise<Record<string, unknown> | null>,\n): Fluent {\n const model = findModel(ctx.schema, modelName)!;\n const where = (args.where ?? {}) as Record<string, unknown>;\n\n let cached: Promise<unknown> | null = null;\n const run = () => (cached ??= exec());\n\n const fluent = {\n then: (res?: any, rej?: any) => run().then(res, rej),\n catch: (rej?: any) => run().catch(rej),\n finally: (f?: any) => run().finally(f),\n } as Fluent;\n\n for (const rel of relationFields(model)) {\n fluent[rel.name] = (subArgs: Record<string, unknown> = {}) =>\n traverse(ctx, model, rel, where, subArgs);\n }\n return fluent;\n}\n\nfunction traverse(\n ctx: DelegateContext,\n model: ModelNode,\n rel: FieldNode,\n parentWhere: Record<string, unknown>,\n subArgs: Record<string, unknown>,\n): unknown {\n const inverse = inverseField(ctx.schema, model, rel);\n const relatedWhere: Record<string, unknown> = inverse\n ? inverse.isList\n ? { [inverse.name]: { some: parentWhere } }\n : { [inverse.name]: parentWhere }\n : {};\n const where: Record<string, unknown> = subArgs.where\n ? { AND: [relatedWhere, subArgs.where] }\n : relatedWhere;\n\n const findArgs = { ...subArgs, where } as Record<string, unknown> as never;\n if (rel.isList) {\n return ctx.engine.findMany(rel.type, findArgs);\n }\n // to-one target: chainable fluent\n return makeFluent(ctx, rel.type, { ...subArgs, where }, () =>\n ctx.engine.findFirst(rel.type, findArgs),\n );\n}\n\nfunction inverseField(\n schema: SchemaDocument,\n model: ModelNode,\n rel: FieldNode,\n): FieldNode | undefined {\n const related = findModel(schema, rel.type);\n if (!related) return undefined;\n const candidates = related.fields.filter(\n (f) => f.kind === \"object\" && f.type === model.name,\n );\n if (rel.relation?.name) {\n const byName = candidates.find((f) => f.relation?.name === rel.relation?.name);\n if (byName) return byName;\n }\n return candidates[0];\n}\n","import type { SchemaDocument } from \"@ember/ast\";\nimport {\n createDriver,\n parseConnectionUrl,\n type ConnectionConfig,\n type QueryEvent,\n type QueryLogger,\n type SqlDriver,\n type TransactionOptions,\n} from \"@ember/driver\";\nimport { EmberError } from \"@ember/errors\";\nimport { FirebirdDialect, type SqlDialect } from \"@ember/sql\";\nimport { QueryEngine } from \"@ember/query\";\nimport { resolveDatasourceUrl } from \"@ember/schema\";\nimport { lowerFirst } from \"@ember/utils\";\nimport { type ModelDelegate } from \"./delegate\";\nimport {\n buildDelegate,\n type DelegateContext,\n type EmberExtensionArgs,\n type Middleware,\n} from \"./runtime\";\n\nexport type { ModelDelegate } from \"./delegate\";\nexport type {\n EmberExtensionArgs,\n Middleware,\n QueryHook,\n QueryHookParams,\n ResultFieldExtension,\n} from \"./runtime\";\nexport type { QueryEvent, QueryLogger } from \"@ember/driver\";\n\nexport interface ClientOptions {\n /** Connection URL or explicit config. Overrides the schema datasource. */\n datasourceUrl?: string;\n datasource?: ConnectionConfig;\n /** A pre-parsed schema document (the generated client passes its own). */\n schema: SchemaDocument;\n /**\n * Query logging: `true` logs each statement to the console; pass a function\n * to receive structured `QueryEvent`s (sql, params, durationMs, rowCount).\n */\n log?: boolean | QueryLogger;\n}\n\n/**\n * Runtime client. Builds one delegate per model from the schema and exposes\n * Prisma-style lifecycle and transaction helpers. The generated client extends\n * this and adds strongly-typed delegate properties.\n */\nexport class EmberClientBase {\n protected readonly driver: SqlDriver;\n protected readonly engine: QueryEngine;\n protected readonly dialect: SqlDialect;\n protected readonly schema: SchemaDocument;\n private connected = false;\n\n /** Mutated by $extends (per instance) and $use (shared). */\n protected extensions: EmberExtensionArgs[] = [];\n protected middlewares: Middleware[] = [];\n private readonly queryListeners: QueryLogger[] = [];\n private readonly baseLog?: QueryLogger;\n\n /** Dynamic model delegates, keyed by camelCased model name. */\n [delegate: string]: unknown;\n\n constructor(options: ClientOptions) {\n this.schema = options.schema;\n\n const url =\n options.datasourceUrl ?? resolveDatasourceUrl(options.schema, process.cwd());\n if (!options.datasource && !url) {\n throw new EmberError(\n \"No datasource configured. Provide datasourceUrl, datasource, or a datasource block with a resolvable url.\",\n );\n }\n const config: ConnectionConfig =\n options.datasource ?? parseConnectionUrl(url!);\n\n this.dialect = new FirebirdDialect({ version: config.version });\n this.baseLog = buildLogger(options.log);\n\n this.driver = createDriver(config, { onQuery: (e) => this.dispatchQuery(e) });\n this.engine = new QueryEngine(options.schema, this.dialect, this.driver);\n\n this.installDelegates();\n }\n\n private dispatchQuery(event: QueryEvent): void {\n this.baseLog?.(event);\n for (const listener of this.queryListeners) listener(event);\n }\n\n private delegateContext(): DelegateContext {\n return {\n engine: this.engine,\n schema: this.schema,\n extensions: this.extensions,\n middlewares: this.middlewares,\n };\n }\n\n /** (Re)define one delegate property per model using the current extensions. */\n private installDelegates(): void {\n const ctx = this.delegateContext();\n for (const model of this.schema.models) {\n Object.defineProperty(this, lowerFirst(model.name), {\n value: buildDelegate(ctx, model.name),\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n /**\n * Prisma-style Client Extensions. Returns a new client (the original is\n * unchanged) that shares the connection/engine but applies the extension's\n * `result` / `model` / `query` / `client` definitions.\n */\n $extends(extension: EmberExtensionArgs): this {\n const clone: this = Object.create(this);\n clone.extensions = [...this.extensions, extension];\n clone.installDelegates();\n if (extension.client) {\n for (const [key, value] of Object.entries(extension.client)) {\n Object.defineProperty(clone, key, {\n value: typeof value === \"function\" ? value.bind(clone) : value,\n enumerable: true,\n configurable: true,\n });\n }\n }\n return clone;\n }\n\n /** Prisma-style middleware: runs around every operation. */\n $use(middleware: Middleware): void {\n this.middlewares.push(middleware);\n }\n\n /** Subscribe to query events (mirrors the `log` callback). */\n $on(event: \"query\", listener: QueryLogger): void {\n if (event === \"query\") this.queryListeners.push(listener);\n }\n\n /** Type-safe access to a delegate by model name. */\n model(name: string): ModelDelegate {\n return this[lowerFirst(name)] as ModelDelegate;\n }\n\n async $connect(): Promise<void> {\n if (this.connected) return;\n await this.driver.connect();\n this.connected = true;\n }\n\n async $disconnect(): Promise<void> {\n if (!this.connected) return;\n await this.driver.disconnect();\n this.connected = false;\n }\n\n /**\n * Run work inside a single transaction.\n * - Interactive form: `$transaction(async (tx) => { ... })`.\n * - Sequential form: `$transaction([(tx) => tx.user.create(...), ...])`.\n *\n * Because the driver tracks the active transaction via AsyncLocalStorage,\n * every delegate call made on the passed client runs in the same transaction.\n */\n $transaction<T>(\n fn: (tx: this) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T>;\n $transaction<T>(\n thunks: ((tx: this) => Promise<T>)[],\n options?: TransactionOptions,\n ): Promise<T[]>;\n $transaction<T>(\n arg: ((tx: this) => Promise<T>) | ((tx: this) => Promise<T>)[],\n options?: TransactionOptions,\n ): Promise<T | T[]> {\n if (Array.isArray(arg)) {\n return this.driver.transaction(async () => {\n const results: T[] = [];\n for (const thunk of arg) results.push(await thunk(this));\n return results;\n }, options);\n }\n return this.driver.transaction(() => arg(this), options);\n }\n\n /** Execute a raw read query (returns rows) inside a transaction. */\n $queryRawUnsafe<T = Record<string, unknown>>(\n sql: string,\n ...params: unknown[]\n ): Promise<T[]> {\n return this.driver.transaction((tx) =>\n tx.query<T>(sql, params.map(toSqlValue)),\n );\n }\n\n /** Execute a raw write statement inside a transaction; returns affected rows when available. */\n $executeRawUnsafe(sql: string, ...params: unknown[]): Promise<number> {\n return this.driver.transaction(async (tx) => {\n const rows = await tx.query(sql, params.map(toSqlValue));\n return Array.isArray(rows) ? rows.length : 0;\n });\n }\n\n /** Tagged-template raw query: `client.$queryRaw\\`SELECT * FROM T WHERE id = ${id}\\``. */\n $queryRaw<T = Record<string, unknown>>(\n strings: TemplateStringsArray,\n ...values: unknown[]\n ): Promise<T[]> {\n const { sql, params } = buildTemplate(strings, values);\n return this.$queryRawUnsafe<T>(sql, ...params);\n }\n\n $executeRaw(\n strings: TemplateStringsArray,\n ...values: unknown[]\n ): Promise<number> {\n const { sql, params } = buildTemplate(strings, values);\n return this.$executeRawUnsafe(sql, ...params);\n }\n}\n\nfunction buildTemplate(\n strings: TemplateStringsArray,\n values: unknown[],\n): { sql: string; params: unknown[] } {\n let sql = \"\";\n strings.forEach((part, i) => {\n sql += part;\n if (i < values.length) sql += \"?\";\n });\n return { sql, params: values };\n}\n\nfunction toSqlValue(v: unknown): never {\n return v as never;\n}\n\n/** Resolve the `log` option into a driver query hook. */\nfunction buildLogger(\n log: ClientOptions[\"log\"],\n): QueryLogger | undefined {\n if (!log) return undefined;\n if (typeof log === \"function\") return log;\n return (e: QueryEvent) => {\n const params = e.params.length ? ` -- ${JSON.stringify(e.params)}` : \"\";\n // eslint-disable-next-line no-console\n console.log(\n `ember:query (${e.durationMs.toFixed(1)}ms, ${e.rowCount} rows) ${e.sql}${params}`,\n );\n };\n}\n\n/**\n * Factory for an untyped client when you don't use the generated client.\n * Prefer the generated `EmberClient` for full type-safety.\n */\nexport function createClient(options: ClientOptions): EmberClientBase {\n return new EmberClientBase(options);\n}\n"],"mappings":"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","names":["resolve","fromFields","toFields","keys"]}
|