@monlite/core 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/id.ts","../src/errors.ts","../src/query/sql.ts","../src/query/where.ts","../src/query/order.ts","../src/query/path.ts","../src/query/select.ts","../src/query/update.ts","../src/aggregation/aggregate.ts","../src/collection.ts","../src/auto-index.ts","../src/driver/better-sqlite3.ts","../src/driver/node-sqlite.ts","../src/driver/index.ts","../src/sync/version.ts","../src/sync/store.ts","../src/db.ts"],"names":["cmp","NAME_RE","stripSystem"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\n/**\n * Generates MongoDB ObjectId-compatible identifiers: a 24-character hex string\n * built from a 4-byte timestamp, 5 random bytes (stable per process) and a\n * 3-byte incrementing counter.\n *\n * Because the timestamp is the high-order component, ids sort in roughly\n * insertion order — which keeps the SQLite primary-key index well-localized.\n */\n\nconst PROCESS_UNIQUE = randomBytes(5);\nlet counter = randomBytes(3).readUIntBE(0, 3);\n\nexport function objectId(): string {\n const time = Math.floor(Date.now() / 1000);\n counter = (counter + 1) % 0x1000000; // wrap at 2^24\n\n const buf = Buffer.allocUnsafe(12);\n buf.writeUInt32BE(time >>> 0, 0);\n PROCESS_UNIQUE.copy(buf, 4, 0, 5);\n buf.writeUIntBE(counter, 9, 3);\n\n return buf.toString(\"hex\");\n}\n\n/** True when a value looks like a monlite/ObjectId id (24 hex chars). */\nexport function isObjectId(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{24}$/i.test(value);\n}\n","/** Base error for all monlite-originated failures. */\nexport class MonliteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MonliteError\";\n }\n}\n\n/** Thrown when a query/update payload is malformed. */\nexport class MonliteQueryError extends MonliteError {\n constructor(message: string) {\n super(message);\n this.name = \"MonliteQueryError\";\n }\n}\n","/** Shared helpers for translating document paths and values into SQLite. */\n\n/** System columns stored outside the JSON `data` blob. */\nexport const RESERVED_FIELDS = new Set([\"_id\", \"created_at\", \"updated_at\"]);\n\nexport function isReserved(field: string): boolean {\n return RESERVED_FIELDS.has(field);\n}\n\n/**\n * True when a field maps to a real SQL column: a system field, or — in a\n * structured collection — one of its declared columns. Such fields are\n * referenced directly instead of via `json_extract`.\n */\nexport function isColumn(field: string, columns?: Set<string>): boolean {\n return isReserved(field) || (columns?.has(field) ?? false);\n}\n\n/**\n * Convert a dotted document path (`address.city`, `items.0.name`) into a\n * SQLite JSON path (`$.address.city`, `$.items[0].name`), quoting segments\n * that are not bare identifiers.\n */\nexport function jsonPath(field: string): string {\n let path = \"$\";\n for (const seg of field.split(\".\")) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(seg)) {\n path += \".\" + seg;\n } else if (/^\\d+$/.test(seg)) {\n path += \"[\" + seg + \"]\";\n } else {\n path += '.\"' + seg.replace(/\"/g, '\"\"') + '\"';\n }\n }\n return path;\n}\n\n/** A JSON path wrapped as a single-quoted SQL string literal. */\nexport function pathLiteral(field: string): string {\n return \"'\" + jsonPath(field).replace(/'/g, \"''\") + \"'\";\n}\n\n/**\n * SQL expression yielding the value of `field` for a row. System fields and\n * declared structured columns resolve to a bare column; everything else is\n * read from the `data` JSON blob via `json_extract`.\n */\nexport function fieldExpr(field: string, columns?: Set<string>): string {\n if (isColumn(field, columns)) return `\"${field}\"`;\n return `json_extract(data, ${pathLiteral(field)})`;\n}\n\n/**\n * Normalize a JS value into something better-sqlite3 can bind.\n * better-sqlite3 only accepts numbers, bigints, strings, Buffers and null —\n * so booleans, Dates, undefined and objects are converted here.\n */\nexport function bindable(value: any): number | bigint | string | Buffer | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.toISOString();\n if (\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n ) {\n return value;\n }\n if (Buffer.isBuffer(value)) return value;\n // Arrays / nested objects: compare against SQLite's minified JSON text.\n return JSON.stringify(value);\n}\n","import type { WhereInput, FieldFilter } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { fieldExpr, pathLiteral, bindable, isColumn } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\n /** Declared native columns (structured collections). */\n columns?: Set<string>;\n /** Called with every document path referenced (for auto-index tracking). */\n onPath?: (path: string) => void;\n}\n\n/** Build a SQL boolean expression from a where clause. Returns `1` when empty. */\nexport function buildWhere(\n where: WhereInput | undefined,\n ctx: WhereContext,\n): string {\n if (!where) return \"1\";\n return translateObject(where, ctx) || \"1\";\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nfunction translateObject(where: WhereInput, ctx: WhereContext): string {\n const parts: string[] = [];\n\n for (const key of Object.keys(where)) {\n const value = (where as any)[key];\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) {\n const join = key === \"AND\" ? \" AND \" : \" OR \";\n parts.push(\"(\" + subs.join(join) + \")\");\n }\n } else if (key === \"NOT\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) parts.push(\"NOT (\" + subs.join(\" AND \") + \")\");\n } else {\n const clause = translateField(key, value, ctx);\n if (clause) parts.push(clause);\n }\n }\n\n return parts.join(\" AND \");\n}\n\nfunction isFilterObject(v: any): v is FieldFilter {\n return (\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v) &&\n (v.constructor === Object || v.constructor === undefined)\n );\n}\n\nfunction translateField(field: string, condition: any, ctx: WhereContext): string {\n if (ctx.onPath && !isColumn(field, ctx.columns)) ctx.onPath(field);\n const expr = fieldExpr(field, ctx.columns);\n\n // Scalar (or array/Date) value is shorthand for `{ equals: value }`.\n if (!isFilterObject(condition)) {\n return eqExpr(expr, condition, ctx);\n }\n\n const filter = condition as Record<string, any>;\n const clauses: string[] = [];\n for (const op of Object.keys(filter)) {\n const v = filter[op];\n if (v === undefined) continue;\n\n switch (op) {\n case \"equals\":\n clauses.push(eqExpr(expr, v, ctx));\n break;\n case \"not\":\n clauses.push(notExpr(expr, v, ctx));\n break;\n case \"gt\":\n clauses.push(cmp(expr, \">\", v, ctx));\n break;\n case \"gte\":\n clauses.push(cmp(expr, \">=\", v, ctx));\n break;\n case \"lt\":\n clauses.push(cmp(expr, \"<\", v, ctx));\n break;\n case \"lte\":\n clauses.push(cmp(expr, \"<=\", v, ctx));\n break;\n case \"in\":\n clauses.push(inExpr(expr, v, ctx, false));\n break;\n case \"notIn\":\n clauses.push(inExpr(expr, v, ctx, true));\n break;\n case \"contains\":\n clauses.push(containsExpr(field, expr, v, ctx));\n break;\n case \"startsWith\":\n ctx.params.push(bindable(v));\n clauses.push(`instr(${expr}, ?) = 1`);\n break;\n case \"endsWith\":\n ctx.params.push(bindable(v));\n ctx.params.push(bindable(v));\n clauses.push(`substr(${expr}, -length(?)) = ?`);\n break;\n case \"has\":\n clauses.push(hasExpr(field, expr, v, ctx));\n break;\n case \"exists\":\n clauses.push(existsExpr(field, expr, !!v, ctx.columns));\n break;\n default:\n throw new MonliteQueryError(\n `Unknown where operator \"${op}\" on field \"${field}\"`,\n );\n }\n }\n\n if (!clauses.length) return \"\";\n return clauses.length === 1 ? clauses[0]! : \"(\" + clauses.join(\" AND \") + \")\";\n}\n\nfunction eqExpr(expr: string, v: any, ctx: WhereContext): string {\n if (v === null) return `${expr} IS NULL`;\n ctx.params.push(bindable(v));\n return `${expr} = ?`;\n}\n\nfunction notExpr(expr: string, v: any, ctx: WhereContext): string {\n // Mongo/Prisma semantics: a missing field counts as \"not equal\".\n if (v === null) return `${expr} IS NOT NULL`;\n ctx.params.push(bindable(v));\n return `(${expr} IS NULL OR ${expr} != ?)`;\n}\n\nfunction cmp(expr: string, op: string, v: any, ctx: WhereContext): string {\n ctx.params.push(bindable(v));\n return `${expr} ${op} ?`;\n}\n\nfunction inExpr(\n expr: string,\n arr: any,\n ctx: WhereContext,\n negate: boolean,\n): string {\n if (!Array.isArray(arr)) {\n throw new MonliteQueryError(\n `${negate ? \"notIn\" : \"in\"} expects an array`,\n );\n }\n if (arr.length === 0) return negate ? \"1\" : \"0\";\n const placeholders = arr\n .map((v) => {\n ctx.params.push(bindable(v));\n return \"?\";\n })\n .join(\", \");\n return negate\n ? `(${expr} IS NULL OR ${expr} NOT IN (${placeholders}))`\n : `${expr} IN (${placeholders})`;\n}\n\n/**\n * `contains` works on strings (case-sensitive substring via `instr`) and arrays\n * (element membership). `instr` is used instead of `LIKE` so that `%`/`_` are\n * treated literally and matching is case-sensitive, matching Prisma semantics.\n */\nfunction containsExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n if (isColumn(field, ctx.columns)) {\n ctx.params.push(bindable(v));\n return `instr(${expr}, ?) > 0`;\n }\n const path = pathLiteral(field);\n ctx.params.push(bindable(v)); // array branch\n ctx.params.push(bindable(v)); // string branch\n return (\n `(CASE WHEN json_type(data, ${path}) = 'array' ` +\n `THEN EXISTS (SELECT 1 FROM json_each(data, ${path}) WHERE value = ?) ` +\n `ELSE instr(${expr}, ?) > 0 END)`\n );\n}\n\nfunction hasExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n ctx.params.push(bindable(v));\n if (isColumn(field, ctx.columns)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(\n field: string,\n expr: string,\n want: boolean,\n columns?: Set<string>,\n): string {\n if (isColumn(field, columns)) {\n return want ? `${expr} IS NOT NULL` : `${expr} IS NULL`;\n }\n const path = pathLiteral(field);\n return want\n ? `json_type(data, ${path}) IS NOT NULL`\n : `json_type(data, ${path}) IS NULL`;\n}\n","import type { OrderBy } from \"../types.js\";\nimport { fieldExpr, isColumn } from \"./sql.js\";\n\n/** Build an `ORDER BY` clause from an orderBy spec. Returns \"\" when empty. */\nexport function buildOrderBy(\n orderBy: OrderBy | undefined,\n onPath?: (p: string) => void,\n columns?: Set<string>,\n): string {\n if (!orderBy) return \"\";\n\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const parts: string[] = [];\n\n for (const obj of list) {\n for (const field of Object.keys(obj)) {\n const dir = (obj as any)[field];\n if (dir === undefined) continue;\n if (onPath && !isColumn(field, columns)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field, columns)} ${d}`);\n }\n }\n\n return parts.length ? \"ORDER BY \" + parts.join(\", \") : \"\";\n}\n","/** Deep get/set/unset on plain objects using dot-notation paths. */\n\nexport function getPath(obj: any, path: string): any {\n let cur = obj;\n for (const seg of path.split(\".\")) {\n if (cur == null) return undefined;\n cur = cur[seg];\n }\n return cur;\n}\n\nexport function setPath(obj: any, path: string, value: any): void {\n const segs = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") cur[seg] = {};\n cur = cur[seg];\n }\n cur[segs[segs.length - 1]!] = value;\n}\n\nexport function unsetPath(obj: any, path: string): void {\n const segs = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") return;\n cur = cur[seg];\n }\n delete cur[segs[segs.length - 1]!];\n}\n","import type { Select } from \"../types.js\";\nimport { getPath, setPath } from \"./path.js\";\n\n/**\n * Project a document down to the selected fields. Supports dot-notation paths,\n * reconstructing nested objects. With no select, the document is returned as-is.\n */\nexport function project(\n doc: Record<string, any>,\n select?: Select,\n): Record<string, any> {\n if (!select) return doc;\n const keys = Object.keys(select).filter((k) => (select as any)[k]);\n if (!keys.length) return doc;\n\n const out: Record<string, any> = {};\n for (const key of keys) {\n const value = getPath(doc, key);\n if (value !== undefined) setPath(out, key, value);\n }\n return out;\n}\n","import type { UpdateData } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { getPath, setPath, unsetPath } from \"./path.js\";\n\nconst UPDATE_OPS = new Set([\"$set\", \"$unset\", \"$inc\", \"$push\", \"$pull\"]);\n\n/** True when the payload uses update operators rather than plain fields. */\nexport function isUpdateOperators(data: any): boolean {\n return (\n data != null &&\n typeof data === \"object\" &&\n Object.keys(data).some((k) => k.startsWith(\"$\"))\n );\n}\n\nfunction sameValue(a: any, b: any): boolean {\n if (a === b) return true;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * Apply an update payload to a (system-field-free) document, returning a new\n * document. Plain payloads are shallow-merged; operator payloads ($set, $inc,\n * $push, $pull, $unset) are applied in order.\n */\nexport function applyUpdate(\n doc: Record<string, any>,\n data: UpdateData,\n): Record<string, any> {\n const next = structuredClone(doc);\n\n if (!isUpdateOperators(data)) {\n return Object.assign(next, data);\n }\n\n for (const key of Object.keys(data)) {\n if (!key.startsWith(\"$\")) {\n throw new MonliteQueryError(\n `Cannot mix update operators with plain field \"${key}\". ` +\n `Use either a plain object or update operators, not both.`,\n );\n }\n if (!UPDATE_OPS.has(key)) {\n throw new MonliteQueryError(`Unknown update operator \"${key}\"`);\n }\n }\n\n const ops = data as Record<string, Record<string, any>>;\n\n if (ops.$set) {\n for (const [path, value] of Object.entries(ops.$set)) setPath(next, path, value);\n }\n if (ops.$inc) {\n for (const [path, by] of Object.entries(ops.$inc)) {\n const cur = getPath(next, path);\n setPath(next, path, (typeof cur === \"number\" ? cur : 0) + Number(by));\n }\n }\n if (ops.$push) {\n for (const [path, value] of Object.entries(ops.$push)) {\n const cur = getPath(next, path);\n const arr = Array.isArray(cur) ? cur.slice() : [];\n // `{ $each: [...] }` pushes multiple values.\n if (value && typeof value === \"object\" && Array.isArray((value as any).$each)) {\n arr.push(...(value as any).$each);\n } else {\n arr.push(value);\n }\n setPath(next, path, arr);\n }\n }\n if (ops.$pull) {\n for (const [path, value] of Object.entries(ops.$pull)) {\n const cur = getPath(next, path);\n if (Array.isArray(cur)) {\n setPath(\n next,\n path,\n cur.filter((x) => !sameValue(x, value)),\n );\n }\n }\n }\n if (ops.$unset) {\n for (const path of Object.keys(ops.$unset)) unsetPath(next, path);\n }\n\n return next;\n}\n","import type {\n AggregateArgs,\n AggregateResult,\n GroupByArgs,\n GroupByResult,\n HavingComparison,\n HavingInput,\n} from \"../types.js\";\nimport type { Driver } from \"../driver/types.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr, isColumn } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\n /** Declared native columns (structured collections). */\n columns?: Set<string>;\n}\n\nconst ACCUMULATORS = [\"_sum\", \"_avg\", \"_min\", \"_max\"] as const;\ntype Accumulator = (typeof ACCUMULATORS)[number];\n\nconst SQL_FN: Record<Accumulator, string> = {\n _sum: \"SUM\",\n _avg: \"AVG\",\n _min: \"MIN\",\n _max: \"MAX\",\n};\n\ninterface AccCol {\n alias: string;\n kind: Accumulator;\n field: string;\n}\n\n/** Build the accumulator SELECT fragments shared by aggregate and groupBy. */\nfunction buildAccumulators(\n args: { _sum?: any; _avg?: any; _min?: any; _max?: any },\n onPath: (p: string) => void,\n columns?: Set<string>,\n): { selects: string[]; cols: AccCol[] } {\n const selects: string[] = [];\n const cols: AccCol[] = [];\n let i = 0;\n\n for (const kind of ACCUMULATORS) {\n const selection = args[kind];\n if (!selection) continue;\n for (const field of Object.keys(selection)) {\n if (!selection[field]) continue;\n if (!isColumn(field, columns)) onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field, columns)}) AS ${alias}`);\n cols.push({ alias, kind, field });\n }\n }\n return { selects, cols };\n}\n\nexport function aggregate(\n ctx: AggContext,\n args: AggregateArgs,\n): AggregateResult {\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: ctx.onPath,\n columns: ctx.columns,\n });\n const { selects, cols } = buildAccumulators(args, ctx.onPath, ctx.columns);\n\n // Always compute count internally; expose only when requested.\n const allSelects = [`COUNT(*) AS agg_count`, ...selects];\n const sql = `SELECT ${allSelects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where}`;\n const row = (ctx.db.prepare(sql).get(...params) ?? {}) as Record<string, any>;\n\n const result: AggregateResult = {};\n if (args._count) result._count = row.agg_count ?? 0;\n for (const col of cols) {\n const bucket = (result[col.kind] ??= {});\n bucket[col.field] = row[col.alias] ?? null;\n }\n return result;\n}\n\nconst HAVING_FNS = [\n [\"_sum\", \"SUM\"],\n [\"_avg\", \"AVG\"],\n [\"_min\", \"MIN\"],\n [\"_max\", \"MAX\"],\n] as const;\n\nfunction comparisonSql(\n expr: string,\n cmp: HavingComparison,\n params: any[],\n): string[] {\n const out: string[] = [];\n const ops: Array<[keyof HavingComparison, string]> = [\n [\"equals\", \"=\"],\n [\"not\", \"<>\"],\n [\"gt\", \">\"],\n [\"gte\", \">=\"],\n [\"lt\", \"<\"],\n [\"lte\", \"<=\"],\n ];\n for (const [key, op] of ops) {\n const v = cmp[key];\n if (v === undefined) continue;\n params.push(v);\n out.push(`${expr} ${op} ?`);\n }\n return out;\n}\n\n/** Build a SQL `HAVING` expression from a having spec. Returns \"\" when empty. */\nfunction buildHaving(\n having: HavingInput,\n params: any[],\n columns?: Set<string>,\n): string {\n const parts: string[] = [];\n if (having._count) {\n parts.push(...comparisonSql(\"COUNT(*)\", having._count, params));\n }\n for (const [kind, fn] of HAVING_FNS) {\n const selection = having[kind];\n if (!selection) continue;\n for (const field of Object.keys(selection)) {\n parts.push(\n ...comparisonSql(`${fn}(${fieldExpr(field, columns)})`, selection[field]!, params),\n );\n }\n }\n return parts.join(\" AND \");\n}\n\nexport function groupBy(\n ctx: AggContext,\n args: GroupByArgs,\n): GroupByResult[] {\n if (!Array.isArray(args.by) || args.by.length === 0) {\n throw new Error(\"groupBy requires a non-empty `by` array\");\n }\n\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: ctx.onPath,\n columns: ctx.columns,\n });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n if (!isColumn(field, ctx.columns)) ctx.onPath(field);\n const expr = fieldExpr(field, ctx.columns);\n groupExprs.push(expr);\n selects.push(`${expr} AS \"${field}\"`);\n }\n\n selects.push(`COUNT(*) AS agg_count`);\n const { selects: accSelects, cols } = buildAccumulators(args, ctx.onPath, ctx.columns);\n selects.push(...accSelects);\n\n let sql =\n `SELECT ${selects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where} ` +\n `GROUP BY ${groupExprs.join(\", \")}`;\n\n if (args.having) {\n // HAVING params come after WHERE params and before LIMIT/OFFSET — push now.\n const havingSql = buildHaving(args.having, params, ctx.columns);\n if (havingSql) sql += ` HAVING ${havingSql}`;\n }\n\n if (args.orderBy) {\n const parts: string[] = [];\n for (const key of Object.keys(args.orderBy)) {\n const dir =\n String(args.orderBy[key]).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n if (key === \"_count\") parts.push(`agg_count ${dir}`);\n else parts.push(`${fieldExpr(key, ctx.columns)} ${dir}`);\n }\n if (parts.length) sql += ` ORDER BY ${parts.join(\", \")}`;\n }\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = ctx.db.prepare(sql).all(...params) as Array<Record<string, any>>;\n\n return rows.map((row) => {\n const out: GroupByResult = {};\n for (const field of args.by) out[field] = row[field];\n if (args._count) out._count = row.agg_count;\n for (const col of cols) {\n (out[col.kind] ??= {})[col.field] = row[col.alias] ?? null;\n }\n return out;\n });\n}\n","import type { Monlite } from \"./db.js\";\nimport type {\n AggregateArgs,\n AggregateResult,\n CollectionMode,\n CollectionOptions,\n ColumnDef,\n ColumnType,\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n Doc,\n FindFirstArgs,\n FindManyArgs,\n GroupByArgs,\n GroupByResult,\n UpdateArgs,\n UpdateData,\n UpsertArgs,\n WhereInput,\n WithId,\n} from \"./types.js\";\nimport { objectId } from \"./id.js\";\nimport { MonliteError } from \"./errors.js\";\nimport { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport {\n bindable,\n fieldExpr,\n isColumn,\n pathLiteral,\n RESERVED_FIELDS,\n} from \"./query/sql.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ntype Row = Record<string, any>;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\nconst NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nfunction sqliteType(type: ColumnType): string {\n return type === \"JSON\" ? \"TEXT\" : type;\n}\n\nfunction formatDefault(value: string | number | null): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return String(value);\n return `'${String(value).replace(/'/g, \"''\")}'`;\n}\n\n/**\n * A collection. In **document** mode (default) every document is stored as JSON\n * in a `data` column — schema-free. In **structured** mode (when a `schema` is\n * given) the listed fields become real, typed SQL columns (fast, indexable,\n * joinable) while any other fields overflow into a JSON `data` column. The CRUD\n * and query API is identical in both modes.\n */\nexport class Collection<T = Doc> {\n readonly mode: CollectionMode;\n\n private initialized = false;\n private readonly columnDefs: Record<string, ColumnDef> = {};\n private readonly columnOrder: string[] = [];\n /** Declared native columns (empty in document mode). */\n private readonly columns = new Set<string>();\n private readonly jsonColumns = new Set<string>();\n private insertSqlCache?: string;\n\n private readonly trackPath = (path: string) =>\n this.mon.autoIndexer.track(this.name, path);\n\n constructor(\n private readonly mon: Monlite,\n readonly name: string,\n options: CollectionOptions = {},\n ) {\n this.mode = options.schema ? \"structured\" : \"document\";\n if (options.schema) {\n for (const [field, def] of Object.entries(options.schema)) {\n if (!NAME_RE.test(field)) {\n throw new MonliteError(`Invalid column name \"${field}\"`);\n }\n if (RESERVED_FIELDS.has(field) || field === \"data\") {\n throw new MonliteError(\n `Column \"${field}\" is reserved by monlite and cannot be declared`,\n );\n }\n const normalized: ColumnDef =\n typeof def === \"string\" ? { type: def } : def;\n this.columnDefs[field] = normalized;\n this.columnOrder.push(field);\n this.columns.add(field);\n if (normalized.type === \"JSON\") this.jsonColumns.add(field);\n }\n }\n }\n\n private get db() {\n return this.mon.driver;\n }\n\n /** Native column names declared for this collection (structured mode). */\n get columnNames(): string[] {\n return [...this.columnOrder];\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\n\n if (this.mode === \"document\") {\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${this.name}\" (\n _id TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n } else {\n const lines = [\n `_id TEXT PRIMARY KEY`,\n `created_at INTEGER NOT NULL`,\n `updated_at INTEGER NOT NULL`,\n `data TEXT NOT NULL DEFAULT '{}'`,\n ];\n for (const field of this.columnOrder) {\n const def = this.columnDefs[field]!;\n let line = `\"${field}\" ${sqliteType(def.type)}`;\n if (def.notNull) line += \" NOT NULL\";\n if (def.unique) line += \" UNIQUE\";\n if (def.default !== undefined) line += ` DEFAULT ${formatDefault(def.default)}`;\n if (def.references) line += ` REFERENCES ${def.references}`;\n lines.push(line);\n }\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${this.name}\" (\\n ${lines.join(\",\\n \")}\\n)`,\n );\n for (const field of this.columnOrder) {\n if (this.columnDefs[field]!.index) {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS \"idx_${this.name}_${field}\" ON \"${this.name}\"(\"${field}\")`,\n );\n }\n }\n }\n this.initialized = true;\n }\n\n /* --------------------------- row <-> doc -------------------------- */\n\n private rowToDoc(row: Row): WithId<T> {\n const doc =\n this.mode === \"document\"\n ? (JSON.parse(row.data) as Record<string, any>)\n : (JSON.parse(row.data ?? \"{}\") as Record<string, any>);\n\n if (this.mode === \"structured\") {\n for (const field of this.columnOrder) {\n const value = row[field];\n if (value === null || value === undefined) continue;\n doc[field] = this.jsonColumns.has(field) ? JSON.parse(value) : value;\n }\n }\n\n doc._id = row._id;\n doc.created_at = row.created_at;\n doc.updated_at = row.updated_at;\n return doc as WithId<T>;\n }\n\n private encodeColumn(field: string, value: any): any {\n if (this.jsonColumns.has(field)) {\n return value === undefined ? null : JSON.stringify(value);\n }\n return bindable(value);\n }\n\n private insertColumns(): string[] {\n return this.mode === \"document\"\n ? [\"_id\", \"data\", \"created_at\", \"updated_at\"]\n : [\"_id\", \"created_at\", \"updated_at\", \"data\", ...this.columnOrder];\n }\n\n private insertSql(): string {\n if (this.insertSqlCache) return this.insertSqlCache;\n const cols = this.insertColumns();\n const list = cols.map((c) => `\"${c}\"`).join(\", \");\n const placeholders = cols.map(() => \"?\").join(\", \");\n return (this.insertSqlCache = `INSERT INTO \"${this.name}\" (${list}) VALUES (${placeholders})`);\n }\n\n /** Split an input document into a row aligned with `insertColumns()`. */\n private buildInsert(input: Record<string, any>): {\n _id: string;\n created_at: number;\n updated_at: number;\n values: any[];\n returned: WithId<T>;\n } {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n const returned = { ...doc, _id: id, created_at: now, updated_at: now } as WithId<T>;\n\n if (this.mode === \"document\") {\n return {\n _id: id,\n created_at: now,\n updated_at: now,\n values: [id, JSON.stringify(doc), now, now],\n returned,\n };\n }\n\n const overflow: Record<string, any> = {};\n const colValues: Record<string, any> = {};\n for (const [k, v] of Object.entries(doc)) {\n if (this.columns.has(k)) colValues[k] = v;\n else overflow[k] = v;\n }\n const values = [\n id,\n now,\n now,\n JSON.stringify(overflow),\n ...this.columnOrder.map((c) =>\n c in colValues ? this.encodeColumn(c, colValues[c]) : null,\n ),\n ];\n return { _id: id, created_at: now, updated_at: now, values, returned };\n }\n\n /** Build the `SET` clause + values to persist an updated document. */\n private buildUpdateSet(\n updatedDoc: Record<string, any>,\n now: number,\n ): { setSql: string; values: any[] } {\n if (this.mode === \"document\") {\n return {\n setSql: `data = ?, updated_at = ?`,\n values: [JSON.stringify(updatedDoc), now],\n };\n }\n const overflow: Record<string, any> = {};\n const colValues: Record<string, any> = {};\n for (const [k, v] of Object.entries(updatedDoc)) {\n if (this.columns.has(k)) colValues[k] = v;\n else overflow[k] = v;\n }\n const setParts = this.columnOrder.map((c) => `\"${c}\" = ?`);\n setParts.push(`data = ?`, `updated_at = ?`);\n const values = [\n ...this.columnOrder.map((c) =>\n c in colValues ? this.encodeColumn(c, colValues[c]) : null,\n ),\n JSON.stringify(overflow),\n now,\n ];\n return { setSql: setParts.join(\", \"), values };\n }\n\n /** Sync store, but only for document collections (structured sync is future work). */\n private get recorder() {\n return this.mode === \"document\" ? this.mon.$sync : undefined;\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.buildInsert(args.data);\n const recorder = this.recorder;\n const write = () => {\n this.db.prepare(this.insertSql()).run(...row.values);\n recorder?.recordLocal(this.name, row._id, \"upsert\", row.created_at);\n };\n if (recorder) this.db.transaction(write);\n else write();\n return row.returned;\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(this.insertSql());\n const recorder = this.recorder;\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.buildInsert(item);\n stmt.run(...row.values);\n recorder?.recordLocal(this.name, row._id, \"upsert\", row.created_at);\n }\n });\n return { count: args.data.length };\n }\n\n /* ------------------------------ read ------------------------------ */\n\n async findMany(args: FindManyArgs<T> = {}): Promise<WithId<T>[]> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n let sql = `SELECT * FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath, this.columns);\n if (order) sql += \" \" + order;\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = this.db.prepare(sql).all(...params) as Row[];\n return rows.map((r) => project(this.rowToDoc(r), args.select) as WithId<T>);\n }\n\n async findFirst(args: FindFirstArgs<T> = {}): Promise<WithId<T> | null> {\n const rows = await this.findMany({ ...args, take: 1 });\n return rows[0] ?? null;\n }\n\n async findById(id: string): Promise<WithId<T> | null> {\n this.ensureTable();\n const row = this.db\n .prepare(`SELECT * FROM \"${this.name}\" WHERE _id = ?`)\n .get(id) as Row | undefined;\n return row ? this.rowToDoc(row) : null;\n }\n\n async count(args: CountArgs<T> = {}): Promise<number> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n const row = this.db\n .prepare(`SELECT COUNT(*) AS n FROM \"${this.name}\" WHERE ${where}`)\n .get(...params) as { n: number };\n return row.n;\n }\n\n /**\n * Return the distinct values of a field. Array fields stored in JSON are\n * unwound (each element counts as a value), matching MongoDB's `distinct`.\n */\n async distinct(field: string, where?: WhereInput<T>): Promise<any[]> {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n\n let sql: string;\n if (isColumn(field, this.columns)) {\n sql =\n `SELECT DISTINCT ${fieldExpr(field, this.columns)} AS v FROM \"${this.name}\" ` +\n `WHERE ${clause} ORDER BY v`;\n } else {\n this.trackPath(field);\n sql =\n `SELECT DISTINCT je.value AS v FROM \"${this.name}\" ` +\n `CROSS JOIN json_each(\"${this.name}\".data, ${pathLiteral(field)}) je ` +\n `WHERE ${clause} ORDER BY v`;\n }\n\n const rows = this.db.prepare(sql).all(...params) as Array<{ v: any }>;\n return rows.map((r) => r.v);\n }\n\n /* ----------------------------- update ----------------------------- */\n\n private runUpdate(\n where: WhereInput<T> | undefined,\n data: UpdateData<T>,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n let selectSql = `SELECT * FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const now = Date.now();\n const recorder = this.recorder;\n\n return this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = stripSystem(this.rowToDoc(row));\n const updated = stripSystem(applyUpdate(current, data));\n const { setSql, values } = this.buildUpdateSet(updated, now);\n this.db\n .prepare(`UPDATE \"${this.name}\" SET ${setSql} WHERE _id = ?`)\n .run(...values, row._id);\n recorder?.recordLocal(this.name, row._id, \"upsert\", now);\n out.push({\n ...updated,\n _id: row._id,\n created_at: row.created_at,\n updated_at: now,\n } as WithId<T>);\n }\n return out;\n });\n }\n\n async update(args: UpdateArgs<T>): Promise<WithId<T> | null> {\n return this.runUpdate(args.where, args.data, true)[0] ?? null;\n }\n\n async updateMany(args: UpdateArgs<T>): Promise<{ count: number }> {\n return { count: this.runUpdate(args.where, args.data, false).length };\n }\n\n async upsert(args: UpsertArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const existing = await this.findFirst({ where: args.where });\n if (existing) {\n const updated = await this.update({\n where: { _id: existing._id } as WhereInput<T>,\n data: args.update,\n });\n return updated as WithId<T>;\n }\n return this.create({ data: args.create });\n }\n\n /* ----------------------------- delete ----------------------------- */\n\n private runDelete(\n where: WhereInput<T> | undefined,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n let selectSql = `SELECT * FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const stmt = this.db.prepare(`DELETE FROM \"${this.name}\" WHERE _id = ?`);\n const recorder = this.recorder;\n const now = Date.now();\n this.db.transaction(() => {\n for (const row of rows) {\n stmt.run(row._id);\n recorder?.recordLocal(this.name, row._id, \"delete\", now);\n }\n });\n\n return rows.map((r) => this.rowToDoc(r));\n }\n\n async delete(args: DeleteArgs<T>): Promise<WithId<T> | null> {\n return this.runDelete(args.where, true)[0] ?? null;\n }\n\n async deleteMany(\n args: DeleteArgs<T> = { where: undefined as any },\n ): Promise<{ count: number }> {\n return { count: this.runDelete(args.where, false).length };\n }\n\n /* --------------------------- aggregation -------------------------- */\n\n async aggregate(args: AggregateArgs<T> = {}): Promise<AggregateResult> {\n this.ensureTable();\n return aggregate(\n { db: this.db, table: this.name, onPath: this.trackPath, columns: this.columns },\n args,\n );\n }\n\n async groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]> {\n this.ensureTable();\n return groupBy(\n { db: this.db, table: this.name, onPath: this.trackPath, columns: this.columns },\n args,\n );\n }\n}\n","import type { Driver } from \"./driver/types.js\";\nimport { pathLiteral } from \"./query/sql.js\";\n\n/**\n * Tracks which JSON paths are queried per collection and silently creates a\n * SQLite expression index once a path crosses the configured threshold.\n */\nexport class AutoIndexer {\n private counts = new Map<string, number>();\n private created = new Set<string>();\n\n constructor(\n private readonly db: Driver,\n private readonly enabled: boolean,\n private readonly threshold: number,\n ) {}\n\n track(collection: string, path: string): void {\n if (!this.enabled) return;\n const key = `${collection}\u0000${path}`;\n if (this.created.has(key)) return;\n\n const next = (this.counts.get(key) ?? 0) + 1;\n this.counts.set(key, next);\n\n if (next >= this.threshold) {\n this.create(collection, path);\n this.created.add(key);\n this.counts.delete(key);\n }\n }\n\n private create(collection: string, path: string): void {\n const safe = path.replace(/[^A-Za-z0-9_]+/g, \"_\");\n const indexName = `idx_${collection}_${safe}`;\n const expr = `json_extract(data, ${pathLiteral(path)})`;\n try {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON \"${collection}\"(${expr})`,\n );\n } catch {\n // Collection may have been dropped between query and index creation.\n }\n }\n\n /** Forget tracking for a collection (or everything when omitted). */\n reset(collection?: string): void {\n if (!collection) {\n this.counts.clear();\n this.created.clear();\n return;\n }\n const prefix = `${collection}\u0000`;\n for (const k of [...this.counts.keys()]) {\n if (k.startsWith(prefix)) this.counts.delete(k);\n }\n for (const k of [...this.created.keys()]) {\n if (k.startsWith(prefix)) this.created.delete(k);\n }\n }\n}\n","import type { Driver, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\n/** Adapter over the `better-sqlite3` native driver. */\nexport class BetterSqlite3Driver implements Driver {\n readonly name = \"better-sqlite3\";\n readonly raw: any;\n private readonly verbose?: (sql: string) => void;\n\n constructor(BetterSqlite3: any, filename: string, options: DriverOpenOptions) {\n this.verbose = options.verbose;\n this.raw = new BetterSqlite3(filename, {\n readonly: options.readonly ?? false,\n });\n if (!options.readonly && (options.wal ?? true)) {\n this.raw.pragma(\"journal_mode = WAL\");\n }\n }\n\n exec(sql: string): void {\n this.verbose?.(sql);\n this.raw.exec(sql);\n }\n\n prepare(sql: string): PreparedStatement {\n this.verbose?.(sql);\n // better-sqlite3 statements already match the PreparedStatement shape.\n return this.raw.prepare(sql);\n }\n\n transaction<T>(fn: () => T): T {\n // Nested calls automatically use SAVEPOINTs in better-sqlite3.\n return this.raw.transaction(fn)();\n }\n\n close(): void {\n this.raw.close();\n }\n}\n","import type { Driver, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\n/**\n * Adapter over Node's built-in `node:sqlite` (Node >= 22.5). Lets monlite run\n * with zero external dependencies. Note: `node:sqlite` is still flagged\n * experimental by Node and prints a one-time ExperimentalWarning.\n *\n * Unlike better-sqlite3 it has no `.transaction()` / `.pragma()` helpers, so\n * transactions are implemented here with BEGIN/COMMIT and nested SAVEPOINTs.\n */\nexport class NodeSqliteDriver implements Driver {\n readonly name = \"node:sqlite\";\n readonly raw: any;\n private readonly verbose?: (sql: string) => void;\n private depth = 0;\n\n constructor(nodeSqlite: any, filename: string, options: DriverOpenOptions) {\n this.verbose = options.verbose;\n const { DatabaseSync } = nodeSqlite;\n this.raw = new DatabaseSync(filename, {\n readOnly: options.readonly ?? false,\n });\n if (!options.readonly && (options.wal ?? true)) {\n this.raw.exec(\"PRAGMA journal_mode = WAL\");\n }\n }\n\n exec(sql: string): void {\n this.verbose?.(sql);\n this.raw.exec(sql);\n }\n\n prepare(sql: string): PreparedStatement {\n this.verbose?.(sql);\n const stmt = this.raw.prepare(sql);\n return {\n run: (...p: any[]) => stmt.run(...p),\n get: (...p: any[]) => stmt.get(...p),\n all: (...p: any[]) => stmt.all(...p),\n };\n }\n\n transaction<T>(fn: () => T): T {\n const savepoint = `monlite_sp_${this.depth}`;\n if (this.depth === 0) this.raw.exec(\"BEGIN\");\n else this.raw.exec(`SAVEPOINT ${savepoint}`);\n this.depth++;\n\n try {\n const result = fn();\n this.depth--;\n if (this.depth === 0) this.raw.exec(\"COMMIT\");\n else this.raw.exec(`RELEASE ${savepoint}`);\n return result;\n } catch (err) {\n this.depth--;\n if (this.depth === 0) this.raw.exec(\"ROLLBACK\");\n else this.raw.exec(`ROLLBACK TO ${savepoint}; RELEASE ${savepoint}`);\n throw err;\n }\n }\n\n close(): void {\n this.raw.close();\n }\n}\n","import { createRequire } from \"node:module\";\nimport { MonliteError } from \"../errors.js\";\nimport type { Driver, DriverName, DriverOpenOptions } from \"./types.js\";\nimport { BetterSqlite3Driver } from \"./better-sqlite3.js\";\nimport { NodeSqliteDriver } from \"./node-sqlite.js\";\n\nexport type { Driver, DriverName, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\n// Resolve relative to this module so optional deps load from the host app.\nconst req = createRequire(import.meta.url);\n\nfunction loadBetterSqlite3(): any | null {\n try {\n const mod = req(\"better-sqlite3\");\n return mod?.default ?? mod;\n } catch {\n return null;\n }\n}\n\nfunction loadNodeSqlite(): any | null {\n try {\n // Only required when actually selected, so better-sqlite3 users never\n // trigger node:sqlite's experimental warning.\n return req(\"node:sqlite\");\n } catch {\n return null;\n }\n}\n\nexport interface CreateDriverOptions extends DriverOpenOptions {\n driver?: DriverName;\n}\n\n/**\n * Build the SQLite driver. With `\"auto\"` (the default) better-sqlite3 is used\n * when installed, otherwise the built-in node:sqlite (Node >= 22.5).\n */\nexport function createDriver(\n filename: string,\n options: CreateDriverOptions = {},\n): Driver {\n const choice = options.driver ?? \"auto\";\n\n if (choice === \"better-sqlite3\") {\n const mod = loadBetterSqlite3();\n if (!mod) {\n throw new MonliteError(\n `driver \"better-sqlite3\" was requested but the package is not installed. ` +\n `Run \\`npm install better-sqlite3\\`.`,\n );\n }\n return new BetterSqlite3Driver(mod, filename, options);\n }\n\n if (choice === \"node:sqlite\") {\n const mod = loadNodeSqlite();\n if (!mod) {\n throw new MonliteError(\n `driver \"node:sqlite\" is unavailable. It requires Node >= 22.5.`,\n );\n }\n return new NodeSqliteDriver(mod, filename, options);\n }\n\n // auto: prefer better-sqlite3 (stable, all Node versions), else node:sqlite.\n const better = loadBetterSqlite3();\n if (better) return new BetterSqlite3Driver(better, filename, options);\n\n const node = loadNodeSqlite();\n if (node) return new NodeSqliteDriver(node, filename, options);\n\n throw new MonliteError(\n `No SQLite driver available. Either install better-sqlite3 ` +\n `(\\`npm install better-sqlite3\\`) or run on Node >= 22.5 for the ` +\n `built-in node:sqlite backend.`,\n );\n}\n","/**\n * Versions are LWW (last-write-wins) tokens of the form\n * `<zero-padded-ms>:<nodeId>` so that plain string comparison yields the\n * correct ordering: newer wall-clock time wins, ties broken by node id.\n *\n * (The design reserves room to swap this for a hybrid logical clock later;\n * the on-disk column is a plain string, so the format can evolve.)\n */\n\nexport type Version = string;\n\nconst TS_WIDTH = 15; // fits ms timestamps well past the year 5000\n\nexport function makeVersion(ts: number, nodeId: string): Version {\n return String(ts).padStart(TS_WIDTH, \"0\") + \":\" + nodeId;\n}\n\nexport function compareVersions(a: Version, b: Version): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function versionTs(v: Version): number {\n const i = v.indexOf(\":\");\n return Number(i === -1 ? v : v.slice(0, i));\n}\n\nexport function versionNode(v: Version): string {\n const i = v.indexOf(\":\");\n return i === -1 ? \"\" : v.slice(i + 1);\n}\n","import type { Driver } from \"../driver/types.js\";\nimport { objectId } from \"../id.js\";\nimport {\n makeVersion,\n compareVersions,\n versionTs,\n type Version,\n} from \"./version.js\";\n\nexport type { Version } from \"./version.js\";\nexport { makeVersion, compareVersions, versionTs } from \"./version.js\";\n\nexport type SyncOp = \"upsert\" | \"delete\";\n\n/** A locally-originated change ready to be pushed to a remote. */\nexport interface LocalChange {\n seq: number;\n collection: string;\n _id: string;\n op: SyncOp;\n version: Version;\n ts: number;\n /** Full document (with system fields) for `upsert`; absent for `delete`. */\n doc?: Record<string, any>;\n}\n\n/** A change received from a remote, to be applied locally. */\nexport interface RemoteChange {\n collection: string;\n _id: string;\n op: SyncOp;\n version: Version;\n doc?: Record<string, any>;\n}\n\nexport type ConflictResolver = (ctx: {\n collection: string;\n _id: string;\n local: { version: Version };\n remote: { version: Version; doc?: Record<string, any> };\n}) => \"local\" | \"remote\";\n\nexport interface ApplyResult {\n applied: boolean;\n conflict: boolean;\n winner: \"local\" | \"remote\" | \"none\";\n}\n\nexport interface SyncStateRow {\n remote: string;\n cursor: string | null;\n lastPullAt: number | null;\n lastPushSeq: number | null;\n lastPushAt: number | null;\n}\n\nexport interface ConflictRow {\n collection: string;\n _id: string;\n localVersion: Version;\n remoteVersion: Version;\n winner: \"local\" | \"remote\";\n ts: number;\n}\n\nconst NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nfunction assertName(name: string): void {\n if (!NAME_RE.test(name)) throw new Error(`Invalid collection name \"${name}\"`);\n}\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\ninterface Row {\n seq: number;\n coll: string;\n doc_id: string;\n op: SyncOp;\n version: string;\n ts: number;\n}\n\n/**\n * Low-level sync primitives stored alongside the data in the same `.db` file:\n * an append-only change feed, tombstones, per-remote cursors and a conflict\n * log. Created only when a database is opened with `{ sync: true }`. The\n * `@monlite/sync` engine drives this; apps rarely touch it directly.\n */\nexport class SyncStore {\n readonly nodeId: string;\n\n constructor(\n private readonly db: Driver,\n nodeId?: string,\n ) {\n this.init();\n this.nodeId = this.resolveNodeId(nodeId);\n }\n\n private init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS _monlite_changes (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n coll TEXT NOT NULL,\n doc_id TEXT NOT NULL,\n op TEXT NOT NULL,\n version TEXT NOT NULL,\n ts INTEGER NOT NULL,\n source TEXT NOT NULL DEFAULT 'local',\n pushed INTEGER NOT NULL DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS _idx_changes_doc ON _monlite_changes(coll, doc_id, seq);\n CREATE INDEX IF NOT EXISTS _idx_changes_push ON _monlite_changes(source, pushed, seq);\n CREATE TABLE IF NOT EXISTS _monlite_sync_state (\n remote TEXT PRIMARY KEY,\n cursor TEXT,\n last_pull_at INTEGER,\n last_push_seq INTEGER,\n last_push_at INTEGER\n );\n CREATE TABLE IF NOT EXISTS _monlite_conflicts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n coll TEXT, doc_id TEXT,\n local_version TEXT, remote_version TEXT,\n winner TEXT, ts INTEGER\n );\n CREATE TABLE IF NOT EXISTS _monlite_meta (key TEXT PRIMARY KEY, value TEXT);\n `);\n }\n\n private resolveNodeId(explicit?: string): string {\n if (explicit) {\n this.db\n .prepare(`INSERT OR REPLACE INTO _monlite_meta (key, value) VALUES ('nodeId', ?)`)\n .run(explicit);\n return explicit;\n }\n const row = this.db\n .prepare(`SELECT value FROM _monlite_meta WHERE key = 'nodeId'`)\n .get() as { value: string } | undefined;\n if (row?.value) return row.value;\n const generated = objectId();\n this.db\n .prepare(`INSERT INTO _monlite_meta (key, value) VALUES ('nodeId', ?)`)\n .run(generated);\n return generated;\n }\n\n /** True if this database tracks sync metadata (always, once constructed). */\n get enabled(): boolean {\n return true;\n }\n\n /* ----------------------- local change recording ----------------------- */\n\n /** Append a locally-originated change to the feed. Call inside a write txn. */\n recordLocal(collection: string, id: string, op: SyncOp, ts: number): Version {\n const version = makeVersion(ts, this.nodeId);\n this.db\n .prepare(\n `INSERT INTO _monlite_changes (coll, doc_id, op, version, ts, source, pushed)\n VALUES (?, ?, ?, ?, ?, 'local', 0)`,\n )\n .run(collection, id, op, version, ts);\n return version;\n }\n\n /** Current (latest) version of a document, or null if never recorded. */\n currentVersion(collection: string, id: string): Version | null {\n const row = this.db\n .prepare(\n `SELECT version FROM _monlite_changes\n WHERE coll = ? AND doc_id = ? ORDER BY seq DESC LIMIT 1`,\n )\n .get(collection, id) as { version: string } | undefined;\n return row?.version ?? null;\n }\n\n /* ----------------------------- push side ----------------------------- */\n\n /** Latest unpushed local change per document (the push queue). */\n pending(collections?: string[]): LocalChange[] {\n const params: any[] = [];\n let collFilter = \"\";\n if (collections && collections.length) {\n collFilter = ` AND coll IN (${collections.map(() => \"?\").join(\", \")})`;\n params.push(...collections);\n }\n const rows = this.db\n .prepare(\n `SELECT c.seq, c.coll, c.doc_id, c.op, c.version, c.ts\n FROM _monlite_changes c\n JOIN (\n SELECT coll, doc_id, MAX(seq) AS mseq\n FROM _monlite_changes\n WHERE source = 'local' AND pushed = 0${collFilter}\n GROUP BY coll, doc_id\n ) m ON c.coll = m.coll AND c.doc_id = m.doc_id AND c.seq = m.mseq\n ORDER BY c.seq`,\n )\n .all(...params) as Row[];\n\n return rows.map((r) => {\n const change: LocalChange = {\n seq: r.seq,\n collection: r.coll,\n _id: r.doc_id,\n op: r.op,\n version: r.version,\n ts: r.ts,\n };\n if (r.op === \"upsert\") {\n const doc = this.readDoc(r.coll, r.doc_id);\n if (doc) change.doc = doc;\n else change.op = \"delete\"; // gone since recording → treat as delete\n }\n return change;\n });\n }\n\n /** Mark the given changes (and any earlier local rows per doc) as pushed. */\n markPushed(changes: LocalChange[]): void {\n if (!changes.length) return;\n const stmt = this.db.prepare(\n `UPDATE _monlite_changes SET pushed = 1\n WHERE coll = ? AND doc_id = ? AND seq <= ? AND source = 'local'`,\n );\n this.db.transaction(() => {\n for (const c of changes) stmt.run(c.collection, c._id, c.seq);\n });\n }\n\n /* ----------------------------- pull side ----------------------------- */\n\n /**\n * Apply a remote change, resolving conflicts against the local version.\n * Remote-applied changes are recorded with `source='remote'` so they are\n * never pushed back (echo prevention).\n */\n applyRemote(change: RemoteChange, resolver?: ConflictResolver): ApplyResult {\n assertName(change.collection);\n const localVersion = this.currentVersion(change.collection, change._id);\n\n let winner: \"local\" | \"remote\";\n if (localVersion === null) {\n winner = \"remote\";\n } else if (change.version === localVersion) {\n return { applied: false, conflict: false, winner: \"none\" }; // echo\n } else {\n winner = resolver\n ? resolver({\n collection: change.collection,\n _id: change._id,\n local: { version: localVersion },\n remote: { version: change.version, doc: change.doc },\n })\n : compareVersions(change.version, localVersion) > 0\n ? \"remote\"\n : \"local\";\n this.recordConflict(\n change.collection,\n change._id,\n localVersion,\n change.version,\n winner,\n );\n }\n\n if (winner !== \"remote\") {\n return { applied: false, conflict: localVersion !== null, winner };\n }\n\n this.db.transaction(() => {\n this.applyData(change);\n this.db\n .prepare(\n `INSERT INTO _monlite_changes (coll, doc_id, op, version, ts, source, pushed)\n VALUES (?, ?, ?, ?, ?, 'remote', 1)`,\n )\n .run(\n change.collection,\n change._id,\n change.op,\n change.version,\n versionTs(change.version),\n );\n });\n\n return { applied: true, conflict: localVersion !== null, winner: \"remote\" };\n }\n\n private applyData(change: RemoteChange): void {\n const { collection: coll, _id, op } = change;\n this.ensureCollTable(coll);\n if (op === \"delete\") {\n this.db.prepare(`DELETE FROM \"${coll}\" WHERE _id = ?`).run(_id);\n return;\n }\n const doc = change.doc ?? {};\n const data = JSON.stringify(stripSystem(doc));\n const ts = versionTs(change.version);\n const createdAt =\n typeof doc.created_at === \"number\" ? doc.created_at : ts;\n this.db\n .prepare(\n `INSERT INTO \"${coll}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)\n ON CONFLICT(_id) DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`,\n )\n .run(_id, data, createdAt, ts);\n }\n\n /**\n * Latest change per document with `seq` greater than the given watermark,\n * as RemoteChanges (used when this database acts as a sync *source*, e.g. the\n * monlite-as-remote adapter). Returns the new watermark to resume from.\n */\n changesSince(\n seq: number,\n collections?: string[],\n ): { changes: RemoteChange[]; maxSeq: number } {\n const params: any[] = [seq];\n let collFilter = \"\";\n if (collections && collections.length) {\n collFilter = ` AND coll IN (${collections.map(() => \"?\").join(\", \")})`;\n params.push(...collections);\n }\n const rows = this.db\n .prepare(\n `SELECT c.seq, c.coll, c.doc_id, c.op, c.version, c.ts\n FROM _monlite_changes c\n JOIN (\n SELECT coll, doc_id, MAX(seq) AS mseq\n FROM _monlite_changes\n WHERE seq > ?${collFilter}\n GROUP BY coll, doc_id\n ) m ON c.coll = m.coll AND c.doc_id = m.doc_id AND c.seq = m.mseq\n ORDER BY c.seq`,\n )\n .all(...params) as Row[];\n\n const changes: RemoteChange[] = rows.map((r) => {\n const change: RemoteChange = {\n collection: r.coll,\n _id: r.doc_id,\n op: r.op,\n version: r.version,\n };\n if (r.op === \"upsert\") {\n const doc = this.readDoc(r.coll, r.doc_id);\n if (doc) change.doc = doc;\n else change.op = \"delete\";\n }\n return change;\n });\n\n const maxRow = this.db\n .prepare(`SELECT MAX(seq) AS m FROM _monlite_changes`)\n .get() as { m: number | null };\n return { changes, maxSeq: maxRow?.m ?? seq };\n }\n\n /* ------------------------------ bootstrap ----------------------------- */\n\n /**\n * Enqueue existing documents (created before sync was enabled, or never\n * recorded) as local upserts so they can be pushed. Idempotent.\n */\n seed(collections: string[]): number {\n let count = 0;\n this.db.transaction(() => {\n for (const coll of collections) {\n assertName(coll);\n const docs = this.db\n .prepare(`SELECT _id, updated_at FROM \"${coll}\"`)\n .all() as Array<{ _id: string; updated_at: number }>;\n for (const d of docs) {\n if (this.currentVersion(coll, d._id) !== null) continue;\n this.recordLocal(coll, d._id, \"upsert\", d.updated_at);\n count++;\n }\n }\n });\n return count;\n }\n\n /* ------------------------------- state -------------------------------- */\n\n getState(remote: string): SyncStateRow {\n const row = this.db\n .prepare(`SELECT * FROM _monlite_sync_state WHERE remote = ?`)\n .get(remote) as any;\n return {\n remote,\n cursor: row?.cursor ?? null,\n lastPullAt: row?.last_pull_at ?? null,\n lastPushSeq: row?.last_push_seq ?? null,\n lastPushAt: row?.last_push_at ?? null,\n };\n }\n\n setState(remote: string, patch: Partial<Omit<SyncStateRow, \"remote\">>): void {\n const cur = this.getState(remote);\n const next = { ...cur, ...patch };\n this.db\n .prepare(\n `INSERT INTO _monlite_sync_state (remote, cursor, last_pull_at, last_push_seq, last_push_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(remote) DO UPDATE SET\n cursor = excluded.cursor,\n last_pull_at = excluded.last_pull_at,\n last_push_seq = excluded.last_push_seq,\n last_push_at = excluded.last_push_at`,\n )\n .run(\n remote,\n next.cursor,\n next.lastPullAt,\n next.lastPushSeq,\n next.lastPushAt,\n );\n }\n\n /* ----------------------------- conflicts ------------------------------ */\n\n private recordConflict(\n coll: string,\n id: string,\n localVersion: Version,\n remoteVersion: Version,\n winner: \"local\" | \"remote\",\n ): void {\n this.db\n .prepare(\n `INSERT INTO _monlite_conflicts (coll, doc_id, local_version, remote_version, winner, ts)\n VALUES (?, ?, ?, ?, ?, ?)`,\n )\n .run(coll, id, localVersion, remoteVersion, winner, versionTs(remoteVersion));\n }\n\n conflicts(): ConflictRow[] {\n const rows = this.db\n .prepare(\n `SELECT coll, doc_id, local_version, remote_version, winner, ts\n FROM _monlite_conflicts ORDER BY id`,\n )\n .all() as any[];\n return rows.map((r) => ({\n collection: r.coll,\n _id: r.doc_id,\n localVersion: r.local_version,\n remoteVersion: r.remote_version,\n winner: r.winner,\n ts: r.ts,\n }));\n }\n\n /* ------------------------------ helpers ------------------------------- */\n\n private readDoc(coll: string, id: string): Record<string, any> | null {\n assertName(coll);\n const row = this.db\n .prepare(\n `SELECT _id, data, created_at, updated_at FROM \"${coll}\" WHERE _id = ?`,\n )\n .get(id) as\n | { _id: string; data: string; created_at: number; updated_at: number }\n | undefined;\n if (!row) return null;\n const doc = JSON.parse(row.data);\n doc._id = row._id;\n doc.created_at = row.created_at;\n doc.updated_at = row.updated_at;\n return doc;\n }\n\n private ensureCollTable(coll: string): void {\n assertName(coll);\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${coll}\" (\n _id TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n }\n}\n","import type {\n CollectionOptions,\n ColumnInfo,\n Doc,\n MonliteOptions,\n} from \"./types.js\";\nimport { Collection } from \"./collection.js\";\nimport { AutoIndexer } from \"./auto-index.js\";\nimport { MonliteError } from \"./errors.js\";\nimport { bindable } from \"./query/sql.js\";\nimport { createDriver } from \"./driver/index.js\";\nimport type { Driver } from \"./driver/types.js\";\nimport { SyncStore } from \"./sync/store.js\";\n\nfunction validateName(name: string): void {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new MonliteError(\n `Invalid collection name \"${name}\". Names must start with a letter or ` +\n `underscore and contain only letters, digits and underscores.`,\n );\n }\n}\n\nfunction buildTagged(\n strings: TemplateStringsArray,\n values: any[],\n): { sql: string; params: any[] } {\n let sql = \"\";\n const params: any[] = [];\n strings.forEach((part, i) => {\n sql += part;\n if (i < values.length) {\n sql += \"?\";\n params.push(bindable(values[i]));\n }\n });\n return { sql, params };\n}\n\n/**\n * A monlite database — a thin document layer over a single SQLite file.\n * Create one with {@link createDb}.\n */\nexport class Monlite {\n /** @internal The active SQLite driver. */\n readonly driver: Driver;\n /** @internal */\n readonly autoIndexer: AutoIndexer;\n /** @internal Sync metadata store; present only when `{ sync: true }`. */\n readonly $sync?: SyncStore;\n\n private readonly collections = new Map<string, Collection<any>>();\n private closed = false;\n\n constructor(filename: string, options: MonliteOptions = {}) {\n this.driver = createDriver(filename, {\n driver: options.driver,\n readonly: options.readonly,\n wal: options.wal,\n verbose: options.verbose,\n });\n\n this.autoIndexer = new AutoIndexer(\n this.driver,\n options.autoIndex ?? true,\n options.autoIndexAfter ?? 10,\n );\n\n if (options.sync) {\n this.$sync = new SyncStore(this.driver, options.nodeId);\n }\n }\n\n /** Stable node id for LWW tie-breaking (only when sync is enabled). */\n get nodeId(): string | undefined {\n return this.$sync?.nodeId;\n }\n\n /** The underlying native database handle (escape hatch). */\n get sqlite(): any {\n return this.driver.raw;\n }\n\n /** Name of the active backend: `\"better-sqlite3\"` or `\"node:sqlite\"`. */\n get driverName(): string {\n return this.driver.name;\n }\n\n /**\n * Get (or lazily create) a typed collection handle. Pass `{ schema }` to make\n * it a structured collection backed by native SQL columns; omit for the\n * default schema-free document mode. Options apply only on first access.\n */\n collection<T = Doc>(name: string, options?: CollectionOptions): Collection<T> {\n this.assertOpen();\n validateName(name);\n let col = this.collections.get(name);\n if (!col) {\n col = new Collection<T>(this, name, options);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\n }\n\n /** Inspect a collection's physical columns (PRAGMA table_info). */\n $schema(name: string): Promise<ColumnInfo[]> {\n this.assertOpen();\n validateName(name);\n const rows = this.driver\n .prepare(`PRAGMA table_info(\"${name}\")`)\n .all() as Array<{ name: string; type: string; notnull: number; pk: number }>;\n return Promise.resolve(\n rows.map((r) => ({\n name: r.name,\n type: r.type,\n notNull: !!r.notnull,\n primaryKey: !!r.pk,\n })),\n );\n }\n\n /** Tagged-template SQL query returning rows. Values are safely parameterized. */\n $queryRaw<R = any>(strings: TemplateStringsArray, ...values: any[]): Promise<R[]> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.driver.prepare(sql).all(...params) as R[]);\n }\n\n /** Like {@link $queryRaw} but takes a raw SQL string and positional params. */\n $queryRawUnsafe<R = any>(sql: string, ...params: any[]): Promise<R[]> {\n this.assertOpen();\n return Promise.resolve(\n this.driver.prepare(sql).all(...params.map(bindable)) as R[],\n );\n }\n\n /** Tagged-template SQL statement returning the number of affected rows. */\n $executeRaw(strings: TemplateStringsArray, ...values: any[]): Promise<number> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.driver.prepare(sql).run(...params).changes);\n }\n\n /** Like {@link $executeRaw} but takes a raw SQL string and positional params. */\n $executeRawUnsafe(sql: string, ...params: any[]): Promise<number> {\n this.assertOpen();\n return Promise.resolve(\n this.driver.prepare(sql).run(...params.map(bindable)).changes,\n );\n }\n\n /**\n * Run a function inside a synchronous SQLite transaction. If it throws, the\n * transaction is rolled back.\n */\n async $transaction<R>(fn: (db: this) => R): Promise<R> {\n this.assertOpen();\n // Transactions are synchronous; `fn` must not be async. A throw inside\n // rolls back and (being in an async method) rejects this promise.\n return this.driver.transaction(() => fn(this));\n }\n\n /** List all collection (table) names. */\n $collections(): Promise<string[]> {\n this.assertOpen();\n const rows = this.driver\n .prepare(\n `SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '\\\\_monlite\\\\_%' ESCAPE '\\\\'\n ORDER BY name`,\n )\n .all() as Array<{ name: string }>;\n return Promise.resolve(rows.map((r) => r.name));\n }\n\n /** Drop a collection and all of its data. */\n $drop(name: string): Promise<void> {\n this.assertOpen();\n validateName(name);\n this.driver.exec(`DROP TABLE IF EXISTS \"${name}\"`);\n this.collections.delete(name);\n this.autoIndexer.reset(name);\n return Promise.resolve();\n }\n\n /** Drop every collection in the database. */\n async $dropAll(): Promise<void> {\n for (const name of await this.$collections()) await this.$drop(name);\n }\n\n /** Close the underlying SQLite connection. */\n $disconnect(): Promise<void> {\n if (!this.closed) {\n this.closed = true;\n this.driver.close();\n }\n return Promise.resolve();\n }\n\n private assertOpen(): void {\n if (this.closed) throw new MonliteError(\"Database connection is closed\");\n }\n}\n\n/**\n * Open (or create) a monlite database backed by a single SQLite file.\n * Use `\":memory:\"` for an in-memory database.\n */\nexport function createDb(filename: string, options?: MonliteOptions): Monlite {\n return new Monlite(filename, options);\n}\n"]}
1
+ {"version":3,"sources":["../src/id.ts","../src/errors.ts","../src/query/sql.ts","../src/query/where.ts","../src/query/order.ts","../src/query/path.ts","../src/query/select.ts","../src/query/update.ts","../src/aggregation/aggregate.ts","../src/collection.ts","../src/auto-index.ts","../src/driver/better-sqlite3.ts","../src/driver/node-sqlite.ts","../src/driver/index.ts","../src/sync/version.ts","../src/sync/store.ts","../src/db.ts"],"names":["cmp","STMT_CACHE_MAX","NAME_RE","stripSystem"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\n/**\n * Generates MongoDB ObjectId-compatible identifiers: a 24-character hex string\n * built from a 4-byte timestamp, 5 random bytes (stable per process) and a\n * 3-byte incrementing counter.\n *\n * Because the timestamp is the high-order component, ids sort in roughly\n * insertion order — which keeps the SQLite primary-key index well-localized.\n */\n\nconst PROCESS_UNIQUE = randomBytes(5);\nlet counter = randomBytes(3).readUIntBE(0, 3);\n\nexport function objectId(): string {\n const time = Math.floor(Date.now() / 1000);\n counter = (counter + 1) % 0x1000000; // wrap at 2^24\n\n const buf = Buffer.allocUnsafe(12);\n buf.writeUInt32BE(time >>> 0, 0);\n PROCESS_UNIQUE.copy(buf, 4, 0, 5);\n buf.writeUIntBE(counter, 9, 3);\n\n return buf.toString(\"hex\");\n}\n\n/** True when a value looks like a monlite/ObjectId id (24 hex chars). */\nexport function isObjectId(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{24}$/i.test(value);\n}\n","/** Base error for all monlite-originated failures. */\nexport class MonliteError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"MonliteError\";\n if (options?.cause !== undefined) (this as any).cause = options.cause;\n }\n}\n\n/** Thrown when a query/update payload is malformed. */\nexport class MonliteQueryError extends MonliteError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"MonliteQueryError\";\n }\n}\n\n/** A database constraint was violated (base class for the specific kinds). */\nexport class MonliteConstraintError extends MonliteError {\n readonly collection?: string;\n constructor(\n message: string,\n options?: { cause?: unknown; collection?: string },\n ) {\n super(message, options);\n this.name = \"MonliteConstraintError\";\n this.collection = options?.collection;\n }\n}\n\n/** A UNIQUE (or primary-key) constraint was violated. */\nexport class MonliteUniqueConstraintError extends MonliteConstraintError {\n constructor(\n message: string,\n options?: { cause?: unknown; collection?: string },\n ) {\n super(message, options);\n this.name = \"MonliteUniqueConstraintError\";\n }\n}\n\n/** A NOT NULL constraint was violated. */\nexport class MonliteNotNullError extends MonliteConstraintError {\n constructor(\n message: string,\n options?: { cause?: unknown; collection?: string },\n ) {\n super(message, options);\n this.name = \"MonliteNotNullError\";\n }\n}\n\n/** A FOREIGN KEY constraint was violated. */\nexport class MonliteForeignKeyError extends MonliteConstraintError {\n constructor(\n message: string,\n options?: { cause?: unknown; collection?: string },\n ) {\n super(message, options);\n this.name = \"MonliteForeignKeyError\";\n }\n}\n\n/**\n * Normalize a raw driver error (better-sqlite3 `SqliteError` or node:sqlite\n * error) into a typed {@link MonliteError}. The two backends differ in error\n * shape, so we sniff both the `code` and the message text.\n */\nexport function normalizeDriverError(\n err: unknown,\n collection?: string,\n): MonliteError {\n if (err instanceof MonliteError) return err;\n\n const code = (err as any)?.code ? String((err as any).code) : \"\";\n const message = err instanceof Error ? err.message : String(err);\n const blob = `${code} ${message}`;\n\n const opts = { cause: err, collection };\n\n if (/UNIQUE|PRIMARY KEY|constraint failed: .*\\.(?:_id)\\b/i.test(blob)) {\n return new MonliteUniqueConstraintError(message, opts);\n }\n if (/NOT ?NULL/i.test(blob)) {\n return new MonliteNotNullError(message, opts);\n }\n if (/FOREIGN ?KEY/i.test(blob)) {\n return new MonliteForeignKeyError(message, opts);\n }\n if (/CONSTRAINT/i.test(blob)) {\n return new MonliteConstraintError(message, opts);\n }\n return new MonliteError(message, { cause: err });\n}\n","/** Shared helpers for translating document paths and values into SQLite. */\n\n/** System columns stored outside the JSON `data` blob. */\nexport const RESERVED_FIELDS = new Set([\"_id\", \"created_at\", \"updated_at\"]);\n\nexport function isReserved(field: string): boolean {\n return RESERVED_FIELDS.has(field);\n}\n\n/**\n * True when a field maps to a real SQL column: a system field, or — in a\n * structured collection — one of its declared columns. Such fields are\n * referenced directly instead of via `json_extract`.\n */\nexport function isColumn(field: string, columns?: Set<string>): boolean {\n return isReserved(field) || (columns?.has(field) ?? false);\n}\n\n/**\n * Convert a dotted document path (`address.city`, `items.0.name`) into a\n * SQLite JSON path (`$.address.city`, `$.items[0].name`), quoting segments\n * that are not bare identifiers.\n */\nexport function jsonPath(field: string): string {\n let path = \"$\";\n for (const seg of field.split(\".\")) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(seg)) {\n path += \".\" + seg;\n } else if (/^\\d+$/.test(seg)) {\n path += \"[\" + seg + \"]\";\n } else {\n path += '.\"' + seg.replace(/\"/g, '\"\"') + '\"';\n }\n }\n return path;\n}\n\n/** A JSON path wrapped as a single-quoted SQL string literal. */\nexport function pathLiteral(field: string): string {\n return \"'\" + jsonPath(field).replace(/'/g, \"''\") + \"'\";\n}\n\n/**\n * SQL expression yielding the value of `field` for a row. System fields and\n * declared structured columns resolve to a bare column; everything else is\n * read from the `data` JSON blob via `json_extract`.\n */\nexport function fieldExpr(field: string, columns?: Set<string>): string {\n if (isColumn(field, columns)) return quoteIdent(field);\n return `json_extract(data, ${pathLiteral(field)})`;\n}\n\n/** Quote a SQL identifier, doubling embedded quotes (defense-in-depth). */\nexport function quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Normalize a JS value into something better-sqlite3 can bind.\n * better-sqlite3 only accepts numbers, bigints, strings, Buffers and null —\n * so booleans, Dates, undefined and objects are converted here.\n */\nexport function bindable(value: any): number | bigint | string | Buffer | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.toISOString();\n if (\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n ) {\n return value;\n }\n if (Buffer.isBuffer(value)) return value;\n // Arrays / nested objects: compare against SQLite's minified JSON text.\n return JSON.stringify(value);\n}\n","import type { WhereInput, FieldFilter } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { fieldExpr, pathLiteral, bindable, isColumn } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\n /** Declared native columns (structured collections). */\n columns?: Set<string>;\n /** Called with every document path referenced (for auto-index tracking). */\n onPath?: (path: string) => void;\n}\n\n/** Build a SQL boolean expression from a where clause. Returns `1` when empty. */\nexport function buildWhere(\n where: WhereInput | undefined,\n ctx: WhereContext,\n): string {\n if (!where) return \"1\";\n return translateObject(where, ctx) || \"1\";\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nfunction translateObject(where: WhereInput, ctx: WhereContext): string {\n const parts: string[] = [];\n\n for (const key of Object.keys(where)) {\n const value = (where as any)[key];\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) {\n const join = key === \"AND\" ? \" AND \" : \" OR \";\n parts.push(\"(\" + subs.join(join) + \")\");\n }\n } else if (key === \"NOT\") {\n const subs = asArray(value)\n .map((w: WhereInput) => translateObject(w, ctx))\n .filter(Boolean);\n if (subs.length) parts.push(\"NOT (\" + subs.join(\" AND \") + \")\");\n } else {\n const clause = translateField(key, value, ctx);\n if (clause) parts.push(clause);\n }\n }\n\n return parts.join(\" AND \");\n}\n\nfunction isFilterObject(v: any): v is FieldFilter {\n return (\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v) &&\n (v.constructor === Object || v.constructor === undefined)\n );\n}\n\nfunction translateField(\n field: string,\n condition: any,\n ctx: WhereContext,\n): string {\n if (ctx.onPath && !isColumn(field, ctx.columns)) ctx.onPath(field);\n const expr = fieldExpr(field, ctx.columns);\n\n // Scalar (or array/Date) value is shorthand for `{ equals: value }`.\n if (!isFilterObject(condition)) {\n return eqExpr(expr, condition, ctx);\n }\n\n const filter = condition as Record<string, any>;\n const ci = filter.mode === \"insensitive\";\n const clauses: string[] = [];\n for (const op of Object.keys(filter)) {\n const v = filter[op];\n if (v === undefined || op === \"mode\") continue;\n\n switch (op) {\n case \"equals\":\n clauses.push(eqExpr(expr, v, ctx));\n break;\n case \"not\":\n clauses.push(notExpr(expr, v, ctx));\n break;\n case \"gt\":\n clauses.push(cmp(expr, \">\", v, ctx));\n break;\n case \"gte\":\n clauses.push(cmp(expr, \">=\", v, ctx));\n break;\n case \"lt\":\n clauses.push(cmp(expr, \"<\", v, ctx));\n break;\n case \"lte\":\n clauses.push(cmp(expr, \"<=\", v, ctx));\n break;\n case \"in\":\n clauses.push(inExpr(expr, v, ctx, false));\n break;\n case \"notIn\":\n clauses.push(inExpr(expr, v, ctx, true));\n break;\n case \"contains\":\n clauses.push(containsExpr(field, expr, v, ctx, ci));\n break;\n case \"startsWith\":\n ctx.params.push(bindable(v));\n clauses.push(\n ci ? `instr(lower(${expr}), lower(?)) = 1` : `instr(${expr}, ?) = 1`,\n );\n break;\n case \"endsWith\":\n ctx.params.push(bindable(v));\n ctx.params.push(bindable(v));\n clauses.push(\n ci\n ? `substr(lower(${expr}), -length(?)) = lower(?)`\n : `substr(${expr}, -length(?)) = ?`,\n );\n break;\n case \"has\":\n clauses.push(hasExpr(field, expr, v, ctx));\n break;\n case \"exists\":\n clauses.push(existsExpr(field, expr, !!v, ctx.columns));\n break;\n default:\n throw new MonliteQueryError(\n `Unknown where operator \"${op}\" on field \"${field}\"`,\n );\n }\n }\n\n if (!clauses.length) return \"\";\n return clauses.length === 1 ? clauses[0]! : \"(\" + clauses.join(\" AND \") + \")\";\n}\n\nfunction eqExpr(expr: string, v: any, ctx: WhereContext): string {\n if (v === null) return `${expr} IS NULL`;\n ctx.params.push(bindable(v));\n return `${expr} = ?`;\n}\n\nfunction notExpr(expr: string, v: any, ctx: WhereContext): string {\n // Mongo/Prisma semantics: a missing field counts as \"not equal\".\n if (v === null) return `${expr} IS NOT NULL`;\n ctx.params.push(bindable(v));\n return `(${expr} IS NULL OR ${expr} != ?)`;\n}\n\nfunction cmp(expr: string, op: string, v: any, ctx: WhereContext): string {\n ctx.params.push(bindable(v));\n return `${expr} ${op} ?`;\n}\n\nfunction inExpr(\n expr: string,\n arr: any,\n ctx: WhereContext,\n negate: boolean,\n): string {\n if (!Array.isArray(arr)) {\n throw new MonliteQueryError(`${negate ? \"notIn\" : \"in\"} expects an array`);\n }\n if (arr.length === 0) return negate ? \"1\" : \"0\";\n const placeholders = arr\n .map((v) => {\n ctx.params.push(bindable(v));\n return \"?\";\n })\n .join(\", \");\n return negate\n ? `(${expr} IS NULL OR ${expr} NOT IN (${placeholders}))`\n : `${expr} IN (${placeholders})`;\n}\n\n/**\n * `contains` works on strings (case-sensitive substring via `instr`) and arrays\n * (element membership). `instr` is used instead of `LIKE` so that `%`/`_` are\n * treated literally and matching is case-sensitive, matching Prisma semantics.\n */\nfunction containsExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n ci: boolean,\n): string {\n const sub = ci\n ? `instr(lower(${expr}), lower(?)) > 0`\n : `instr(${expr}, ?) > 0`;\n if (isColumn(field, ctx.columns)) {\n ctx.params.push(bindable(v));\n return sub;\n }\n const path = pathLiteral(field);\n const member = ci ? `lower(value) = lower(?)` : `value = ?`;\n ctx.params.push(bindable(v)); // array branch\n ctx.params.push(bindable(v)); // string branch\n return (\n `(CASE WHEN json_type(data, ${path}) = 'array' ` +\n `THEN EXISTS (SELECT 1 FROM json_each(data, ${path}) WHERE ${member}) ` +\n `ELSE ${sub} END)`\n );\n}\n\nfunction hasExpr(\n field: string,\n expr: string,\n v: any,\n ctx: WhereContext,\n): string {\n ctx.params.push(bindable(v));\n if (isColumn(field, ctx.columns)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(\n field: string,\n expr: string,\n want: boolean,\n columns?: Set<string>,\n): string {\n if (isColumn(field, columns)) {\n return want ? `${expr} IS NOT NULL` : `${expr} IS NULL`;\n }\n const path = pathLiteral(field);\n return want\n ? `json_type(data, ${path}) IS NOT NULL`\n : `json_type(data, ${path}) IS NULL`;\n}\n","import type { OrderBy } from \"../types.js\";\nimport { fieldExpr, isColumn } from \"./sql.js\";\n\n/** Build an `ORDER BY` clause from an orderBy spec. Returns \"\" when empty. */\nexport function buildOrderBy(\n orderBy: OrderBy | undefined,\n onPath?: (p: string) => void,\n columns?: Set<string>,\n): string {\n if (!orderBy) return \"\";\n\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const parts: string[] = [];\n\n for (const obj of list) {\n for (const field of Object.keys(obj)) {\n const dir = (obj as any)[field];\n if (dir === undefined) continue;\n if (onPath && !isColumn(field, columns)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field, columns)} ${d}`);\n }\n }\n\n return parts.length ? \"ORDER BY \" + parts.join(\", \") : \"\";\n}\n","/** Deep get/set/unset on plain objects using dot-notation paths. */\n\nimport { MonliteQueryError } from \"../errors.js\";\n\nconst FORBIDDEN = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\n/** Reject path segments that could pollute the prototype chain. */\nfunction safeSegments(path: string): string[] {\n const segs = path.split(\".\");\n for (const seg of segs) {\n if (FORBIDDEN.has(seg)) {\n throw new MonliteQueryError(`Illegal path segment \"${seg}\" in \"${path}\"`);\n }\n }\n return segs;\n}\n\nexport function getPath(obj: any, path: string): any {\n let cur = obj;\n for (const seg of safeSegments(path)) {\n if (cur == null) return undefined;\n cur = cur[seg];\n }\n return cur;\n}\n\nexport function setPath(obj: any, path: string, value: any): void {\n const segs = safeSegments(path);\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") cur[seg] = {};\n cur = cur[seg];\n }\n cur[segs[segs.length - 1]!] = value;\n}\n\nexport function unsetPath(obj: any, path: string): void {\n const segs = safeSegments(path);\n let cur = obj;\n for (let i = 0; i < segs.length - 1; i++) {\n const seg = segs[i]!;\n if (cur[seg] == null || typeof cur[seg] !== \"object\") return;\n cur = cur[seg];\n }\n delete cur[segs[segs.length - 1]!];\n}\n","import type { Select } from \"../types.js\";\nimport { getPath, setPath } from \"./path.js\";\n\n/**\n * Project a document down to the selected fields. Supports dot-notation paths,\n * reconstructing nested objects. With no select, the document is returned as-is.\n */\nexport function project(\n doc: Record<string, any>,\n select?: Select,\n): Record<string, any> {\n if (!select) return doc;\n const keys = Object.keys(select).filter((k) => (select as any)[k]);\n if (!keys.length) return doc;\n\n const out: Record<string, any> = {};\n for (const key of keys) {\n const value = getPath(doc, key);\n if (value !== undefined) setPath(out, key, value);\n }\n return out;\n}\n","import type { UpdateData } from \"../types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { getPath, setPath, unsetPath } from \"./path.js\";\n\nconst UPDATE_OPS = new Set([\"$set\", \"$unset\", \"$inc\", \"$push\", \"$pull\"]);\n\n/** True when the payload uses update operators rather than plain fields. */\nexport function isUpdateOperators(data: any): boolean {\n return (\n data != null &&\n typeof data === \"object\" &&\n Object.keys(data).some((k) => k.startsWith(\"$\"))\n );\n}\n\nfunction sameValue(a: any, b: any): boolean {\n if (a === b) return true;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * Apply an update payload to a (system-field-free) document, returning a new\n * document. Plain payloads are shallow-merged; operator payloads ($set, $inc,\n * $push, $pull, $unset) are applied in order.\n */\nexport function applyUpdate(\n doc: Record<string, any>,\n data: UpdateData,\n): Record<string, any> {\n const next = structuredClone(doc);\n\n if (!isUpdateOperators(data)) {\n return Object.assign(next, data);\n }\n\n for (const key of Object.keys(data)) {\n if (!key.startsWith(\"$\")) {\n throw new MonliteQueryError(\n `Cannot mix update operators with plain field \"${key}\". ` +\n `Use either a plain object or update operators, not both.`,\n );\n }\n if (!UPDATE_OPS.has(key)) {\n throw new MonliteQueryError(`Unknown update operator \"${key}\"`);\n }\n }\n\n const ops = data as Record<string, Record<string, any>>;\n\n if (ops.$set) {\n for (const [path, value] of Object.entries(ops.$set))\n setPath(next, path, value);\n }\n if (ops.$inc) {\n for (const [path, by] of Object.entries(ops.$inc)) {\n if (typeof by !== \"number\" || !Number.isFinite(by)) {\n throw new MonliteQueryError(\n `$inc on \"${path}\" requires a finite number, got ${JSON.stringify(by)}`,\n );\n }\n const cur = getPath(next, path);\n setPath(next, path, (typeof cur === \"number\" ? cur : 0) + by);\n }\n }\n if (ops.$push) {\n for (const [path, value] of Object.entries(ops.$push)) {\n const cur = getPath(next, path);\n const arr = Array.isArray(cur) ? cur.slice() : [];\n // `{ $each: [...] }` pushes multiple values.\n if (\n value &&\n typeof value === \"object\" &&\n Array.isArray((value as any).$each)\n ) {\n arr.push(...(value as any).$each);\n } else {\n arr.push(value);\n }\n setPath(next, path, arr);\n }\n }\n if (ops.$pull) {\n for (const [path, value] of Object.entries(ops.$pull)) {\n const cur = getPath(next, path);\n if (Array.isArray(cur)) {\n setPath(\n next,\n path,\n cur.filter((x) => !sameValue(x, value)),\n );\n }\n }\n }\n if (ops.$unset) {\n for (const path of Object.keys(ops.$unset)) unsetPath(next, path);\n }\n\n return next;\n}\n","import type {\n AggregateArgs,\n AggregateResult,\n GroupByArgs,\n GroupByResult,\n HavingComparison,\n HavingInput,\n} from \"../types.js\";\nimport type { Driver } from \"../driver/types.js\";\nimport { MonliteQueryError } from \"../errors.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr, isColumn } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\n /** Declared native columns (structured collections). */\n columns?: Set<string>;\n}\n\nconst ACCUMULATORS = [\"_sum\", \"_avg\", \"_min\", \"_max\"] as const;\ntype Accumulator = (typeof ACCUMULATORS)[number];\n\nconst SQL_FN: Record<Accumulator, string> = {\n _sum: \"SUM\",\n _avg: \"AVG\",\n _min: \"MIN\",\n _max: \"MAX\",\n};\n\ninterface AccCol {\n alias: string;\n kind: Accumulator;\n field: string;\n}\n\n/** Build the accumulator SELECT fragments shared by aggregate and groupBy. */\nfunction buildAccumulators(\n args: { _sum?: any; _avg?: any; _min?: any; _max?: any },\n onPath: (p: string) => void,\n columns?: Set<string>,\n): { selects: string[]; cols: AccCol[] } {\n const selects: string[] = [];\n const cols: AccCol[] = [];\n let i = 0;\n\n for (const kind of ACCUMULATORS) {\n const selection = args[kind];\n if (!selection) continue;\n for (const field of Object.keys(selection)) {\n if (!selection[field]) continue;\n if (!isColumn(field, columns)) onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field, columns)}) AS ${alias}`);\n cols.push({ alias, kind, field });\n }\n }\n return { selects, cols };\n}\n\nexport function aggregate(\n ctx: AggContext,\n args: AggregateArgs,\n): AggregateResult {\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: ctx.onPath,\n columns: ctx.columns,\n });\n const { selects, cols } = buildAccumulators(args, ctx.onPath, ctx.columns);\n\n // Always compute count internally; expose only when requested.\n const allSelects = [`COUNT(*) AS agg_count`, ...selects];\n const sql = `SELECT ${allSelects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where}`;\n const row = (ctx.db.prepare(sql).get(...params) ?? {}) as Record<string, any>;\n\n const result: AggregateResult = {};\n if (args._count) result._count = row.agg_count ?? 0;\n for (const col of cols) {\n const bucket = (result[col.kind] ??= {});\n bucket[col.field] = row[col.alias] ?? null;\n }\n return result;\n}\n\nconst HAVING_FNS = [\n [\"_sum\", \"SUM\"],\n [\"_avg\", \"AVG\"],\n [\"_min\", \"MIN\"],\n [\"_max\", \"MAX\"],\n] as const;\n\nfunction comparisonSql(\n expr: string,\n cmp: HavingComparison,\n params: any[],\n): string[] {\n const out: string[] = [];\n const ops: Array<[keyof HavingComparison, string]> = [\n [\"equals\", \"=\"],\n [\"not\", \"<>\"],\n [\"gt\", \">\"],\n [\"gte\", \">=\"],\n [\"lt\", \"<\"],\n [\"lte\", \"<=\"],\n ];\n for (const [key, op] of ops) {\n const v = cmp[key];\n if (v === undefined) continue;\n params.push(v);\n out.push(`${expr} ${op} ?`);\n }\n return out;\n}\n\n/** Build a SQL `HAVING` expression from a having spec. Returns \"\" when empty. */\nfunction buildHaving(\n having: HavingInput,\n params: any[],\n columns?: Set<string>,\n): string {\n const parts: string[] = [];\n if (having._count) {\n parts.push(...comparisonSql(\"COUNT(*)\", having._count, params));\n }\n for (const [kind, fn] of HAVING_FNS) {\n const selection = having[kind];\n if (!selection) continue;\n for (const field of Object.keys(selection)) {\n parts.push(\n ...comparisonSql(\n `${fn}(${fieldExpr(field, columns)})`,\n selection[field]!,\n params,\n ),\n );\n }\n }\n return parts.join(\" AND \");\n}\n\nexport function groupBy(ctx: AggContext, args: GroupByArgs): GroupByResult[] {\n if (!Array.isArray(args.by) || args.by.length === 0) {\n throw new MonliteQueryError(\"groupBy requires a non-empty `by` array\");\n }\n\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: ctx.onPath,\n columns: ctx.columns,\n });\n\n // Use generated aliases (never the raw field name) so a user-supplied `by`\n // field can never break out of the SQL — then map back to the field in JS.\n const groupExprs: string[] = [];\n const groupCols: Array<{ alias: string; field: string }> = [];\n const selects: string[] = [];\n args.by.forEach((field, gi) => {\n if (!isColumn(field, ctx.columns)) ctx.onPath(field);\n const expr = fieldExpr(field, ctx.columns);\n const alias = `grp_${gi}`;\n groupExprs.push(expr);\n selects.push(`${expr} AS ${alias}`);\n groupCols.push({ alias, field });\n });\n\n selects.push(`COUNT(*) AS agg_count`);\n const { selects: accSelects, cols } = buildAccumulators(\n args,\n ctx.onPath,\n ctx.columns,\n );\n selects.push(...accSelects);\n\n let sql =\n `SELECT ${selects.join(\", \")} FROM \"${ctx.table}\" WHERE ${where} ` +\n `GROUP BY ${groupExprs.join(\", \")}`;\n\n if (args.having) {\n // HAVING params come after WHERE params and before LIMIT/OFFSET — push now.\n const havingSql = buildHaving(args.having, params, ctx.columns);\n if (havingSql) sql += ` HAVING ${havingSql}`;\n }\n\n if (args.orderBy) {\n const parts: string[] = [];\n for (const key of Object.keys(args.orderBy)) {\n const dir =\n String(args.orderBy[key]).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n if (key === \"_count\") parts.push(`agg_count ${dir}`);\n else parts.push(`${fieldExpr(key, ctx.columns)} ${dir}`);\n }\n if (parts.length) sql += ` ORDER BY ${parts.join(\", \")}`;\n }\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = ctx.db.prepare(sql).all(...params) as Array<Record<string, any>>;\n\n return rows.map((row) => {\n const out: GroupByResult = {};\n for (const { alias, field } of groupCols) out[field] = row[alias];\n if (args._count) out._count = row.agg_count;\n for (const col of cols) {\n (out[col.kind] ??= {})[col.field] = row[col.alias] ?? null;\n }\n return out;\n });\n}\n","import type { Monlite } from \"./db.js\";\nimport type {\n AggregateArgs,\n AggregateResult,\n CollectionMode,\n CollectionOptions,\n ColumnDef,\n ColumnType,\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n DeleteArgs,\n Doc,\n FindFirstArgs,\n FindManyArgs,\n GroupByArgs,\n GroupByResult,\n UpdateArgs,\n UpdateData,\n UpsertArgs,\n WhereInput,\n WithId,\n} from \"./types.js\";\nimport { objectId } from \"./id.js\";\nimport {\n MonliteError,\n MonliteQueryError,\n normalizeDriverError,\n} from \"./errors.js\";\nimport { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport {\n bindable,\n fieldExpr,\n isColumn,\n pathLiteral,\n RESERVED_FIELDS,\n} from \"./query/sql.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ntype Row = Record<string, any>;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\nconst NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nfunction sqliteType(type: ColumnType): string {\n return type === \"JSON\" ? \"TEXT\" : type;\n}\n\nfunction formatDefault(value: string | number | null): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return String(value);\n return `'${String(value).replace(/'/g, \"''\")}'`;\n}\n\n/**\n * A collection. In **document** mode (default) every document is stored as JSON\n * in a `data` column — schema-free. In **structured** mode (when a `schema` is\n * given) the listed fields become real, typed SQL columns (fast, indexable,\n * joinable) while any other fields overflow into a JSON `data` column. The CRUD\n * and query API is identical in both modes.\n */\nexport class Collection<T = Doc> {\n readonly mode: CollectionMode;\n\n private initialized = false;\n private readonly columnDefs: Record<string, ColumnDef> = {};\n private readonly columnOrder: string[] = [];\n /** Declared native columns (empty in document mode). */\n private readonly columns = new Set<string>();\n private readonly jsonColumns = new Set<string>();\n private insertSqlCache?: string;\n\n private readonly trackPath = (path: string) =>\n this.mon.autoIndexer.track(this.name, path);\n\n constructor(\n private readonly mon: Monlite,\n readonly name: string,\n options: CollectionOptions = {},\n ) {\n this.mode = options.schema ? \"structured\" : \"document\";\n if (options.schema) {\n for (const [field, def] of Object.entries(options.schema)) {\n if (!NAME_RE.test(field)) {\n throw new MonliteError(`Invalid column name \"${field}\"`);\n }\n if (RESERVED_FIELDS.has(field) || field === \"data\") {\n throw new MonliteError(\n `Column \"${field}\" is reserved by monlite and cannot be declared`,\n );\n }\n const normalized: ColumnDef =\n typeof def === \"string\" ? { type: def } : def;\n if (\n normalized.references &&\n !/^[A-Za-z_][A-Za-z0-9_]*(\\([A-Za-z_][A-Za-z0-9_]*\\))?$/.test(\n normalized.references,\n )\n ) {\n throw new MonliteError(\n `Invalid references \"${normalized.references}\" on column \"${field}\"`,\n );\n }\n this.columnDefs[field] = normalized;\n this.columnOrder.push(field);\n this.columns.add(field);\n if (normalized.type === \"JSON\") this.jsonColumns.add(field);\n }\n }\n }\n\n private get db() {\n return this.mon.driver;\n }\n\n /** Run a DB operation, normalizing driver errors into typed MonliteErrors. */\n private guard<R>(fn: () => R): R {\n try {\n return fn();\n } catch (err) {\n throw normalizeDriverError(err, this.name);\n }\n }\n\n /** Native column names declared for this collection (structured mode). */\n get columnNames(): string[] {\n return [...this.columnOrder];\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\n\n if (this.mode === \"document\") {\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${this.name}\" (\n _id TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n } else {\n const lines = [\n `_id TEXT PRIMARY KEY`,\n `created_at INTEGER NOT NULL`,\n `updated_at INTEGER NOT NULL`,\n `data TEXT NOT NULL DEFAULT '{}'`,\n ];\n for (const field of this.columnOrder) {\n const def = this.columnDefs[field]!;\n let line = `\"${field}\" ${sqliteType(def.type)}`;\n if (def.notNull) line += \" NOT NULL\";\n if (def.unique) line += \" UNIQUE\";\n if (def.default !== undefined)\n line += ` DEFAULT ${formatDefault(def.default)}`;\n if (def.references) line += ` REFERENCES ${def.references}`;\n lines.push(line);\n }\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${this.name}\" (\\n ${lines.join(\",\\n \")}\\n)`,\n );\n for (const field of this.columnOrder) {\n if (this.columnDefs[field]!.index) {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS \"idx_${this.name}_${field}\" ON \"${this.name}\"(\"${field}\")`,\n );\n }\n }\n }\n this.initialized = true;\n }\n\n /* --------------------------- row <-> doc -------------------------- */\n\n private rowToDoc(row: Row): WithId<T> {\n const doc =\n this.mode === \"document\"\n ? (JSON.parse(row.data) as Record<string, any>)\n : (JSON.parse(row.data ?? \"{}\") as Record<string, any>);\n\n if (this.mode === \"structured\") {\n for (const field of this.columnOrder) {\n const value = row[field];\n if (value === undefined) continue;\n if (value === null) {\n doc[field] = null; // explicit null round-trips (SQL columns always exist)\n continue;\n }\n doc[field] = this.jsonColumns.has(field) ? JSON.parse(value) : value;\n }\n }\n\n doc._id = row._id;\n doc.created_at = row.created_at;\n doc.updated_at = row.updated_at;\n return doc as WithId<T>;\n }\n\n private encodeColumn(field: string, value: any): any {\n if (this.jsonColumns.has(field)) {\n return value === undefined ? null : JSON.stringify(value);\n }\n if (\n value !== null &&\n typeof value === \"object\" &&\n !(value instanceof Date) &&\n !Buffer.isBuffer(value)\n ) {\n throw new MonliteQueryError(\n `Column \"${field}\" cannot store an object/array. Declare it as ` +\n `{ type: \"JSON\" } to store structured values.`,\n );\n }\n return bindable(value);\n }\n\n private insertColumns(): string[] {\n return this.mode === \"document\"\n ? [\"_id\", \"data\", \"created_at\", \"updated_at\"]\n : [\"_id\", \"created_at\", \"updated_at\", \"data\", ...this.columnOrder];\n }\n\n private insertSql(): string {\n if (this.insertSqlCache) return this.insertSqlCache;\n const cols = this.insertColumns();\n const list = cols.map((c) => `\"${c}\"`).join(\", \");\n const placeholders = cols.map(() => \"?\").join(\", \");\n return (this.insertSqlCache = `INSERT INTO \"${this.name}\" (${list}) VALUES (${placeholders})`);\n }\n\n /** Split an input document into a row aligned with `insertColumns()`. */\n private buildInsert(input: Record<string, any>): {\n _id: string;\n created_at: number;\n updated_at: number;\n values: any[];\n returned: WithId<T>;\n } {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n const returned = {\n ...doc,\n _id: id,\n created_at: now,\n updated_at: now,\n } as WithId<T>;\n\n if (this.mode === \"document\") {\n return {\n _id: id,\n created_at: now,\n updated_at: now,\n values: [id, JSON.stringify(doc), now, now],\n returned,\n };\n }\n\n const overflow: Record<string, any> = {};\n const colValues: Record<string, any> = {};\n for (const [k, v] of Object.entries(doc)) {\n if (this.columns.has(k)) colValues[k] = v;\n else overflow[k] = v;\n }\n const values = [\n id,\n now,\n now,\n JSON.stringify(overflow),\n ...this.columnOrder.map((c) =>\n c in colValues ? this.encodeColumn(c, colValues[c]) : null,\n ),\n ];\n return { _id: id, created_at: now, updated_at: now, values, returned };\n }\n\n /** Build the `SET` clause + values to persist an updated document. */\n private buildUpdateSet(\n updatedDoc: Record<string, any>,\n now: number,\n ): { setSql: string; values: any[] } {\n if (this.mode === \"document\") {\n return {\n setSql: `data = ?, updated_at = ?`,\n values: [JSON.stringify(updatedDoc), now],\n };\n }\n const overflow: Record<string, any> = {};\n const colValues: Record<string, any> = {};\n for (const [k, v] of Object.entries(updatedDoc)) {\n if (this.columns.has(k)) colValues[k] = v;\n else overflow[k] = v;\n }\n const setParts = this.columnOrder.map((c) => `\"${c}\" = ?`);\n setParts.push(`data = ?`, `updated_at = ?`);\n const values = [\n ...this.columnOrder.map((c) =>\n c in colValues ? this.encodeColumn(c, colValues[c]) : null,\n ),\n JSON.stringify(overflow),\n now,\n ];\n return { setSql: setParts.join(\", \"), values };\n }\n\n /** Sync store for recording local changes (both document and structured). */\n private get recorder() {\n return this.mon.$sync;\n }\n\n /** @internal Read a full document by id (mode-aware), synchronously. */\n getRaw(id: string): WithId<T> | null {\n this.ensureTable();\n const row = this.db\n .prepare(`SELECT * FROM \"${this.name}\" WHERE _id = ?`)\n .get(id) as Row | undefined;\n return row ? this.rowToDoc(row) : null;\n }\n\n /**\n * @internal Apply a remote change to storage WITHOUT recording it to the\n * change feed (the sync store records the `remote` feed row itself). Used by\n * `@monlite/sync` so structured collections sync correctly through the same\n * column/overflow split as local writes.\n */\n applyRemoteWrite(\n op: \"upsert\" | \"delete\",\n id: string,\n doc: Record<string, any> | undefined,\n ts: number,\n ): void {\n this.ensureTable();\n if (op === \"delete\") {\n this.db.prepare(`DELETE FROM \"${this.name}\" WHERE _id = ?`).run(id);\n return;\n }\n const clean = stripSystem(doc ?? {});\n const createdAt =\n typeof (doc as any)?.created_at === \"number\"\n ? (doc as any).created_at\n : ts;\n\n if (this.mode === \"document\") {\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)\n ON CONFLICT(_id) DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`,\n )\n .run(id, JSON.stringify(clean), createdAt, ts);\n return;\n }\n\n const overflow: Record<string, any> = {};\n const colValues: Record<string, any> = {};\n for (const [k, v] of Object.entries(clean)) {\n if (this.columns.has(k)) colValues[k] = v;\n else overflow[k] = v;\n }\n const cols = [\n \"_id\",\n \"created_at\",\n \"updated_at\",\n \"data\",\n ...this.columnOrder,\n ];\n const values = [\n id,\n createdAt,\n ts,\n JSON.stringify(overflow),\n ...this.columnOrder.map((c) =>\n c in colValues ? this.encodeColumn(c, colValues[c]) : null,\n ),\n ];\n const colList = cols.map((c) => `\"${c}\"`).join(\", \");\n const placeholders = cols.map(() => \"?\").join(\", \");\n const updateSet = cols\n .filter((c) => c !== \"_id\" && c !== \"created_at\")\n .map((c) => `\"${c}\" = excluded.\"${c}\"`)\n .join(\", \");\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (${colList}) VALUES (${placeholders}) ` +\n `ON CONFLICT(_id) DO UPDATE SET ${updateSet}`,\n )\n .run(...values);\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.buildInsert(args.data);\n const recorder = this.recorder;\n const write = () => {\n this.db.prepare(this.insertSql()).run(...row.values);\n recorder?.recordLocal(this.name, row._id, \"upsert\", row.created_at);\n };\n this.guard(() => (recorder ? this.db.transaction(write) : write()));\n return row.returned;\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(this.insertSql());\n const recorder = this.recorder;\n this.guard(() =>\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.buildInsert(item);\n stmt.run(...row.values);\n recorder?.recordLocal(this.name, row._id, \"upsert\", row.created_at);\n }\n }),\n );\n return { count: args.data.length };\n }\n\n /* ------------------------------ read ------------------------------ */\n\n async findMany(args: FindManyArgs<T> = {}): Promise<WithId<T>[]> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n let sql = `SELECT * FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath, this.columns);\n if (order) sql += \" \" + order;\n\n if (args.take != null) {\n sql += \" LIMIT ?\";\n params.push(args.take);\n }\n if (args.skip != null) {\n sql += (args.take != null ? \"\" : \" LIMIT -1\") + \" OFFSET ?\";\n params.push(args.skip);\n }\n\n const rows = this.db.prepare(sql).all(...params) as Row[];\n return rows.map((r) => project(this.rowToDoc(r), args.select) as WithId<T>);\n }\n\n async findFirst(args: FindFirstArgs<T> = {}): Promise<WithId<T> | null> {\n const rows = await this.findMany({ ...args, take: 1 });\n return rows[0] ?? null;\n }\n\n /** Alias of {@link findFirst} for Prisma familiarity. */\n async findUnique(args: FindFirstArgs<T> = {}): Promise<WithId<T> | null> {\n return this.findFirst(args);\n }\n\n /** Like {@link findFirst} but throws if no document matches. */\n async findFirstOrThrow(args: FindFirstArgs<T> = {}): Promise<WithId<T>> {\n const doc = await this.findFirst(args);\n if (!doc) throw new MonliteError(`No document found in \"${this.name}\"`);\n return doc;\n }\n\n /** True if at least one document matches. */\n async exists(where?: WhereInput<T>): Promise<boolean> {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n const row = this.db\n .prepare(`SELECT 1 FROM \"${this.name}\" WHERE ${clause} LIMIT 1`)\n .get(...params);\n return row != null;\n }\n\n async findById(id: string): Promise<WithId<T> | null> {\n this.ensureTable();\n const row = this.db\n .prepare(`SELECT * FROM \"${this.name}\" WHERE _id = ?`)\n .get(id) as Row | undefined;\n return row ? this.rowToDoc(row) : null;\n }\n\n async count(args: CountArgs<T> = {}): Promise<number> {\n this.ensureTable();\n const params: any[] = [];\n const where = buildWhere(args.where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n const row = this.db\n .prepare(`SELECT COUNT(*) AS n FROM \"${this.name}\" WHERE ${where}`)\n .get(...params) as { n: number };\n return row.n;\n }\n\n /**\n * Return the distinct values of a field. Array fields stored in JSON are\n * unwound (each element counts as a value), matching MongoDB's `distinct`.\n */\n async distinct(field: string, where?: WhereInput<T>): Promise<any[]> {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n\n let sql: string;\n if (isColumn(field, this.columns)) {\n sql =\n `SELECT DISTINCT ${fieldExpr(field, this.columns)} AS v FROM \"${this.name}\" ` +\n `WHERE ${clause} ORDER BY v`;\n } else {\n this.trackPath(field);\n sql =\n `SELECT DISTINCT je.value AS v FROM \"${this.name}\" ` +\n `CROSS JOIN json_each(\"${this.name}\".data, ${pathLiteral(field)}) je ` +\n `WHERE ${clause} ORDER BY v`;\n }\n\n return this.guard(() => {\n const rows = this.db.prepare(sql).all(...params) as Array<{ v: any }>;\n return rows.map((r) => r.v);\n });\n }\n\n /* ----------------------------- update ----------------------------- */\n\n private runUpdate(\n where: WhereInput<T> | undefined,\n data: UpdateData<T>,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n let selectSql = `SELECT * FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const now = Date.now();\n const recorder = this.recorder;\n\n return this.guard(() =>\n this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = stripSystem(this.rowToDoc(row));\n const updated = stripSystem(applyUpdate(current, data));\n const { setSql, values } = this.buildUpdateSet(updated, now);\n this.db\n .prepare(`UPDATE \"${this.name}\" SET ${setSql} WHERE _id = ?`)\n .run(...values, row._id);\n recorder?.recordLocal(this.name, row._id, \"upsert\", now);\n out.push({\n ...updated,\n _id: row._id,\n created_at: row.created_at,\n updated_at: now,\n } as WithId<T>);\n }\n return out;\n }),\n );\n }\n\n async update(args: UpdateArgs<T>): Promise<WithId<T> | null> {\n return this.runUpdate(args.where, args.data, true)[0] ?? null;\n }\n\n async updateMany(args: UpdateArgs<T>): Promise<{ count: number }> {\n return { count: this.runUpdate(args.where, args.data, false).length };\n }\n\n async upsert(args: UpsertArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n // Find + create/update run inside ONE transaction so concurrent/interleaved\n // upserts can't both miss and double-insert.\n return this.guard(() =>\n this.db.transaction(() => {\n const params: any[] = [];\n const clause = buildWhere(args.where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n const row = this.db\n .prepare(`SELECT * FROM \"${this.name}\" WHERE ${clause} LIMIT 1`)\n .get(...params) as Row | undefined;\n\n const now = Date.now();\n const recorder = this.recorder;\n\n if (row) {\n const current = stripSystem(this.rowToDoc(row));\n const updated = stripSystem(applyUpdate(current, args.update));\n const { setSql, values } = this.buildUpdateSet(updated, now);\n this.db\n .prepare(`UPDATE \"${this.name}\" SET ${setSql} WHERE _id = ?`)\n .run(...values, row._id);\n recorder?.recordLocal(this.name, row._id, \"upsert\", now);\n return {\n ...updated,\n _id: row._id,\n created_at: row.created_at,\n updated_at: now,\n } as WithId<T>;\n }\n\n const ins = this.buildInsert(args.create);\n this.db.prepare(this.insertSql()).run(...ins.values);\n recorder?.recordLocal(this.name, ins._id, \"upsert\", ins.created_at);\n return ins.returned;\n }),\n );\n }\n\n /* ----------------------------- delete ----------------------------- */\n\n private runDelete(\n where: WhereInput<T> | undefined,\n single: boolean,\n ): WithId<T>[] {\n this.ensureTable();\n const params: any[] = [];\n const clause = buildWhere(where, {\n params,\n onPath: this.trackPath,\n columns: this.columns,\n });\n let selectSql = `SELECT * FROM \"${this.name}\" WHERE ${clause}`;\n if (single) selectSql += \" LIMIT 1\";\n\n const rows = this.db.prepare(selectSql).all(...params) as Row[];\n if (!rows.length) return [];\n\n const stmt = this.db.prepare(`DELETE FROM \"${this.name}\" WHERE _id = ?`);\n const recorder = this.recorder;\n const now = Date.now();\n this.guard(() =>\n this.db.transaction(() => {\n for (const row of rows) {\n stmt.run(row._id);\n recorder?.recordLocal(this.name, row._id, \"delete\", now);\n }\n }),\n );\n\n return rows.map((r) => this.rowToDoc(r));\n }\n\n async delete(args: DeleteArgs<T>): Promise<WithId<T> | null> {\n return this.runDelete(args.where, true)[0] ?? null;\n }\n\n async deleteMany(\n args: DeleteArgs<T> = { where: undefined as any },\n ): Promise<{ count: number }> {\n return { count: this.runDelete(args.where, false).length };\n }\n\n /* --------------------------- aggregation -------------------------- */\n\n async aggregate(args: AggregateArgs<T> = {}): Promise<AggregateResult> {\n this.ensureTable();\n return this.guard(() =>\n aggregate(\n {\n db: this.db,\n table: this.name,\n onPath: this.trackPath,\n columns: this.columns,\n },\n args,\n ),\n );\n }\n\n async groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]> {\n this.ensureTable();\n return this.guard(() =>\n groupBy(\n {\n db: this.db,\n table: this.name,\n onPath: this.trackPath,\n columns: this.columns,\n },\n args,\n ),\n );\n }\n}\n","import type { Driver } from \"./driver/types.js\";\nimport { pathLiteral } from \"./query/sql.js\";\n\n/**\n * Tracks which JSON paths are queried per collection and silently creates a\n * SQLite expression index once a path crosses the configured threshold.\n */\nexport class AutoIndexer {\n private counts = new Map<string, number>();\n private created = new Set<string>();\n\n constructor(\n private readonly db: Driver,\n private readonly enabled: boolean,\n private readonly threshold: number,\n ) {}\n\n track(collection: string, path: string): void {\n if (!this.enabled) return;\n const key = `${collection}\u0000${path}`;\n if (this.created.has(key)) return;\n\n const next = (this.counts.get(key) ?? 0) + 1;\n this.counts.set(key, next);\n\n if (next >= this.threshold) {\n this.create(collection, path);\n this.created.add(key);\n this.counts.delete(key);\n }\n }\n\n private create(collection: string, path: string): void {\n const safe = path.replace(/[^A-Za-z0-9_]+/g, \"_\");\n const indexName = `idx_${collection}_${safe}`;\n const expr = `json_extract(data, ${pathLiteral(path)})`;\n try {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON \"${collection}\"(${expr})`,\n );\n } catch {\n // Collection may have been dropped between query and index creation.\n }\n }\n\n /** Forget tracking for a collection (or everything when omitted). */\n reset(collection?: string): void {\n if (!collection) {\n this.counts.clear();\n this.created.clear();\n return;\n }\n const prefix = `${collection}\u0000`;\n for (const k of [...this.counts.keys()]) {\n if (k.startsWith(prefix)) this.counts.delete(k);\n }\n for (const k of [...this.created.keys()]) {\n if (k.startsWith(prefix)) this.created.delete(k);\n }\n }\n}\n","import type { Driver, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\nconst STMT_CACHE_MAX = 256;\n\n/** Adapter over the `better-sqlite3` native driver. */\nexport class BetterSqlite3Driver implements Driver {\n readonly name = \"better-sqlite3\";\n readonly raw: any;\n private readonly verbose?: (sql: string) => void;\n private readonly cache = new Map<string, PreparedStatement>();\n\n constructor(\n BetterSqlite3: any,\n filename: string,\n options: DriverOpenOptions,\n ) {\n this.verbose = options.verbose;\n this.raw = new BetterSqlite3(filename, {\n readonly: options.readonly ?? false,\n });\n this.raw.pragma(\"foreign_keys = ON\");\n this.raw.pragma(`busy_timeout = ${options.busyTimeout ?? 5000}`);\n if (!options.readonly && (options.wal ?? true)) {\n this.raw.pragma(\"journal_mode = WAL\");\n }\n }\n\n exec(sql: string): void {\n this.verbose?.(sql);\n this.raw.exec(sql);\n }\n\n prepare(sql: string): PreparedStatement {\n this.verbose?.(sql);\n const cached = this.cache.get(sql);\n if (cached) return cached;\n const stmt = this.raw.prepare(sql) as PreparedStatement; // reusable\n this.cacheStmt(sql, stmt);\n return stmt;\n }\n\n private cacheStmt(sql: string, stmt: PreparedStatement): void {\n if (this.cache.size >= STMT_CACHE_MAX) {\n const oldest = this.cache.keys().next().value;\n if (oldest !== undefined) this.cache.delete(oldest);\n }\n this.cache.set(sql, stmt);\n }\n\n transaction<T>(fn: () => T): T {\n // Nested calls automatically use SAVEPOINTs in better-sqlite3.\n return this.raw.transaction(fn)();\n }\n\n close(): void {\n this.cache.clear();\n this.raw.close();\n }\n}\n","import type { Driver, DriverOpenOptions, PreparedStatement } from \"./types.js\";\n\nconst STMT_CACHE_MAX = 256;\n\n/**\n * Adapter over Node's built-in `node:sqlite` (Node >= 22.5). Lets monlite run\n * with zero external dependencies. Note: `node:sqlite` is still flagged\n * experimental by Node and prints a one-time ExperimentalWarning.\n *\n * Unlike better-sqlite3 it has no `.transaction()` / `.pragma()` helpers, so\n * transactions are implemented here with BEGIN/COMMIT and nested SAVEPOINTs.\n */\nexport class NodeSqliteDriver implements Driver {\n readonly name = \"node:sqlite\";\n readonly raw: any;\n private readonly verbose?: (sql: string) => void;\n private readonly cache = new Map<string, PreparedStatement>();\n private depth = 0;\n\n constructor(nodeSqlite: any, filename: string, options: DriverOpenOptions) {\n this.verbose = options.verbose;\n const { DatabaseSync } = nodeSqlite;\n this.raw = new DatabaseSync(filename, {\n readOnly: options.readonly ?? false,\n });\n this.raw.exec(`PRAGMA busy_timeout = ${options.busyTimeout ?? 5000}`);\n if (!options.readonly && (options.wal ?? true)) {\n this.raw.exec(\"PRAGMA journal_mode = WAL\");\n }\n }\n\n exec(sql: string): void {\n this.verbose?.(sql);\n this.raw.exec(sql);\n }\n\n prepare(sql: string): PreparedStatement {\n this.verbose?.(sql);\n const cached = this.cache.get(sql);\n if (cached) return cached;\n\n const stmt = this.raw.prepare(sql);\n const wrapped: PreparedStatement = {\n run: (...p: any[]) => stmt.run(...p),\n get: (...p: any[]) => stmt.get(...p),\n all: (...p: any[]) => stmt.all(...p),\n };\n if (this.cache.size >= STMT_CACHE_MAX) {\n const oldest = this.cache.keys().next().value;\n if (oldest !== undefined) this.cache.delete(oldest);\n }\n this.cache.set(sql, wrapped);\n return wrapped;\n }\n\n transaction<T>(fn: () => T): T {\n const savepoint = `monlite_sp_${this.depth}`;\n if (this.depth === 0) this.raw.exec(\"BEGIN\");\n else this.raw.exec(`SAVEPOINT ${savepoint}`);\n this.depth++;\n\n try {\n const result = fn();\n this.depth--;\n if (this.depth === 0) this.raw.exec(\"COMMIT\");\n else this.raw.exec(`RELEASE ${savepoint}`);\n return result;\n } catch (err) {\n this.depth--;\n // Best-effort rollback. If the rollback itself fails, force the depth\n // back to a clean state so the connection isn't poisoned for the process.\n try {\n if (this.depth === 0) this.raw.exec(\"ROLLBACK\");\n else this.raw.exec(`ROLLBACK TO ${savepoint}; RELEASE ${savepoint}`);\n } catch {\n this.depth = 0;\n try {\n this.raw.exec(\"ROLLBACK\");\n } catch {\n /* already rolled back / no active txn */\n }\n }\n throw err;\n }\n }\n\n close(): void {\n this.cache.clear();\n this.raw.close();\n }\n}\n","import { createRequire } from \"node:module\";\nimport { MonliteError } from \"../errors.js\";\nimport type { Driver, DriverName, DriverOpenOptions } from \"./types.js\";\nimport { BetterSqlite3Driver } from \"./better-sqlite3.js\";\nimport { NodeSqliteDriver } from \"./node-sqlite.js\";\n\nexport type {\n Driver,\n DriverName,\n DriverOpenOptions,\n PreparedStatement,\n} from \"./types.js\";\n\n// Resolve relative to this module so optional deps load from the host app.\nconst req = createRequire(import.meta.url);\n\nfunction loadBetterSqlite3(): any | null {\n try {\n const mod = req(\"better-sqlite3\");\n return mod?.default ?? mod;\n } catch {\n return null;\n }\n}\n\nfunction loadNodeSqlite(): any | null {\n try {\n // Only required when actually selected, so better-sqlite3 users never\n // trigger node:sqlite's experimental warning.\n return req(\"node:sqlite\");\n } catch {\n return null;\n }\n}\n\nexport interface CreateDriverOptions extends DriverOpenOptions {\n driver?: DriverName;\n}\n\n/**\n * Build the SQLite driver. With `\"auto\"` (the default) better-sqlite3 is used\n * when installed, otherwise the built-in node:sqlite (Node >= 22.5).\n */\nexport function createDriver(\n filename: string,\n options: CreateDriverOptions = {},\n): Driver {\n const choice = options.driver ?? \"auto\";\n\n if (choice === \"better-sqlite3\") {\n const mod = loadBetterSqlite3();\n if (!mod) {\n throw new MonliteError(\n `driver \"better-sqlite3\" was requested but the package is not installed. ` +\n `Run \\`npm install better-sqlite3\\`.`,\n );\n }\n return new BetterSqlite3Driver(mod, filename, options);\n }\n\n if (choice === \"node:sqlite\") {\n const mod = loadNodeSqlite();\n if (!mod) {\n throw new MonliteError(\n `driver \"node:sqlite\" is unavailable. It requires Node >= 22.5.`,\n );\n }\n return new NodeSqliteDriver(mod, filename, options);\n }\n\n // auto: prefer better-sqlite3 (stable, all Node versions), else node:sqlite.\n const better = loadBetterSqlite3();\n if (better) return new BetterSqlite3Driver(better, filename, options);\n\n const node = loadNodeSqlite();\n if (node) return new NodeSqliteDriver(node, filename, options);\n\n throw new MonliteError(\n `No SQLite driver available. Either install better-sqlite3 ` +\n `(\\`npm install better-sqlite3\\`) or run on Node >= 22.5 for the ` +\n `built-in node:sqlite backend.`,\n );\n}\n","/**\n * Versions are LWW (last-write-wins) tokens of the form\n * `<zero-padded-ms>:<nodeId>` so that plain string comparison yields the\n * correct ordering: newer wall-clock time wins, ties broken by node id.\n *\n * (The design reserves room to swap this for a hybrid logical clock later;\n * the on-disk column is a plain string, so the format can evolve.)\n */\n\nexport type Version = string;\n\nconst TS_WIDTH = 15; // fits ms timestamps well past the year 5000\nconst SEQ_WIDTH = 12; // per-node monotonic tiebreaker\n\n/**\n * Build a version token. The optional `seq` is a per-node monotonic counter\n * that makes versions unique even within the same millisecond — important so\n * that cursor-based pulls (`> version`) never skip a same-timestamp change.\n */\nexport function makeVersion(ts: number, nodeId: string, seq?: number): Version {\n const base = String(ts).padStart(TS_WIDTH, \"0\") + \":\" + nodeId;\n return seq === undefined\n ? base\n : base + \":\" + String(seq).padStart(SEQ_WIDTH, \"0\");\n}\n\nexport function compareVersions(a: Version, b: Version): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function versionTs(v: Version): number {\n const i = v.indexOf(\":\");\n return Number(i === -1 ? v : v.slice(0, i));\n}\n\nexport function versionNode(v: Version): string {\n const i = v.indexOf(\":\");\n return i === -1 ? \"\" : v.slice(i + 1);\n}\n","import type { Driver } from \"../driver/types.js\";\nimport type { Monlite } from \"../db.js\";\nimport { objectId } from \"../id.js\";\nimport {\n makeVersion,\n compareVersions,\n versionTs,\n type Version,\n} from \"./version.js\";\n\nexport type { Version } from \"./version.js\";\nexport { makeVersion, compareVersions, versionTs } from \"./version.js\";\n\nexport type SyncOp = \"upsert\" | \"delete\";\n\n/** A locally-originated change ready to be pushed to a remote. */\nexport interface LocalChange {\n seq: number;\n collection: string;\n _id: string;\n op: SyncOp;\n version: Version;\n ts: number;\n /** Full document (with system fields) for `upsert`; absent for `delete`. */\n doc?: Record<string, any>;\n}\n\n/** A change received from a remote, to be applied locally. */\nexport interface RemoteChange {\n collection: string;\n _id: string;\n op: SyncOp;\n version: Version;\n doc?: Record<string, any>;\n}\n\nexport type ConflictResolver = (ctx: {\n collection: string;\n _id: string;\n local: { version: Version };\n remote: { version: Version; doc?: Record<string, any> };\n}) => \"local\" | \"remote\";\n\nexport interface ApplyResult {\n applied: boolean;\n conflict: boolean;\n winner: \"local\" | \"remote\" | \"none\";\n}\n\nexport interface SyncStateRow {\n remote: string;\n cursor: string | null;\n lastPullAt: number | null;\n lastPushSeq: number | null;\n lastPushAt: number | null;\n}\n\nexport interface ConflictRow {\n collection: string;\n _id: string;\n localVersion: Version;\n remoteVersion: Version;\n winner: \"local\" | \"remote\";\n ts: number;\n}\n\nconst NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nfunction assertName(name: string): void {\n if (!NAME_RE.test(name)) throw new Error(`Invalid collection name \"${name}\"`);\n}\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\ninterface Row {\n seq: number;\n coll: string;\n doc_id: string;\n op: SyncOp;\n version: string;\n ts: number;\n}\n\n/**\n * Low-level sync primitives stored alongside the data in the same `.db` file:\n * an append-only change feed, tombstones, per-remote cursors and a conflict\n * log. Created only when a database is opened with `{ sync: true }`. The\n * `@monlite/sync` engine drives this; apps rarely touch it directly.\n */\nexport class SyncStore {\n readonly nodeId: string;\n private versionSeq = 0;\n\n constructor(\n private readonly db: Driver,\n nodeId?: string,\n private readonly mon?: Monlite,\n ) {\n this.init();\n this.nodeId = this.resolveNodeId(nodeId);\n }\n\n private init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS _monlite_changes (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n coll TEXT NOT NULL,\n doc_id TEXT NOT NULL,\n op TEXT NOT NULL,\n version TEXT NOT NULL,\n ts INTEGER NOT NULL,\n source TEXT NOT NULL DEFAULT 'local',\n pushed INTEGER NOT NULL DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS _idx_changes_doc ON _monlite_changes(coll, doc_id, seq);\n CREATE INDEX IF NOT EXISTS _idx_changes_push ON _monlite_changes(source, pushed, seq);\n CREATE TABLE IF NOT EXISTS _monlite_sync_state (\n remote TEXT PRIMARY KEY,\n cursor TEXT,\n last_pull_at INTEGER,\n last_push_seq INTEGER,\n last_push_at INTEGER\n );\n CREATE TABLE IF NOT EXISTS _monlite_conflicts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n coll TEXT, doc_id TEXT,\n local_version TEXT, remote_version TEXT,\n winner TEXT, ts INTEGER\n );\n CREATE TABLE IF NOT EXISTS _monlite_meta (key TEXT PRIMARY KEY, value TEXT);\n `);\n }\n\n private resolveNodeId(explicit?: string): string {\n if (explicit) {\n this.db\n .prepare(\n `INSERT OR REPLACE INTO _monlite_meta (key, value) VALUES ('nodeId', ?)`,\n )\n .run(explicit);\n return explicit;\n }\n const row = this.db\n .prepare(`SELECT value FROM _monlite_meta WHERE key = 'nodeId'`)\n .get() as { value: string } | undefined;\n if (row?.value) return row.value;\n const generated = objectId();\n this.db\n .prepare(`INSERT INTO _monlite_meta (key, value) VALUES ('nodeId', ?)`)\n .run(generated);\n return generated;\n }\n\n /** True if this database tracks sync metadata (always, once constructed). */\n get enabled(): boolean {\n return true;\n }\n\n /* ----------------------- local change recording ----------------------- */\n\n /** Append a locally-originated change to the feed. Call inside a write txn. */\n recordLocal(collection: string, id: string, op: SyncOp, ts: number): Version {\n const version = makeVersion(ts, this.nodeId, this.versionSeq++);\n this.db\n .prepare(\n `INSERT INTO _monlite_changes (coll, doc_id, op, version, ts, source, pushed)\n VALUES (?, ?, ?, ?, ?, 'local', 0)`,\n )\n .run(collection, id, op, version, ts);\n return version;\n }\n\n /** Current (latest) version of a document, or null if never recorded. */\n currentVersion(collection: string, id: string): Version | null {\n const row = this.db\n .prepare(\n `SELECT version FROM _monlite_changes\n WHERE coll = ? AND doc_id = ? ORDER BY seq DESC LIMIT 1`,\n )\n .get(collection, id) as { version: string } | undefined;\n return row?.version ?? null;\n }\n\n /* ----------------------------- push side ----------------------------- */\n\n /** Latest unpushed local change per document (the push queue). */\n pending(collections?: string[], limit?: number): LocalChange[] {\n const params: any[] = [];\n let collFilter = \"\";\n if (collections && collections.length) {\n collFilter = ` AND coll IN (${collections.map(() => \"?\").join(\", \")})`;\n params.push(...collections);\n }\n let limitClause = \"\";\n if (limit != null && limit > 0) {\n limitClause = \" LIMIT ?\";\n params.push(limit);\n }\n const rows = this.db\n .prepare(\n `SELECT c.seq, c.coll, c.doc_id, c.op, c.version, c.ts\n FROM _monlite_changes c\n JOIN (\n SELECT coll, doc_id, MAX(seq) AS mseq\n FROM _monlite_changes\n WHERE source = 'local' AND pushed = 0${collFilter}\n GROUP BY coll, doc_id\n ) m ON c.coll = m.coll AND c.doc_id = m.doc_id AND c.seq = m.mseq\n ORDER BY c.seq${limitClause}`,\n )\n .all(...params) as Row[];\n\n return rows.map((r) => {\n const change: LocalChange = {\n seq: r.seq,\n collection: r.coll,\n _id: r.doc_id,\n op: r.op,\n version: r.version,\n ts: r.ts,\n };\n if (r.op === \"upsert\") {\n const doc = this.readDoc(r.coll, r.doc_id);\n if (doc) change.doc = doc;\n else change.op = \"delete\"; // gone since recording → treat as delete\n }\n return change;\n });\n }\n\n /** Mark the given changes (and any earlier local rows per doc) as pushed. */\n markPushed(changes: LocalChange[]): void {\n if (!changes.length) return;\n const stmt = this.db.prepare(\n `UPDATE _monlite_changes SET pushed = 1\n WHERE coll = ? AND doc_id = ? AND seq <= ? AND source = 'local'`,\n );\n this.db.transaction(() => {\n for (const c of changes) stmt.run(c.collection, c._id, c.seq);\n });\n }\n\n /* ----------------------------- pull side ----------------------------- */\n\n /**\n * Apply a remote change, resolving conflicts against the local version.\n * Remote-applied changes are recorded with `source='remote'` so they are\n * never pushed back (echo prevention).\n */\n applyRemote(change: RemoteChange, resolver?: ConflictResolver): ApplyResult {\n assertName(change.collection);\n // Read the local version, decide the winner, and write — all in ONE\n // transaction so the decision can't race an interleaved write.\n return this.db.transaction((): ApplyResult => {\n const localVersion = this.currentVersion(change.collection, change._id);\n\n let winner: \"local\" | \"remote\";\n if (localVersion === null) {\n winner = \"remote\";\n } else if (change.version === localVersion) {\n return { applied: false, conflict: false, winner: \"none\" }; // echo\n } else {\n winner = resolver\n ? resolver({\n collection: change.collection,\n _id: change._id,\n local: { version: localVersion },\n remote: { version: change.version, doc: change.doc },\n })\n : compareVersions(change.version, localVersion) > 0\n ? \"remote\"\n : \"local\";\n this.recordConflict(\n change.collection,\n change._id,\n localVersion,\n change.version,\n winner,\n );\n }\n\n if (winner !== \"remote\") {\n // Local won a real conflict. Re-enqueue it so the winning version\n // propagates back to the remote; otherwise the remote keeps the stale\n // value and the two ends diverge. (`pending` downgrades to a delete if\n // the doc no longer exists locally.)\n if (localVersion !== null) {\n this.recordLocal(change.collection, change._id, \"upsert\", Date.now());\n }\n return { applied: false, conflict: localVersion !== null, winner };\n }\n\n this.applyData(change);\n this.db\n .prepare(\n `INSERT INTO _monlite_changes (coll, doc_id, op, version, ts, source, pushed)\n VALUES (?, ?, ?, ?, ?, 'remote', 1)`,\n )\n .run(\n change.collection,\n change._id,\n change.op,\n change.version,\n versionTs(change.version),\n );\n\n return {\n applied: true,\n conflict: localVersion !== null,\n winner: \"remote\",\n };\n });\n }\n\n private applyData(change: RemoteChange): void {\n const ts = versionTs(change.version);\n // Route through the collection so storage respects its mode (document vs\n // structured). Structured collections must be opened with their schema\n // before their remote changes are applied — otherwise they default to\n // document mode.\n if (this.mon) {\n this.mon\n .collection(change.collection)\n .applyRemoteWrite(change.op, change._id, change.doc, ts);\n return;\n }\n // Fallback (no Monlite ref): document-mode raw write.\n const coll = change.collection;\n this.ensureCollTable(coll);\n if (change.op === \"delete\") {\n this.db.prepare(`DELETE FROM \"${coll}\" WHERE _id = ?`).run(change._id);\n return;\n }\n const doc = change.doc ?? {};\n const createdAt = typeof doc.created_at === \"number\" ? doc.created_at : ts;\n this.db\n .prepare(\n `INSERT INTO \"${coll}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)\n ON CONFLICT(_id) DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`,\n )\n .run(change._id, JSON.stringify(stripSystem(doc)), createdAt, ts);\n }\n\n /**\n * Latest change per document with `seq` greater than the given watermark,\n * as RemoteChanges (used when this database acts as a sync *source*, e.g. the\n * monlite-as-remote adapter). Returns the new watermark to resume from.\n */\n changesSince(\n seq: number,\n collections?: string[],\n limit?: number,\n ): { changes: RemoteChange[]; maxSeq: number } {\n const params: any[] = [seq];\n let collFilter = \"\";\n if (collections && collections.length) {\n collFilter = ` AND coll IN (${collections.map(() => \"?\").join(\", \")})`;\n params.push(...collections);\n }\n let limitClause = \"\";\n if (limit != null && limit > 0) {\n limitClause = \" LIMIT ?\";\n params.push(limit);\n }\n const rows = this.db\n .prepare(\n `SELECT c.seq, c.coll, c.doc_id, c.op, c.version, c.ts\n FROM _monlite_changes c\n JOIN (\n SELECT coll, doc_id, MAX(seq) AS mseq\n FROM _monlite_changes\n WHERE seq > ?${collFilter}\n GROUP BY coll, doc_id\n ) m ON c.coll = m.coll AND c.doc_id = m.doc_id AND c.seq = m.mseq\n ORDER BY c.seq${limitClause}`,\n )\n .all(...params) as Row[];\n\n const changes: RemoteChange[] = rows.map((r) => {\n const change: RemoteChange = {\n collection: r.coll,\n _id: r.doc_id,\n op: r.op,\n version: r.version,\n };\n if (r.op === \"upsert\") {\n const doc = this.readDoc(r.coll, r.doc_id);\n if (doc) change.doc = doc;\n else change.op = \"delete\";\n }\n return change;\n });\n\n // Advance only to the last row we actually returned (correct under LIMIT).\n const maxSeq = rows.length ? rows[rows.length - 1]!.seq : seq;\n return { changes, maxSeq };\n }\n\n /* ------------------------------ bootstrap ----------------------------- */\n\n /**\n * Enqueue existing documents (created before sync was enabled, or never\n * recorded) as local upserts so they can be pushed. Idempotent.\n */\n seed(collections: string[]): number {\n let count = 0;\n this.db.transaction(() => {\n for (const coll of collections) {\n assertName(coll);\n if (!this.tableExists(coll)) continue; // nothing to seed yet\n const docs = this.db\n .prepare(`SELECT _id, updated_at FROM \"${coll}\"`)\n .all() as Array<{ _id: string; updated_at: number }>;\n for (const d of docs) {\n if (this.currentVersion(coll, d._id) !== null) continue;\n this.recordLocal(coll, d._id, \"upsert\", d.updated_at);\n count++;\n }\n }\n });\n return count;\n }\n\n /* ------------------------------- state -------------------------------- */\n\n getState(remote: string): SyncStateRow {\n const row = this.db\n .prepare(`SELECT * FROM _monlite_sync_state WHERE remote = ?`)\n .get(remote) as any;\n return {\n remote,\n cursor: row?.cursor ?? null,\n lastPullAt: row?.last_pull_at ?? null,\n lastPushSeq: row?.last_push_seq ?? null,\n lastPushAt: row?.last_push_at ?? null,\n };\n }\n\n setState(remote: string, patch: Partial<Omit<SyncStateRow, \"remote\">>): void {\n const cur = this.getState(remote);\n const next = { ...cur, ...patch };\n this.db\n .prepare(\n `INSERT INTO _monlite_sync_state (remote, cursor, last_pull_at, last_push_seq, last_push_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(remote) DO UPDATE SET\n cursor = excluded.cursor,\n last_pull_at = excluded.last_pull_at,\n last_push_seq = excluded.last_push_seq,\n last_push_at = excluded.last_push_at`,\n )\n .run(\n remote,\n next.cursor,\n next.lastPullAt,\n next.lastPushSeq,\n next.lastPushAt,\n );\n }\n\n /* ----------------------------- conflicts ------------------------------ */\n\n private recordConflict(\n coll: string,\n id: string,\n localVersion: Version,\n remoteVersion: Version,\n winner: \"local\" | \"remote\",\n ): void {\n this.db\n .prepare(\n `INSERT INTO _monlite_conflicts (coll, doc_id, local_version, remote_version, winner, ts)\n VALUES (?, ?, ?, ?, ?, ?)`,\n )\n .run(\n coll,\n id,\n localVersion,\n remoteVersion,\n winner,\n versionTs(remoteVersion),\n );\n }\n\n conflicts(): ConflictRow[] {\n const rows = this.db\n .prepare(\n `SELECT coll, doc_id, local_version, remote_version, winner, ts\n FROM _monlite_conflicts ORDER BY id`,\n )\n .all() as any[];\n return rows.map((r) => ({\n collection: r.coll,\n _id: r.doc_id,\n localVersion: r.local_version,\n remoteVersion: r.remote_version,\n winner: r.winner,\n ts: r.ts,\n }));\n }\n\n /* ------------------------------ helpers ------------------------------- */\n\n private readDoc(coll: string, id: string): Record<string, any> | null {\n assertName(coll);\n // Read through the collection so structured (native-column) documents are\n // reassembled correctly, not just their JSON overflow.\n if (this.mon) return this.mon.collection(coll).getRaw(id);\n\n if (!this.tableExists(coll)) return null;\n const row = this.db\n .prepare(\n `SELECT _id, data, created_at, updated_at FROM \"${coll}\" WHERE _id = ?`,\n )\n .get(id) as\n | { _id: string; data: string; created_at: number; updated_at: number }\n | undefined;\n if (!row) return null;\n const doc = JSON.parse(row.data);\n doc._id = row._id;\n doc.created_at = row.created_at;\n doc.updated_at = row.updated_at;\n return doc;\n }\n\n private tableExists(name: string): boolean {\n return (\n this.db\n .prepare(`SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?`)\n .get(name) != null\n );\n }\n\n private ensureCollTable(coll: string): void {\n assertName(coll);\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS \"${coll}\" (\n _id TEXT PRIMARY KEY,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n }\n}\n","import type {\n CollectionOptions,\n ColumnInfo,\n Doc,\n MonliteOptions,\n} from \"./types.js\";\nimport { Collection } from \"./collection.js\";\nimport { AutoIndexer } from \"./auto-index.js\";\nimport { MonliteError, normalizeDriverError } from \"./errors.js\";\nimport { bindable } from \"./query/sql.js\";\nimport { createDriver } from \"./driver/index.js\";\nimport type { Driver } from \"./driver/types.js\";\nimport { SyncStore } from \"./sync/store.js\";\n\nfunction validateName(name: string): void {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new MonliteError(\n `Invalid collection name \"${name}\". Names must start with a letter or ` +\n `underscore and contain only letters, digits and underscores.`,\n );\n }\n}\n\nfunction buildTagged(\n strings: TemplateStringsArray,\n values: any[],\n): { sql: string; params: any[] } {\n let sql = \"\";\n const params: any[] = [];\n strings.forEach((part, i) => {\n sql += part;\n if (i < values.length) {\n sql += \"?\";\n params.push(bindable(values[i]));\n }\n });\n return { sql, params };\n}\n\n/**\n * A monlite database — a thin document layer over a single SQLite file.\n * Create one with {@link createDb}.\n */\nexport class Monlite {\n /** @internal The active SQLite driver. */\n readonly driver: Driver;\n /** @internal */\n readonly autoIndexer: AutoIndexer;\n /** @internal Sync metadata store; present only when `{ sync: true }`. */\n readonly $sync?: SyncStore;\n\n private readonly collections = new Map<string, Collection<any>>();\n private closed = false;\n\n constructor(filename: string, options: MonliteOptions = {}) {\n this.driver = createDriver(filename, {\n driver: options.driver,\n readonly: options.readonly,\n wal: options.wal,\n busyTimeout: options.busyTimeout,\n verbose: options.verbose,\n });\n\n this.autoIndexer = new AutoIndexer(\n this.driver,\n options.autoIndex ?? true,\n options.autoIndexAfter ?? 10,\n );\n\n if (options.sync) {\n this.$sync = new SyncStore(this.driver, options.nodeId, this);\n }\n }\n\n /** Stable node id for LWW tie-breaking (only when sync is enabled). */\n get nodeId(): string | undefined {\n return this.$sync?.nodeId;\n }\n\n /** The underlying native database handle (escape hatch). */\n get sqlite(): any {\n return this.driver.raw;\n }\n\n /** Name of the active backend: `\"better-sqlite3\"` or `\"node:sqlite\"`. */\n get driverName(): string {\n return this.driver.name;\n }\n\n /**\n * Get (or lazily create) a typed collection handle. Pass `{ schema }` to make\n * it a structured collection backed by native SQL columns; omit for the\n * default schema-free document mode. Options apply only on first access.\n */\n collection<T = Doc>(\n name: string,\n options?: CollectionOptions,\n ): Collection<T> {\n this.assertOpen();\n validateName(name);\n let col = this.collections.get(name);\n if (!col) {\n col = new Collection<T>(this, name, options);\n this.collections.set(name, col);\n } else if (options?.schema) {\n // A collection's mode/columns are fixed on first access; surface conflicts\n // instead of silently ignoring a re-declaration.\n const requested = Object.keys(options.schema);\n const existing = new Set(col.columnNames);\n const sameShape =\n col.mode === \"structured\" &&\n requested.length === existing.size &&\n requested.every((c) => existing.has(c));\n if (!sameShape) {\n throw new MonliteError(\n `Collection \"${name}\" was already opened with a different schema/mode. ` +\n `A collection's storage mode is fixed on first access.`,\n );\n }\n }\n return col as Collection<T>;\n }\n\n /** Inspect a collection's physical columns (PRAGMA table_info). */\n $schema(name: string): Promise<ColumnInfo[]> {\n this.assertOpen();\n validateName(name);\n const rows = this.driver\n .prepare(`PRAGMA table_info(\"${name}\")`)\n .all() as Array<{\n name: string;\n type: string;\n notnull: number;\n pk: number;\n }>;\n return Promise.resolve(\n rows.map((r) => ({\n name: r.name,\n type: r.type,\n notNull: !!r.notnull,\n primaryKey: !!r.pk,\n })),\n );\n }\n\n /** Tagged-template SQL query returning rows. Values are safely parameterized. */\n $queryRaw<R = any>(\n strings: TemplateStringsArray,\n ...values: any[]\n ): Promise<R[]> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n return Promise.resolve(this.driver.prepare(sql).all(...params) as R[]);\n }\n\n /** Like {@link $queryRaw} but takes a raw SQL string and positional params. */\n $queryRawUnsafe<R = any>(sql: string, ...params: any[]): Promise<R[]> {\n this.assertOpen();\n return Promise.resolve(\n this.driver.prepare(sql).all(...params.map(bindable)) as R[],\n );\n }\n\n /** Tagged-template SQL statement returning the number of affected rows. */\n $executeRaw(\n strings: TemplateStringsArray,\n ...values: any[]\n ): Promise<number> {\n this.assertOpen();\n const { sql, params } = buildTagged(strings, values);\n try {\n return Promise.resolve(this.driver.prepare(sql).run(...params).changes);\n } catch (err) {\n throw normalizeDriverError(err);\n }\n }\n\n /** Like {@link $executeRaw} but takes a raw SQL string and positional params. */\n $executeRawUnsafe(sql: string, ...params: any[]): Promise<number> {\n this.assertOpen();\n return Promise.resolve(\n this.driver.prepare(sql).run(...params.map(bindable)).changes,\n );\n }\n\n /**\n * Run a function inside a synchronous SQLite transaction. If it throws, the\n * transaction is rolled back.\n */\n async $transaction<R>(fn: (db: this) => R): Promise<R> {\n this.assertOpen();\n // Transactions are synchronous; `fn` must not be async. A throw inside\n // rolls back and (being in an async method) rejects this promise.\n return this.driver.transaction(() => fn(this));\n }\n\n /** List all collection (table) names. */\n $collections(): Promise<string[]> {\n this.assertOpen();\n const rows = this.driver\n .prepare(\n `SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '\\\\_monlite\\\\_%' ESCAPE '\\\\'\n ORDER BY name`,\n )\n .all() as Array<{ name: string }>;\n return Promise.resolve(rows.map((r) => r.name));\n }\n\n /** Drop a collection and all of its data. */\n $drop(name: string): Promise<void> {\n this.assertOpen();\n validateName(name);\n this.driver.exec(`DROP TABLE IF EXISTS \"${name}\"`);\n this.collections.delete(name);\n this.autoIndexer.reset(name);\n return Promise.resolve();\n }\n\n /** Drop every collection in the database. */\n async $dropAll(): Promise<void> {\n for (const name of await this.$collections()) await this.$drop(name);\n }\n\n /** Close the underlying SQLite connection. */\n $disconnect(): Promise<void> {\n if (!this.closed) {\n this.closed = true;\n this.driver.close();\n }\n return Promise.resolve();\n }\n\n private assertOpen(): void {\n if (this.closed) throw new MonliteError(\"Database connection is closed\");\n }\n}\n\n/**\n * Open (or create) a monlite database backed by a single SQLite file.\n * Use `\":memory:\"` for an in-memory database.\n */\nexport function createDb(filename: string, options?: MonliteOptions): Monlite {\n return new Monlite(filename, options);\n}\n"]}