@monlite/core 0.2.0 → 0.3.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/README.md +23 -0
- package/dist/index.cjs +60 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -250,6 +250,29 @@ const grouped = await users.groupBy({
|
|
|
250
250
|
orderBy: { _count: "desc" },
|
|
251
251
|
});
|
|
252
252
|
// [ { role: "admin", _count: 5, _sum: { age: 140 } }, … ]
|
|
253
|
+
|
|
254
|
+
// groupBy + having (filter groups by an aggregate, like SQL HAVING)
|
|
255
|
+
await users.groupBy({
|
|
256
|
+
by: ["role"],
|
|
257
|
+
_count: true,
|
|
258
|
+
_sum: { age: true },
|
|
259
|
+
having: {
|
|
260
|
+
_count: { gte: 2 }, // keep groups with COUNT(*) >= 2
|
|
261
|
+
_sum: { age: { gt: 50 } }, // and SUM(age) > 50
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
// having comparisons: equals, not, gt, gte, lt, lte — on _count and on
|
|
265
|
+
// _sum/_avg/_min/_max of any field.
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### distinct
|
|
269
|
+
|
|
270
|
+
```ts
|
|
271
|
+
await users.distinct("role"); // ["admin", "editor"]
|
|
272
|
+
await users.distinct("age", { role: "admin" }); // [28, 31]
|
|
273
|
+
|
|
274
|
+
// Array fields are unwound — each element is a value (like MongoDB):
|
|
275
|
+
await users.distinct("tags"); // ["a", "b", "c"]
|
|
253
276
|
```
|
|
254
277
|
|
|
255
278
|
---
|
package/dist/index.cjs
CHANGED
|
@@ -379,6 +379,44 @@ function aggregate(ctx, args) {
|
|
|
379
379
|
}
|
|
380
380
|
return result;
|
|
381
381
|
}
|
|
382
|
+
var HAVING_FNS = [
|
|
383
|
+
["_sum", "SUM"],
|
|
384
|
+
["_avg", "AVG"],
|
|
385
|
+
["_min", "MIN"],
|
|
386
|
+
["_max", "MAX"]
|
|
387
|
+
];
|
|
388
|
+
function comparisonSql(expr, cmp2, params) {
|
|
389
|
+
const out = [];
|
|
390
|
+
const ops = [
|
|
391
|
+
["equals", "="],
|
|
392
|
+
["not", "<>"],
|
|
393
|
+
["gt", ">"],
|
|
394
|
+
["gte", ">="],
|
|
395
|
+
["lt", "<"],
|
|
396
|
+
["lte", "<="]
|
|
397
|
+
];
|
|
398
|
+
for (const [key, op] of ops) {
|
|
399
|
+
const v = cmp2[key];
|
|
400
|
+
if (v === void 0) continue;
|
|
401
|
+
params.push(v);
|
|
402
|
+
out.push(`${expr} ${op} ?`);
|
|
403
|
+
}
|
|
404
|
+
return out;
|
|
405
|
+
}
|
|
406
|
+
function buildHaving(having, params) {
|
|
407
|
+
const parts = [];
|
|
408
|
+
if (having._count) {
|
|
409
|
+
parts.push(...comparisonSql("COUNT(*)", having._count, params));
|
|
410
|
+
}
|
|
411
|
+
for (const [kind, fn] of HAVING_FNS) {
|
|
412
|
+
const selection = having[kind];
|
|
413
|
+
if (!selection) continue;
|
|
414
|
+
for (const field of Object.keys(selection)) {
|
|
415
|
+
parts.push(...comparisonSql(`${fn}(${fieldExpr(field)})`, selection[field], params));
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return parts.join(" AND ");
|
|
419
|
+
}
|
|
382
420
|
function groupBy(ctx, args) {
|
|
383
421
|
if (!Array.isArray(args.by) || args.by.length === 0) {
|
|
384
422
|
throw new Error("groupBy requires a non-empty `by` array");
|
|
@@ -397,6 +435,10 @@ function groupBy(ctx, args) {
|
|
|
397
435
|
const { selects: accSelects, cols } = buildAccumulators(args, ctx.onPath);
|
|
398
436
|
selects.push(...accSelects);
|
|
399
437
|
let sql = `SELECT ${selects.join(", ")} FROM "${ctx.table}" WHERE ${where} GROUP BY ${groupExprs.join(", ")}`;
|
|
438
|
+
if (args.having) {
|
|
439
|
+
const havingSql = buildHaving(args.having, params);
|
|
440
|
+
if (havingSql) sql += ` HAVING ${havingSql}`;
|
|
441
|
+
}
|
|
400
442
|
if (args.orderBy) {
|
|
401
443
|
const parts = [];
|
|
402
444
|
for (const key of Object.keys(args.orderBy)) {
|
|
@@ -533,6 +575,24 @@ var Collection = class {
|
|
|
533
575
|
const row = this.db.prepare(`SELECT COUNT(*) AS n FROM "${this.name}" WHERE ${where}`).get(...params);
|
|
534
576
|
return row.n;
|
|
535
577
|
}
|
|
578
|
+
/**
|
|
579
|
+
* Return the distinct values of a field across the collection. Array fields
|
|
580
|
+
* are unwound (each element counts as a value), matching MongoDB's `distinct`.
|
|
581
|
+
*/
|
|
582
|
+
async distinct(field, where) {
|
|
583
|
+
this.ensureTable();
|
|
584
|
+
const params = [];
|
|
585
|
+
const clause = buildWhere(where, { params, onPath: this.trackPath });
|
|
586
|
+
let sql;
|
|
587
|
+
if (isReserved(field)) {
|
|
588
|
+
sql = `SELECT DISTINCT ${fieldExpr(field)} AS v FROM "${this.name}" WHERE ${clause} ORDER BY v`;
|
|
589
|
+
} else {
|
|
590
|
+
this.trackPath(field);
|
|
591
|
+
sql = `SELECT DISTINCT je.value AS v FROM "${this.name}" CROSS JOIN json_each("${this.name}".data, ${pathLiteral(field)}) je WHERE ${clause} ORDER BY v`;
|
|
592
|
+
}
|
|
593
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
594
|
+
return rows.map((r) => r.v);
|
|
595
|
+
}
|
|
536
596
|
/* ----------------------------- update ----------------------------- */
|
|
537
597
|
runUpdate(where, data, single) {
|
|
538
598
|
this.ensureTable();
|
package/dist/index.cjs.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/db.ts"],"names":["randomBytes","createRequire"],"mappings":"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","file":"index.cjs","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 * 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/** SQL expression yielding the value of `field` for a row. */\nexport function fieldExpr(field: string): string {\n if (isReserved(field)) 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, isReserved } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\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 && !isReserved(field)) ctx.onPath(field);\n const expr = fieldExpr(field);\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));\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 (isReserved(field)) {\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 (isReserved(field)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(field: string, expr: string, want: boolean): string {\n if (isReserved(field)) {\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, isReserved } 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): 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 && !isReserved(field)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field)} ${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} from \"../types.js\";\nimport type { Driver } from \"../driver/types.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\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): { 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 onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field)}) 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, { params, onPath: ctx.onPath });\n const { selects, cols } = buildAccumulators(args, ctx.onPath);\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\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, { params, onPath: ctx.onPath });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n ctx.onPath(field);\n const expr = fieldExpr(field);\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);\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.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)} ${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 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 { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ninterface Row {\n _id: string;\n data: string;\n created_at: number;\n updated_at: number;\n}\n\nconst SELECT_COLS = `_id, data, created_at, updated_at`;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\n/**\n * A document collection. Backed by a single SQLite table whose rows store the\n * document as JSON in a `data` column. Created lazily on first write/read.\n */\nexport class Collection<T = Doc> {\n private initialized = false;\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 ) {}\n\n private get db() {\n return this.mon.driver;\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\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 this.initialized = true;\n }\n\n private rowToDoc(row: Row): WithId<T> {\n const doc = JSON.parse(row.data) as Record<string, any>;\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 prepareInsert(input: Record<string, any>): Row {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n return {\n _id: id,\n data: JSON.stringify(doc),\n created_at: now,\n updated_at: now,\n };\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.prepareInsert(args.data);\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n )\n .run(row._id, row.data, row.created_at, row.updated_at);\n return this.rowToDoc(row);\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n );\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_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, { params, onPath: this.trackPath });\n let sql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath);\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(\n (r) => project(this.rowToDoc(r), args.select) as WithId<T>,\n );\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 ${SELECT_COLS} 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, { params, onPath: this.trackPath });\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 /* ----------------------------- 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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 stmt = this.db.prepare(\n `UPDATE \"${this.name}\" SET data = ?, updated_at = ? WHERE _id = ?`,\n );\n\n return this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = JSON.parse(row.data) as Record<string, any>;\n const updated = stripSystem(applyUpdate(current, data));\n stmt.run(JSON.stringify(updated), now, row._id);\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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\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(args: DeleteArgs<T> = { where: undefined as any }): Promise<{\n count: number;\n }> {\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 },\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 },\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","import type { Doc, MonliteOptions } 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\";\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\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\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 /** Get (or lazily create) a typed collection handle. */\n collection<T = Doc>(name: string): 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);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\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' AND name NOT LIKE 'sqlite_%'\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/db.ts"],"names":["randomBytes","cmp","createRequire"],"mappings":"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","file":"index.cjs","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 * 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/** SQL expression yielding the value of `field` for a row. */\nexport function fieldExpr(field: string): string {\n if (isReserved(field)) 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, isReserved } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\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 && !isReserved(field)) ctx.onPath(field);\n const expr = fieldExpr(field);\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));\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 (isReserved(field)) {\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 (isReserved(field)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(field: string, expr: string, want: boolean): string {\n if (isReserved(field)) {\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, isReserved } 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): 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 && !isReserved(field)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field)} ${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 } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\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): { 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 onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field)}) 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, { params, onPath: ctx.onPath });\n const { selects, cols } = buildAccumulators(args, ctx.onPath);\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(having: HavingInput, params: any[]): 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(...comparisonSql(`${fn}(${fieldExpr(field)})`, selection[field]!, params));\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, { params, onPath: ctx.onPath });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n ctx.onPath(field);\n const expr = fieldExpr(field);\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);\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);\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)} ${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 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 { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport { fieldExpr, isReserved, pathLiteral } from \"./query/sql.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ninterface Row {\n _id: string;\n data: string;\n created_at: number;\n updated_at: number;\n}\n\nconst SELECT_COLS = `_id, data, created_at, updated_at`;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\n/**\n * A document collection. Backed by a single SQLite table whose rows store the\n * document as JSON in a `data` column. Created lazily on first write/read.\n */\nexport class Collection<T = Doc> {\n private initialized = false;\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 ) {}\n\n private get db() {\n return this.mon.driver;\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\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 this.initialized = true;\n }\n\n private rowToDoc(row: Row): WithId<T> {\n const doc = JSON.parse(row.data) as Record<string, any>;\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 prepareInsert(input: Record<string, any>): Row {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n return {\n _id: id,\n data: JSON.stringify(doc),\n created_at: now,\n updated_at: now,\n };\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.prepareInsert(args.data);\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n )\n .run(row._id, row.data, row.created_at, row.updated_at);\n return this.rowToDoc(row);\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n );\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_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, { params, onPath: this.trackPath });\n let sql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath);\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(\n (r) => project(this.rowToDoc(r), args.select) as WithId<T>,\n );\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 ${SELECT_COLS} 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, { params, onPath: this.trackPath });\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 across the collection. Array fields\n * are 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, { params, onPath: this.trackPath });\n\n let sql: string;\n if (isReserved(field)) {\n sql =\n `SELECT DISTINCT ${fieldExpr(field)} 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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 stmt = this.db.prepare(\n `UPDATE \"${this.name}\" SET data = ?, updated_at = ? WHERE _id = ?`,\n );\n\n return this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = JSON.parse(row.data) as Record<string, any>;\n const updated = stripSystem(applyUpdate(current, data));\n stmt.run(JSON.stringify(updated), now, row._id);\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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\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(args: DeleteArgs<T> = { where: undefined as any }): Promise<{\n count: number;\n }> {\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 },\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 },\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","import type { Doc, MonliteOptions } 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\";\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\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\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 /** Get (or lazily create) a typed collection handle. */\n collection<T = Doc>(name: string): 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);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\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' AND name NOT LIKE 'sqlite_%'\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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -130,9 +130,27 @@ interface AggregateResult {
|
|
|
130
130
|
_min?: Record<string, any>;
|
|
131
131
|
_max?: Record<string, any>;
|
|
132
132
|
}
|
|
133
|
+
/** Numeric comparison used by `groupBy` having-filters. */
|
|
134
|
+
interface HavingComparison {
|
|
135
|
+
equals?: number;
|
|
136
|
+
not?: number;
|
|
137
|
+
gt?: number;
|
|
138
|
+
gte?: number;
|
|
139
|
+
lt?: number;
|
|
140
|
+
lte?: number;
|
|
141
|
+
}
|
|
142
|
+
/** Post-aggregation filter (SQL `HAVING`) for `groupBy`. */
|
|
143
|
+
interface HavingInput {
|
|
144
|
+
_count?: HavingComparison;
|
|
145
|
+
_sum?: Record<string, HavingComparison>;
|
|
146
|
+
_avg?: Record<string, HavingComparison>;
|
|
147
|
+
_min?: Record<string, HavingComparison>;
|
|
148
|
+
_max?: Record<string, HavingComparison>;
|
|
149
|
+
}
|
|
133
150
|
interface GroupByArgs<T = Doc> {
|
|
134
151
|
by: string[];
|
|
135
152
|
where?: WhereInput<T>;
|
|
153
|
+
having?: HavingInput;
|
|
136
154
|
_count?: boolean;
|
|
137
155
|
_sum?: FieldSelection;
|
|
138
156
|
_avg?: FieldSelection;
|
|
@@ -184,6 +202,11 @@ declare class Collection<T = Doc> {
|
|
|
184
202
|
findFirst(args?: FindFirstArgs<T>): Promise<WithId<T> | null>;
|
|
185
203
|
findById(id: string): Promise<WithId<T> | null>;
|
|
186
204
|
count(args?: CountArgs<T>): Promise<number>;
|
|
205
|
+
/**
|
|
206
|
+
* Return the distinct values of a field across the collection. Array fields
|
|
207
|
+
* are unwound (each element counts as a value), matching MongoDB's `distinct`.
|
|
208
|
+
*/
|
|
209
|
+
distinct(field: string, where?: WhereInput<T>): Promise<any[]>;
|
|
187
210
|
private runUpdate;
|
|
188
211
|
update(args: UpdateArgs<T>): Promise<WithId<T> | null>;
|
|
189
212
|
updateMany(args: UpdateArgs<T>): Promise<{
|
|
@@ -302,4 +325,4 @@ declare function objectId(): string;
|
|
|
302
325
|
/** True when a value looks like a monlite/ObjectId id (24 hex chars). */
|
|
303
326
|
declare function isObjectId(value: unknown): value is string;
|
|
304
327
|
|
|
305
|
-
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type Driver, type DriverName, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type PreparedStatement, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
|
328
|
+
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type Driver, type DriverName, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, type HavingComparison, type HavingInput, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type PreparedStatement, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
package/dist/index.d.ts
CHANGED
|
@@ -130,9 +130,27 @@ interface AggregateResult {
|
|
|
130
130
|
_min?: Record<string, any>;
|
|
131
131
|
_max?: Record<string, any>;
|
|
132
132
|
}
|
|
133
|
+
/** Numeric comparison used by `groupBy` having-filters. */
|
|
134
|
+
interface HavingComparison {
|
|
135
|
+
equals?: number;
|
|
136
|
+
not?: number;
|
|
137
|
+
gt?: number;
|
|
138
|
+
gte?: number;
|
|
139
|
+
lt?: number;
|
|
140
|
+
lte?: number;
|
|
141
|
+
}
|
|
142
|
+
/** Post-aggregation filter (SQL `HAVING`) for `groupBy`. */
|
|
143
|
+
interface HavingInput {
|
|
144
|
+
_count?: HavingComparison;
|
|
145
|
+
_sum?: Record<string, HavingComparison>;
|
|
146
|
+
_avg?: Record<string, HavingComparison>;
|
|
147
|
+
_min?: Record<string, HavingComparison>;
|
|
148
|
+
_max?: Record<string, HavingComparison>;
|
|
149
|
+
}
|
|
133
150
|
interface GroupByArgs<T = Doc> {
|
|
134
151
|
by: string[];
|
|
135
152
|
where?: WhereInput<T>;
|
|
153
|
+
having?: HavingInput;
|
|
136
154
|
_count?: boolean;
|
|
137
155
|
_sum?: FieldSelection;
|
|
138
156
|
_avg?: FieldSelection;
|
|
@@ -184,6 +202,11 @@ declare class Collection<T = Doc> {
|
|
|
184
202
|
findFirst(args?: FindFirstArgs<T>): Promise<WithId<T> | null>;
|
|
185
203
|
findById(id: string): Promise<WithId<T> | null>;
|
|
186
204
|
count(args?: CountArgs<T>): Promise<number>;
|
|
205
|
+
/**
|
|
206
|
+
* Return the distinct values of a field across the collection. Array fields
|
|
207
|
+
* are unwound (each element counts as a value), matching MongoDB's `distinct`.
|
|
208
|
+
*/
|
|
209
|
+
distinct(field: string, where?: WhereInput<T>): Promise<any[]>;
|
|
187
210
|
private runUpdate;
|
|
188
211
|
update(args: UpdateArgs<T>): Promise<WithId<T> | null>;
|
|
189
212
|
updateMany(args: UpdateArgs<T>): Promise<{
|
|
@@ -302,4 +325,4 @@ declare function objectId(): string;
|
|
|
302
325
|
/** True when a value looks like a monlite/ObjectId id (24 hex chars). */
|
|
303
326
|
declare function isObjectId(value: unknown): value is string;
|
|
304
327
|
|
|
305
|
-
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type Driver, type DriverName, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type PreparedStatement, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
|
328
|
+
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type Driver, type DriverName, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, type HavingComparison, type HavingInput, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, type PreparedStatement, type Select, type SortOrder, type SystemFields, type UpdateArgs, type UpdateData, type UpdateOperators, type UpsertArgs, type WhereInput as WhereClause, type WhereInput, type WithId, createDb, isObjectId, objectId };
|
package/dist/index.js
CHANGED
|
@@ -376,6 +376,44 @@ function aggregate(ctx, args) {
|
|
|
376
376
|
}
|
|
377
377
|
return result;
|
|
378
378
|
}
|
|
379
|
+
var HAVING_FNS = [
|
|
380
|
+
["_sum", "SUM"],
|
|
381
|
+
["_avg", "AVG"],
|
|
382
|
+
["_min", "MIN"],
|
|
383
|
+
["_max", "MAX"]
|
|
384
|
+
];
|
|
385
|
+
function comparisonSql(expr, cmp2, params) {
|
|
386
|
+
const out = [];
|
|
387
|
+
const ops = [
|
|
388
|
+
["equals", "="],
|
|
389
|
+
["not", "<>"],
|
|
390
|
+
["gt", ">"],
|
|
391
|
+
["gte", ">="],
|
|
392
|
+
["lt", "<"],
|
|
393
|
+
["lte", "<="]
|
|
394
|
+
];
|
|
395
|
+
for (const [key, op] of ops) {
|
|
396
|
+
const v = cmp2[key];
|
|
397
|
+
if (v === void 0) continue;
|
|
398
|
+
params.push(v);
|
|
399
|
+
out.push(`${expr} ${op} ?`);
|
|
400
|
+
}
|
|
401
|
+
return out;
|
|
402
|
+
}
|
|
403
|
+
function buildHaving(having, params) {
|
|
404
|
+
const parts = [];
|
|
405
|
+
if (having._count) {
|
|
406
|
+
parts.push(...comparisonSql("COUNT(*)", having._count, params));
|
|
407
|
+
}
|
|
408
|
+
for (const [kind, fn] of HAVING_FNS) {
|
|
409
|
+
const selection = having[kind];
|
|
410
|
+
if (!selection) continue;
|
|
411
|
+
for (const field of Object.keys(selection)) {
|
|
412
|
+
parts.push(...comparisonSql(`${fn}(${fieldExpr(field)})`, selection[field], params));
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return parts.join(" AND ");
|
|
416
|
+
}
|
|
379
417
|
function groupBy(ctx, args) {
|
|
380
418
|
if (!Array.isArray(args.by) || args.by.length === 0) {
|
|
381
419
|
throw new Error("groupBy requires a non-empty `by` array");
|
|
@@ -394,6 +432,10 @@ function groupBy(ctx, args) {
|
|
|
394
432
|
const { selects: accSelects, cols } = buildAccumulators(args, ctx.onPath);
|
|
395
433
|
selects.push(...accSelects);
|
|
396
434
|
let sql = `SELECT ${selects.join(", ")} FROM "${ctx.table}" WHERE ${where} GROUP BY ${groupExprs.join(", ")}`;
|
|
435
|
+
if (args.having) {
|
|
436
|
+
const havingSql = buildHaving(args.having, params);
|
|
437
|
+
if (havingSql) sql += ` HAVING ${havingSql}`;
|
|
438
|
+
}
|
|
397
439
|
if (args.orderBy) {
|
|
398
440
|
const parts = [];
|
|
399
441
|
for (const key of Object.keys(args.orderBy)) {
|
|
@@ -530,6 +572,24 @@ var Collection = class {
|
|
|
530
572
|
const row = this.db.prepare(`SELECT COUNT(*) AS n FROM "${this.name}" WHERE ${where}`).get(...params);
|
|
531
573
|
return row.n;
|
|
532
574
|
}
|
|
575
|
+
/**
|
|
576
|
+
* Return the distinct values of a field across the collection. Array fields
|
|
577
|
+
* are unwound (each element counts as a value), matching MongoDB's `distinct`.
|
|
578
|
+
*/
|
|
579
|
+
async distinct(field, where) {
|
|
580
|
+
this.ensureTable();
|
|
581
|
+
const params = [];
|
|
582
|
+
const clause = buildWhere(where, { params, onPath: this.trackPath });
|
|
583
|
+
let sql;
|
|
584
|
+
if (isReserved(field)) {
|
|
585
|
+
sql = `SELECT DISTINCT ${fieldExpr(field)} AS v FROM "${this.name}" WHERE ${clause} ORDER BY v`;
|
|
586
|
+
} else {
|
|
587
|
+
this.trackPath(field);
|
|
588
|
+
sql = `SELECT DISTINCT je.value AS v FROM "${this.name}" CROSS JOIN json_each("${this.name}".data, ${pathLiteral(field)}) je WHERE ${clause} ORDER BY v`;
|
|
589
|
+
}
|
|
590
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
591
|
+
return rows.map((r) => r.v);
|
|
592
|
+
}
|
|
533
593
|
/* ----------------------------- update ----------------------------- */
|
|
534
594
|
runUpdate(where, data, single) {
|
|
535
595
|
this.ensureTable();
|
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/db.ts"],"names":[],"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 * 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/** SQL expression yielding the value of `field` for a row. */\nexport function fieldExpr(field: string): string {\n if (isReserved(field)) 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, isReserved } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\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 && !isReserved(field)) ctx.onPath(field);\n const expr = fieldExpr(field);\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));\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 (isReserved(field)) {\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 (isReserved(field)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(field: string, expr: string, want: boolean): string {\n if (isReserved(field)) {\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, isReserved } 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): 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 && !isReserved(field)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field)} ${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} from \"../types.js\";\nimport type { Driver } from \"../driver/types.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\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): { 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 onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field)}) 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, { params, onPath: ctx.onPath });\n const { selects, cols } = buildAccumulators(args, ctx.onPath);\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\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, { params, onPath: ctx.onPath });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n ctx.onPath(field);\n const expr = fieldExpr(field);\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);\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.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)} ${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 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 { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ninterface Row {\n _id: string;\n data: string;\n created_at: number;\n updated_at: number;\n}\n\nconst SELECT_COLS = `_id, data, created_at, updated_at`;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\n/**\n * A document collection. Backed by a single SQLite table whose rows store the\n * document as JSON in a `data` column. Created lazily on first write/read.\n */\nexport class Collection<T = Doc> {\n private initialized = false;\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 ) {}\n\n private get db() {\n return this.mon.driver;\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\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 this.initialized = true;\n }\n\n private rowToDoc(row: Row): WithId<T> {\n const doc = JSON.parse(row.data) as Record<string, any>;\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 prepareInsert(input: Record<string, any>): Row {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n return {\n _id: id,\n data: JSON.stringify(doc),\n created_at: now,\n updated_at: now,\n };\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.prepareInsert(args.data);\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n )\n .run(row._id, row.data, row.created_at, row.updated_at);\n return this.rowToDoc(row);\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n );\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_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, { params, onPath: this.trackPath });\n let sql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath);\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(\n (r) => project(this.rowToDoc(r), args.select) as WithId<T>,\n );\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 ${SELECT_COLS} 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, { params, onPath: this.trackPath });\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 /* ----------------------------- 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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 stmt = this.db.prepare(\n `UPDATE \"${this.name}\" SET data = ?, updated_at = ? WHERE _id = ?`,\n );\n\n return this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = JSON.parse(row.data) as Record<string, any>;\n const updated = stripSystem(applyUpdate(current, data));\n stmt.run(JSON.stringify(updated), now, row._id);\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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\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(args: DeleteArgs<T> = { where: undefined as any }): Promise<{\n count: number;\n }> {\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 },\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 },\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","import type { Doc, MonliteOptions } 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\";\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\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\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 /** Get (or lazily create) a typed collection handle. */\n collection<T = Doc>(name: string): 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);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\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' AND name NOT LIKE 'sqlite_%'\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/db.ts"],"names":["cmp"],"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 * 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/** SQL expression yielding the value of `field` for a row. */\nexport function fieldExpr(field: string): string {\n if (isReserved(field)) 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, isReserved } from \"./sql.js\";\n\nexport interface WhereContext {\n params: any[];\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 && !isReserved(field)) ctx.onPath(field);\n const expr = fieldExpr(field);\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));\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 (isReserved(field)) {\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 (isReserved(field)) return `${expr} = ?`;\n return `EXISTS (SELECT 1 FROM json_each(data, ${pathLiteral(field)}) WHERE value = ?)`;\n}\n\nfunction existsExpr(field: string, expr: string, want: boolean): string {\n if (isReserved(field)) {\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, isReserved } 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): 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 && !isReserved(field)) onPath(field);\n const d = String(dir).toLowerCase() === \"desc\" ? \"DESC\" : \"ASC\";\n parts.push(`${fieldExpr(field)} ${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 } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Driver;\n table: string;\n onPath: (path: string) => void;\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): { 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 onPath(field);\n const alias = `agg_${kind.slice(1)}_${i++}`;\n selects.push(`${SQL_FN[kind]}(${fieldExpr(field)}) 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, { params, onPath: ctx.onPath });\n const { selects, cols } = buildAccumulators(args, ctx.onPath);\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(having: HavingInput, params: any[]): 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(...comparisonSql(`${fn}(${fieldExpr(field)})`, selection[field]!, params));\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, { params, onPath: ctx.onPath });\n\n const groupExprs: string[] = [];\n const selects: string[] = [];\n for (const field of args.by) {\n ctx.onPath(field);\n const expr = fieldExpr(field);\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);\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);\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)} ${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 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 { buildWhere } from \"./query/where.js\";\nimport { buildOrderBy } from \"./query/order.js\";\nimport { project } from \"./query/select.js\";\nimport { applyUpdate } from \"./query/update.js\";\nimport { fieldExpr, isReserved, pathLiteral } from \"./query/sql.js\";\nimport { aggregate, groupBy } from \"./aggregation/aggregate.js\";\n\ninterface Row {\n _id: string;\n data: string;\n created_at: number;\n updated_at: number;\n}\n\nconst SELECT_COLS = `_id, data, created_at, updated_at`;\n\nfunction stripSystem(obj: Record<string, any>): Record<string, any> {\n const { _id, created_at, updated_at, ...rest } = obj;\n return rest;\n}\n\n/**\n * A document collection. Backed by a single SQLite table whose rows store the\n * document as JSON in a `data` column. Created lazily on first write/read.\n */\nexport class Collection<T = Doc> {\n private initialized = false;\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 ) {}\n\n private get db() {\n return this.mon.driver;\n }\n\n private ensureTable(): void {\n if (this.initialized) return;\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 this.initialized = true;\n }\n\n private rowToDoc(row: Row): WithId<T> {\n const doc = JSON.parse(row.data) as Record<string, any>;\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 prepareInsert(input: Record<string, any>): Row {\n const now = Date.now();\n const id = input._id != null ? String(input._id) : objectId();\n const doc = stripSystem(input);\n return {\n _id: id,\n data: JSON.stringify(doc),\n created_at: now,\n updated_at: now,\n };\n }\n\n /* ----------------------------- create ----------------------------- */\n\n async create(args: CreateArgs<T>): Promise<WithId<T>> {\n this.ensureTable();\n const row = this.prepareInsert(args.data);\n this.db\n .prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n )\n .run(row._id, row.data, row.created_at, row.updated_at);\n return this.rowToDoc(row);\n }\n\n async createMany(args: CreateManyArgs<T>): Promise<{ count: number }> {\n this.ensureTable();\n const stmt = this.db.prepare(\n `INSERT INTO \"${this.name}\" (_id, data, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n );\n this.db.transaction(() => {\n for (const item of args.data) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_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, { params, onPath: this.trackPath });\n let sql = `SELECT ${SELECT_COLS} FROM \"${this.name}\" WHERE ${where}`;\n\n const order = buildOrderBy(args.orderBy, this.trackPath);\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(\n (r) => project(this.rowToDoc(r), args.select) as WithId<T>,\n );\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 ${SELECT_COLS} 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, { params, onPath: this.trackPath });\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 across the collection. Array fields\n * are 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, { params, onPath: this.trackPath });\n\n let sql: string;\n if (isReserved(field)) {\n sql =\n `SELECT DISTINCT ${fieldExpr(field)} 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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 stmt = this.db.prepare(\n `UPDATE \"${this.name}\" SET data = ?, updated_at = ? WHERE _id = ?`,\n );\n\n return this.db.transaction(() => {\n const out: WithId<T>[] = [];\n for (const row of rows) {\n const current = JSON.parse(row.data) as Record<string, any>;\n const updated = stripSystem(applyUpdate(current, data));\n stmt.run(JSON.stringify(updated), now, row._id);\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, { params, onPath: this.trackPath });\n let selectSql = `SELECT ${SELECT_COLS} 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 this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\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(args: DeleteArgs<T> = { where: undefined as any }): Promise<{\n count: number;\n }> {\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 },\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 },\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","import type { Doc, MonliteOptions } 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\";\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\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\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 /** Get (or lazily create) a typed collection handle. */\n collection<T = Doc>(name: string): 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);\n this.collections.set(name, col);\n }\n return col as Collection<T>;\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' AND name NOT LIKE 'sqlite_%'\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monlite/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "An embedded document database for TypeScript apps. MongoDB-like API, Prisma-like DX, SQLite under the hood. Zero config, zero migrations, zero server.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.30.3",
|