@monlite/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +343 -0
- package/dist/index.cjs +814 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +271 -0
- package/dist/index.d.ts +271 -0
- package/dist/index.js +802 -0
- package/dist/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +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/db.ts"],"names":["randomBytes","Database"],"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 { Database } from \"better-sqlite3\";\nimport type {\n AggregateArgs,\n AggregateResult,\n GroupByArgs,\n GroupByResult,\n} from \"../types.js\";\nimport { buildWhere } from \"../query/where.js\";\nimport { fieldExpr } from \"../query/sql.js\";\n\nexport interface AggContext {\n db: Database;\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.sqlite;\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 const insertAll = this.db.transaction((items: Record<string, any>[]) => {\n for (const item of items) {\n const row = this.prepareInsert(item);\n stmt.run(row._id, row.data, row.created_at, row.updated_at);\n }\n });\n insertAll(args.data);\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 const txn = 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 return txn();\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 const txn = this.db.transaction(() => {\n for (const row of rows) stmt.run(row._id);\n });\n txn();\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 { Database } from \"better-sqlite3\";\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: Database,\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 Database from \"better-sqlite3\";\nimport type { Database as SqliteDatabase } from \"better-sqlite3\";\nimport 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\";\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 /** The underlying better-sqlite3 connection (escape hatch). */\n readonly sqlite: SqliteDatabase;\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 const verbose = options.verbose;\n this.sqlite = new Database(filename, {\n readonly: options.readonly ?? false,\n ...(verbose ? { verbose: (msg?: unknown) => verbose(String(msg)) } : {}),\n });\n\n if (!options.readonly && (options.wal ?? true)) {\n this.sqlite.pragma(\"journal_mode = WAL\");\n }\n\n this.autoIndexer = new AutoIndexer(\n this.sqlite,\n options.autoIndex ?? true,\n options.autoIndexAfter ?? 10,\n );\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.sqlite.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.sqlite.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.sqlite.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.sqlite.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 // better-sqlite3 transactions are synchronous; `fn` must not be async.\n // A throw inside `txn()` rolls back and rejects this promise.\n const txn = this.sqlite.transaction(() => fn(this));\n return txn();\n }\n\n /** List all collection (table) names. */\n $collections(): Promise<string[]> {\n this.assertOpen();\n const rows = this.sqlite\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.sqlite.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.sqlite.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
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { Database } from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Public type surface for monlite.
|
|
5
|
+
*
|
|
6
|
+
* Documents are plain objects. monlite adds three system fields to every
|
|
7
|
+
* stored document: `_id`, `created_at`, and `updated_at`.
|
|
8
|
+
*/
|
|
9
|
+
/** A free-form document. */
|
|
10
|
+
type Doc = Record<string, any>;
|
|
11
|
+
/** System fields monlite manages on every document. */
|
|
12
|
+
interface SystemFields {
|
|
13
|
+
_id: string;
|
|
14
|
+
/** Unix epoch milliseconds. */
|
|
15
|
+
created_at: number;
|
|
16
|
+
/** Unix epoch milliseconds. */
|
|
17
|
+
updated_at: number;
|
|
18
|
+
}
|
|
19
|
+
/** A stored document: the user's shape plus monlite's system fields. */
|
|
20
|
+
type WithId<T> = T & SystemFields;
|
|
21
|
+
/** Per-field operators, Prisma-style (no `$` prefix). */
|
|
22
|
+
interface FieldFilter<V = any> {
|
|
23
|
+
equals?: V | null;
|
|
24
|
+
not?: V | null;
|
|
25
|
+
in?: V[];
|
|
26
|
+
notIn?: V[];
|
|
27
|
+
lt?: V;
|
|
28
|
+
lte?: V;
|
|
29
|
+
gt?: V;
|
|
30
|
+
gte?: V;
|
|
31
|
+
/** Substring match on strings, or element membership on arrays. */
|
|
32
|
+
contains?: V extends string ? string : any;
|
|
33
|
+
startsWith?: string;
|
|
34
|
+
endsWith?: string;
|
|
35
|
+
/** Explicit array element membership. */
|
|
36
|
+
has?: any;
|
|
37
|
+
/** Field presence. `true` requires the field to exist, `false` requires absence. */
|
|
38
|
+
exists?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** A value used directly as a filter is shorthand for `{ equals: value }`. */
|
|
41
|
+
type FilterInput<V> = V | FieldFilter<V>;
|
|
42
|
+
/**
|
|
43
|
+
* Where input. Known fields are typed from `T`; nested paths can also be
|
|
44
|
+
* addressed with dot notation (e.g. `"address.city"`).
|
|
45
|
+
*/
|
|
46
|
+
type WhereInput<T = Doc> = {
|
|
47
|
+
[K in keyof T]?: FilterInput<T[K]>;
|
|
48
|
+
} & {
|
|
49
|
+
_id?: FilterInput<string>;
|
|
50
|
+
created_at?: FilterInput<number>;
|
|
51
|
+
updated_at?: FilterInput<number>;
|
|
52
|
+
AND?: WhereInput<T> | WhereInput<T>[];
|
|
53
|
+
OR?: WhereInput<T> | WhereInput<T>[];
|
|
54
|
+
NOT?: WhereInput<T> | WhereInput<T>[];
|
|
55
|
+
} & {
|
|
56
|
+
[path: string]: any;
|
|
57
|
+
};
|
|
58
|
+
/** Mongo-inspired update operators. */
|
|
59
|
+
interface UpdateOperators {
|
|
60
|
+
$set?: Record<string, any>;
|
|
61
|
+
$unset?: Record<string, true | 1>;
|
|
62
|
+
$inc?: Record<string, number>;
|
|
63
|
+
$push?: Record<string, any>;
|
|
64
|
+
$pull?: Record<string, any>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Update payload. Either a plain object (shallow-merged into the document)
|
|
68
|
+
* or an object using update operators. The two forms cannot be mixed.
|
|
69
|
+
*/
|
|
70
|
+
type UpdateData<T = Doc> = (Partial<T> & Record<string, any>) | UpdateOperators;
|
|
71
|
+
type SortOrder = "asc" | "desc";
|
|
72
|
+
type OrderBy<T = Doc> = ({
|
|
73
|
+
[K in keyof T]?: SortOrder;
|
|
74
|
+
} & {
|
|
75
|
+
[path: string]: SortOrder;
|
|
76
|
+
}) | Array<{
|
|
77
|
+
[path: string]: SortOrder;
|
|
78
|
+
}>;
|
|
79
|
+
type Select<T = Doc> = {
|
|
80
|
+
[K in keyof T]?: boolean;
|
|
81
|
+
} & {
|
|
82
|
+
[path: string]: boolean;
|
|
83
|
+
};
|
|
84
|
+
interface FindManyArgs<T = Doc> {
|
|
85
|
+
where?: WhereInput<T>;
|
|
86
|
+
orderBy?: OrderBy<T>;
|
|
87
|
+
select?: Select<T>;
|
|
88
|
+
skip?: number;
|
|
89
|
+
take?: number;
|
|
90
|
+
}
|
|
91
|
+
interface FindFirstArgs<T = Doc> {
|
|
92
|
+
where?: WhereInput<T>;
|
|
93
|
+
orderBy?: OrderBy<T>;
|
|
94
|
+
select?: Select<T>;
|
|
95
|
+
skip?: number;
|
|
96
|
+
}
|
|
97
|
+
interface CreateArgs<T = Doc> {
|
|
98
|
+
data: Partial<T> & Record<string, any>;
|
|
99
|
+
}
|
|
100
|
+
interface CreateManyArgs<T = Doc> {
|
|
101
|
+
data: Array<Partial<T> & Record<string, any>>;
|
|
102
|
+
}
|
|
103
|
+
interface UpdateArgs<T = Doc> {
|
|
104
|
+
where: WhereInput<T>;
|
|
105
|
+
data: UpdateData<T>;
|
|
106
|
+
}
|
|
107
|
+
interface UpsertArgs<T = Doc> {
|
|
108
|
+
where: WhereInput<T>;
|
|
109
|
+
create: Partial<T> & Record<string, any>;
|
|
110
|
+
update: UpdateData<T>;
|
|
111
|
+
}
|
|
112
|
+
interface DeleteArgs<T = Doc> {
|
|
113
|
+
where: WhereInput<T>;
|
|
114
|
+
}
|
|
115
|
+
interface CountArgs<T = Doc> {
|
|
116
|
+
where?: WhereInput<T>;
|
|
117
|
+
}
|
|
118
|
+
/** Map of `field -> true` selecting which fields an accumulator applies to. */
|
|
119
|
+
type FieldSelection = Record<string, boolean>;
|
|
120
|
+
interface AggregateArgs<T = Doc> {
|
|
121
|
+
where?: WhereInput<T>;
|
|
122
|
+
_count?: boolean;
|
|
123
|
+
_sum?: FieldSelection;
|
|
124
|
+
_avg?: FieldSelection;
|
|
125
|
+
_min?: FieldSelection;
|
|
126
|
+
_max?: FieldSelection;
|
|
127
|
+
}
|
|
128
|
+
interface AggregateResult {
|
|
129
|
+
_count?: number;
|
|
130
|
+
_sum?: Record<string, number | null>;
|
|
131
|
+
_avg?: Record<string, number | null>;
|
|
132
|
+
_min?: Record<string, any>;
|
|
133
|
+
_max?: Record<string, any>;
|
|
134
|
+
}
|
|
135
|
+
interface GroupByArgs<T = Doc> {
|
|
136
|
+
by: string[];
|
|
137
|
+
where?: WhereInput<T>;
|
|
138
|
+
_count?: boolean;
|
|
139
|
+
_sum?: FieldSelection;
|
|
140
|
+
_avg?: FieldSelection;
|
|
141
|
+
_min?: FieldSelection;
|
|
142
|
+
_max?: FieldSelection;
|
|
143
|
+
orderBy?: Record<string, SortOrder>;
|
|
144
|
+
skip?: number;
|
|
145
|
+
take?: number;
|
|
146
|
+
}
|
|
147
|
+
type GroupByResult = Record<string, any>;
|
|
148
|
+
interface MonliteOptions {
|
|
149
|
+
/** Auto-create indexes on frequently-queried JSON paths. Default `true`. */
|
|
150
|
+
autoIndex?: boolean;
|
|
151
|
+
/** Number of times a path must be queried before an index is created. Default `10`. */
|
|
152
|
+
autoIndexAfter?: number;
|
|
153
|
+
/** Open the database read-only. Default `false`. */
|
|
154
|
+
readonly?: boolean;
|
|
155
|
+
/** Use SQLite WAL journal mode for better concurrency. Default `true`. */
|
|
156
|
+
wal?: boolean;
|
|
157
|
+
/** Verbose logger for executed SQL (debugging). */
|
|
158
|
+
verbose?: (sql: string) => void;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* A document collection. Backed by a single SQLite table whose rows store the
|
|
163
|
+
* document as JSON in a `data` column. Created lazily on first write/read.
|
|
164
|
+
*/
|
|
165
|
+
declare class Collection<T = Doc> {
|
|
166
|
+
private readonly mon;
|
|
167
|
+
readonly name: string;
|
|
168
|
+
private initialized;
|
|
169
|
+
private readonly trackPath;
|
|
170
|
+
constructor(mon: Monlite, name: string);
|
|
171
|
+
private get db();
|
|
172
|
+
private ensureTable;
|
|
173
|
+
private rowToDoc;
|
|
174
|
+
private prepareInsert;
|
|
175
|
+
create(args: CreateArgs<T>): Promise<WithId<T>>;
|
|
176
|
+
createMany(args: CreateManyArgs<T>): Promise<{
|
|
177
|
+
count: number;
|
|
178
|
+
}>;
|
|
179
|
+
findMany(args?: FindManyArgs<T>): Promise<WithId<T>[]>;
|
|
180
|
+
findFirst(args?: FindFirstArgs<T>): Promise<WithId<T> | null>;
|
|
181
|
+
findById(id: string): Promise<WithId<T> | null>;
|
|
182
|
+
count(args?: CountArgs<T>): Promise<number>;
|
|
183
|
+
private runUpdate;
|
|
184
|
+
update(args: UpdateArgs<T>): Promise<WithId<T> | null>;
|
|
185
|
+
updateMany(args: UpdateArgs<T>): Promise<{
|
|
186
|
+
count: number;
|
|
187
|
+
}>;
|
|
188
|
+
upsert(args: UpsertArgs<T>): Promise<WithId<T>>;
|
|
189
|
+
private runDelete;
|
|
190
|
+
delete(args: DeleteArgs<T>): Promise<WithId<T> | null>;
|
|
191
|
+
deleteMany(args?: DeleteArgs<T>): Promise<{
|
|
192
|
+
count: number;
|
|
193
|
+
}>;
|
|
194
|
+
aggregate(args?: AggregateArgs<T>): Promise<AggregateResult>;
|
|
195
|
+
groupBy(args: GroupByArgs<T>): Promise<GroupByResult[]>;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Tracks which JSON paths are queried per collection and silently creates a
|
|
200
|
+
* SQLite expression index once a path crosses the configured threshold.
|
|
201
|
+
*/
|
|
202
|
+
declare class AutoIndexer {
|
|
203
|
+
private readonly db;
|
|
204
|
+
private readonly enabled;
|
|
205
|
+
private readonly threshold;
|
|
206
|
+
private counts;
|
|
207
|
+
private created;
|
|
208
|
+
constructor(db: Database, enabled: boolean, threshold: number);
|
|
209
|
+
track(collection: string, path: string): void;
|
|
210
|
+
private create;
|
|
211
|
+
/** Forget tracking for a collection (or everything when omitted). */
|
|
212
|
+
reset(collection?: string): void;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* A monlite database — a thin document layer over a single SQLite file.
|
|
217
|
+
* Create one with {@link createDb}.
|
|
218
|
+
*/
|
|
219
|
+
declare class Monlite {
|
|
220
|
+
/** The underlying better-sqlite3 connection (escape hatch). */
|
|
221
|
+
readonly sqlite: Database;
|
|
222
|
+
/** @internal */
|
|
223
|
+
readonly autoIndexer: AutoIndexer;
|
|
224
|
+
private readonly collections;
|
|
225
|
+
private closed;
|
|
226
|
+
constructor(filename: string, options?: MonliteOptions);
|
|
227
|
+
/** Get (or lazily create) a typed collection handle. */
|
|
228
|
+
collection<T = Doc>(name: string): Collection<T>;
|
|
229
|
+
/** Tagged-template SQL query returning rows. Values are safely parameterized. */
|
|
230
|
+
$queryRaw<R = any>(strings: TemplateStringsArray, ...values: any[]): Promise<R[]>;
|
|
231
|
+
/** Like {@link $queryRaw} but takes a raw SQL string and positional params. */
|
|
232
|
+
$queryRawUnsafe<R = any>(sql: string, ...params: any[]): Promise<R[]>;
|
|
233
|
+
/** Tagged-template SQL statement returning the number of affected rows. */
|
|
234
|
+
$executeRaw(strings: TemplateStringsArray, ...values: any[]): Promise<number>;
|
|
235
|
+
/** Like {@link $executeRaw} but takes a raw SQL string and positional params. */
|
|
236
|
+
$executeRawUnsafe(sql: string, ...params: any[]): Promise<number>;
|
|
237
|
+
/**
|
|
238
|
+
* Run a function inside a synchronous SQLite transaction. If it throws, the
|
|
239
|
+
* transaction is rolled back.
|
|
240
|
+
*/
|
|
241
|
+
$transaction<R>(fn: (db: this) => R): Promise<R>;
|
|
242
|
+
/** List all collection (table) names. */
|
|
243
|
+
$collections(): Promise<string[]>;
|
|
244
|
+
/** Drop a collection and all of its data. */
|
|
245
|
+
$drop(name: string): Promise<void>;
|
|
246
|
+
/** Drop every collection in the database. */
|
|
247
|
+
$dropAll(): Promise<void>;
|
|
248
|
+
/** Close the underlying SQLite connection. */
|
|
249
|
+
$disconnect(): Promise<void>;
|
|
250
|
+
private assertOpen;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Open (or create) a monlite database backed by a single SQLite file.
|
|
254
|
+
* Use `":memory:"` for an in-memory database.
|
|
255
|
+
*/
|
|
256
|
+
declare function createDb(filename: string, options?: MonliteOptions): Monlite;
|
|
257
|
+
|
|
258
|
+
/** Base error for all monlite-originated failures. */
|
|
259
|
+
declare class MonliteError extends Error {
|
|
260
|
+
constructor(message: string);
|
|
261
|
+
}
|
|
262
|
+
/** Thrown when a query/update payload is malformed. */
|
|
263
|
+
declare class MonliteQueryError extends MonliteError {
|
|
264
|
+
constructor(message: string);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
declare function objectId(): string;
|
|
268
|
+
/** True when a value looks like a monlite/ObjectId id (24 hex chars). */
|
|
269
|
+
declare function isObjectId(value: unknown): value is string;
|
|
270
|
+
|
|
271
|
+
export { type AggregateArgs, type AggregateResult, Collection, type CountArgs, type CreateArgs, type CreateManyArgs, Monlite as Db, type DeleteArgs, type Doc, type FieldFilter, type FieldSelection, type FilterInput, type FindFirstArgs, type FindManyArgs, type GroupByArgs, type GroupByResult, Monlite, MonliteError, type MonliteOptions, MonliteQueryError, type OrderBy, 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 };
|