@hexaijs/sqlite 0.1.0 → 0.2.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/dist/index.d.ts CHANGED
@@ -1,2 +1,12 @@
1
- export * from "./sqlite-unit-of-work";
2
- //# sourceMappingURL=index.d.ts.map
1
+ import { Database } from 'sqlite';
2
+ import { UnitOfWork } from '@hexaijs/core';
3
+
4
+ declare class SqliteUnitOfWork implements UnitOfWork<Database> {
5
+ private db;
6
+ private static transactions;
7
+ constructor(db: Database);
8
+ getClient(): Database;
9
+ wrap<T>(fn: (client: Database) => Promise<T>): Promise<T>;
10
+ }
11
+
12
+ export { SqliteUnitOfWork };
package/dist/index.js CHANGED
@@ -1,18 +1,46 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
1
+ // src/sqlite-unit-of-work.ts
2
+ var SqliteUnitOfWork = class _SqliteUnitOfWork {
3
+ constructor(db) {
4
+ this.db = db;
5
+ if (!_SqliteUnitOfWork.transactions.has(db)) {
6
+ _SqliteUnitOfWork.transactions.set(db, {
7
+ level: 0,
8
+ aborted: false
9
+ });
7
10
  }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ }
12
+ static transactions = /* @__PURE__ */ new WeakMap();
13
+ getClient() {
14
+ const current = _SqliteUnitOfWork.transactions.get(this.db);
15
+ if (!current || current.level === 0) {
16
+ throw new Error("No transaction is active");
17
+ }
18
+ return this.db;
19
+ }
20
+ async wrap(fn) {
21
+ const current = _SqliteUnitOfWork.transactions.get(this.db);
22
+ if (++current.level === 1) {
23
+ await this.db.run("BEGIN TRANSACTION");
24
+ }
25
+ try {
26
+ return await fn(this.db);
27
+ } catch (e) {
28
+ if (!current.aborted) {
29
+ current.aborted = true;
30
+ }
31
+ throw e;
32
+ } finally {
33
+ if (--current.level === 0) {
34
+ if (current.aborted) {
35
+ await this.db.run("ROLLBACK");
36
+ } else {
37
+ await this.db.run("COMMIT");
38
+ }
39
+ }
40
+ }
41
+ }
15
42
  };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./sqlite-unit-of-work"), exports);
43
+
44
+ export { SqliteUnitOfWork };
45
+ //# sourceMappingURL=index.js.map
18
46
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
1
+ {"version":3,"sources":["../src/sqlite-unit-of-work.ts"],"names":[],"mappings":";AAIO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiD;AAAA,EAS1D,YAAoB,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAChB,IAAA,IAAI,CAAC,iBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AACxC,MAAA,iBAAA,CAAiB,YAAA,CAAa,IAAI,EAAA,EAAI;AAAA,QAClC,KAAA,EAAO,CAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ;AAAA,EAfA,OAAe,YAAA,mBAAe,IAAI,OAAA,EAMhC;AAAA,EAWF,SAAA,GAAsB;AAClB,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,KAAK,EAAE,CAAA;AACzD,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,KAAA,KAAU,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAQ,EAAA,EAAkD;AAC5D,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,KAAK,EAAE,CAAA;AACzD,IAAA,IAAI,EAAE,OAAA,CAAQ,KAAA,KAAU,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,mBAAmB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,IAC3B,SAAS,CAAA,EAAG;AACR,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,MACtB;AAEA,MAAA,MAAM,CAAA;AAAA,IACV,CAAA,SAAE;AACE,MAAA,IAAI,EAAE,OAAA,CAAQ,KAAA,KAAU,CAAA,EAAG;AACvB,QAAA,IAAI,QAAQ,OAAA,EAAS;AACjB,UAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,UAAU,CAAA;AAAA,QAChC,CAAA,MAAO;AACH,UAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ","file":"index.js","sourcesContent":["import type { Database } from \"sqlite\";\n\nimport { UnitOfWork } from \"@hexaijs/core\";\n\nexport class SqliteUnitOfWork implements UnitOfWork<Database> {\n private static transactions = new WeakMap<\n Database,\n {\n level: number;\n aborted: boolean;\n }\n >();\n\n constructor(private db: Database) {\n if (!SqliteUnitOfWork.transactions.has(db)) {\n SqliteUnitOfWork.transactions.set(db, {\n level: 0,\n aborted: false,\n });\n }\n }\n\n getClient(): Database {\n const current = SqliteUnitOfWork.transactions.get(this.db);\n if (!current || current.level === 0) {\n throw new Error(\"No transaction is active\");\n }\n return this.db;\n }\n\n async wrap<T>(fn: (client: Database) => Promise<T>): Promise<T> {\n const current = SqliteUnitOfWork.transactions.get(this.db)!;\n if (++current.level === 1) {\n await this.db.run(\"BEGIN TRANSACTION\");\n }\n\n try {\n return await fn(this.db);\n } catch (e) {\n if (!current.aborted) {\n current.aborted = true;\n }\n\n throw e;\n } finally {\n if (--current.level === 0) {\n if (current.aborted) {\n await this.db.run(\"ROLLBACK\");\n } else {\n await this.db.run(\"COMMIT\");\n }\n }\n }\n }\n}\n"]}
@@ -1,3 +1,23 @@
1
- export * from "./sqlite-repository-for-test";
2
- export * from "./utils";
3
- //# sourceMappingURL=index.d.ts.map
1
+ import { Database } from 'sqlite';
2
+ import { Identifiable, Repository, IdOf } from '@hexaijs/core';
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(): Promise<void>;
19
+ }
20
+
21
+ declare function getSqliteConnection(filename?: string): Promise<Database>;
22
+
23
+ export { SqliteRepositoryForTest, getSqliteConnection };
@@ -1,19 +1,93 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
1
+ import { ObjectNotFoundError, DuplicateObjectError } from '@hexaijs/core';
2
+
3
+ // src/test/sqlite-repository-for-test.ts
4
+ var SqliteRepositoryForTest = class {
5
+ constructor(db, {
6
+ namespace,
7
+ hydrate,
8
+ dehydrate
9
+ }) {
10
+ this.db = db;
11
+ this.namespace = namespace;
12
+ this.hydrate = hydrate;
13
+ this.dehydrate = dehydrate;
14
+ }
15
+ namespace;
16
+ hydrate;
17
+ dehydrate;
18
+ async get(id) {
19
+ await this.ensureTableExists();
20
+ const row = await this.db.get(
21
+ `SELECT * FROM ${this.namespace} WHERE id = ?`,
22
+ id.getValue()
23
+ );
24
+ if (!row) {
25
+ throw new ObjectNotFoundError(
26
+ `entity with id '${id.getValue()}' not found`
27
+ );
7
28
  }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
29
+ return this.hydrate(JSON.parse(row.data));
30
+ }
31
+ async add(entity) {
32
+ await this.ensureTableExists();
33
+ try {
34
+ await this.db.run(
35
+ `INSERT INTO ${this.namespace} (id, data)
36
+ VALUES (?, ?)`,
37
+ entity.getId().getValue(),
38
+ JSON.stringify(this.dehydrate(entity))
39
+ );
40
+ } catch (e) {
41
+ if (e.message.includes("UNIQUE constraint failed")) {
42
+ throw new DuplicateObjectError(
43
+ `entity with id '${entity.getId().getValue()}' already exists`
44
+ );
45
+ }
46
+ throw e;
47
+ }
48
+ }
49
+ async update(entity) {
50
+ await this.ensureTableExists();
51
+ const result = await this.db.run(
52
+ `UPDATE ${this.namespace}
53
+ SET data = ?
54
+ WHERE id = ?`,
55
+ JSON.stringify(this.dehydrate(entity)),
56
+ entity.getId().getValue()
57
+ );
58
+ if (result.changes === 0) {
59
+ throw new ObjectNotFoundError(
60
+ `entity with id '${entity.getId().getValue()}' not found`
61
+ );
62
+ }
63
+ }
64
+ async count() {
65
+ await this.ensureTableExists();
66
+ const result = await this.db.get(
67
+ `SELECT COUNT(*) AS count FROM ${this.namespace}`
68
+ );
69
+ return result.count;
70
+ }
71
+ async ensureTableExists() {
72
+ await this.db.run(`
73
+ CREATE TABLE IF NOT EXISTS ${this.namespace} (
74
+ id TEXT NOT NULL PRIMARY KEY UNIQUE,
75
+ data TEXT NOT NULL
76
+ )
77
+ `);
78
+ }
15
79
  };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./sqlite-repository-for-test"), exports);
18
- __exportStar(require("./utils"), exports);
80
+
81
+ // src/test/utils.ts
82
+ async function getSqliteConnection(filename = ":memory:") {
83
+ const sqlite = await import('sqlite');
84
+ const sqlite3 = await import('sqlite3');
85
+ return await sqlite.open({
86
+ filename,
87
+ driver: sqlite3.default.Database
88
+ });
89
+ }
90
+
91
+ export { SqliteRepositoryForTest, getSqliteConnection };
92
+ //# sourceMappingURL=index.js.map
19
93
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,0CAAwB"}
1
+ {"version":3,"sources":["../../src/test/sqlite-repository-for-test.ts","../../src/test/utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { Database } from \"sqlite\";\n\nimport {\n DuplicateObjectError,\n Identifiable,\n IdOf,\n ObjectNotFoundError,\n Repository,\n} from \"@hexaijs/core\";\n\nexport class SqliteRepositoryForTest<\n E extends Identifiable<any>,\n M,\n> implements Repository<E> {\n protected namespace: string;\n protected hydrate: (memento: M) => E;\n protected dehydrate: (entity: E) => M;\n\n constructor(\n protected db: Database,\n {\n namespace,\n hydrate,\n dehydrate,\n }: {\n namespace: string;\n hydrate: (memento: M) => E;\n dehydrate: (entity: E) => M;\n }\n ) {\n this.namespace = namespace;\n this.hydrate = hydrate;\n this.dehydrate = dehydrate;\n }\n\n async get(id: IdOf<E>): Promise<E> {\n await this.ensureTableExists();\n\n const row = await this.db.get(\n `SELECT * FROM ${this.namespace} WHERE id = ?`,\n id.getValue()\n );\n if (!row) {\n throw new ObjectNotFoundError(\n `entity with id '${id.getValue()}' not found`\n );\n }\n\n return this.hydrate(JSON.parse(row.data));\n }\n\n async add(entity: E): Promise<void> {\n await this.ensureTableExists();\n\n try {\n await this.db.run(\n `INSERT INTO ${this.namespace} (id, data)\n VALUES (?, ?)`,\n entity.getId().getValue(),\n JSON.stringify(this.dehydrate(entity))\n );\n } catch (e) {\n if ((e as Error).message.includes(\"UNIQUE constraint failed\")) {\n throw new DuplicateObjectError(\n `entity with id '${entity\n .getId()\n .getValue()}' already exists`\n );\n }\n\n throw e;\n }\n }\n\n async update(entity: E): Promise<void> {\n await this.ensureTableExists();\n\n const result = await this.db.run(\n `UPDATE ${this.namespace}\n SET data = ?\n WHERE id = ?`,\n JSON.stringify(this.dehydrate(entity)),\n entity.getId().getValue()\n );\n\n if (result.changes === 0) {\n throw new ObjectNotFoundError(\n `entity with id '${entity.getId().getValue()}' not found`\n );\n }\n }\n\n async count(): Promise<number> {\n await this.ensureTableExists();\n\n const result = await this.db.get(\n `SELECT COUNT(*) AS count FROM ${this.namespace}`\n );\n\n return result.count;\n }\n\n protected async ensureTableExists(): Promise<void> {\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.namespace} (\n id TEXT NOT NULL PRIMARY KEY UNIQUE,\n data TEXT NOT NULL\n )\n `);\n }\n}\n","import type { Database } from \"sqlite\";\n\nexport async function getSqliteConnection(\n filename = \":memory:\"\n): Promise<Database> {\n const sqlite = await import(\"sqlite\");\n const sqlite3 = await import(\"sqlite3\");\n return await sqlite.open({\n filename,\n driver: sqlite3.default.Database,\n });\n}\n"]}
package/package.json CHANGED
@@ -1,62 +1,63 @@
1
1
  {
2
- "name": "@hexaijs/sqlite",
3
- "publishConfig": {
4
- "access": "public"
5
- },
6
- "version": "0.1.0",
7
- "description": "SQLite support for hexai",
8
- "license": "MIT",
9
- "author": "Sangwoo Hyun <wkdny.hyun@gmail.com>",
10
- "contributors": [
11
- "Seungcheol Baek <victoryiron.baek@gmail.com>",
12
- "Donghyun Lee <edonghyun@naver.com>"
13
- ],
14
- "repository": {
15
- "type": "git",
16
- "url": "git+https://github.com/workingdanny911/hexai.git",
17
- "directory": "packages/sqlite"
18
- },
19
- "homepage": "https://github.com/workingdanny911/hexai#readme",
20
- "bugs": {
21
- "url": "https://github.com/workingdanny911/hexai/issues"
22
- },
23
- "keywords": [
24
- "hexai",
25
- "hexagonal",
26
- "clean-architecture",
27
- "sqlite",
28
- "database",
29
- "typescript"
30
- ],
31
- "files": [
32
- "dist",
33
- "LICENSE"
34
- ],
35
- "exports": {
36
- ".": {
37
- "types": "./dist/index.d.ts",
38
- "import": "./dist/index.js",
39
- "require": "./dist/index.js"
2
+ "name": "@hexaijs/sqlite",
3
+ "publishConfig": {
4
+ "access": "public"
40
5
  },
41
- "./test": {
42
- "types": "./dist/test/index.d.ts",
43
- "import": "./dist/test/index.js",
44
- "require": "./dist/test/index.js"
6
+ "version": "0.2.0",
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"
45
19
  },
46
- "./package.json": "./package.json"
47
- },
48
- "dependencies": {},
49
- "peerDependencies": {
50
- "sqlite": "^5.1.1",
51
- "sqlite3": "^5.1.7",
52
- "@hexaijs/core": "^0.2.0"
53
- },
54
- "devDependencies": {
55
- "sqlite": "^5.1.1",
56
- "sqlite3": "^5.1.7"
57
- },
58
- "scripts": {
59
- "test": "vitest run",
60
- "build": "tsc -p ./tsconfig.build.json && tsc-alias"
61
- }
62
- }
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"
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.5.0",
54
+ "sqlite": "^5.1.1",
55
+ "sqlite3": "^5.1.7"
56
+ },
57
+ "devDependencies": {
58
+ "@hexaijs/core": "workspace:^",
59
+ "@hexaijs/tooling": "workspace:*",
60
+ "sqlite": "^5.1.1",
61
+ "sqlite3": "^5.1.7"
62
+ }
63
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { Database } from "sqlite";
2
- import { UnitOfWork } from "@hexaijs/core";
3
- export declare class SqliteUnitOfWork implements UnitOfWork<Database> {
4
- private db;
5
- private static transactions;
6
- constructor(db: Database);
7
- getClient(): Database;
8
- wrap<T>(fn: (client: Database) => Promise<T>): Promise<T>;
9
- }
10
- //# sourceMappingURL=sqlite-unit-of-work.d.ts.map
@@ -1 +0,0 @@
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,QAAQ,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,gBAAiB,YAAW,UAAU,CAAC,QAAQ,CAAC;IAS7C,OAAO,CAAC,EAAE;IARtB,OAAO,CAAC,MAAM,CAAC,YAAY,CAMvB;gBAEgB,EAAE,EAAE,QAAQ;IAShC,SAAS,IAAI,QAAQ;IAQf,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAwBlE"}
@@ -1,50 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SqliteUnitOfWork = void 0;
4
- class SqliteUnitOfWork {
5
- db;
6
- static transactions = new WeakMap();
7
- constructor(db) {
8
- this.db = db;
9
- if (!SqliteUnitOfWork.transactions.has(db)) {
10
- SqliteUnitOfWork.transactions.set(db, {
11
- level: 0,
12
- aborted: false,
13
- });
14
- }
15
- }
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
- async wrap(fn) {
24
- const current = SqliteUnitOfWork.transactions.get(this.db);
25
- if (++current.level === 1) {
26
- await this.db.run("BEGIN TRANSACTION");
27
- }
28
- try {
29
- return await fn(this.db);
30
- }
31
- catch (e) {
32
- if (!current.aborted) {
33
- current.aborted = true;
34
- }
35
- throw e;
36
- }
37
- finally {
38
- if (--current.level === 0) {
39
- if (current.aborted) {
40
- await this.db.run("ROLLBACK");
41
- }
42
- else {
43
- await this.db.run("COMMIT");
44
- }
45
- }
46
- }
47
- }
48
- }
49
- exports.SqliteUnitOfWork = SqliteUnitOfWork;
50
- //# sourceMappingURL=sqlite-unit-of-work.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-unit-of-work.js","sourceRoot":"","sources":["../src/sqlite-unit-of-work.ts"],"names":[],"mappings":";;;AAIA,MAAa,gBAAgB;IASL;IARZ,MAAM,CAAC,YAAY,GAAG,IAAI,OAAO,EAMtC,CAAC;IAEJ,YAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;QAC5B,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;gBAClC,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,KAAK;aACjB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,SAAS;QACL,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,EAAoC;QAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAC5D,IAAI,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,CAAC;QACZ,CAAC;gBAAS,CAAC;YACP,IAAI,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACJ,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;;AAjDL,4CAkDC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,SAAS,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { Database } from "sqlite";
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(): Promise<void>;
18
- }
19
- //# sourceMappingURL=sqlite-repository-for-test.d.ts.map
@@ -1 +0,0 @@
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,QAAQ,CAAC;AAEvC,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;gBAGxB,EAAE,EAAE,QAAQ,EACtB,EACI,SAAS,EACT,OAAO,EACP,SAAS,GACZ,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;IAOC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAgB5B,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB7B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;cAUd,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAQrD"}
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SqliteRepositoryForTest = void 0;
4
- const core_1 = require("@hexaijs/core");
5
- class SqliteRepositoryForTest {
6
- db;
7
- namespace;
8
- hydrate;
9
- dehydrate;
10
- constructor(db, { namespace, hydrate, dehydrate, }) {
11
- this.db = db;
12
- this.namespace = namespace;
13
- this.hydrate = hydrate;
14
- this.dehydrate = dehydrate;
15
- }
16
- async get(id) {
17
- await this.ensureTableExists();
18
- const row = await this.db.get(`SELECT * FROM ${this.namespace} WHERE id = ?`, id.getValue());
19
- if (!row) {
20
- throw new core_1.ObjectNotFoundError(`entity with id '${id.getValue()}' not found`);
21
- }
22
- return this.hydrate(JSON.parse(row.data));
23
- }
24
- async add(entity) {
25
- await this.ensureTableExists();
26
- try {
27
- await this.db.run(`INSERT INTO ${this.namespace} (id, data)
28
- VALUES (?, ?)`, entity.getId().getValue(), JSON.stringify(this.dehydrate(entity)));
29
- }
30
- catch (e) {
31
- if (e.message.includes("UNIQUE constraint failed")) {
32
- throw new core_1.DuplicateObjectError(`entity with id '${entity
33
- .getId()
34
- .getValue()}' already exists`);
35
- }
36
- throw e;
37
- }
38
- }
39
- async update(entity) {
40
- await this.ensureTableExists();
41
- const result = await this.db.run(`UPDATE ${this.namespace}
42
- SET data = ?
43
- WHERE id = ?`, JSON.stringify(this.dehydrate(entity)), entity.getId().getValue());
44
- if (result.changes === 0) {
45
- throw new core_1.ObjectNotFoundError(`entity with id '${entity.getId().getValue()}' not found`);
46
- }
47
- }
48
- async count() {
49
- await this.ensureTableExists();
50
- const result = await this.db.get(`SELECT COUNT(*) AS count FROM ${this.namespace}`);
51
- return result.count;
52
- }
53
- async ensureTableExists() {
54
- await this.db.run(`
55
- CREATE TABLE IF NOT EXISTS ${this.namespace} (
56
- id TEXT NOT NULL PRIMARY KEY UNIQUE,
57
- data TEXT NOT NULL
58
- )
59
- `);
60
- }
61
- }
62
- exports.SqliteRepositoryForTest = SqliteRepositoryForTest;
63
- //# sourceMappingURL=sqlite-repository-for-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-repository-for-test.js","sourceRoot":"","sources":["../../src/test/sqlite-repository-for-test.ts"],"names":[],"mappings":";;;AAEA,wCAMuB;AAEvB,MAAa,uBAAuB;IASlB;IALJ,SAAS,CAAS;IAClB,OAAO,CAAoB;IAC3B,SAAS,CAAmB;IAEtC,YACc,EAAY,EACtB,EACI,SAAS,EACT,OAAO,EACP,SAAS,GAKZ;QATS,OAAE,GAAF,EAAE,CAAU;QAWtB,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,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACzB,iBAAiB,IAAI,CAAC,SAAS,eAAe,EAC9C,EAAE,CAAC,QAAQ,EAAE,CAChB,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,0BAAmB,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,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACb,eAAe,IAAI,CAAC,SAAS;+BACd,EACf,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,2BAAoB,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,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAC5B,UAAU,IAAI,CAAC,SAAS;;8BAEN,EAClB,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,0BAAmB,CACzB,mBAAmB,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAC5D,CAAC;QACN,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAC5B,iCAAiC,IAAI,CAAC,SAAS,EAAE,CACpD,CAAC;QAEF,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAES,KAAK,CAAC,iBAAiB;QAC7B,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;yCACe,IAAI,CAAC,SAAS;;;;SAI9C,CAAC,CAAC;IACP,CAAC;CACJ;AApGD,0DAoGC"}
@@ -1,3 +0,0 @@
1
- import type { Database } from "sqlite";
2
- export declare function getSqliteConnection(filename?: string): Promise<Database>;
3
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,wBAAsB,mBAAmB,CACrC,QAAQ,SAAa,GACtB,OAAO,CAAC,QAAQ,CAAC,CAOnB"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSqliteConnection = getSqliteConnection;
4
- async function getSqliteConnection(filename = ":memory:") {
5
- const sqlite = await import("sqlite");
6
- const sqlite3 = await import("sqlite3");
7
- return await sqlite.open({
8
- filename,
9
- driver: sqlite3.default.Database,
10
- });
11
- }
12
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":";;AAEA,kDASC;AATM,KAAK,UAAU,mBAAmB,CACrC,QAAQ,GAAG,UAAU;IAErB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC;QACrB,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;KACnC,CAAC,CAAC;AACP,CAAC"}