@mauryasumit/driftdb 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/orm/repository.d.ts
CHANGED
|
@@ -17,8 +17,11 @@ export declare class Repository<T extends BaseRecord> {
|
|
|
17
17
|
private readonly tableName;
|
|
18
18
|
private readonly schema;
|
|
19
19
|
private readonly changeLog;
|
|
20
|
+
private readonly booleanColumns;
|
|
20
21
|
constructor(db: Database.Database, tableName: string, schema: ModelSchema, changeLog: ChangeLog | null);
|
|
21
22
|
private initTable;
|
|
23
|
+
private serialize;
|
|
24
|
+
private deserializeRow;
|
|
22
25
|
create(data: Partial<Omit<T, 'id' | 'createdAt' | 'updatedAt'>>): Promise<T>;
|
|
23
26
|
findById(id: string): Promise<T | null>;
|
|
24
27
|
findOne(where: WhereClause<T>): Promise<T | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/orm/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,IAAI,UAAU,GAAG;KACxD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GAC5C,MAAM,GACN,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7B,MAAM,GACN,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GAChC,OAAO,GACP,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7B,MAAM,GACN,MAAM;CACX,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/orm/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,IAAI,UAAU,GAAG;KACxD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GAC5C,MAAM,GACN,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7B,MAAM,GACN,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GAChC,OAAO,GACP,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7B,MAAM,GACN,MAAM;CACX,CAAC;AAIF,qBAAa,UAAU,CAAC,CAAC,SAAS,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;gBAG3C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,SAAS,GAAG,IAAI;IAc7B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;IAUhB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmB5E,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAOvC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAMjD,IAAI,CAAC,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAMhD,MAAM,CAAC,KAAK,GAAE,WAAW,CAAC,CAAC,CAAM,EAAE,OAAO,GAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAI7F,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB1F,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAe9C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,KAAK,CAAC,KAAK,GAAE,WAAW,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOlD,MAAM,CACV,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;IASb,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,CAAC,EAAE;IAI1D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;CAInG"}
|
package/dist/orm/repository.js
CHANGED
|
@@ -10,12 +10,37 @@ class Repository {
|
|
|
10
10
|
this.tableName = tableName;
|
|
11
11
|
this.schema = (0, schema_js_1.normalizeSchema)(schema);
|
|
12
12
|
this.changeLog = changeLog;
|
|
13
|
+
this.booleanColumns = new Set(Object.entries(this.schema)
|
|
14
|
+
.filter(([, def]) => def.type === 'BOOLEAN')
|
|
15
|
+
.map(([key]) => key));
|
|
13
16
|
this.initTable();
|
|
14
17
|
}
|
|
15
18
|
initTable() {
|
|
16
19
|
const sql = (0, schema_js_1.buildCreateTableSQL)(this.tableName, this.schema);
|
|
17
20
|
this.db.exec(sql);
|
|
18
21
|
}
|
|
22
|
+
serialize(key, value) {
|
|
23
|
+
if (value === undefined || value === null)
|
|
24
|
+
return null;
|
|
25
|
+
if (this.booleanColumns.has(key) && typeof value === 'boolean') {
|
|
26
|
+
return value ? 1 : 0;
|
|
27
|
+
}
|
|
28
|
+
if (typeof value === 'boolean')
|
|
29
|
+
return value ? 1 : 0;
|
|
30
|
+
if (typeof value === 'object' && !Buffer.isBuffer(value)) {
|
|
31
|
+
return JSON.stringify(value);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
deserializeRow(row) {
|
|
36
|
+
const out = { ...row };
|
|
37
|
+
for (const col of this.booleanColumns) {
|
|
38
|
+
if (col in out) {
|
|
39
|
+
out[col] = out[col] === 1 || out[col] === true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
19
44
|
async create(data) {
|
|
20
45
|
const now = Date.now();
|
|
21
46
|
const id = (0, id_js_1.generateId)();
|
|
@@ -23,27 +48,28 @@ class Repository {
|
|
|
23
48
|
const keys = Object.keys(record);
|
|
24
49
|
const placeholders = keys.map(() => '?').join(', ');
|
|
25
50
|
const cols = keys.map((k) => `"${k}"`).join(', ');
|
|
26
|
-
const values = keys.map((k) => record[k]);
|
|
51
|
+
const values = keys.map((k) => this.serialize(k, record[k]));
|
|
27
52
|
this.db
|
|
28
53
|
.prepare(`INSERT INTO "${this.tableName}" (${cols}) VALUES (${placeholders})`)
|
|
29
54
|
.run(...values);
|
|
30
55
|
this.changeLog?.append(this.tableName, 'insert', record);
|
|
31
|
-
return record;
|
|
56
|
+
return this.deserializeRow(record);
|
|
32
57
|
}
|
|
33
58
|
async findById(id) {
|
|
34
59
|
const row = this.db
|
|
35
60
|
.prepare(`SELECT * FROM "${this.tableName}" WHERE id = ?`)
|
|
36
61
|
.get(id);
|
|
37
|
-
return row
|
|
62
|
+
return row ? this.deserializeRow(row) : null;
|
|
38
63
|
}
|
|
39
64
|
async findOne(where) {
|
|
40
65
|
const { sql, params } = (0, query_builder_js_1.buildSelectSQL)(this.tableName, { where, limit: 1 });
|
|
41
66
|
const row = this.db.prepare(sql).get(...params);
|
|
42
|
-
return row
|
|
67
|
+
return row ? this.deserializeRow(row) : null;
|
|
43
68
|
}
|
|
44
69
|
async find(options = {}) {
|
|
45
70
|
const { sql, params } = (0, query_builder_js_1.buildSelectSQL)(this.tableName, options);
|
|
46
|
-
|
|
71
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
72
|
+
return rows.map((r) => this.deserializeRow(r));
|
|
47
73
|
}
|
|
48
74
|
async filter(where = {}, options = {}) {
|
|
49
75
|
return this.find({ where, ...options });
|
|
@@ -54,7 +80,7 @@ class Repository {
|
|
|
54
80
|
const setCols = Object.keys(updateData)
|
|
55
81
|
.map((k) => `"${k}" = ?`)
|
|
56
82
|
.join(', ');
|
|
57
|
-
const setValues = Object.
|
|
83
|
+
const setValues = Object.entries(updateData).map(([k, v]) => this.serialize(k, v));
|
|
58
84
|
const { sql: whereSQL, params: whereParams } = (0, query_builder_js_1.buildWhereClause)(where);
|
|
59
85
|
const sql = `UPDATE "${this.tableName}" SET ${setCols} ${whereSQL}`;
|
|
60
86
|
const result = this.db.prepare(sql).run(...setValues, ...whereParams);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/orm/repository.ts"],"names":[],"mappings":";;;AAEA,2CAAmE;AACnE,yDAAsE;AACtE,0CAA4C;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/orm/repository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/orm/repository.ts
CHANGED
|
@@ -17,11 +17,14 @@ export type RecordOf<S extends ModelSchema> = BaseRecord & {
|
|
|
17
17
|
: string;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
+
type SqliteBindable = string | number | bigint | Buffer | null;
|
|
21
|
+
|
|
20
22
|
export class Repository<T extends BaseRecord> {
|
|
21
23
|
private readonly db: Database.Database;
|
|
22
24
|
private readonly tableName: string;
|
|
23
25
|
private readonly schema: ModelSchema;
|
|
24
26
|
private readonly changeLog: ChangeLog | null;
|
|
27
|
+
private readonly booleanColumns: Set<string>;
|
|
25
28
|
|
|
26
29
|
constructor(
|
|
27
30
|
db: Database.Database,
|
|
@@ -33,6 +36,11 @@ export class Repository<T extends BaseRecord> {
|
|
|
33
36
|
this.tableName = tableName;
|
|
34
37
|
this.schema = normalizeSchema(schema);
|
|
35
38
|
this.changeLog = changeLog;
|
|
39
|
+
this.booleanColumns = new Set(
|
|
40
|
+
Object.entries(this.schema)
|
|
41
|
+
.filter(([, def]) => def.type === 'BOOLEAN')
|
|
42
|
+
.map(([key]) => key)
|
|
43
|
+
);
|
|
36
44
|
this.initTable();
|
|
37
45
|
}
|
|
38
46
|
|
|
@@ -41,6 +49,28 @@ export class Repository<T extends BaseRecord> {
|
|
|
41
49
|
this.db.exec(sql);
|
|
42
50
|
}
|
|
43
51
|
|
|
52
|
+
private serialize(key: string, value: unknown): SqliteBindable {
|
|
53
|
+
if (value === undefined || value === null) return null;
|
|
54
|
+
if (this.booleanColumns.has(key) && typeof value === 'boolean') {
|
|
55
|
+
return value ? 1 : 0;
|
|
56
|
+
}
|
|
57
|
+
if (typeof value === 'boolean') return value ? 1 : 0;
|
|
58
|
+
if (typeof value === 'object' && !Buffer.isBuffer(value)) {
|
|
59
|
+
return JSON.stringify(value);
|
|
60
|
+
}
|
|
61
|
+
return value as SqliteBindable;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private deserializeRow(row: Record<string, unknown>): T {
|
|
65
|
+
const out: Record<string, unknown> = { ...row };
|
|
66
|
+
for (const col of this.booleanColumns) {
|
|
67
|
+
if (col in out) {
|
|
68
|
+
out[col] = out[col] === 1 || out[col] === true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return out as T;
|
|
72
|
+
}
|
|
73
|
+
|
|
44
74
|
async create(data: Partial<Omit<T, 'id' | 'createdAt' | 'updatedAt'>>): Promise<T> {
|
|
45
75
|
const now = Date.now();
|
|
46
76
|
const id = generateId();
|
|
@@ -49,7 +79,7 @@ export class Repository<T extends BaseRecord> {
|
|
|
49
79
|
const keys = Object.keys(record);
|
|
50
80
|
const placeholders = keys.map(() => '?').join(', ');
|
|
51
81
|
const cols = keys.map((k) => `"${k}"`).join(', ');
|
|
52
|
-
const values = keys.map((k) => (record as Record<string, unknown>)[k]);
|
|
82
|
+
const values = keys.map((k) => this.serialize(k, (record as Record<string, unknown>)[k]));
|
|
53
83
|
|
|
54
84
|
this.db
|
|
55
85
|
.prepare(`INSERT INTO "${this.tableName}" (${cols}) VALUES (${placeholders})`)
|
|
@@ -57,25 +87,26 @@ export class Repository<T extends BaseRecord> {
|
|
|
57
87
|
|
|
58
88
|
this.changeLog?.append(this.tableName, 'insert', record as Record<string, unknown>);
|
|
59
89
|
|
|
60
|
-
return record;
|
|
90
|
+
return this.deserializeRow(record as Record<string, unknown>);
|
|
61
91
|
}
|
|
62
92
|
|
|
63
93
|
async findById(id: string): Promise<T | null> {
|
|
64
94
|
const row = this.db
|
|
65
95
|
.prepare(`SELECT * FROM "${this.tableName}" WHERE id = ?`)
|
|
66
|
-
.get(id) as
|
|
67
|
-
return row
|
|
96
|
+
.get(id) as Record<string, unknown> | undefined;
|
|
97
|
+
return row ? this.deserializeRow(row) : null;
|
|
68
98
|
}
|
|
69
99
|
|
|
70
100
|
async findOne(where: WhereClause<T>): Promise<T | null> {
|
|
71
101
|
const { sql, params } = buildSelectSQL<T>(this.tableName, { where, limit: 1 });
|
|
72
|
-
const row = this.db.prepare(sql).get(...params) as
|
|
73
|
-
return row
|
|
102
|
+
const row = this.db.prepare(sql).get(...params) as Record<string, unknown> | undefined;
|
|
103
|
+
return row ? this.deserializeRow(row) : null;
|
|
74
104
|
}
|
|
75
105
|
|
|
76
106
|
async find(options: FindOptions<T> = {}): Promise<T[]> {
|
|
77
107
|
const { sql, params } = buildSelectSQL<T>(this.tableName, options);
|
|
78
|
-
|
|
108
|
+
const rows = this.db.prepare(sql).all(...params) as Record<string, unknown>[];
|
|
109
|
+
return rows.map((r) => this.deserializeRow(r));
|
|
79
110
|
}
|
|
80
111
|
|
|
81
112
|
async filter(where: WhereClause<T> = {}, options: Omit<FindOptions<T>, 'where'> = {}): Promise<T[]> {
|
|
@@ -89,7 +120,7 @@ export class Repository<T extends BaseRecord> {
|
|
|
89
120
|
const setCols = Object.keys(updateData)
|
|
90
121
|
.map((k) => `"${k}" = ?`)
|
|
91
122
|
.join(', ');
|
|
92
|
-
const setValues = Object.
|
|
123
|
+
const setValues = Object.entries(updateData).map(([k, v]) => this.serialize(k, v));
|
|
93
124
|
|
|
94
125
|
const { sql: whereSQL, params: whereParams } = buildWhereClause(where);
|
|
95
126
|
const sql = `UPDATE "${this.tableName}" SET ${setCols} ${whereSQL}`;
|