@dyrected/db-sqlite 0.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/README.md +3 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/package.json +23 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { DatabaseAdapter } from '@dyrected/core';
|
|
2
|
+
export interface SqliteAdapterConfig {
|
|
3
|
+
filename: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class SqliteAdapter implements DatabaseAdapter {
|
|
6
|
+
private db;
|
|
7
|
+
private sqlite;
|
|
8
|
+
constructor(config: SqliteAdapterConfig);
|
|
9
|
+
private initInternalTables;
|
|
10
|
+
private getTableName;
|
|
11
|
+
private ensureTable;
|
|
12
|
+
find(params: {
|
|
13
|
+
collection: string;
|
|
14
|
+
where?: any;
|
|
15
|
+
limit?: number;
|
|
16
|
+
page?: number;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
docs: any[];
|
|
19
|
+
total: number;
|
|
20
|
+
limit: number;
|
|
21
|
+
page: number;
|
|
22
|
+
}>;
|
|
23
|
+
findOne(params: {
|
|
24
|
+
collection: string;
|
|
25
|
+
id: string;
|
|
26
|
+
}): Promise<any>;
|
|
27
|
+
create(params: {
|
|
28
|
+
collection: string;
|
|
29
|
+
data: any;
|
|
30
|
+
}): Promise<any>;
|
|
31
|
+
update(params: {
|
|
32
|
+
collection: string;
|
|
33
|
+
id: string;
|
|
34
|
+
data: any;
|
|
35
|
+
}): Promise<any>;
|
|
36
|
+
delete(params: {
|
|
37
|
+
collection: string;
|
|
38
|
+
id: string;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
getGlobal(params: {
|
|
41
|
+
slug: string;
|
|
42
|
+
}): Promise<any>;
|
|
43
|
+
updateGlobal(params: {
|
|
44
|
+
slug: string;
|
|
45
|
+
data: any;
|
|
46
|
+
}): Promise<any>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkC,MAAM,gBAAgB,CAAC;AAKjF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,mBAAmB;IAMvC,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,YAAY;YAIN,WAAW;IAenB,IAAI,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;IAkB/E,OAAO,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IASlD,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;IAahD,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;IAQ5D,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAOjD,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAOlC,YAAY,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;CAKvD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
3
|
+
export class SqliteAdapter {
|
|
4
|
+
db;
|
|
5
|
+
sqlite;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.sqlite = new Database(config.filename);
|
|
8
|
+
this.db = drizzle(this.sqlite);
|
|
9
|
+
this.initInternalTables();
|
|
10
|
+
}
|
|
11
|
+
initInternalTables() {
|
|
12
|
+
// Basic setup for a generic approach if needed,
|
|
13
|
+
// but we will mostly use dynamic tables.
|
|
14
|
+
this.sqlite.exec(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS dyrected_internal (
|
|
16
|
+
key TEXT PRIMARY KEY,
|
|
17
|
+
value TEXT
|
|
18
|
+
)
|
|
19
|
+
`);
|
|
20
|
+
}
|
|
21
|
+
getTableName(slug) {
|
|
22
|
+
return `collection_${slug}`;
|
|
23
|
+
}
|
|
24
|
+
async ensureTable(slug) {
|
|
25
|
+
const tableName = this.getTableName(slug);
|
|
26
|
+
// Simple dynamic table creation for MVP
|
|
27
|
+
// In a real scenario, we'd map fields to columns.
|
|
28
|
+
// For now, we'll use a JSON 'data' column for flexibility.
|
|
29
|
+
this.sqlite.exec(`
|
|
30
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
31
|
+
id TEXT PRIMARY KEY,
|
|
32
|
+
data TEXT,
|
|
33
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
34
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
35
|
+
)
|
|
36
|
+
`);
|
|
37
|
+
}
|
|
38
|
+
async find(params) {
|
|
39
|
+
await this.ensureTable(params.collection);
|
|
40
|
+
const tableName = this.getTableName(params.collection);
|
|
41
|
+
// Simple query implementation
|
|
42
|
+
const stmt = this.sqlite.prepare(`SELECT * FROM ${tableName} LIMIT ? OFFSET ?`);
|
|
43
|
+
const limit = params.limit || 10;
|
|
44
|
+
const offset = ((params.page || 1) - 1) * limit;
|
|
45
|
+
const rows = stmt.all(limit, offset);
|
|
46
|
+
return {
|
|
47
|
+
docs: rows.map(r => ({ id: r.id, ...JSON.parse(r.data) })),
|
|
48
|
+
total: 0, // TODO: Count total
|
|
49
|
+
limit,
|
|
50
|
+
page: params.page || 1
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async findOne(params) {
|
|
54
|
+
await this.ensureTable(params.collection);
|
|
55
|
+
const tableName = this.getTableName(params.collection);
|
|
56
|
+
const stmt = this.sqlite.prepare(`SELECT * FROM ${tableName} WHERE id = ?`);
|
|
57
|
+
const row = stmt.get(params.id);
|
|
58
|
+
if (!row)
|
|
59
|
+
return null;
|
|
60
|
+
return { id: row.id, ...JSON.parse(row.data) };
|
|
61
|
+
}
|
|
62
|
+
async create(params) {
|
|
63
|
+
await this.ensureTable(params.collection);
|
|
64
|
+
const tableName = this.getTableName(params.collection);
|
|
65
|
+
const id = params.data.id || Math.random().toString(36).substring(7);
|
|
66
|
+
const data = { ...params.data };
|
|
67
|
+
delete data.id;
|
|
68
|
+
const stmt = this.sqlite.prepare(`INSERT INTO ${tableName} (id, data) VALUES (?, ?)`);
|
|
69
|
+
stmt.run(id, JSON.stringify(data));
|
|
70
|
+
return { id, ...data };
|
|
71
|
+
}
|
|
72
|
+
async update(params) {
|
|
73
|
+
await this.ensureTable(params.collection);
|
|
74
|
+
const tableName = this.getTableName(params.collection);
|
|
75
|
+
const stmt = this.sqlite.prepare(`UPDATE ${tableName} SET data = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`);
|
|
76
|
+
stmt.run(JSON.stringify(params.data), params.id);
|
|
77
|
+
return { id: params.id, ...params.data };
|
|
78
|
+
}
|
|
79
|
+
async delete(params) {
|
|
80
|
+
await this.ensureTable(params.collection);
|
|
81
|
+
const tableName = this.getTableName(params.collection);
|
|
82
|
+
const stmt = this.sqlite.prepare(`DELETE FROM ${tableName} WHERE id = ?`);
|
|
83
|
+
stmt.run(params.id);
|
|
84
|
+
}
|
|
85
|
+
async getGlobal(params) {
|
|
86
|
+
const stmt = this.sqlite.prepare(`SELECT value FROM dyrected_internal WHERE key = ?`);
|
|
87
|
+
const row = stmt.get(`global_${params.slug}`);
|
|
88
|
+
if (!row)
|
|
89
|
+
return {};
|
|
90
|
+
return JSON.parse(row.value);
|
|
91
|
+
}
|
|
92
|
+
async updateGlobal(params) {
|
|
93
|
+
const stmt = this.sqlite.prepare(`INSERT OR REPLACE INTO dyrected_internal (key, value) VALUES (?, ?)`);
|
|
94
|
+
stmt.run(`global_${params.slug}`, JSON.stringify(params.data));
|
|
95
|
+
return params.data;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dyrected/db-sqlite",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"better-sqlite3": "^11.0.0",
|
|
12
|
+
"drizzle-orm": "^0.30.0",
|
|
13
|
+
"@dyrected/core": "0.0.1"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/better-sqlite3": "^7.6.10",
|
|
17
|
+
"typescript": "^5.4.5"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"dev": "tsc --watch"
|
|
22
|
+
}
|
|
23
|
+
}
|