@moriajs/db 0.4.5 → 0.4.6
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 +15 -2
- package/dist/index.d.ts +22 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +86 -3
package/README.md
CHANGED
|
@@ -6,15 +6,28 @@ Database abstraction layer for MoriaJS.
|
|
|
6
6
|
|
|
7
7
|
- **Kysely Integration**: Type-safe SQL query builder.
|
|
8
8
|
- **Pongo Support**: Document API for PostgreSQL (JSONB).
|
|
9
|
-
- **
|
|
9
|
+
- **MongoDB Support**: Native MongoDB integration.
|
|
10
|
+
- **Multi-adapter**: Support for PostgreSQL, SQLite, and MongoDB.
|
|
10
11
|
|
|
11
12
|
## Usage
|
|
12
13
|
|
|
14
|
+
### SQL (Kysely)
|
|
13
15
|
```ts
|
|
14
16
|
import { createDatabase } from '@moriajs/db';
|
|
15
17
|
|
|
16
18
|
const db = await createDatabase({
|
|
17
|
-
|
|
19
|
+
adapter: 'pg',
|
|
18
20
|
url: process.env.DATABASE_URL
|
|
19
21
|
});
|
|
20
22
|
```
|
|
23
|
+
|
|
24
|
+
### Document (MongoDB)
|
|
25
|
+
```ts
|
|
26
|
+
import { createDatabase } from '@moriajs/db';
|
|
27
|
+
|
|
28
|
+
const db = await createDatabase({
|
|
29
|
+
adapter: 'mongo',
|
|
30
|
+
url: 'mongodb://localhost:27017',
|
|
31
|
+
dbName: 'my_database'
|
|
32
|
+
});
|
|
33
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -3,14 +3,14 @@ export * from './types.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Supported database adapters.
|
|
5
5
|
*/
|
|
6
|
-
export type DatabaseAdapterName = 'pg' | 'sqlite' | 'mysql';
|
|
6
|
+
export type DatabaseAdapterName = 'pg' | 'sqlite' | 'mysql' | 'mongo';
|
|
7
7
|
/**
|
|
8
8
|
* Configuration for creating a database connection.
|
|
9
9
|
*/
|
|
10
10
|
export interface DatabaseConfig {
|
|
11
11
|
/** Database adapter name to use */
|
|
12
12
|
adapter: DatabaseAdapterName;
|
|
13
|
-
/** Connection URL (for pg/mysql/pongo) */
|
|
13
|
+
/** Connection URL (for pg/mysql/pongo/mongo) */
|
|
14
14
|
url?: string;
|
|
15
15
|
/** File path (for sqlite) */
|
|
16
16
|
filename?: string;
|
|
@@ -21,6 +21,8 @@ export interface DatabaseConfig {
|
|
|
21
21
|
min?: number;
|
|
22
22
|
max?: number;
|
|
23
23
|
};
|
|
24
|
+
/** Database name (for mongo) */
|
|
25
|
+
dbName?: string;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Kysely Adapter Implementation (SQL)
|
|
@@ -57,6 +59,24 @@ export declare class PongoAdapter implements MoriaDBAdapter {
|
|
|
57
59
|
deleteOne(collection: string, filter: any): Promise<void>;
|
|
58
60
|
raw<T>(): T;
|
|
59
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* MongoDB Adapter Implementation
|
|
64
|
+
*/
|
|
65
|
+
export declare class MongoAdapter implements MoriaDBAdapter {
|
|
66
|
+
private config;
|
|
67
|
+
private client;
|
|
68
|
+
constructor(config: DatabaseConfig);
|
|
69
|
+
connect(): Promise<void>;
|
|
70
|
+
disconnect(): Promise<void>;
|
|
71
|
+
private mapIdFilter;
|
|
72
|
+
private mapIdResult;
|
|
73
|
+
find<T extends Record<string, any> = any>(collection: string, filter?: any): Promise<T[]>;
|
|
74
|
+
findOne<T extends Record<string, any> = any>(collection: string, filter?: any): Promise<T | null>;
|
|
75
|
+
insertOne<T extends Record<string, any> = any>(collection: string, data: any): Promise<T>;
|
|
76
|
+
updateOne(collection: string, filter: any, data: any): Promise<void>;
|
|
77
|
+
deleteOne(collection: string, filter: any): Promise<void>;
|
|
78
|
+
raw<T>(): T;
|
|
79
|
+
}
|
|
60
80
|
/**
|
|
61
81
|
* Factory to create a MoriaDB instance.
|
|
62
82
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Kysely, PostgresDialect, SqliteDialect } from 'kysely';
|
|
2
2
|
import { pongoClient } from '@event-driven-io/pongo';
|
|
3
|
+
import { MongoClient } from 'mongodb';
|
|
3
4
|
import { MoriaDB } from './types.js';
|
|
4
5
|
export * from './types.js';
|
|
5
6
|
/**
|
|
@@ -151,12 +152,86 @@ export class PongoAdapter {
|
|
|
151
152
|
return this.client;
|
|
152
153
|
}
|
|
153
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* MongoDB Adapter Implementation
|
|
157
|
+
*/
|
|
158
|
+
export class MongoAdapter {
|
|
159
|
+
config;
|
|
160
|
+
client = null;
|
|
161
|
+
constructor(config) {
|
|
162
|
+
this.config = config;
|
|
163
|
+
}
|
|
164
|
+
async connect() {
|
|
165
|
+
if (!this.config.url) {
|
|
166
|
+
throw new Error('@moriajs/db: MongoDB connection URL is required');
|
|
167
|
+
}
|
|
168
|
+
this.client = new MongoClient(this.config.url);
|
|
169
|
+
await this.client.connect();
|
|
170
|
+
}
|
|
171
|
+
async disconnect() {
|
|
172
|
+
if (this.client) {
|
|
173
|
+
await this.client.close();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
mapIdFilter(filter) {
|
|
177
|
+
if (!filter || typeof filter !== 'object')
|
|
178
|
+
return filter;
|
|
179
|
+
const newFilter = { ...filter };
|
|
180
|
+
if ('id' in newFilter) {
|
|
181
|
+
newFilter._id = newFilter.id;
|
|
182
|
+
delete newFilter.id;
|
|
183
|
+
}
|
|
184
|
+
return newFilter;
|
|
185
|
+
}
|
|
186
|
+
mapIdResult(result) {
|
|
187
|
+
if (!result)
|
|
188
|
+
return result;
|
|
189
|
+
if (Array.isArray(result)) {
|
|
190
|
+
return result.map(item => this.mapIdResult(item));
|
|
191
|
+
}
|
|
192
|
+
if (typeof result === 'object' && '_id' in result) {
|
|
193
|
+
const { _id, ...rest } = result;
|
|
194
|
+
return { ...rest, id: _id };
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
async find(collection, filter = {}) {
|
|
199
|
+
const db = this.client.db(this.config.dbName);
|
|
200
|
+
const results = await db.collection(collection).find(this.mapIdFilter(filter)).toArray();
|
|
201
|
+
return this.mapIdResult(results);
|
|
202
|
+
}
|
|
203
|
+
async findOne(collection, filter = {}) {
|
|
204
|
+
const db = this.client.db(this.config.dbName);
|
|
205
|
+
const result = await db.collection(collection).findOne(this.mapIdFilter(filter));
|
|
206
|
+
return this.mapIdResult(result);
|
|
207
|
+
}
|
|
208
|
+
async insertOne(collection, data) {
|
|
209
|
+
const db = this.client.db(this.config.dbName);
|
|
210
|
+
const result = await db.collection(collection).insertOne(data);
|
|
211
|
+
const inserted = await db.collection(collection).findOne({ _id: result.insertedId });
|
|
212
|
+
return this.mapIdResult(inserted);
|
|
213
|
+
}
|
|
214
|
+
async updateOne(collection, filter, data) {
|
|
215
|
+
const db = this.client.db(this.config.dbName);
|
|
216
|
+
await db.collection(collection).updateOne(this.mapIdFilter(filter), { $set: data });
|
|
217
|
+
}
|
|
218
|
+
async deleteOne(collection, filter) {
|
|
219
|
+
const db = this.client.db(this.config.dbName);
|
|
220
|
+
await db.collection(collection).deleteOne(this.mapIdFilter(filter));
|
|
221
|
+
}
|
|
222
|
+
raw() {
|
|
223
|
+
return this.client;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
154
226
|
/**
|
|
155
227
|
* Factory to create a MoriaDB instance.
|
|
156
228
|
*/
|
|
157
229
|
export async function createDatabase(config) {
|
|
158
230
|
let adapter;
|
|
159
|
-
if (config.
|
|
231
|
+
if (config.adapter === 'mongo') {
|
|
232
|
+
adapter = new MongoAdapter(config);
|
|
233
|
+
}
|
|
234
|
+
else if (config.usePongo && config.adapter === 'pg') {
|
|
160
235
|
adapter = new PongoAdapter(config);
|
|
161
236
|
}
|
|
162
237
|
else {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,WAAW,EAAe,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAErD,cAAc,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moriajs/db",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "MoriaJS database — Kysely adapters with kysely-schema integration",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"kysely": "^0.27.0",
|
|
16
|
-
"@event-driven-io/pongo": "^0.16.11"
|
|
16
|
+
"@event-driven-io/pongo": "^0.16.11",
|
|
17
|
+
"mongodb": "^6.10.0"
|
|
17
18
|
},
|
|
18
19
|
"optionalDependencies": {
|
|
19
20
|
"pg": "^8.13.0",
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Kysely, PostgresDialect, SqliteDialect } from 'kysely';
|
|
2
2
|
import { pongoClient, PongoClient } from '@event-driven-io/pongo';
|
|
3
|
+
import { MongoClient } from 'mongodb';
|
|
3
4
|
import { MoriaDB, MoriaDBAdapter } from './types.js';
|
|
4
5
|
|
|
5
6
|
export * from './types.js';
|
|
@@ -7,7 +8,7 @@ export * from './types.js';
|
|
|
7
8
|
/**
|
|
8
9
|
* Supported database adapters.
|
|
9
10
|
*/
|
|
10
|
-
export type DatabaseAdapterName = 'pg' | 'sqlite' | 'mysql';
|
|
11
|
+
export type DatabaseAdapterName = 'pg' | 'sqlite' | 'mysql' | 'mongo';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Configuration for creating a database connection.
|
|
@@ -15,7 +16,7 @@ export type DatabaseAdapterName = 'pg' | 'sqlite' | 'mysql';
|
|
|
15
16
|
export interface DatabaseConfig {
|
|
16
17
|
/** Database adapter name to use */
|
|
17
18
|
adapter: DatabaseAdapterName;
|
|
18
|
-
/** Connection URL (for pg/mysql/pongo) */
|
|
19
|
+
/** Connection URL (for pg/mysql/pongo/mongo) */
|
|
19
20
|
url?: string;
|
|
20
21
|
/** File path (for sqlite) */
|
|
21
22
|
filename?: string;
|
|
@@ -26,6 +27,8 @@ export interface DatabaseConfig {
|
|
|
26
27
|
min?: number;
|
|
27
28
|
max?: number;
|
|
28
29
|
};
|
|
30
|
+
/** Database name (for mongo) */
|
|
31
|
+
dbName?: string;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
/**
|
|
@@ -192,13 +195,93 @@ export class PongoAdapter implements MoriaDBAdapter {
|
|
|
192
195
|
}
|
|
193
196
|
}
|
|
194
197
|
|
|
198
|
+
/**
|
|
199
|
+
* MongoDB Adapter Implementation
|
|
200
|
+
*/
|
|
201
|
+
export class MongoAdapter implements MoriaDBAdapter {
|
|
202
|
+
private client: MongoClient | null = null;
|
|
203
|
+
|
|
204
|
+
constructor(private config: DatabaseConfig) { }
|
|
205
|
+
|
|
206
|
+
async connect(): Promise<void> {
|
|
207
|
+
if (!this.config.url) {
|
|
208
|
+
throw new Error('@moriajs/db: MongoDB connection URL is required');
|
|
209
|
+
}
|
|
210
|
+
this.client = new MongoClient(this.config.url);
|
|
211
|
+
await this.client.connect();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async disconnect(): Promise<void> {
|
|
215
|
+
if (this.client) {
|
|
216
|
+
await this.client.close();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private mapIdFilter(filter: any): any {
|
|
221
|
+
if (!filter || typeof filter !== 'object') return filter;
|
|
222
|
+
const newFilter = { ...filter };
|
|
223
|
+
if ('id' in newFilter) {
|
|
224
|
+
newFilter._id = newFilter.id;
|
|
225
|
+
delete newFilter.id;
|
|
226
|
+
}
|
|
227
|
+
return newFilter;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private mapIdResult(result: any): any {
|
|
231
|
+
if (!result) return result;
|
|
232
|
+
if (Array.isArray(result)) {
|
|
233
|
+
return result.map(item => this.mapIdResult(item));
|
|
234
|
+
}
|
|
235
|
+
if (typeof result === 'object' && '_id' in result) {
|
|
236
|
+
const { _id, ...rest } = result;
|
|
237
|
+
return { ...rest, id: _id };
|
|
238
|
+
}
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async find<T extends Record<string, any> = any>(collection: string, filter: any = {}): Promise<T[]> {
|
|
243
|
+
const db = this.client!.db(this.config.dbName);
|
|
244
|
+
const results = await db.collection(collection).find(this.mapIdFilter(filter)).toArray();
|
|
245
|
+
return this.mapIdResult(results);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async findOne<T extends Record<string, any> = any>(collection: string, filter: any = {}): Promise<T | null> {
|
|
249
|
+
const db = this.client!.db(this.config.dbName);
|
|
250
|
+
const result = await db.collection(collection).findOne(this.mapIdFilter(filter));
|
|
251
|
+
return this.mapIdResult(result);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async insertOne<T extends Record<string, any> = any>(collection: string, data: any): Promise<T> {
|
|
255
|
+
const db = this.client!.db(this.config.dbName);
|
|
256
|
+
const result = await db.collection(collection).insertOne(data);
|
|
257
|
+
const inserted = await db.collection(collection).findOne({ _id: result.insertedId });
|
|
258
|
+
return this.mapIdResult(inserted);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async updateOne(collection: string, filter: any, data: any): Promise<void> {
|
|
262
|
+
const db = this.client!.db(this.config.dbName);
|
|
263
|
+
await db.collection(collection).updateOne(this.mapIdFilter(filter), { $set: data });
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async deleteOne(collection: string, filter: any): Promise<void> {
|
|
267
|
+
const db = this.client!.db(this.config.dbName);
|
|
268
|
+
await db.collection(collection).deleteOne(this.mapIdFilter(filter));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
raw<T>(): T {
|
|
272
|
+
return this.client as unknown as T;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
195
276
|
/**
|
|
196
277
|
* Factory to create a MoriaDB instance.
|
|
197
278
|
*/
|
|
198
279
|
export async function createDatabase(config: DatabaseConfig): Promise<MoriaDB> {
|
|
199
280
|
let adapter: MoriaDBAdapter;
|
|
200
281
|
|
|
201
|
-
if (config.
|
|
282
|
+
if (config.adapter === 'mongo') {
|
|
283
|
+
adapter = new MongoAdapter(config);
|
|
284
|
+
} else if (config.usePongo && config.adapter === 'pg') {
|
|
202
285
|
adapter = new PongoAdapter(config);
|
|
203
286
|
} else {
|
|
204
287
|
adapter = new KyselyAdapter(config);
|