@hexaijs/sqlite 0.5.0 → 0.5.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/index.d.ts +2 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -90
- package/dist/index.js.map +1 -1
- package/dist/sqlite-unit-of-work.d.ts +16 -0
- package/dist/sqlite-unit-of-work.d.ts.map +1 -0
- package/dist/sqlite-unit-of-work.js +76 -0
- package/dist/sqlite-unit-of-work.js.map +1 -0
- package/dist/test/index.d.ts +3 -23
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +2 -87
- package/dist/test/index.js.map +1 -1
- package/dist/test/sqlite-repository-for-test.d.ts +19 -0
- package/dist/test/sqlite-repository-for-test.d.ts.map +1 -0
- package/dist/test/sqlite-repository-for-test.js +59 -0
- package/dist/test/sqlite-repository-for-test.js.map +1 -0
- package/dist/test/utils.d.ts +3 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/test/utils.js +5 -0
- package/dist/test/utils.js.map +1 -0
- package/package.json +60 -59
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
declare class SqliteUnitOfWork implements UnitOfWork<Database> {
|
|
5
|
-
private db;
|
|
6
|
-
private static transactions;
|
|
7
|
-
constructor(db: Database);
|
|
8
|
-
getClient(): Database;
|
|
9
|
-
beforeCommit(hook: TransactionHook): void;
|
|
10
|
-
afterCommit(hook: TransactionHook): void;
|
|
11
|
-
afterRollback(hook: TransactionHook): void;
|
|
12
|
-
scope<T>(fn: () => Promise<T>): Promise<T>;
|
|
13
|
-
wrap<T>(fn: (client: Database) => Promise<T>): Promise<T>;
|
|
14
|
-
private getRequiredState;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export { SqliteUnitOfWork };
|
|
1
|
+
export * from "./sqlite-unit-of-work.js";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,91 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// src/sqlite-unit-of-work.ts
|
|
4
|
-
var SqliteUnitOfWork = class _SqliteUnitOfWork {
|
|
5
|
-
constructor(db) {
|
|
6
|
-
this.db = db;
|
|
7
|
-
if (!_SqliteUnitOfWork.transactions.has(db)) {
|
|
8
|
-
_SqliteUnitOfWork.transactions.set(db, {
|
|
9
|
-
level: 0,
|
|
10
|
-
aborted: false,
|
|
11
|
-
hooks: new TransactionHooks()
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
static transactions = /* @__PURE__ */ new WeakMap();
|
|
16
|
-
getClient() {
|
|
17
|
-
const current = _SqliteUnitOfWork.transactions.get(this.db);
|
|
18
|
-
if (!current || current.level === 0) {
|
|
19
|
-
throw new Error("No transaction is active");
|
|
20
|
-
}
|
|
21
|
-
return this.db;
|
|
22
|
-
}
|
|
23
|
-
beforeCommit(hook) {
|
|
24
|
-
const current = this.getRequiredState("beforeCommit");
|
|
25
|
-
current.hooks.addBeforeCommit(hook);
|
|
26
|
-
}
|
|
27
|
-
afterCommit(hook) {
|
|
28
|
-
const current = this.getRequiredState("afterCommit");
|
|
29
|
-
current.hooks.addAfterCommit(hook);
|
|
30
|
-
}
|
|
31
|
-
afterRollback(hook) {
|
|
32
|
-
const current = this.getRequiredState("afterRollback");
|
|
33
|
-
current.hooks.addAfterRollback(hook);
|
|
34
|
-
}
|
|
35
|
-
async scope(fn) {
|
|
36
|
-
return this.wrap(fn);
|
|
37
|
-
}
|
|
38
|
-
async wrap(fn) {
|
|
39
|
-
const current = _SqliteUnitOfWork.transactions.get(this.db);
|
|
40
|
-
if (++current.level === 1) {
|
|
41
|
-
this.db.exec("BEGIN TRANSACTION");
|
|
42
|
-
}
|
|
43
|
-
let abortError;
|
|
44
|
-
try {
|
|
45
|
-
return await fn(this.db);
|
|
46
|
-
} catch (e) {
|
|
47
|
-
if (!current.aborted) {
|
|
48
|
-
current.aborted = true;
|
|
49
|
-
}
|
|
50
|
-
abortError = e;
|
|
51
|
-
throw e;
|
|
52
|
-
} finally {
|
|
53
|
-
if (--current.level === 0) {
|
|
54
|
-
const hooks = current.hooks;
|
|
55
|
-
const wasAborted = current.aborted;
|
|
56
|
-
current.hooks = new TransactionHooks();
|
|
57
|
-
current.aborted = false;
|
|
58
|
-
if (wasAborted) {
|
|
59
|
-
await hooks.executeRollback(
|
|
60
|
-
async () => {
|
|
61
|
-
this.db.exec("ROLLBACK");
|
|
62
|
-
},
|
|
63
|
-
abortError
|
|
64
|
-
);
|
|
65
|
-
} else {
|
|
66
|
-
await hooks.executeCommit(
|
|
67
|
-
async () => {
|
|
68
|
-
this.db.exec("COMMIT");
|
|
69
|
-
},
|
|
70
|
-
async () => {
|
|
71
|
-
this.db.exec("ROLLBACK");
|
|
72
|
-
}
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
getRequiredState(hookName) {
|
|
79
|
-
const current = _SqliteUnitOfWork.transactions.get(this.db);
|
|
80
|
-
if (!current || current.level === 0) {
|
|
81
|
-
throw new Error(
|
|
82
|
-
`Cannot register ${hookName} hook outside of a transaction scope`
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
return current;
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export { SqliteUnitOfWork };
|
|
90
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export * from "./sqlite-unit-of-work.js";
|
|
91
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Database } from "better-sqlite3";
|
|
2
|
+
import { UnitOfWork } from "@hexaijs/core";
|
|
3
|
+
import type { TransactionHook } from "@hexaijs/core";
|
|
4
|
+
export declare class SqliteUnitOfWork implements UnitOfWork<Database> {
|
|
5
|
+
private db;
|
|
6
|
+
private static transactions;
|
|
7
|
+
constructor(db: Database);
|
|
8
|
+
getClient(): Database;
|
|
9
|
+
beforeCommit(hook: TransactionHook): void;
|
|
10
|
+
afterCommit(hook: TransactionHook): void;
|
|
11
|
+
afterRollback(hook: TransactionHook): void;
|
|
12
|
+
scope<T>(fn: () => Promise<T>): Promise<T>;
|
|
13
|
+
wrap<T>(fn: (client: Database) => Promise<T>): Promise<T>;
|
|
14
|
+
private getRequiredState;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=sqlite-unit-of-work.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-unit-of-work.d.ts","sourceRoot":"","sources":["../src/sqlite-unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAoB,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,qBAAa,gBAAiB,YAAW,UAAU,CAAC,QAAQ,CAAC;IAU7C,OAAO,CAAC,EAAE;IATtB,OAAO,CAAC,MAAM,CAAC,YAAY,CAOvB;IAEJ,YAAoB,EAAE,EAAE,QAAQ,EAQ/B;IAED,SAAS,IAAI,QAAQ,CAMpB;IAED,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAGxC;IAED,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAGvC;IAED,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAGzC;IAEK,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE/C;IAEK,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAqC9D;IAED,OAAO,CAAC,gBAAgB;CAS3B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { TransactionHooks } from "@hexaijs/core";
|
|
2
|
+
export class SqliteUnitOfWork {
|
|
3
|
+
db;
|
|
4
|
+
static transactions = new WeakMap();
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
if (!SqliteUnitOfWork.transactions.has(db)) {
|
|
8
|
+
SqliteUnitOfWork.transactions.set(db, {
|
|
9
|
+
level: 0,
|
|
10
|
+
aborted: false,
|
|
11
|
+
hooks: new TransactionHooks(),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
getClient() {
|
|
16
|
+
const current = SqliteUnitOfWork.transactions.get(this.db);
|
|
17
|
+
if (!current || current.level === 0) {
|
|
18
|
+
throw new Error("No transaction is active");
|
|
19
|
+
}
|
|
20
|
+
return this.db;
|
|
21
|
+
}
|
|
22
|
+
beforeCommit(hook) {
|
|
23
|
+
const current = this.getRequiredState("beforeCommit");
|
|
24
|
+
current.hooks.addBeforeCommit(hook);
|
|
25
|
+
}
|
|
26
|
+
afterCommit(hook) {
|
|
27
|
+
const current = this.getRequiredState("afterCommit");
|
|
28
|
+
current.hooks.addAfterCommit(hook);
|
|
29
|
+
}
|
|
30
|
+
afterRollback(hook) {
|
|
31
|
+
const current = this.getRequiredState("afterRollback");
|
|
32
|
+
current.hooks.addAfterRollback(hook);
|
|
33
|
+
}
|
|
34
|
+
async scope(fn) {
|
|
35
|
+
return this.wrap(fn);
|
|
36
|
+
}
|
|
37
|
+
async wrap(fn) {
|
|
38
|
+
const current = SqliteUnitOfWork.transactions.get(this.db);
|
|
39
|
+
if (++current.level === 1) {
|
|
40
|
+
this.db.exec("BEGIN TRANSACTION");
|
|
41
|
+
}
|
|
42
|
+
let abortError;
|
|
43
|
+
try {
|
|
44
|
+
return await fn(this.db);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
if (!current.aborted) {
|
|
48
|
+
current.aborted = true;
|
|
49
|
+
}
|
|
50
|
+
abortError = e;
|
|
51
|
+
throw e;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
if (--current.level === 0) {
|
|
55
|
+
const hooks = current.hooks;
|
|
56
|
+
const wasAborted = current.aborted;
|
|
57
|
+
current.hooks = new TransactionHooks();
|
|
58
|
+
current.aborted = false;
|
|
59
|
+
if (wasAborted) {
|
|
60
|
+
await hooks.executeRollback(async () => { this.db.exec("ROLLBACK"); }, abortError);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
await hooks.executeCommit(async () => { this.db.exec("COMMIT"); }, async () => { this.db.exec("ROLLBACK"); });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
getRequiredState(hookName) {
|
|
69
|
+
const current = SqliteUnitOfWork.transactions.get(this.db);
|
|
70
|
+
if (!current || current.level === 0) {
|
|
71
|
+
throw new Error(`Cannot register ${hookName} hook outside of a transaction scope`);
|
|
72
|
+
}
|
|
73
|
+
return current;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=sqlite-unit-of-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-unit-of-work.js","sourceRoot":"","sources":["../src/sqlite-unit-of-work.ts"],"names":[],"mappings":"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"}
|
package/dist/test/index.d.ts
CHANGED
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
declare class SqliteRepositoryForTest<E extends Identifiable<any>, M> implements Repository<E> {
|
|
5
|
-
protected db: Database;
|
|
6
|
-
protected namespace: string;
|
|
7
|
-
protected hydrate: (memento: M) => E;
|
|
8
|
-
protected dehydrate: (entity: E) => M;
|
|
9
|
-
constructor(db: Database, { namespace, hydrate, dehydrate, }: {
|
|
10
|
-
namespace: string;
|
|
11
|
-
hydrate: (memento: M) => E;
|
|
12
|
-
dehydrate: (entity: E) => M;
|
|
13
|
-
});
|
|
14
|
-
get(id: IdOf<E>): Promise<E>;
|
|
15
|
-
add(entity: E): Promise<void>;
|
|
16
|
-
update(entity: E): Promise<void>;
|
|
17
|
-
count(): Promise<number>;
|
|
18
|
-
protected ensureTableExists(): void;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare function getSqliteConnection(filename?: string): Database;
|
|
22
|
-
|
|
23
|
-
export { SqliteRepositoryForTest, getSqliteConnection };
|
|
1
|
+
export * from "./sqlite-repository-for-test.js";
|
|
2
|
+
export * from "./utils.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,YAAY,CAAC"}
|
package/dist/test/index.js
CHANGED
|
@@ -1,88 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// src/test/sqlite-repository-for-test.ts
|
|
5
|
-
var SqliteRepositoryForTest = class {
|
|
6
|
-
constructor(db, {
|
|
7
|
-
namespace,
|
|
8
|
-
hydrate,
|
|
9
|
-
dehydrate
|
|
10
|
-
}) {
|
|
11
|
-
this.db = db;
|
|
12
|
-
this.namespace = namespace;
|
|
13
|
-
this.hydrate = hydrate;
|
|
14
|
-
this.dehydrate = dehydrate;
|
|
15
|
-
}
|
|
16
|
-
namespace;
|
|
17
|
-
hydrate;
|
|
18
|
-
dehydrate;
|
|
19
|
-
async get(id) {
|
|
20
|
-
this.ensureTableExists();
|
|
21
|
-
const row = this.db.prepare(
|
|
22
|
-
`SELECT * FROM ${this.namespace} WHERE id = ?`
|
|
23
|
-
).get(id.getValue());
|
|
24
|
-
if (!row) {
|
|
25
|
-
throw new ObjectNotFoundError(
|
|
26
|
-
`entity with id '${id.getValue()}' not found`
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
return this.hydrate(JSON.parse(row.data));
|
|
30
|
-
}
|
|
31
|
-
async add(entity) {
|
|
32
|
-
this.ensureTableExists();
|
|
33
|
-
try {
|
|
34
|
-
this.db.prepare(
|
|
35
|
-
`INSERT INTO ${this.namespace} (id, data)
|
|
36
|
-
VALUES (?, ?)`
|
|
37
|
-
).run(
|
|
38
|
-
entity.getId().getValue(),
|
|
39
|
-
JSON.stringify(this.dehydrate(entity))
|
|
40
|
-
);
|
|
41
|
-
} catch (e) {
|
|
42
|
-
if (e.message.includes("UNIQUE constraint failed")) {
|
|
43
|
-
throw new DuplicateObjectError(
|
|
44
|
-
`entity with id '${entity.getId().getValue()}' already exists`
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
throw e;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async update(entity) {
|
|
51
|
-
this.ensureTableExists();
|
|
52
|
-
const result = this.db.prepare(
|
|
53
|
-
`UPDATE ${this.namespace}
|
|
54
|
-
SET data = ?
|
|
55
|
-
WHERE id = ?`
|
|
56
|
-
).run(
|
|
57
|
-
JSON.stringify(this.dehydrate(entity)),
|
|
58
|
-
entity.getId().getValue()
|
|
59
|
-
);
|
|
60
|
-
if (result.changes === 0) {
|
|
61
|
-
throw new ObjectNotFoundError(
|
|
62
|
-
`entity with id '${entity.getId().getValue()}' not found`
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async count() {
|
|
67
|
-
this.ensureTableExists();
|
|
68
|
-
const result = this.db.prepare(
|
|
69
|
-
`SELECT COUNT(*) AS count FROM ${this.namespace}`
|
|
70
|
-
).get();
|
|
71
|
-
return result.count;
|
|
72
|
-
}
|
|
73
|
-
ensureTableExists() {
|
|
74
|
-
this.db.exec(`
|
|
75
|
-
CREATE TABLE IF NOT EXISTS ${this.namespace} (
|
|
76
|
-
id TEXT NOT NULL PRIMARY KEY UNIQUE,
|
|
77
|
-
data TEXT NOT NULL
|
|
78
|
-
)
|
|
79
|
-
`);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
function getSqliteConnection(filename = ":memory:") {
|
|
83
|
-
return new Database(filename);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export { SqliteRepositoryForTest, getSqliteConnection };
|
|
87
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export * from "./sqlite-repository-for-test.js";
|
|
2
|
+
export * from "./utils.js";
|
|
88
3
|
//# sourceMappingURL=index.js.map
|
package/dist/test/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Database } from "better-sqlite3";
|
|
2
|
+
import { Identifiable, IdOf, Repository } from "@hexaijs/core";
|
|
3
|
+
export declare class SqliteRepositoryForTest<E extends Identifiable<any>, M> implements Repository<E> {
|
|
4
|
+
protected db: Database;
|
|
5
|
+
protected namespace: string;
|
|
6
|
+
protected hydrate: (memento: M) => E;
|
|
7
|
+
protected dehydrate: (entity: E) => M;
|
|
8
|
+
constructor(db: Database, { namespace, hydrate, dehydrate }: {
|
|
9
|
+
namespace: string;
|
|
10
|
+
hydrate: (memento: M) => E;
|
|
11
|
+
dehydrate: (entity: E) => M;
|
|
12
|
+
});
|
|
13
|
+
get(id: IdOf<E>): Promise<E>;
|
|
14
|
+
add(entity: E): Promise<void>;
|
|
15
|
+
update(entity: E): Promise<void>;
|
|
16
|
+
count(): Promise<number>;
|
|
17
|
+
protected ensureTableExists(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=sqlite-repository-for-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-repository-for-test.d.ts","sourceRoot":"","sources":["../../src/test/sqlite-repository-for-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAEH,YAAY,EACZ,IAAI,EAEJ,UAAU,EACb,MAAM,eAAe,CAAC;AAEvB,qBAAa,uBAAuB,CAChC,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC,EAC3B,CAAC,CACH,YAAW,UAAU,CAAC,CAAC,CAAC;IAMlB,SAAS,CAAC,EAAE,EAAE,QAAQ;IAL1B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACrC,SAAS,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAEtC,YACc,EAAE,EAAE,QAAQ,EACtB,EACI,SAAS,EACT,OAAO,EACP,SAAS,EACZ,EAAE;QACC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;KAC/B,EAKJ;IAEK,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAajC;IAEK,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlC;IAEK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrC;IAEK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAQ7B;IAED,SAAS,CAAC,iBAAiB,IAAI,IAAI,CAOlC;CACJ"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DuplicateObjectError, ObjectNotFoundError, } from "@hexaijs/core";
|
|
2
|
+
export class SqliteRepositoryForTest {
|
|
3
|
+
db;
|
|
4
|
+
namespace;
|
|
5
|
+
hydrate;
|
|
6
|
+
dehydrate;
|
|
7
|
+
constructor(db, { namespace, hydrate, dehydrate, }) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.namespace = namespace;
|
|
10
|
+
this.hydrate = hydrate;
|
|
11
|
+
this.dehydrate = dehydrate;
|
|
12
|
+
}
|
|
13
|
+
async get(id) {
|
|
14
|
+
this.ensureTableExists();
|
|
15
|
+
const row = this.db.prepare(`SELECT * FROM ${this.namespace} WHERE id = ?`).get(id.getValue());
|
|
16
|
+
if (!row) {
|
|
17
|
+
throw new ObjectNotFoundError(`entity with id '${id.getValue()}' not found`);
|
|
18
|
+
}
|
|
19
|
+
return this.hydrate(JSON.parse(row.data));
|
|
20
|
+
}
|
|
21
|
+
async add(entity) {
|
|
22
|
+
this.ensureTableExists();
|
|
23
|
+
try {
|
|
24
|
+
this.db.prepare(`INSERT INTO ${this.namespace} (id, data)
|
|
25
|
+
VALUES (?, ?)`).run(entity.getId().getValue(), JSON.stringify(this.dehydrate(entity)));
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
if (e.message.includes("UNIQUE constraint failed")) {
|
|
29
|
+
throw new DuplicateObjectError(`entity with id '${entity
|
|
30
|
+
.getId()
|
|
31
|
+
.getValue()}' already exists`);
|
|
32
|
+
}
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async update(entity) {
|
|
37
|
+
this.ensureTableExists();
|
|
38
|
+
const result = this.db.prepare(`UPDATE ${this.namespace}
|
|
39
|
+
SET data = ?
|
|
40
|
+
WHERE id = ?`).run(JSON.stringify(this.dehydrate(entity)), entity.getId().getValue());
|
|
41
|
+
if (result.changes === 0) {
|
|
42
|
+
throw new ObjectNotFoundError(`entity with id '${entity.getId().getValue()}' not found`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async count() {
|
|
46
|
+
this.ensureTableExists();
|
|
47
|
+
const result = this.db.prepare(`SELECT COUNT(*) AS count FROM ${this.namespace}`).get();
|
|
48
|
+
return result.count;
|
|
49
|
+
}
|
|
50
|
+
ensureTableExists() {
|
|
51
|
+
this.db.exec(`
|
|
52
|
+
CREATE TABLE IF NOT EXISTS ${this.namespace} (
|
|
53
|
+
id TEXT NOT NULL PRIMARY KEY UNIQUE,
|
|
54
|
+
data TEXT NOT NULL
|
|
55
|
+
)
|
|
56
|
+
`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=sqlite-repository-for-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-repository-for-test.js","sourceRoot":"","sources":["../../src/test/sqlite-repository-for-test.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,oBAAoB,EAGpB,mBAAmB,GAEtB,MAAM,eAAe,CAAC;AAEvB,MAAM,OAAO,uBAAuB;IASlB,EAAE;IALN,SAAS,CAAS;IAClB,OAAO,CAAoB;IAC3B,SAAS,CAAmB;IAEtC,YACc,EAAY,EACtB,EACI,SAAS,EACT,OAAO,EACP,SAAS,GAKZ;kBATS,EAAE;QAWZ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAW;QACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACvB,iBAAiB,IAAI,CAAC,SAAS,eAAe,CACjD,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAiC,CAAC;QACrD,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,mBAAmB,CACzB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,aAAa,CAChD,CAAC;QACN,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAS;QACf,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,OAAO,CACX,eAAe,IAAI,CAAC,SAAS;+BACd,CAClB,CAAC,GAAG,CACD,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACzC,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAK,CAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,oBAAoB,CAC1B,mBAAmB,MAAM;qBACpB,KAAK,EAAE;qBACP,QAAQ,EAAE,kBAAkB,CACpC,CAAC;YACN,CAAC;YAED,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAS;QAClB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,UAAU,IAAI,CAAC,SAAS;;8BAEN,CACrB,CAAC,GAAG,CACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACtC,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAC5B,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,mBAAmB,CACzB,mBAAmB,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAC5D,CAAC;QACN,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,iCAAiC,IAAI,CAAC,SAAS,EAAE,CACpD,CAAC,GAAG,EAAuB,CAAC;QAE7B,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAES,iBAAiB;QACvB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;yCACoB,IAAI,CAAC,SAAS;;;;SAI9C,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,wBAAgB,mBAAmB,CAC/B,QAAQ,SAAa,GACtB,gBAAgB,CAElB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,UAAU,mBAAmB,CAC/B,QAAQ,GAAG,UAAU;IAErB,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,62 +1,63 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
"name": "@hexaijs/sqlite",
|
|
3
|
+
"publishConfig": {
|
|
4
|
+
"access": "public"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.5.1",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"description": "SQLite support for hexai",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"author": "Sangwoo Hyun <wkdny.hyun@gmail.com>",
|
|
11
|
+
"contributors": [
|
|
12
|
+
"Seungcheol Baek <victoryiron.baek@gmail.com>",
|
|
13
|
+
"Donghyun Lee <edonghyun@naver.com>"
|
|
14
|
+
],
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/workingdanny911/hexai.git",
|
|
18
|
+
"directory": "packages/sqlite"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/workingdanny911/hexai#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/workingdanny911/hexai/issues"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"hexai",
|
|
26
|
+
"hexagonal",
|
|
27
|
+
"clean-architecture",
|
|
28
|
+
"sqlite",
|
|
29
|
+
"database",
|
|
30
|
+
"typescript"
|
|
31
|
+
],
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"import": "./dist/index.js"
|
|
5
40
|
},
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"license": "MIT",
|
|
10
|
-
"author": "Sangwoo Hyun <wkdny.hyun@gmail.com>",
|
|
11
|
-
"contributors": [
|
|
12
|
-
"Seungcheol Baek <victoryiron.baek@gmail.com>",
|
|
13
|
-
"Donghyun Lee <edonghyun@naver.com>"
|
|
14
|
-
],
|
|
15
|
-
"repository": {
|
|
16
|
-
"type": "git",
|
|
17
|
-
"url": "git+https://github.com/workingdanny911/hexai.git",
|
|
18
|
-
"directory": "packages/sqlite"
|
|
41
|
+
"./test": {
|
|
42
|
+
"types": "./dist/test/index.d.ts",
|
|
43
|
+
"import": "./dist/test/index.js"
|
|
19
44
|
},
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"import": "./dist/index.js"
|
|
40
|
-
},
|
|
41
|
-
"./test": {
|
|
42
|
-
"types": "./dist/test/index.d.ts",
|
|
43
|
-
"import": "./dist/test/index.js"
|
|
44
|
-
},
|
|
45
|
-
"./package.json": "./package.json"
|
|
46
|
-
},
|
|
47
|
-
"scripts": {
|
|
48
|
-
"test": "vitest run",
|
|
49
|
-
"build": "tsup"
|
|
50
|
-
},
|
|
51
|
-
"dependencies": {},
|
|
52
|
-
"peerDependencies": {
|
|
53
|
-
"@hexaijs/core": "^0.9.0",
|
|
54
|
-
"better-sqlite3": "^12.5.0"
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@hexaijs/core": "workspace:^",
|
|
58
|
-
"@hexaijs/tooling": "workspace:*",
|
|
59
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
60
|
-
"better-sqlite3": "^12.5.0"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
45
|
+
"./package.json": "./package.json"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"@hexaijs/core": "^0.9.0",
|
|
50
|
+
"better-sqlite3": "^12.5.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@typescript/native-preview": "^7.0.0-dev",
|
|
54
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
55
|
+
"better-sqlite3": "^12.5.0",
|
|
56
|
+
"@hexaijs/core": "^0.9.1",
|
|
57
|
+
"@hexaijs/tooling": "0.1.0"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"build": "tsgo -p tsconfig.build.json"
|
|
62
|
+
}
|
|
63
|
+
}
|