@visorcraft/mongreldb-kit 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/constraints.d.ts +35 -0
  2. package/dist/constraints.d.ts.map +1 -0
  3. package/dist/constraints.js +404 -0
  4. package/dist/constraints.js.map +1 -0
  5. package/dist/db.d.ts +135 -0
  6. package/dist/db.d.ts.map +1 -0
  7. package/dist/db.js +495 -0
  8. package/dist/db.js.map +1 -0
  9. package/dist/defaults.d.ts +26 -0
  10. package/dist/defaults.d.ts.map +1 -0
  11. package/dist/defaults.js +56 -0
  12. package/dist/defaults.js.map +1 -0
  13. package/dist/errors.d.ts +54 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +104 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/index.d.ts +13 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +13 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/internalTables.d.ts +63 -0
  22. package/dist/internalTables.d.ts.map +1 -0
  23. package/dist/internalTables.js +60 -0
  24. package/dist/internalTables.js.map +1 -0
  25. package/dist/keys.d.ts +7 -0
  26. package/dist/keys.d.ts.map +1 -0
  27. package/dist/keys.js +84 -0
  28. package/dist/keys.js.map +1 -0
  29. package/dist/migrate.d.ts +132 -0
  30. package/dist/migrate.d.ts.map +1 -0
  31. package/dist/migrate.js +1004 -0
  32. package/dist/migrate.js.map +1 -0
  33. package/dist/packing.d.ts +12 -0
  34. package/dist/packing.d.ts.map +1 -0
  35. package/dist/packing.js +137 -0
  36. package/dist/packing.js.map +1 -0
  37. package/dist/query.d.ts +423 -0
  38. package/dist/query.d.ts.map +1 -0
  39. package/dist/query.js +1645 -0
  40. package/dist/query.js.map +1 -0
  41. package/dist/remote.d.ts +29 -0
  42. package/dist/remote.d.ts.map +1 -0
  43. package/dist/remote.js +42 -0
  44. package/dist/remote.js.map +1 -0
  45. package/dist/rows.d.ts +5 -0
  46. package/dist/rows.d.ts.map +1 -0
  47. package/dist/rows.js +38 -0
  48. package/dist/rows.js.map +1 -0
  49. package/dist/schema.d.ts +91 -0
  50. package/dist/schema.d.ts.map +1 -0
  51. package/dist/schema.js +206 -0
  52. package/dist/schema.js.map +1 -0
  53. package/dist/tsv.d.ts +4 -0
  54. package/dist/tsv.d.ts.map +1 -0
  55. package/dist/tsv.js +102 -0
  56. package/dist/tsv.js.map +1 -0
  57. package/dist/types.d.ts +99 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +2 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/validation.d.ts +3 -0
  62. package/dist/validation.d.ts.map +1 -0
  63. package/dist/validation.js +98 -0
  64. package/dist/validation.js.map +1 -0
  65. package/package.json +50 -0
package/dist/db.js ADDED
@@ -0,0 +1,495 @@
1
+ import { createHash } from 'node:crypto';
2
+ import mongreldb from '@visorcraft/mongreldb';
3
+ import { rowsToTsv, tsvToRows } from './tsv.js';
4
+ import { rowFromRowJs } from './rows.js';
5
+ import { internalTables, kitSchemaCatalog } from './internalTables.js';
6
+ import { migrateSync as runMigrateSync } from './migrate.js';
7
+ import { deleteGuardsForTable } from './constraints.js';
8
+ import { KitError, isRetryableConflict } from './errors.js';
9
+ /** Members of a set-valued cell: a JSON array, or a JSON string of one. */
10
+ function parseStringSet(value) {
11
+ let arr = value;
12
+ if (typeof value === 'string') {
13
+ try {
14
+ arr = JSON.parse(value);
15
+ }
16
+ catch {
17
+ arr = null;
18
+ }
19
+ }
20
+ const out = new Set();
21
+ if (Array.isArray(arr)) {
22
+ for (const v of arr) {
23
+ if (typeof v === 'string')
24
+ out.add(v);
25
+ else if (typeof v === 'number' || typeof v === 'boolean')
26
+ out.add(String(v));
27
+ }
28
+ }
29
+ return out;
30
+ }
31
+ const addon = mongreldb;
32
+ function toMongrelColumnType(storageType) {
33
+ switch (storageType) {
34
+ case 'bool':
35
+ return 0 /* addon.ColumnType.Bool */;
36
+ case 'int64':
37
+ return 1 /* addon.ColumnType.Int64 */;
38
+ case 'float64':
39
+ return 2 /* addon.ColumnType.Float64 */;
40
+ case 'text':
41
+ case 'timestamp':
42
+ case 'date':
43
+ case 'bytes':
44
+ case 'json':
45
+ return 5 /* addon.ColumnType.Bytes */;
46
+ case 'embedding':
47
+ return 6 /* addon.ColumnType.Embedding */;
48
+ case 'sparse':
49
+ // A sparse column is stored as bincoded bytes; the sparse index reads
50
+ // the tokens from those bytes.
51
+ return 5 /* addon.ColumnType.Bytes */;
52
+ }
53
+ }
54
+ function toMongrelSchema(table) {
55
+ const indexes = table.indexes.flatMap((idx) => idx.columns.map((colName) => {
56
+ const col = table.columns.find((c) => c.name === colName);
57
+ if (!col) {
58
+ throw new Error(`Index column "${colName}" not found in table "${table.name}"`);
59
+ }
60
+ return {
61
+ name: `${idx.name}_${colName}`,
62
+ columnId: col.id,
63
+ kind: idx.kind === 'fm'
64
+ ? 1 /* addon.IndexKindSpec.FmIndex */
65
+ : idx.kind === 'ann'
66
+ ? 2 /* addon.IndexKindSpec.Ann */
67
+ : idx.kind === 'sparse'
68
+ ? 3 /* addon.IndexKindSpec.Sparse */
69
+ : idx.kind === 'minhash'
70
+ ? 4 /* addon.IndexKindSpec.MinHash */
71
+ : 0 /* addon.IndexKindSpec.Bitmap */
72
+ };
73
+ }));
74
+ const indexedColumns = new Set(table.indexes.flatMap((idx) => idx.columns));
75
+ for (const pk of table.primaryKey) {
76
+ if (indexedColumns.has(pk))
77
+ continue;
78
+ const col = table.columns.find((c) => c.name === pk);
79
+ if (!col) {
80
+ throw new Error(`Primary key column "${pk}" not found in table "${table.name}"`);
81
+ }
82
+ indexes.push({
83
+ name: `pk_${pk}`,
84
+ columnId: col.id,
85
+ kind: 0 /* addon.IndexKindSpec.Bitmap */
86
+ });
87
+ indexedColumns.add(pk);
88
+ }
89
+ for (const fk of table.foreignKeys) {
90
+ for (const colName of fk.columns) {
91
+ if (indexedColumns.has(colName))
92
+ continue;
93
+ const col = table.columns.find((c) => c.name === colName);
94
+ if (!col) {
95
+ throw new Error(`Foreign key column "${colName}" not found in table "${table.name}"`);
96
+ }
97
+ indexes.push({
98
+ name: `fk_${fk.name}_${colName}`,
99
+ columnId: col.id,
100
+ kind: 0 /* addon.IndexKindSpec.Bitmap */
101
+ });
102
+ indexedColumns.add(colName);
103
+ }
104
+ }
105
+ return {
106
+ columns: table.columns.map((col) => ({
107
+ id: col.id,
108
+ name: col.name,
109
+ ty: toMongrelColumnType(col.storageType),
110
+ primaryKey: col.primaryKey,
111
+ nullable: col.nullable,
112
+ // A Kit sequence-default column maps to the engine's native
113
+ // AUTO_INCREMENT allocator (a per-table WAL-durable counter) instead
114
+ // of the legacy __kit_sequences hot row.
115
+ autoIncrement: col.default?.kind === 'sequence',
116
+ embeddingDim: col.embeddingDim,
117
+ encrypted: col.encrypted,
118
+ encryptedIndexable: col.encryptedIndexable
119
+ })),
120
+ indexes
121
+ };
122
+ }
123
+ function columnId(table, name) {
124
+ const col = table.columns.find((c) => c.name === name);
125
+ if (!col) {
126
+ throw new Error(`Column "${name}" not found in table "${table.name}"`);
127
+ }
128
+ return col.id;
129
+ }
130
+ function isoNow() {
131
+ return new Date().toISOString();
132
+ }
133
+ /**
134
+ * Run `fn` inside a fresh transaction, retrying bounded-exponentially on
135
+ * retryable conflicts. Exported so query builders and `KitDatabase` methods
136
+ * can share one implementation.
137
+ */
138
+ export function runSyncTxn(kit, fn, opts = {}) {
139
+ const maxRetries = opts.maxRetries ?? 5;
140
+ const baseDelayMs = opts.baseDelayMs ?? 1;
141
+ let lastErr;
142
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
143
+ const txn = kit.begin();
144
+ try {
145
+ fn(txn);
146
+ txn.commit();
147
+ return;
148
+ }
149
+ catch (err) {
150
+ try {
151
+ txn.rollback();
152
+ }
153
+ catch {
154
+ // ignore rollback errors
155
+ }
156
+ lastErr = err;
157
+ if (attempt < maxRetries && isRetryableConflict(err)) {
158
+ const delay = baseDelayMs * (attempt + 1);
159
+ if (delay > 0) {
160
+ const start = Date.now();
161
+ while (Date.now() - start < delay) {
162
+ // busy wait
163
+ }
164
+ }
165
+ continue;
166
+ }
167
+ throw err;
168
+ }
169
+ }
170
+ throw lastErr;
171
+ }
172
+ export class KitDatabase {
173
+ db;
174
+ schema;
175
+ constructor(db, schema) {
176
+ this.db = db;
177
+ this.schema = schema;
178
+ }
179
+ static async open(path, schema) {
180
+ let db;
181
+ try {
182
+ db = addon.Database.open(path);
183
+ }
184
+ catch {
185
+ db = addon.Database.withPath(path);
186
+ }
187
+ const kitDb = new KitDatabase(db, schema);
188
+ kitDb.ensureInternalTables();
189
+ for (const table of schema.tablesList()) {
190
+ kitDb.ensureAppTable(table);
191
+ }
192
+ kitDb.writeSchemaCatalog();
193
+ return kitDb;
194
+ }
195
+ static openSync(path, schema, options) {
196
+ if (options?.encryption?.passphrase) {
197
+ try {
198
+ return KitDatabase.openEncryptedSync(path, schema, options.encryption.passphrase);
199
+ }
200
+ catch {
201
+ return KitDatabase.createEncryptedSync(path, schema, options.encryption.passphrase);
202
+ }
203
+ }
204
+ let db;
205
+ try {
206
+ db = addon.Database.open(path);
207
+ }
208
+ catch {
209
+ db = addon.Database.withPath(path);
210
+ }
211
+ return KitDatabase.initialize(db, schema);
212
+ }
213
+ static createEncryptedSync(path, schema, passphrase) {
214
+ if (!passphrase) {
215
+ throw new Error('createEncryptedSync requires a non-empty passphrase');
216
+ }
217
+ const db = addon.Database.createEncrypted(path, passphrase);
218
+ return KitDatabase.initialize(db, schema);
219
+ }
220
+ static openEncryptedSync(path, schema, passphrase) {
221
+ if (!passphrase) {
222
+ throw new Error('openEncryptedSync requires a non-empty passphrase');
223
+ }
224
+ const db = addon.Database.openEncrypted(path, passphrase);
225
+ return KitDatabase.initialize(db, schema);
226
+ }
227
+ static initialize(db, schema) {
228
+ const kitDb = new KitDatabase(db, schema);
229
+ kitDb.ensureInternalTables();
230
+ for (const table of schema.tablesList()) {
231
+ kitDb.ensureAppTable(table);
232
+ }
233
+ kitDb.writeSchemaCatalog();
234
+ return kitDb;
235
+ }
236
+ ensureInternalTables() {
237
+ for (const table of internalTables) {
238
+ if (!this.db.tableNames().includes(table.name)) {
239
+ this.db.createTable(table.name, toMongrelSchema(table));
240
+ }
241
+ }
242
+ }
243
+ ensureAppTable(table) {
244
+ if (this.db.tableNames().includes(table.name))
245
+ return;
246
+ this.db.createTable(table.name, toMongrelSchema(table));
247
+ }
248
+ writeSchemaCatalog() {
249
+ const catalog = this.db.table('__kit_schema_catalog');
250
+ const schemaJson = JSON.stringify(this.schema.tablesList().map((t) => ({
251
+ tableId: t.tableId,
252
+ name: t.name,
253
+ columns: t.columns.map((c) => ({
254
+ id: c.id,
255
+ name: c.name,
256
+ storageType: c.storageType,
257
+ applicationType: c.applicationType,
258
+ nullable: c.nullable,
259
+ primaryKey: c.primaryKey,
260
+ enumValues: c.enumValues,
261
+ min: c.min,
262
+ max: c.max,
263
+ minLength: c.minLength,
264
+ maxLength: c.maxLength,
265
+ regex: c.regex?.source
266
+ })),
267
+ primaryKey: t.primaryKey,
268
+ indexes: t.indexes,
269
+ foreignKeys: t.foreignKeys,
270
+ unique: t.unique,
271
+ checks: t.checks.map((c) => ({ name: c.name }))
272
+ })));
273
+ const checksum = createHash('sha256').update(schemaJson).digest('hex');
274
+ catalog.put([
275
+ { columnId: columnId(kitSchemaCatalog, 'schema_version'), int64: 1n },
276
+ { columnId: columnId(kitSchemaCatalog, 'schema_json'), text: schemaJson },
277
+ { columnId: columnId(kitSchemaCatalog, 'checksum'), text: checksum },
278
+ { columnId: columnId(kitSchemaCatalog, 'written_at'), text: isoNow() }
279
+ ]);
280
+ catalog.commit();
281
+ }
282
+ migrateSync(schema, migrations) {
283
+ runMigrateSync(this, schema, migrations);
284
+ }
285
+ close() {
286
+ this.db.close();
287
+ }
288
+ get nativeDb() {
289
+ return this.db;
290
+ }
291
+ tableNames() {
292
+ return this.db.tableNames().filter((name) => !name.startsWith('__kit_'));
293
+ }
294
+ /** Verify run footer checksums; returns integrity issues grouped by table. */
295
+ check() {
296
+ return JSON.parse(this.db.check());
297
+ }
298
+ /** Drop corrupt runs; returns the doctor report. */
299
+ doctor() {
300
+ return JSON.parse(this.db.doctor());
301
+ }
302
+ /**
303
+ * Flush every table's in-memory writes to durable sorted runs. Besides
304
+ * durability, this empties the memtable, which enables the engine's
305
+ * incremental-aggregate fast path (see `incrementalAggregate`).
306
+ */
307
+ flush() {
308
+ for (const name of this.db.tableNames()) {
309
+ this.db.table(name).flush();
310
+ }
311
+ }
312
+ /** The current visible commit epoch (monotonically increasing version). */
313
+ snapshotEpoch() {
314
+ return this.db.snapshotEpoch();
315
+ }
316
+ /** Export every visible row of `table` as a TSV document. */
317
+ exportTsv(table) {
318
+ const spec = this.schema.table(table);
319
+ const rows = this.selectFrom(spec).executeSync();
320
+ return rowsToTsv(spec, rows);
321
+ }
322
+ /** Read every row of `table` visible at commit `epoch` (MVCC time-travel). */
323
+ rowsAtEpoch(table, epoch) {
324
+ const spec = this.schema.table(table);
325
+ return this.db
326
+ .table(table)
327
+ .rowsAtEpoch(epoch)
328
+ .map((rj) => rowFromRowJs(spec, rj));
329
+ }
330
+ /**
331
+ * Reservoir-sampled approximate aggregate (`count`/`sum`/`avg`) with a
332
+ * `z`-score confidence interval (default ~95%). Returns
333
+ * `{ point, ci_low, ci_high, n_population, n_sample_live, n_passing }`, or
334
+ * `null` when the reservoir is empty. `column` is required for `sum`/`avg`.
335
+ */
336
+ approxAggregate(table, agg, column, z = 1.96) {
337
+ const spec = this.schema.table(table);
338
+ let columnId;
339
+ if (column !== undefined) {
340
+ const col = spec.columns.find((c) => c.name === column);
341
+ if (!col)
342
+ throw new KitError(`unknown column '${column}'`);
343
+ columnId = col.id;
344
+ }
345
+ else if (agg !== 'count') {
346
+ throw new KitError(`approx ${agg} requires a column`);
347
+ }
348
+ const raw = this.db.table(table).approxAggregate(agg, columnId, z);
349
+ return raw === null ? null : JSON.parse(raw);
350
+ }
351
+ /**
352
+ * Stream `table` in batches of at most `batchSize` rows, invoking `cb` once
353
+ * per batch. Implemented with `limit`/`offset` pagination, so memory stays
354
+ * bounded to one batch. (Not snapshot-consistent across batches, and O(n·
355
+ * pages) — the Rust/Python kit's `scan_batched` uses the engine's native
356
+ * single-pass cursor.)
357
+ */
358
+ scanBatched(table, batchSize, cb) {
359
+ const spec = this.schema.table(table);
360
+ const size = Math.max(1, Math.floor(batchSize));
361
+ let offset = 0;
362
+ for (;;) {
363
+ const rows = this.selectFrom(spec)
364
+ .limit(size)
365
+ .offset(offset)
366
+ .executeSync();
367
+ if (rows.length === 0)
368
+ break;
369
+ cb(rows);
370
+ if (rows.length < size)
371
+ break;
372
+ offset += rows.length;
373
+ }
374
+ }
375
+ /**
376
+ * Rank rows of `table` by Jaccard set-similarity between `query` and the
377
+ * string set stored (as a JSON array) in `column`, returning the top `k`
378
+ * with similarity `> 0`, highest first. The set-similarity / dedup-join
379
+ * primitive the `MinHash` index kind is meant to serve; an exact linear scan
380
+ * (a sub-linear MinHash/LSH index remains engine future-work).
381
+ */
382
+ setSimilarity(table, column, query, k) {
383
+ const spec = this.schema.table(table);
384
+ const col = spec.columns.find((c) => c.name === column);
385
+ if (!col) {
386
+ throw new KitError(`unknown column '${column}' on table '${table}'`);
387
+ }
388
+ const q = new Set(query);
389
+ // Fast path: a MinHash index generates sub-linear candidates via LSH,
390
+ // which are then re-verified with exact Jaccard below.
391
+ const hasMinhash = (spec.indexes ?? []).some((idx) => idx.kind === 'minhash' && idx.columns.includes(column));
392
+ let rows;
393
+ if (hasMinhash) {
394
+ const candidateBudget = Math.max(k * 8, k + 64);
395
+ const cond = {
396
+ kind: 12 /* addon.ConditionKind.MinHashSimilar */,
397
+ columnId: col.id,
398
+ values: query,
399
+ k: candidateBudget
400
+ };
401
+ rows = this.db
402
+ .table(table)
403
+ .query([cond])
404
+ .map((rj) => rowFromRowJs(spec, rj));
405
+ }
406
+ else {
407
+ rows = this.selectFrom(spec).executeSync();
408
+ }
409
+ const scored = [];
410
+ for (const row of rows) {
411
+ const set = parseStringSet(row[column]);
412
+ let inter = 0;
413
+ for (const x of set)
414
+ if (q.has(x))
415
+ inter++;
416
+ const union = set.size + q.size - inter;
417
+ const sim = union === 0 ? 0 : inter / union;
418
+ if (sim > 0)
419
+ scored.push({ row, similarity: sim });
420
+ }
421
+ scored.sort((a, b) => b.similarity - a.similarity);
422
+ return scored.slice(0, Math.max(0, k));
423
+ }
424
+ /** Import a TSV document into `table`; returns the number of rows inserted. */
425
+ importTsv(table, text) {
426
+ const spec = this.schema.table(table);
427
+ const rows = tsvToRows(spec, text);
428
+ if (rows.length === 0)
429
+ return 0;
430
+ this.insertInto(spec)
431
+ .valuesMany(rows)
432
+ .executeSync();
433
+ return rows.length;
434
+ }
435
+ /**
436
+ * Rename a live table from `oldName` to `newName`. The source must exist and
437
+ * be live; the target must not collide with an existing table (the engine
438
+ * enforces both). The rename is durable: it is logged to the WAL and applied
439
+ * again on reopen. The `table_id`, schema, and on-disk layout are unchanged,
440
+ * so outstanding handles and indexes remain valid.
441
+ *
442
+ * Internal `__kit_`-prefixed names are off-limits in both directions: an app
443
+ * table cannot be renamed to a `__kit_` name (it would vanish from
444
+ * {@link KitDatabase.tableNames}, which filters that prefix) and an internal
445
+ * table cannot be renamed away from its expected name (the Kit looks internal
446
+ * tables up by name). This keeps the internal-table namespace invariant
447
+ * intact without the engine needing to know about Kit conventions.
448
+ */
449
+ renameTable(oldName, newName) {
450
+ if (oldName.startsWith('__kit_') || newName.startsWith('__kit_')) {
451
+ throw new Error("renameTable: names beginning with '__kit_' are reserved for internal tables");
452
+ }
453
+ this.db.renameTable(oldName, newName);
454
+ }
455
+ begin() {
456
+ return this.db.begin();
457
+ }
458
+ /**
459
+ * Reserve (without inserting) the next engine-native AUTO_INCREMENT value for
460
+ * `tableName`, advancing the engine's per-table counter. Returns `null` when
461
+ * the table has no auto-increment column.
462
+ *
463
+ * This is the replacement for the legacy `allocateSequenceSync` hot-row
464
+ * scheme: it is a pure in-memory counter bump (no `__kit_sequences` row, no
465
+ * extra commit) that becomes durable when a row carrying the reserved id
466
+ * commits. An aborted reservation simply leaves a gap, which the never-reuse
467
+ * rule permits. Used by `prepareInsertRowSync` so a transaction can stage the
468
+ * row with an explicit id and still return it from `executeSync()`.
469
+ */
470
+ reserveAutoIncSync(tableName) {
471
+ const reserved = this.db.table(tableName).reserveAutoInc();
472
+ return reserved ?? null;
473
+ }
474
+ /**
475
+ * Remove every row from `tableName` and clear the Kit guard rows owned by
476
+ * that table. Throws when another table has a foreign key referencing it.
477
+ */
478
+ truncateTable(tableName) {
479
+ this.schema.table(tableName);
480
+ const references = this.schema
481
+ .tablesList()
482
+ .flatMap((t) => t.foreignKeys
483
+ .filter((fk) => fk.referencesTable === tableName)
484
+ .map((fk) => `${t.name}.${fk.name}`));
485
+ if (references.length > 0) {
486
+ throw new KitError(`table ${tableName} is referenced by foreign key(s): ${references.join(', ')}`, 'RESTRICT');
487
+ }
488
+ const kit = { db: this.nativeDb, schema: this.schema };
489
+ runSyncTxn(this, (txn) => {
490
+ txn.truncate(tableName);
491
+ deleteGuardsForTable(kit, txn, tableName);
492
+ });
493
+ }
494
+ }
495
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { TableSpec } from './types.js';
2
+ export type DefaultValue = {
3
+ kind: 'static';
4
+ value: unknown;
5
+ } | {
6
+ kind: 'now';
7
+ } | {
8
+ kind: 'uuid';
9
+ } | {
10
+ kind: 'sequence';
11
+ name: string;
12
+ } | {
13
+ kind: 'custom';
14
+ fn: () => unknown;
15
+ };
16
+ export interface DefaultContext {
17
+ now: string;
18
+ uuid: () => string;
19
+ }
20
+ export declare function staticDefault(value: unknown): DefaultValue;
21
+ export declare function nowDefault(): DefaultValue;
22
+ export declare function uuidDefault(): DefaultValue;
23
+ export declare function sequenceDefault(name: string): DefaultValue;
24
+ export declare function customDefault(fn: () => unknown): DefaultValue;
25
+ export declare function applyDefaults(table: TableSpec, row: Record<string, unknown>, ctx: DefaultContext): Record<string, unknown>;
26
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,YAAY,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,OAAO,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAE1D;AAED,wBAAgB,UAAU,IAAI,YAAY,CAEzC;AAED,wBAAgB,WAAW,IAAI,YAAY,CAE1C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE1D;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,YAAY,CAE7D;AAQD,wBAAgB,aAAa,CAC5B,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,cAAc,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgCzB"}
@@ -0,0 +1,56 @@
1
+ export function staticDefault(value) {
2
+ return { kind: 'static', value };
3
+ }
4
+ export function nowDefault() {
5
+ return { kind: 'now' };
6
+ }
7
+ export function uuidDefault() {
8
+ return { kind: 'uuid' };
9
+ }
10
+ export function sequenceDefault(name) {
11
+ return { kind: 'sequence', name };
12
+ }
13
+ export function customDefault(fn) {
14
+ return { kind: 'custom', fn };
15
+ }
16
+ function generatedDefault(generated) {
17
+ if (generated === 'uuid')
18
+ return uuidDefault();
19
+ if (generated === 'now')
20
+ return nowDefault();
21
+ return null;
22
+ }
23
+ export function applyDefaults(table, row, ctx) {
24
+ const out = { ...row };
25
+ for (const col of table.columns) {
26
+ const value = out[col.name];
27
+ if (value !== undefined && value !== null)
28
+ continue;
29
+ const source = col.default ?? generatedDefault(col.generated);
30
+ if (!source)
31
+ continue;
32
+ switch (source.kind) {
33
+ case 'static':
34
+ out[col.name] = source.value;
35
+ break;
36
+ case 'now':
37
+ out[col.name] = col.storageType === 'date' ? ctx.now.slice(0, 10) : ctx.now;
38
+ break;
39
+ case 'uuid':
40
+ out[col.name] = ctx.uuid();
41
+ break;
42
+ // 'sequence' columns are engine-managed AUTO_INCREMENT: the caller
43
+ // (prepareInsertRowSync) reserves the id up front via reserveAutoIncSync,
44
+ // so the value is already present here. If it was somehow omitted, leave
45
+ // it unset — the engine assigns it on insert (and a null/undefined PK is
46
+ // caught by validation).
47
+ case 'sequence':
48
+ break;
49
+ case 'custom':
50
+ out[col.name] = source.fn();
51
+ break;
52
+ }
53
+ }
54
+ return out;
55
+ }
56
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,aAAa,CAAC,KAAc;IAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,UAAU;IACzB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW;IAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAiB;IAC9C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAgC;IACzD,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,WAAW,EAAE,CAAC;IAC/C,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO,UAAU,EAAE,CAAC;IAC7C,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,KAAgB,EAChB,GAA4B,EAC5B,GAAmB;IAEnB,MAAM,GAAG,GAA4B,EAAE,GAAG,GAAG,EAAE,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAEpD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,QAAQ;gBACZ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC7B,MAAM;YACP,KAAK,KAAK;gBACT,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC5E,MAAM;YACR,KAAK,MAAM;gBACV,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,MAAM;YACP,mEAAmE;YACnE,0EAA0E;YAC1E,yEAAyE;YACzE,yEAAyE;YACzE,yBAAyB;YACzB,KAAK,UAAU;gBACd,MAAM;YACP,KAAK,QAAQ;gBACX,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM;QACR,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
@@ -0,0 +1,54 @@
1
+ export type KitErrorCode = 'STORAGE' | 'VALIDATION' | 'NOT_FOUND' | 'DUPLICATE' | 'FOREIGN_KEY' | 'RESTRICT' | 'CONFLICT' | 'MIGRATION' | 'SCHEMA_DRIFT' | 'TIMEOUT' | 'UNSUPPORTED' | 'INTEGRITY';
2
+ export declare class KitError extends Error {
3
+ readonly code: KitErrorCode;
4
+ constructor(message: string, code?: KitErrorCode);
5
+ }
6
+ export declare class KitValidationError extends KitError {
7
+ table?: string;
8
+ column?: string;
9
+ constructor(message: string, table?: string, column?: string);
10
+ }
11
+ export declare class KitNotFoundError extends KitError {
12
+ table: string;
13
+ pk: unknown;
14
+ constructor(table: string, pk: unknown);
15
+ }
16
+ export declare class KitDuplicateError extends KitError {
17
+ table: string;
18
+ constraint: string;
19
+ constructor(table: string, constraint: string);
20
+ }
21
+ export declare class KitForeignKeyError extends KitError {
22
+ table: string;
23
+ constraint: string;
24
+ constructor(table: string, constraint: string);
25
+ }
26
+ export declare class KitRestrictError extends KitError {
27
+ table: string;
28
+ constraint: string;
29
+ constructor(table: string, constraint: string);
30
+ }
31
+ export declare class KitConflictError extends KitError {
32
+ retryable: boolean;
33
+ constructor(message?: string);
34
+ }
35
+ export declare class KitMigrationError extends KitError {
36
+ constructor(message: string);
37
+ }
38
+ export declare class KitSchemaDriftError extends KitError {
39
+ constructor(message: string);
40
+ }
41
+ export declare class KitTimeoutError extends KitError {
42
+ constructor(message?: string);
43
+ }
44
+ export declare class KitUnsupportedError extends KitError {
45
+ constructor(message: string);
46
+ }
47
+ /**
48
+ * Returns true when the underlying error is a retryable MongrelDB write-write
49
+ * conflict. The native addon prefixes commit-time conflict errors with
50
+ * `__CONFLICT__:` so callers can detect them without instanceof checks against
51
+ * addon-owned classes that may not cross the require boundary cleanly.
52
+ */
53
+ export declare function isRetryableConflict(err: unknown): boolean;
54
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACrB,SAAS,GACT,YAAY,GACZ,WAAW,GACX,WAAW,GACX,aAAa,GACb,UAAU,GACV,UAAU,GACV,WAAW,GACX,cAAc,GACd,SAAS,GACT,aAAa,GACb,WAAW,CAAC;AAEf,qBAAa,QAAS,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,YAAwB;CAK3D;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEJ,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM5D;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;gBAEA,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO;CAMtC;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;gBAEP,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAM7C;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;gBAEP,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAM7C;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;gBAEP,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAM7C;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAC7C,SAAS,UAAQ;gBAEL,OAAO,SAAa;CAIhC;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,MAAM;CAI3B;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACpC,OAAO,EAAE,MAAM;CAI3B;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAChC,OAAO,SAA0B;CAI7C;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACpC,OAAO,EAAE,MAAM;CAI3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKzD"}