universal-db-switcher 1.0.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.
Files changed (62) hide show
  1. package/README.md +93 -0
  2. package/dist/adapters/index.d.ts +6 -0
  3. package/dist/adapters/index.d.ts.map +1 -0
  4. package/dist/adapters/index.js +6 -0
  5. package/dist/adapters/index.js.map +1 -0
  6. package/dist/adapters/mongodb-adapter.d.ts +25 -0
  7. package/dist/adapters/mongodb-adapter.d.ts.map +1 -0
  8. package/dist/adapters/mongodb-adapter.js +150 -0
  9. package/dist/adapters/mongodb-adapter.js.map +1 -0
  10. package/dist/adapters/mysql-adapter.d.ts +25 -0
  11. package/dist/adapters/mysql-adapter.d.ts.map +1 -0
  12. package/dist/adapters/mysql-adapter.js +197 -0
  13. package/dist/adapters/mysql-adapter.js.map +1 -0
  14. package/dist/cli/cli.d.ts +6 -0
  15. package/dist/cli/cli.d.ts.map +1 -0
  16. package/dist/cli/cli.js +164 -0
  17. package/dist/cli/cli.js.map +1 -0
  18. package/dist/cli/index.d.ts +5 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +5 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/core/adapter-factory.d.ts +7 -0
  23. package/dist/core/adapter-factory.d.ts.map +1 -0
  24. package/dist/core/adapter-factory.js +22 -0
  25. package/dist/core/adapter-factory.js.map +1 -0
  26. package/dist/core/base-adapter.d.ts +41 -0
  27. package/dist/core/base-adapter.d.ts.map +1 -0
  28. package/dist/core/base-adapter.js +14 -0
  29. package/dist/core/base-adapter.js.map +1 -0
  30. package/dist/core/index.d.ts +7 -0
  31. package/dist/core/index.d.ts.map +1 -0
  32. package/dist/core/index.js +7 -0
  33. package/dist/core/index.js.map +1 -0
  34. package/dist/core/types.d.ts +52 -0
  35. package/dist/core/types.d.ts.map +1 -0
  36. package/dist/core/types.js +33 -0
  37. package/dist/core/types.js.map +1 -0
  38. package/dist/index.d.ts +17 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +13 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/migration/index.d.ts +3 -0
  43. package/dist/migration/index.d.ts.map +1 -0
  44. package/dist/migration/index.js +2 -0
  45. package/dist/migration/index.js.map +1 -0
  46. package/dist/migration/migration-engine.d.ts +29 -0
  47. package/dist/migration/migration-engine.d.ts.map +1 -0
  48. package/dist/migration/migration-engine.js +101 -0
  49. package/dist/migration/migration-engine.js.map +1 -0
  50. package/dist/schema-mapper/index.d.ts +2 -0
  51. package/dist/schema-mapper/index.d.ts.map +1 -0
  52. package/dist/schema-mapper/index.js +2 -0
  53. package/dist/schema-mapper/index.js.map +1 -0
  54. package/dist/schema-mapper/schema-mapper.d.ts +7 -0
  55. package/dist/schema-mapper/schema-mapper.d.ts.map +1 -0
  56. package/dist/schema-mapper/schema-mapper.js +99 -0
  57. package/dist/schema-mapper/schema-mapper.js.map +1 -0
  58. package/dist/switch-db.d.ts +32 -0
  59. package/dist/switch-db.d.ts.map +1 -0
  60. package/dist/switch-db.js +78 -0
  61. package/dist/switch-db.js.map +1 -0
  62. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # universal-db-switcher
2
+
3
+ A universal database switching and migration tool that supports MongoDB, MySQL, PostgreSQL, and SQLite.
4
+
5
+ ## Features
6
+
7
+ - **Switch** between MongoDB, MySQL, PostgreSQL, and SQLite
8
+ - **Extract** schema from source database
9
+ - **Convert** schema to target database format
10
+ - **Migrate** data with configurable batch size
11
+ - **CLI** tool for command-line migrations
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install universal-db-switcher
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ### Programmatic API
22
+
23
+ ```javascript
24
+ import { switchDB } from 'universal-db-switcher';
25
+
26
+ const result = await switchDB(
27
+ {
28
+ type: 'mongodb',
29
+ host: 'localhost',
30
+ port: 27017,
31
+ database: 'mydb',
32
+ },
33
+ {
34
+ type: 'mysql',
35
+ host: 'localhost',
36
+ port: 3306,
37
+ database: 'mydb',
38
+ username: 'root',
39
+ password: 'secret',
40
+ },
41
+ { batchSize: 1000 }
42
+ );
43
+
44
+ console.log(result.success ? 'Migration complete!' : result.error);
45
+ ```
46
+
47
+ ### CLI
48
+
49
+ ```bash
50
+ # Migrate from MySQL to MongoDB
51
+ npx udb-switch migrate -s mysql -t mongodb \
52
+ --source-uri "mysql://user:pass@localhost/sourcedb" \
53
+ --target-uri "mongodb://localhost:27017/targetdb"
54
+
55
+ # Extract schema only (no data)
56
+ npx udb-switch migrate -s mysql -t mongodb --schema-only \
57
+ --source-uri "mysql://user:pass@localhost/db" \
58
+ --target-uri "mongodb://localhost/db"
59
+
60
+ # Extract schema to file
61
+ npx udb-switch schema -t mysql --uri "mysql://user:pass@localhost/db" -o schema.json
62
+ ```
63
+
64
+ ## Supported Databases
65
+
66
+ | Database | Status |
67
+ |-----------|-----------|
68
+ | MongoDB | ✅ Supported |
69
+ | MySQL | ✅ Supported |
70
+ | PostgreSQL| 🔜 Planned |
71
+ | SQLite | 🔜 Planned |
72
+
73
+ ## API Reference
74
+
75
+ ### switchDB(sourceConfig, targetConfig, options?)
76
+
77
+ Migrates data from source to target database.
78
+
79
+ ### extractSchema(config)
80
+
81
+ Extracts schema from a database.
82
+
83
+ ### runQuery(config, query, params?)
84
+
85
+ Runs a raw query against a database.
86
+
87
+ ### createAdapter(config)
88
+
89
+ Creates a database adapter instance.
90
+
91
+ ## License
92
+
93
+ MIT
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Universal DB Switcher - Adapters
3
+ */
4
+ export { MongoAdapter } from './mongodb-adapter.js';
5
+ export { MySQLAdapter } from './mysql-adapter.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Universal DB Switcher - Adapters
3
+ */
4
+ export { MongoAdapter } from './mongodb-adapter.js';
5
+ export { MySQLAdapter } from './mysql-adapter.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Universal DB Switcher - MongoDB Adapter
3
+ */
4
+ import { BaseAdapter } from '../core/base-adapter.js';
5
+ import type { ConnectionConfig, SchemaDefinition, QueryResult } from '../core/types.js';
6
+ export declare class MongoAdapter extends BaseAdapter {
7
+ private client;
8
+ private db;
9
+ constructor(config: ConnectionConfig);
10
+ connect(): Promise<void>;
11
+ private buildConnectionString;
12
+ disconnect(): Promise<void>;
13
+ getSchema(): Promise<SchemaDefinition>;
14
+ private inferSchemaFromDocument;
15
+ private getMongoType;
16
+ fetchData(collectionName: string, options?: {
17
+ limit?: number;
18
+ offset?: number;
19
+ query?: unknown;
20
+ }): Promise<Record<string, unknown>[]>;
21
+ insertData(collectionName: string, data: Record<string, unknown>[], _schema?: SchemaDefinition): Promise<number>;
22
+ runQuery(query: string, _params?: unknown[]): Promise<QueryResult>;
23
+ private ensureConnected;
24
+ }
25
+ //# sourceMappingURL=mongodb-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAAM;gBAEJ,MAAM,EAAE,gBAAgB;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B,OAAO,CAAC,qBAAqB;IAMvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA6B5C,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,YAAY;IAQd,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IA2B/B,UAAU,CACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC;IAwBZ,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBxE,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Universal DB Switcher - MongoDB Adapter
3
+ */
4
+ import { MongoClient } from 'mongodb';
5
+ import { BaseAdapter } from '../core/base-adapter.js';
6
+ import { ConnectionError, SchemaError } from '../core/types.js';
7
+ export class MongoAdapter extends BaseAdapter {
8
+ client;
9
+ db;
10
+ constructor(config) {
11
+ super(config);
12
+ if (config.type !== 'mongodb') {
13
+ throw new ConnectionError('MongoAdapter requires type: mongodb');
14
+ }
15
+ }
16
+ async connect() {
17
+ try {
18
+ const uri = this.config.connectionString ??
19
+ this.buildConnectionString();
20
+ this.client = new MongoClient(uri);
21
+ await this.client.connect();
22
+ this.db = this.client.db(this.config.database ?? 'test');
23
+ this._connected = true;
24
+ }
25
+ catch (error) {
26
+ this._connected = false;
27
+ throw new ConnectionError(`Failed to connect to MongoDB: ${error.message}`, error);
28
+ }
29
+ }
30
+ buildConnectionString() {
31
+ const { host = 'localhost', port = 27017, username, password, database = 'test' } = this.config;
32
+ const auth = username && password ? `${encodeURIComponent(username)}:${encodeURIComponent(password)}@` : '';
33
+ return `mongodb://${auth}${host}:${port}/${database}`;
34
+ }
35
+ async disconnect() {
36
+ try {
37
+ if (this.client) {
38
+ await this.client.close();
39
+ }
40
+ this._connected = false;
41
+ }
42
+ catch (error) {
43
+ this._connected = false;
44
+ throw new ConnectionError(`Failed to disconnect from MongoDB: ${error.message}`, error);
45
+ }
46
+ }
47
+ async getSchema() {
48
+ this.ensureConnected();
49
+ try {
50
+ const collections = await this.db.listCollections().toArray();
51
+ const schemas = [];
52
+ for (const col of collections) {
53
+ const collection = this.db.collection(col.name);
54
+ const sample = await collection.findOne();
55
+ const fields = sample
56
+ ? this.inferSchemaFromDocument(sample)
57
+ : {};
58
+ schemas.push({
59
+ name: col.name,
60
+ fields,
61
+ });
62
+ }
63
+ return schemas;
64
+ }
65
+ catch (error) {
66
+ throw new SchemaError(`Failed to extract MongoDB schema: ${error.message}`, error);
67
+ }
68
+ }
69
+ inferSchemaFromDocument(doc) {
70
+ const fields = {};
71
+ for (const [key, value] of Object.entries(doc)) {
72
+ if (key === '_id')
73
+ continue;
74
+ fields[key] = this.getMongoType(value);
75
+ }
76
+ return fields;
77
+ }
78
+ getMongoType(value) {
79
+ if (value === null)
80
+ return 'null';
81
+ if (Array.isArray(value))
82
+ return 'array';
83
+ if (value instanceof Date)
84
+ return 'date';
85
+ if (typeof value === 'object')
86
+ return 'object';
87
+ return typeof value;
88
+ }
89
+ async fetchData(collectionName, options) {
90
+ this.ensureConnected();
91
+ try {
92
+ const collection = this.db.collection(collectionName);
93
+ const query = (options?.query ?? {});
94
+ let cursor = collection.find(query);
95
+ const offset = options?.offset ?? 0;
96
+ const limit = options?.limit ?? 0;
97
+ if (offset > 0)
98
+ cursor = cursor.skip(offset);
99
+ if (limit > 0)
100
+ cursor = cursor.limit(limit);
101
+ const docs = await cursor.toArray();
102
+ return docs.map((doc) => {
103
+ const { _id, ...rest } = doc;
104
+ return { id: String(_id), ...rest };
105
+ });
106
+ }
107
+ catch (error) {
108
+ throw new SchemaError(`Failed to fetch data from ${collectionName}: ${error.message}`, error);
109
+ }
110
+ }
111
+ async insertData(collectionName, data, _schema) {
112
+ this.ensureConnected();
113
+ try {
114
+ const collection = this.db.collection(collectionName);
115
+ const docs = data.map((row) => {
116
+ const { id, ...rest } = row;
117
+ const doc = { ...rest };
118
+ if (id !== undefined && id !== null) {
119
+ doc._id = id;
120
+ }
121
+ return doc;
122
+ });
123
+ const result = await collection.insertMany(docs);
124
+ return result.insertedCount;
125
+ }
126
+ catch (error) {
127
+ throw new SchemaError(`Failed to insert data into ${collectionName}: ${error.message}`, error);
128
+ }
129
+ }
130
+ async runQuery(query, _params) {
131
+ this.ensureConnected();
132
+ try {
133
+ const result = await this.db.command(JSON.parse(query));
134
+ const rows = Array.isArray(result) ? result : [result];
135
+ return {
136
+ rows: rows,
137
+ rowCount: rows.length,
138
+ };
139
+ }
140
+ catch (error) {
141
+ throw new SchemaError(`Failed to run MongoDB command: ${error.message}`, error);
142
+ }
143
+ }
144
+ ensureConnected() {
145
+ if (!this._connected || !this.client) {
146
+ throw new ConnectionError('Not connected to MongoDB');
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=mongodb-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb-adapter.js","sourceRoot":"","sources":["../../src/adapters/mongodb-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Universal DB Switcher - MySQL Adapter
3
+ */
4
+ import { BaseAdapter } from '../core/base-adapter.js';
5
+ import type { ConnectionConfig, SchemaDefinition, QueryResult } from '../core/types.js';
6
+ export declare class MySQLAdapter extends BaseAdapter {
7
+ private connection;
8
+ constructor(config: ConnectionConfig);
9
+ connect(): Promise<void>;
10
+ disconnect(): Promise<void>;
11
+ getSchema(): Promise<SchemaDefinition>;
12
+ private normalizeColumnType;
13
+ fetchData(tableName: string, options?: {
14
+ limit?: number;
15
+ offset?: number;
16
+ query?: unknown;
17
+ }): Promise<Record<string, unknown>[]>;
18
+ private buildWhereClause;
19
+ insertData(tableName: string, data: Record<string, unknown>[], schema?: SchemaDefinition): Promise<number>;
20
+ runQuery(query: string, params?: unknown[]): Promise<QueryResult>;
21
+ createTable(table: import('../core/types.js').TableSchema): Promise<void>;
22
+ private toMySQLType;
23
+ private ensureConnected;
24
+ }
25
+ //# sourceMappingURL=mysql-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mysql-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAGhB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,UAAU,CAAc;gBAEpB,MAAM,EAAE,gBAAgB;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA+C5C,OAAO,CAAC,mBAAmB;IAUrB,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IA8BrC,OAAO,CAAC,gBAAgB;IAalB,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC;IAyBZ,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBjE,WAAW,CAAC,KAAK,EAAE,OAAO,kBAAkB,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/E,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Universal DB Switcher - MySQL Adapter
3
+ */
4
+ import mysql from 'mysql2/promise';
5
+ import { BaseAdapter } from '../core/base-adapter.js';
6
+ import { ConnectionError, SchemaError } from '../core/types.js';
7
+ export class MySQLAdapter extends BaseAdapter {
8
+ connection;
9
+ constructor(config) {
10
+ super(config);
11
+ if (config.type !== 'mysql') {
12
+ throw new ConnectionError('MySQLAdapter requires type: mysql');
13
+ }
14
+ }
15
+ async connect() {
16
+ try {
17
+ this.connection = await mysql.createConnection({
18
+ host: this.config.host ?? 'localhost',
19
+ port: this.config.port ?? 3306,
20
+ user: this.config.username,
21
+ password: this.config.password,
22
+ database: this.config.database,
23
+ });
24
+ this._connected = true;
25
+ }
26
+ catch (error) {
27
+ this._connected = false;
28
+ throw new ConnectionError(`Failed to connect to MySQL: ${error.message}`, error);
29
+ }
30
+ }
31
+ async disconnect() {
32
+ try {
33
+ if (this.connection) {
34
+ await this.connection.end();
35
+ }
36
+ this._connected = false;
37
+ }
38
+ catch (error) {
39
+ this._connected = false;
40
+ throw new ConnectionError(`Failed to disconnect from MySQL: ${error.message}`, error);
41
+ }
42
+ }
43
+ async getSchema() {
44
+ this.ensureConnected();
45
+ try {
46
+ const [tables] = await this.connection.query("SHOW TABLES");
47
+ const schemas = [];
48
+ for (const row of tables) {
49
+ const tableName = Object.values(row)[0];
50
+ const [columns] = await this.connection.query(`DESCRIBE \`${tableName}\``);
51
+ const columnSchemas = columns.map((col) => {
52
+ const type = col.Type.toLowerCase();
53
+ const isNull = col.Null === 'YES';
54
+ const isPK = col.Key === 'PRI';
55
+ return {
56
+ name: col.Field,
57
+ type: this.normalizeColumnType(type),
58
+ nullable: isNull,
59
+ primaryKey: isPK,
60
+ };
61
+ });
62
+ const pkColumns = columnSchemas
63
+ .filter((c) => c.primaryKey)
64
+ .map((c) => c.name);
65
+ schemas.push({
66
+ name: tableName,
67
+ columns: columnSchemas,
68
+ primaryKey: pkColumns.length > 0 ? pkColumns : undefined,
69
+ });
70
+ }
71
+ return schemas;
72
+ }
73
+ catch (error) {
74
+ throw new SchemaError(`Failed to extract MySQL schema: ${error.message}`, error);
75
+ }
76
+ }
77
+ normalizeColumnType(mysqlType) {
78
+ if (mysqlType.includes('int'))
79
+ return 'integer';
80
+ if (mysqlType.includes('decimal') || mysqlType.includes('float') || mysqlType.includes('double'))
81
+ return 'number';
82
+ if (mysqlType.includes('varchar') || mysqlType.includes('char') || mysqlType.includes('text'))
83
+ return 'string';
84
+ if (mysqlType.includes('datetime') || mysqlType.includes('timestamp') || mysqlType.includes('date'))
85
+ return 'datetime';
86
+ if (mysqlType.includes('bool'))
87
+ return 'boolean';
88
+ if (mysqlType.includes('json'))
89
+ return 'json';
90
+ return 'string';
91
+ }
92
+ async fetchData(tableName, options) {
93
+ this.ensureConnected();
94
+ try {
95
+ let sql = `SELECT * FROM \`${tableName}\``;
96
+ const params = [];
97
+ if (options?.query && typeof options.query === 'object') {
98
+ const where = this.buildWhereClause(options.query, params);
99
+ if (where)
100
+ sql += ` WHERE ${where}`;
101
+ }
102
+ if (options?.limit) {
103
+ sql += ' LIMIT ?';
104
+ params.push(options.limit);
105
+ }
106
+ if (options?.offset) {
107
+ sql += ' OFFSET ?';
108
+ params.push(options.offset);
109
+ }
110
+ const [rows] = await this.connection.query(sql, params);
111
+ return rows;
112
+ }
113
+ catch (error) {
114
+ throw new SchemaError(`Failed to fetch data from ${tableName}: ${error.message}`, error);
115
+ }
116
+ }
117
+ buildWhereClause(query, params) {
118
+ const conditions = [];
119
+ for (const [key, value] of Object.entries(query)) {
120
+ if (value === undefined)
121
+ continue;
122
+ conditions.push(`\`${key}\` = ?`);
123
+ params.push(value);
124
+ }
125
+ return conditions.join(' AND ');
126
+ }
127
+ async insertData(tableName, data, schema) {
128
+ this.ensureConnected();
129
+ if (data.length === 0)
130
+ return 0;
131
+ try {
132
+ const columns = Object.keys(data[0]);
133
+ const placeholders = columns.map(() => '?').join(', ');
134
+ const columnList = columns.map((c) => `\`${c}\``).join(', ');
135
+ const sql = `INSERT INTO \`${tableName}\` (${columnList}) VALUES (${placeholders})`;
136
+ let inserted = 0;
137
+ for (const row of data) {
138
+ const values = columns.map((c) => row[c]);
139
+ await this.connection.execute(sql, values);
140
+ inserted++;
141
+ }
142
+ return inserted;
143
+ }
144
+ catch (error) {
145
+ throw new SchemaError(`Failed to insert data into ${tableName}: ${error.message}`, error);
146
+ }
147
+ }
148
+ async runQuery(query, params) {
149
+ this.ensureConnected();
150
+ try {
151
+ const [rows] = await this.connection.query(query, params ?? []);
152
+ const rowArray = Array.isArray(rows) ? rows : [rows];
153
+ return {
154
+ rows: rowArray,
155
+ rowCount: rowArray.length,
156
+ };
157
+ }
158
+ catch (error) {
159
+ throw new SchemaError(`Failed to run MySQL query: ${error.message}`, error);
160
+ }
161
+ }
162
+ async createTable(table) {
163
+ this.ensureConnected();
164
+ const cols = table.columns.map((col) => {
165
+ const type = this.toMySQLType(col.type);
166
+ const nn = col.nullable === false ? ' NOT NULL' : '';
167
+ const pk = col.primaryKey ? ' PRIMARY KEY' : '';
168
+ return `\`${col.name}\` ${type}${nn}${pk}`;
169
+ });
170
+ const sql = `CREATE TABLE IF NOT EXISTS \`${table.name}\` (${cols.join(', ')})`;
171
+ await this.connection.execute(sql);
172
+ }
173
+ toMySQLType(type) {
174
+ const lower = type.toLowerCase();
175
+ if (lower.includes('int') || lower === 'integer')
176
+ return 'INT';
177
+ if (lower.includes('varchar'))
178
+ return type;
179
+ if (lower.includes('decimal') || lower.includes('float') || lower.includes('double'))
180
+ return type;
181
+ if (lower.includes('text'))
182
+ return 'TEXT';
183
+ if (lower.includes('datetime') || lower.includes('date'))
184
+ return 'DATETIME';
185
+ if (lower.includes('bool'))
186
+ return 'BOOLEAN';
187
+ if (lower.includes('json'))
188
+ return 'JSON';
189
+ return 'TEXT';
190
+ }
191
+ ensureConnected() {
192
+ if (!this._connected || !this.connection) {
193
+ throw new ConnectionError('Not connected to MySQL');
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=mysql-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql-adapter.js","sourceRoot":"","sources":["../../src/adapters/mysql-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Universal DB Switcher - CLI
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}