@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/tsv.js ADDED
@@ -0,0 +1,102 @@
1
+ // TSV codec matching the Rust/Python kit: header row of column names,
2
+ // tab-separated cells, NULL = empty field, `\t \n \r \\` backslash-escaped.
3
+ // Numbers/bools render as literal text; arrays/objects render as escaped JSON.
4
+ // (An empty string round-trips as null — the documented limitation.)
5
+ function escape(s) {
6
+ let o = '';
7
+ for (const c of s) {
8
+ if (c === '\\')
9
+ o += '\\\\';
10
+ else if (c === '\t')
11
+ o += '\\t';
12
+ else if (c === '\n')
13
+ o += '\\n';
14
+ else if (c === '\r')
15
+ o += '\\r';
16
+ else
17
+ o += c;
18
+ }
19
+ return o;
20
+ }
21
+ function unescape(s) {
22
+ let o = '';
23
+ for (let i = 0; i < s.length; i++) {
24
+ const c = s[i];
25
+ if (c === '\\' && i + 1 < s.length) {
26
+ const n = s[++i];
27
+ o += n === 't' ? '\t' : n === 'n' ? '\n' : n === 'r' ? '\r' : n === '\\' ? '\\' : '\\' + n;
28
+ }
29
+ else {
30
+ o += c;
31
+ }
32
+ }
33
+ return o;
34
+ }
35
+ function cellToTsv(v) {
36
+ if (v === null || v === undefined)
37
+ return '';
38
+ if (typeof v === 'string')
39
+ return escape(v);
40
+ if (typeof v === 'boolean')
41
+ return v ? 'true' : 'false';
42
+ if (typeof v === 'number' || typeof v === 'bigint')
43
+ return String(v);
44
+ return escape(JSON.stringify(v));
45
+ }
46
+ export function rowsToTsv(table, rows) {
47
+ const cols = table.columns.map((c) => c.name);
48
+ const lines = [cols.join('\t')];
49
+ for (const row of rows) {
50
+ lines.push(cols.map((n) => cellToTsv(row[n] ?? null)).join('\t'));
51
+ }
52
+ return lines.join('\n') + '\n';
53
+ }
54
+ function parseCell(raw, ty) {
55
+ if (raw === '')
56
+ return null;
57
+ const text = unescape(raw);
58
+ switch (ty) {
59
+ case 'bool':
60
+ return text === 'true';
61
+ case 'int64':
62
+ return BigInt(text);
63
+ case 'float64':
64
+ return Number(text);
65
+ case 'embedding':
66
+ case 'sparse':
67
+ case 'bytes':
68
+ // These insert as arrays/buffers; json is carried as a JSON string.
69
+ try {
70
+ return JSON.parse(text);
71
+ }
72
+ catch {
73
+ return text;
74
+ }
75
+ default:
76
+ return text; // text, date, timestamp, json (JSON string)
77
+ }
78
+ }
79
+ export function tsvToRows(table, text) {
80
+ const lines = text.split('\n');
81
+ if (lines.length === 0 || lines[0] === '')
82
+ return [];
83
+ const names = lines[0].split('\t');
84
+ const types = names.map((n) => table.columns.find((c) => c.name === n)?.applicationType);
85
+ const rows = [];
86
+ for (let i = 1; i < lines.length; i++) {
87
+ if (lines[i] === '')
88
+ continue;
89
+ const fields = lines[i].split('\t');
90
+ const row = {};
91
+ fields.forEach((f, j) => {
92
+ const name = names[j];
93
+ const ty = types[j];
94
+ if (name === undefined || ty === undefined)
95
+ return;
96
+ row[name] = parseCell(f, ty);
97
+ });
98
+ rows.push(row);
99
+ }
100
+ return rows;
101
+ }
102
+ //# sourceMappingURL=tsv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsv.js","sourceRoot":"","sources":["../src/tsv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import type { DefaultValue } from './defaults.js';
2
+ export type ColumnStorageType = 'bool' | 'int64' | 'float64' | 'timestamp' | 'date' | 'text' | 'bytes' | 'json' | 'embedding' | 'sparse';
3
+ export type PkValue = string | bigint | (string | bigint | null)[];
4
+ export type ColumnApplicationType = ColumnStorageType;
5
+ export interface ColumnSpec<TName extends string = string, TApp extends ColumnApplicationType = ColumnApplicationType, TNull extends boolean = boolean, TDefault extends DefaultValue | null = DefaultValue | null, TGenerated extends 'uuid' | 'now' | null = 'uuid' | 'now' | null> {
6
+ id: number;
7
+ name: TName;
8
+ storageType: ColumnStorageType;
9
+ applicationType: TApp;
10
+ nullable: TNull;
11
+ primaryKey: boolean;
12
+ default: TDefault;
13
+ generated: TGenerated;
14
+ /** Vector dimension for an `embedding` column (required for ANN). */
15
+ embeddingDim?: number;
16
+ /** Encrypt this column at rest (requires an encrypted database). */
17
+ encrypted?: boolean;
18
+ /** Encrypt but keep queryable via deterministic tokens. */
19
+ encryptedIndexable?: boolean;
20
+ enumValues?: string[];
21
+ check?: (value: unknown) => boolean | string;
22
+ min?: number;
23
+ max?: number;
24
+ minLength?: number;
25
+ maxLength?: number;
26
+ regex?: RegExp;
27
+ }
28
+ export interface IndexSpec {
29
+ name: string;
30
+ columns: string[];
31
+ unique: boolean;
32
+ /** Index kind; defaults to `bitmap`. `fm` enables FM substring search so
33
+ * `contains(col, needle)` pushes down to the engine instead of scanning. */
34
+ kind?: 'bitmap' | 'fm' | 'ann' | 'sparse' | 'minhash';
35
+ }
36
+ export interface ForeignKeySpec {
37
+ name: string;
38
+ columns: string[];
39
+ referencesTable: string;
40
+ referencesColumns: string[];
41
+ onDelete: 'cascade' | 'set null' | 'restrict';
42
+ }
43
+ export interface UniqueSpec {
44
+ name: string;
45
+ columns: string[];
46
+ }
47
+ export interface CheckSpec {
48
+ name: string;
49
+ expr: (row: Record<string, unknown>) => boolean | string;
50
+ }
51
+ export interface TableSpec<TColumns extends readonly ColumnSpec[] = readonly ColumnSpec[]> {
52
+ tableId: number;
53
+ name: string;
54
+ columns: TColumns;
55
+ primaryKey: string[];
56
+ indexes: IndexSpec[];
57
+ foreignKeys: ForeignKeySpec[];
58
+ unique: UniqueSpec[];
59
+ checks: CheckSpec[];
60
+ /**
61
+ * Look up a column spec by name. Use this for columns whose name shadows a
62
+ * table property (e.g. a column literally named `name`), which are not
63
+ * reachable as a direct `table.<column>` accessor.
64
+ */
65
+ column(name: string): ColumnSpec;
66
+ }
67
+ type ApplicationTypeMap = {
68
+ bool: boolean;
69
+ int64: bigint;
70
+ float64: number;
71
+ timestamp: string;
72
+ date: string;
73
+ text: string;
74
+ bytes: unknown;
75
+ json: unknown;
76
+ embedding: number[];
77
+ sparse: [number, number][];
78
+ };
79
+ type ApplicationType<T extends ColumnApplicationType> = ApplicationTypeMap[T];
80
+ export type Row<T extends TableSpec> = {
81
+ [K in T['columns'][number] as K['name']]: K['nullable'] extends true ? ApplicationType<K['applicationType']> | null : ApplicationType<K['applicationType']>;
82
+ };
83
+ type ColumnToDefaultName<C> = C extends {
84
+ name: infer N;
85
+ nullable: infer Null;
86
+ default: infer D;
87
+ generated: infer G;
88
+ } ? N extends string ? Null extends true ? never : D extends DefaultValue ? N : G extends 'uuid' | 'now' ? N : never : never : never;
89
+ type ColumnsWithDefault<T extends TableSpec> = ColumnToDefaultName<T['columns'][number]>;
90
+ type NullableColumnName<C> = C extends {
91
+ name: infer N;
92
+ nullable: infer Null;
93
+ } ? N extends string ? Null extends true ? N : never : never : never;
94
+ type NullableColumns<T extends TableSpec> = NullableColumnName<T['columns'][number]>;
95
+ type OptionalInsertColumns<T extends TableSpec> = Extract<NullableColumns<T> | ColumnsWithDefault<T>, keyof Row<T>>;
96
+ export type Insert<T extends TableSpec> = Omit<Row<T>, ColumnsWithDefault<T> | NullableColumns<T>> & Partial<Pick<Row<T>, OptionalInsertColumns<T>>>;
97
+ export type Update<T extends TableSpec> = Partial<Row<T>>;
98
+ export {};
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { TableSpec } from './types.js';
2
+ export declare function validateRow(table: TableSpec, row: Record<string, unknown>): void;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,YAAY,CAAC;AAsI3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAchF"}
@@ -0,0 +1,98 @@
1
+ import { KitValidationError } from './errors.js';
2
+ function typeError(value, storageType) {
3
+ switch (storageType) {
4
+ case 'bool':
5
+ return typeof value === 'boolean' ? undefined : 'must be a boolean';
6
+ case 'int64':
7
+ return typeof value === 'bigint' ? undefined : 'must be a bigint';
8
+ case 'float64':
9
+ return typeof value === 'number' ? undefined : 'must be a number';
10
+ case 'text':
11
+ return typeof value === 'string' ? undefined : 'must be a string';
12
+ case 'bytes':
13
+ return value instanceof Uint8Array ? undefined : 'must be a Uint8Array';
14
+ case 'json': {
15
+ try {
16
+ JSON.stringify(value);
17
+ return undefined;
18
+ }
19
+ catch {
20
+ return 'must be JSON serializable';
21
+ }
22
+ }
23
+ case 'timestamp':
24
+ return typeof value === 'string' ? undefined : 'must be an ISO timestamp string';
25
+ case 'date':
26
+ return typeof value === 'string' ? undefined : 'must be a date string';
27
+ }
28
+ }
29
+ function validateColumn(tableName, column, value) {
30
+ if (value === null || value === undefined) {
31
+ if (!column.nullable) {
32
+ throw new KitValidationError(`Column "${column.name}" cannot be null`, tableName, column.name);
33
+ }
34
+ return;
35
+ }
36
+ const typeErr = typeError(value, column.storageType);
37
+ if (typeErr) {
38
+ throw new KitValidationError(`Column "${column.name}" ${typeErr}`, tableName, column.name);
39
+ }
40
+ if (column.enumValues && typeof value === 'string' && !column.enumValues.includes(value)) {
41
+ throw new KitValidationError(`Value "${value}" for "${column.name}" must be one of ${column.enumValues.join(', ')}`, tableName, column.name);
42
+ }
43
+ if (column.min !== undefined) {
44
+ if (typeof value === 'bigint') {
45
+ const min = BigInt(column.min);
46
+ if (value < min) {
47
+ throw new KitValidationError(`Value for "${column.name}" must be at least ${column.min}`, tableName, column.name);
48
+ }
49
+ }
50
+ else if (typeof value === 'number' && value < column.min) {
51
+ throw new KitValidationError(`Value for "${column.name}" must be at least ${column.min}`, tableName, column.name);
52
+ }
53
+ }
54
+ if (column.max !== undefined) {
55
+ if (typeof value === 'bigint') {
56
+ const max = BigInt(column.max);
57
+ if (value > max) {
58
+ throw new KitValidationError(`Value for "${column.name}" must be at most ${column.max}`, tableName, column.name);
59
+ }
60
+ }
61
+ else if (typeof value === 'number' && value > column.max) {
62
+ throw new KitValidationError(`Value for "${column.name}" must be at most ${column.max}`, tableName, column.name);
63
+ }
64
+ }
65
+ if (column.minLength !== undefined) {
66
+ const length = typeof value === 'string' ? value.length : value instanceof Uint8Array ? value.length : null;
67
+ if (length !== null && length < column.minLength) {
68
+ throw new KitValidationError(`Value for "${column.name}" must have length at least ${column.minLength}`, tableName, column.name);
69
+ }
70
+ }
71
+ if (column.maxLength !== undefined) {
72
+ const length = typeof value === 'string' ? value.length : value instanceof Uint8Array ? value.length : null;
73
+ if (length !== null && length > column.maxLength) {
74
+ throw new KitValidationError(`Value for "${column.name}" must have length at most ${column.maxLength}`, tableName, column.name);
75
+ }
76
+ }
77
+ if (column.regex && typeof value === 'string' && !column.regex.test(value)) {
78
+ throw new KitValidationError(`Value for "${column.name}" does not match required pattern`, tableName, column.name);
79
+ }
80
+ if (column.check) {
81
+ const result = column.check(value);
82
+ if (result !== true) {
83
+ throw new KitValidationError(typeof result === 'string' ? result : `Value for "${column.name}" failed custom check`, tableName, column.name);
84
+ }
85
+ }
86
+ }
87
+ export function validateRow(table, row) {
88
+ for (const column of table.columns) {
89
+ validateColumn(table.name, column, row[column.name]);
90
+ }
91
+ for (const check of table.checks) {
92
+ const result = check.expr(row);
93
+ if (result !== true) {
94
+ throw new KitValidationError(typeof result === 'string' ? result : `Table check "${check.name}" failed`, table.name);
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@visorcraft/mongreldb-kit",
3
+ "version": "0.7.0",
4
+ "description": "Application persistence layer for MongrelDB: schema DSL, typed query builder, migrations, and relational constraints (unique, foreign keys, cascade/set-null/restrict).",
5
+ "license": "MIT OR Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "!dist/**/*.test.*"
18
+ ],
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/visorcraft/MongrelDB-Kit.git",
22
+ "directory": "packages/kit"
23
+ },
24
+ "homepage": "https://github.com/visorcraft/MongrelDB-Kit#readme",
25
+ "keywords": ["mongreldb", "database", "orm", "query-builder", "migrations", "schema"],
26
+ "sideEffects": false,
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "provenance": true
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "check": "tsc --noEmit",
34
+ "test": "vitest run"
35
+ },
36
+ "engines": {
37
+ "node": ">=22.0.0"
38
+ },
39
+ "dependencies": {
40
+ "apache-arrow": "^21.1.0"
41
+ },
42
+ "peerDependencies": {
43
+ "@visorcraft/mongreldb": "*"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.0.0",
47
+ "typescript": "^5.6.0",
48
+ "vitest": "^2.1.0"
49
+ }
50
+ }