@mountsqli/mongodb 0.1.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.
@@ -0,0 +1,91 @@
1
+ import { Table, TableConfig, Column, Session, Logger, QueryWithTypings, PreparedQuery, Driver } from '@mountsqli/core';
2
+
3
+ /**
4
+ * MongoDB collection factory.
5
+ */
6
+
7
+ declare class MongoCollection$1 extends Table<TableConfig & {
8
+ dialect: 'mongo';
9
+ }> {
10
+ }
11
+ type MongoCollectionColumns = Record<string, Column>;
12
+ declare function mongoCollection<TColumns extends MongoCollectionColumns>(name: string, columns: TColumns): MongoCollection$1 & {
13
+ columns: TColumns;
14
+ };
15
+
16
+ /**
17
+ * MongoDB session — wraps native MongoDB driver.
18
+ */
19
+
20
+ interface MongoDb {
21
+ collection(name: string): MongoCollection;
22
+ close(): Promise<void>;
23
+ }
24
+ interface MongoCollection {
25
+ find(filter?: any, options?: any): MongoCursor;
26
+ findOne(filter?: any, options?: any): Promise<any>;
27
+ insertOne(doc: any): Promise<{
28
+ insertedId: any;
29
+ }>;
30
+ insertMany(docs: any[]): Promise<{
31
+ insertedIds: any[];
32
+ }>;
33
+ updateOne(filter: any, update: any): Promise<any>;
34
+ updateMany(filter: any, update: any): Promise<any>;
35
+ deleteOne(filter: any): Promise<any>;
36
+ deleteMany(filter: any): Promise<any>;
37
+ aggregate(pipeline: any[]): MongoCursor;
38
+ countDocuments(filter?: any): Promise<number>;
39
+ }
40
+ interface MongoCursor {
41
+ toArray(): Promise<any[]>;
42
+ sort(spec: any): MongoCursor;
43
+ limit(n: number): MongoCursor;
44
+ skip(n: number): MongoCursor;
45
+ project(spec: any): MongoCursor;
46
+ }
47
+ declare class MongoSession extends Session {
48
+ private _db;
49
+ constructor(db: MongoDb, logger: Logger);
50
+ execute<T>(query: QueryWithTypings): Promise<T>;
51
+ prepare<T>(query: QueryWithTypings): PreparedQuery<T>;
52
+ transaction<T>(fn: (tx: any) => Promise<T>): Promise<T>;
53
+ dispose(): Promise<void>;
54
+ }
55
+ declare class MongoTransaction extends Session {
56
+ private _db;
57
+ constructor(db: MongoDb, logger: Logger);
58
+ execute<T>(query: QueryWithTypings): Promise<T>;
59
+ prepare<T>(query: QueryWithTypings): PreparedQuery<T>;
60
+ transaction<T>(fn: (tx: any) => Promise<T>): Promise<T>;
61
+ rollback(): Promise<never>;
62
+ commit(): Promise<void>;
63
+ setTransactionIsolation(_level: string): Promise<void>;
64
+ dispose(): Promise<void>;
65
+ }
66
+
67
+ /**
68
+ * MongoDB native driver.
69
+ */
70
+
71
+ interface MongoNativeDriverConfig {
72
+ /** MongoDB connection URI */
73
+ uri: string;
74
+ /** Database name */
75
+ database: string;
76
+ logger?: Logger | boolean;
77
+ }
78
+ declare class MongoNativeDriver implements Driver {
79
+ readonly dialect: "mongo";
80
+ private _config;
81
+ private _client;
82
+ private _db;
83
+ private _logger;
84
+ constructor(config: MongoNativeDriverConfig);
85
+ createSession(): MongoSession;
86
+ connect(): Promise<void>;
87
+ disconnect(): Promise<void>;
88
+ ping(): Promise<boolean>;
89
+ }
90
+
91
+ export { MongoCollection$1 as MongoCollection, type MongoCollectionColumns, MongoNativeDriver, MongoSession, MongoTransaction, mongoCollection };
package/dist/index.js ADDED
@@ -0,0 +1,133 @@
1
+ // src/mongo-core/collection.ts
2
+ import { Table } from "@mountsqli/core";
3
+ var MongoCollection = class extends Table {
4
+ };
5
+ function mongoCollection(name, columns) {
6
+ const collection = new MongoCollection(name, void 0, name);
7
+ for (const [key, col] of Object.entries(columns)) {
8
+ collection.columns[key] = col;
9
+ col.tableName = name;
10
+ }
11
+ const result = collection;
12
+ result.columns = columns;
13
+ return result;
14
+ }
15
+
16
+ // src/mongo-core/session.ts
17
+ import { Session } from "@mountsqli/core";
18
+ var MongoPreparedQuery = class {
19
+ _operation;
20
+ constructor(operation) {
21
+ this._operation = operation;
22
+ }
23
+ async execute() {
24
+ return this._operation();
25
+ }
26
+ async all() {
27
+ const result = await this._operation();
28
+ return Array.isArray(result) ? result : [result];
29
+ }
30
+ async values() {
31
+ const rows = await this.all();
32
+ return rows.map((row) => Object.values(row));
33
+ }
34
+ getQuery() {
35
+ return { sql: "mongo", params: [] };
36
+ }
37
+ };
38
+ var MongoSession = class extends Session {
39
+ _db;
40
+ constructor(db, logger) {
41
+ super(logger);
42
+ this._db = db;
43
+ }
44
+ async execute(query) {
45
+ throw new Error("MongoDB execute not directly supported \u2014 use collection methods");
46
+ }
47
+ prepare(query) {
48
+ return new MongoPreparedQuery(async () => {
49
+ return this.execute(query);
50
+ });
51
+ }
52
+ async transaction(fn) {
53
+ const tx = new MongoTransaction(this._db, this.logger);
54
+ return fn(tx);
55
+ }
56
+ async dispose() {
57
+ await this._db.close();
58
+ }
59
+ };
60
+ var MongoTransaction = class _MongoTransaction extends Session {
61
+ _db;
62
+ constructor(db, logger) {
63
+ super(logger);
64
+ this._db = db;
65
+ this.inTransaction = true;
66
+ }
67
+ async execute(query) {
68
+ throw new Error("MongoDB transaction execute not directly supported");
69
+ }
70
+ prepare(query) {
71
+ return new MongoPreparedQuery(async () => {
72
+ return this.execute(query);
73
+ });
74
+ }
75
+ async transaction(fn) {
76
+ const tx = new _MongoTransaction(this._db, this.logger);
77
+ return fn(tx);
78
+ }
79
+ async rollback() {
80
+ throw new Error("Transaction rolled back");
81
+ }
82
+ async commit() {
83
+ }
84
+ async setTransactionIsolation(_level) {
85
+ }
86
+ async dispose() {
87
+ }
88
+ };
89
+
90
+ // src/drivers/native/driver.ts
91
+ import { createLogger } from "@mountsqli/core";
92
+ var MongoNativeDriver = class {
93
+ dialect = "mongo";
94
+ _config;
95
+ _client = null;
96
+ _db = null;
97
+ _logger;
98
+ constructor(config) {
99
+ this._config = config;
100
+ this._logger = typeof config.logger === "boolean" ? createLogger({ enabled: config.logger }) : config.logger ?? createLogger({ enabled: false });
101
+ }
102
+ createSession() {
103
+ if (!this._db) throw new Error("Not connected");
104
+ return new MongoSession(this._db, this._logger);
105
+ }
106
+ async connect() {
107
+ const { MongoClient } = await import("mongodb");
108
+ this._client = new MongoClient(this._config.uri);
109
+ await this._client.connect();
110
+ this._db = this._client.db(this._config.database);
111
+ }
112
+ async disconnect() {
113
+ if (this._client) {
114
+ await this._client.close();
115
+ this._client = null;
116
+ this._db = null;
117
+ }
118
+ }
119
+ async ping() {
120
+ try {
121
+ await this._client?.db(this._config.database).command({ ping: 1 });
122
+ return true;
123
+ } catch {
124
+ return false;
125
+ }
126
+ }
127
+ };
128
+ export {
129
+ MongoNativeDriver,
130
+ MongoSession,
131
+ MongoTransaction,
132
+ mongoCollection
133
+ };
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@mountsqli/mongodb",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "import": "./dist/index.js",
8
+ "types": "./dist/index.d.ts"
9
+ }
10
+ },
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "files": ["dist", "LICENSE", "README.md"],
14
+ "scripts": {
15
+ "build": "tsup src/index.ts --format esm --dts --clean",
16
+ "dev": "tsup --watch",
17
+ "clean": "rm -rf dist"
18
+ },
19
+ "dependencies": {
20
+ "@mountsqli/core": "workspace:*",
21
+ "@mountsqli/shared": "workspace:*"
22
+ },
23
+ "peerDependencies": {
24
+ "mongodb": "^6.0.0"
25
+ },
26
+ "peerDependenciesMeta": {
27
+ "mongodb": { "optional": true }
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.0.0",
31
+ "typescript": "^5.7.0",
32
+ "tsup": "^8.0.0",
33
+ "vitest": "^3.0.0"
34
+ }
35
+ }