cohere-db 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.
- package/LICENSE +21 -0
- package/README.md +383 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/generate.d.ts +21 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +131 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/handoff.d.ts +16 -0
- package/dist/commands/handoff.d.ts.map +1 -0
- package/dist/commands/handoff.js +334 -0
- package/dist/commands/handoff.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +28 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/show.d.ts +10 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +123 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +167 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/watch.d.ts +10 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +74 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/extractors/drizzle.d.ts +63 -0
- package/dist/extractors/drizzle.d.ts.map +1 -0
- package/dist/extractors/drizzle.js +251 -0
- package/dist/extractors/drizzle.js.map +1 -0
- package/dist/extractors/firebase.d.ts +40 -0
- package/dist/extractors/firebase.d.ts.map +1 -0
- package/dist/extractors/firebase.js +192 -0
- package/dist/extractors/firebase.js.map +1 -0
- package/dist/extractors/index.d.ts +68 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +346 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/extractors/mongodb.d.ts +45 -0
- package/dist/extractors/mongodb.d.ts.map +1 -0
- package/dist/extractors/mongodb.js +201 -0
- package/dist/extractors/mongodb.js.map +1 -0
- package/dist/extractors/mysql.d.ts +62 -0
- package/dist/extractors/mysql.d.ts.map +1 -0
- package/dist/extractors/mysql.js +173 -0
- package/dist/extractors/mysql.js.map +1 -0
- package/dist/extractors/postgres.d.ts +48 -0
- package/dist/extractors/postgres.d.ts.map +1 -0
- package/dist/extractors/postgres.js +141 -0
- package/dist/extractors/postgres.js.map +1 -0
- package/dist/extractors/prisma.d.ts +72 -0
- package/dist/extractors/prisma.d.ts.map +1 -0
- package/dist/extractors/prisma.js +262 -0
- package/dist/extractors/prisma.js.map +1 -0
- package/dist/extractors/sqlite.d.ts +51 -0
- package/dist/extractors/sqlite.d.ts.map +1 -0
- package/dist/extractors/sqlite.js +150 -0
- package/dist/extractors/sqlite.js.map +1 -0
- package/dist/generators/templates.d.ts +104 -0
- package/dist/generators/templates.d.ts.map +1 -0
- package/dist/generators/templates.js +1516 -0
- package/dist/generators/templates.js.map +1 -0
- package/package.json +79 -0
- package/templates/claude.md +176 -0
- package/templates/constraints.md +222 -0
- package/templates/context/session-context.example.json +48 -0
- package/templates/context/session-context.schema.json +129 -0
- package/templates/cursor.md +154 -0
- package/templates/decisions/decision-template.md +138 -0
- package/templates/edge-cases.md +164 -0
- package/templates/handoffs/handoff-template.md +132 -0
- package/templates/memory/checkpoint-patterns.md +224 -0
- package/templates/query-template.md +35 -0
- package/templates/state/CURRENT_STATE.md +117 -0
- package/templates/test-templates/edge-cases.test.md +230 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Schema Extractor
|
|
3
|
+
* Extracts database schema information from MongoDB databases by sampling documents
|
|
4
|
+
*/
|
|
5
|
+
export interface MongoDBFieldInfo {
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
nullable: boolean;
|
|
9
|
+
isArray: boolean;
|
|
10
|
+
sampleValues?: any[];
|
|
11
|
+
}
|
|
12
|
+
export interface MongoDBCollectionInfo {
|
|
13
|
+
name: string;
|
|
14
|
+
documentCount: number;
|
|
15
|
+
fields: MongoDBFieldInfo[];
|
|
16
|
+
sampleSize: number;
|
|
17
|
+
indexes: {
|
|
18
|
+
name: string;
|
|
19
|
+
keys: Record<string, any>;
|
|
20
|
+
unique: boolean;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export interface MongoDBSchemaInfo {
|
|
24
|
+
collections: MongoDBCollectionInfo[];
|
|
25
|
+
databaseType: 'mongodb';
|
|
26
|
+
databaseName: string;
|
|
27
|
+
connectionString: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class MongoDBExtractor {
|
|
30
|
+
private connectionString;
|
|
31
|
+
private client;
|
|
32
|
+
private db;
|
|
33
|
+
private sampleSize;
|
|
34
|
+
constructor(connectionString: string, sampleSize?: number);
|
|
35
|
+
extract(): Promise<MongoDBSchemaInfo>;
|
|
36
|
+
private extractCollectionSchema;
|
|
37
|
+
private inferSchemaFromDocuments;
|
|
38
|
+
private analyzeObject;
|
|
39
|
+
private getMongoType;
|
|
40
|
+
private determinePrimaryType;
|
|
41
|
+
private extractDatabaseName;
|
|
42
|
+
private sanitizeConnectionString;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=mongodb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../src/extractors/mongodb.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;CACP;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACrC,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,UAAU,CAAe;gBAErB,gBAAgB,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY;IAKxD,OAAO,IAAI,OAAO,CAAC,iBAAiB,CAAC;YA8B7B,uBAAuB;IAiCrC,OAAO,CAAC,wBAAwB;IAiChC,OAAO,CAAC,aAAa;IAmDrB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,wBAAwB;IAK1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Schema Extractor
|
|
3
|
+
* Extracts database schema information from MongoDB databases by sampling documents
|
|
4
|
+
*/
|
|
5
|
+
import { MongoClient } from 'mongodb';
|
|
6
|
+
export class MongoDBExtractor {
|
|
7
|
+
connectionString;
|
|
8
|
+
client = null;
|
|
9
|
+
db = null;
|
|
10
|
+
sampleSize = 100;
|
|
11
|
+
constructor(connectionString, sampleSize = 100) {
|
|
12
|
+
this.connectionString = connectionString;
|
|
13
|
+
this.sampleSize = sampleSize;
|
|
14
|
+
}
|
|
15
|
+
async extract() {
|
|
16
|
+
this.client = new MongoClient(this.connectionString);
|
|
17
|
+
try {
|
|
18
|
+
await this.client.connect();
|
|
19
|
+
// Extract database name from connection string
|
|
20
|
+
const dbName = this.extractDatabaseName(this.connectionString);
|
|
21
|
+
this.db = this.client.db(dbName);
|
|
22
|
+
// List all collections
|
|
23
|
+
const collectionsInfo = await this.db.listCollections().toArray();
|
|
24
|
+
const collectionNames = collectionsInfo.map(c => c.name);
|
|
25
|
+
// Extract schema for each collection
|
|
26
|
+
const collections = await Promise.all(collectionNames.map(name => this.extractCollectionSchema(name)));
|
|
27
|
+
return {
|
|
28
|
+
collections,
|
|
29
|
+
databaseType: 'mongodb',
|
|
30
|
+
databaseName: dbName,
|
|
31
|
+
connectionString: this.sanitizeConnectionString(this.connectionString),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async extractCollectionSchema(collectionName) {
|
|
39
|
+
if (!this.db)
|
|
40
|
+
throw new Error('Database not connected');
|
|
41
|
+
const collection = this.db.collection(collectionName);
|
|
42
|
+
// Get document count
|
|
43
|
+
const documentCount = await collection.countDocuments();
|
|
44
|
+
// Sample documents
|
|
45
|
+
const sampleDocuments = await collection
|
|
46
|
+
.find({})
|
|
47
|
+
.limit(this.sampleSize)
|
|
48
|
+
.toArray();
|
|
49
|
+
// Get indexes
|
|
50
|
+
const indexes = await collection.indexes();
|
|
51
|
+
// Infer schema from sampled documents
|
|
52
|
+
const fields = this.inferSchemaFromDocuments(sampleDocuments);
|
|
53
|
+
return {
|
|
54
|
+
name: collectionName,
|
|
55
|
+
documentCount,
|
|
56
|
+
fields,
|
|
57
|
+
sampleSize: sampleDocuments.length,
|
|
58
|
+
indexes: indexes.map(idx => ({
|
|
59
|
+
name: idx.name || '',
|
|
60
|
+
keys: idx.key,
|
|
61
|
+
unique: idx.unique || false,
|
|
62
|
+
})),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
inferSchemaFromDocuments(documents) {
|
|
66
|
+
if (documents.length === 0)
|
|
67
|
+
return [];
|
|
68
|
+
const fieldMap = new Map();
|
|
69
|
+
// Analyze all documents
|
|
70
|
+
for (const doc of documents) {
|
|
71
|
+
this.analyzeObject(doc, fieldMap, '');
|
|
72
|
+
}
|
|
73
|
+
// Convert to field info
|
|
74
|
+
const fields = [];
|
|
75
|
+
for (const [fieldName, info] of fieldMap.entries()) {
|
|
76
|
+
const types = Array.from(info.types);
|
|
77
|
+
const primaryType = this.determinePrimaryType(types);
|
|
78
|
+
fields.push({
|
|
79
|
+
name: fieldName,
|
|
80
|
+
type: primaryType,
|
|
81
|
+
nullable: info.nullCount > 0,
|
|
82
|
+
isArray: info.isArray,
|
|
83
|
+
sampleValues: info.samples.slice(0, 3), // Keep first 3 sample values
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return fields.sort((a, b) => a.name.localeCompare(b.name));
|
|
87
|
+
}
|
|
88
|
+
analyzeObject(obj, fieldMap, prefix) {
|
|
89
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
90
|
+
const fieldName = prefix ? `${prefix}.${key}` : key;
|
|
91
|
+
if (!fieldMap.has(fieldName)) {
|
|
92
|
+
fieldMap.set(fieldName, {
|
|
93
|
+
types: new Set(),
|
|
94
|
+
nullCount: 0,
|
|
95
|
+
isArray: false,
|
|
96
|
+
samples: [],
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const fieldInfo = fieldMap.get(fieldName);
|
|
100
|
+
if (value === null || value === undefined) {
|
|
101
|
+
fieldInfo.nullCount++;
|
|
102
|
+
fieldInfo.types.add('null');
|
|
103
|
+
}
|
|
104
|
+
else if (Array.isArray(value)) {
|
|
105
|
+
fieldInfo.isArray = true;
|
|
106
|
+
fieldInfo.types.add('Array');
|
|
107
|
+
// Analyze array elements
|
|
108
|
+
if (value.length > 0) {
|
|
109
|
+
const elementType = this.getMongoType(value[0]);
|
|
110
|
+
fieldInfo.types.add(`Array<${elementType}>`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (typeof value === 'object') {
|
|
114
|
+
const mongoType = this.getMongoType(value);
|
|
115
|
+
fieldInfo.types.add(mongoType);
|
|
116
|
+
// Don't recurse into ObjectId, Date, etc.
|
|
117
|
+
if (mongoType === 'Object') {
|
|
118
|
+
this.analyzeObject(value, fieldMap, fieldName);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const mongoType = this.getMongoType(value);
|
|
123
|
+
fieldInfo.types.add(mongoType);
|
|
124
|
+
// Store sample values
|
|
125
|
+
if (fieldInfo.samples.length < 3 && !['null', 'undefined'].includes(mongoType)) {
|
|
126
|
+
fieldInfo.samples.push(value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
getMongoType(value) {
|
|
132
|
+
if (value === null)
|
|
133
|
+
return 'null';
|
|
134
|
+
if (value === undefined)
|
|
135
|
+
return 'undefined';
|
|
136
|
+
// Check for MongoDB types
|
|
137
|
+
if (value._bsontype === 'ObjectId' || value.constructor?.name === 'ObjectId') {
|
|
138
|
+
return 'ObjectId';
|
|
139
|
+
}
|
|
140
|
+
if (value instanceof Date)
|
|
141
|
+
return 'Date';
|
|
142
|
+
if (value._bsontype === 'Binary')
|
|
143
|
+
return 'Binary';
|
|
144
|
+
if (value._bsontype === 'Decimal128')
|
|
145
|
+
return 'Decimal128';
|
|
146
|
+
// Check for standard JavaScript types
|
|
147
|
+
if (Array.isArray(value))
|
|
148
|
+
return 'Array';
|
|
149
|
+
if (typeof value === 'string')
|
|
150
|
+
return 'String';
|
|
151
|
+
if (typeof value === 'number') {
|
|
152
|
+
return Number.isInteger(value) ? 'Int' : 'Double';
|
|
153
|
+
}
|
|
154
|
+
if (typeof value === 'boolean')
|
|
155
|
+
return 'Boolean';
|
|
156
|
+
if (typeof value === 'object')
|
|
157
|
+
return 'Object';
|
|
158
|
+
return 'Mixed';
|
|
159
|
+
}
|
|
160
|
+
determinePrimaryType(types) {
|
|
161
|
+
if (types.length === 0)
|
|
162
|
+
return 'Mixed';
|
|
163
|
+
if (types.length === 1)
|
|
164
|
+
return types[0];
|
|
165
|
+
// Filter out null
|
|
166
|
+
const nonNullTypes = types.filter(t => t !== 'null');
|
|
167
|
+
if (nonNullTypes.length === 1)
|
|
168
|
+
return nonNullTypes[0];
|
|
169
|
+
if (nonNullTypes.length === 0)
|
|
170
|
+
return 'null';
|
|
171
|
+
// If multiple types, return Mixed
|
|
172
|
+
return `Mixed(${nonNullTypes.join('|')})`;
|
|
173
|
+
}
|
|
174
|
+
extractDatabaseName(connectionString) {
|
|
175
|
+
try {
|
|
176
|
+
// Parse connection string to extract database name
|
|
177
|
+
// mongodb://host:port/dbname or mongodb+srv://host/dbname
|
|
178
|
+
const match = connectionString.match(/\/([^/?]+)(\?|$)/);
|
|
179
|
+
if (match && match[1]) {
|
|
180
|
+
return match[1];
|
|
181
|
+
}
|
|
182
|
+
// Default to 'test' if not found
|
|
183
|
+
return 'test';
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return 'test';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
sanitizeConnectionString(connectionString) {
|
|
190
|
+
// Remove password from connection string for display
|
|
191
|
+
return connectionString.replace(/mongodb(\+srv)?:\/\/([^:]+):([^@]+)@/, 'mongodb$1://$2:***@');
|
|
192
|
+
}
|
|
193
|
+
async close() {
|
|
194
|
+
if (this.client) {
|
|
195
|
+
await this.client.close();
|
|
196
|
+
this.client = null;
|
|
197
|
+
this.db = null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=mongodb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../src/extractors/mongodb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Schema Extractor
|
|
3
|
+
* Extracts database schema information from MySQL databases
|
|
4
|
+
*/
|
|
5
|
+
export interface MySQLColumnInfo {
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
nullable: boolean;
|
|
9
|
+
default: string | null;
|
|
10
|
+
extra: string;
|
|
11
|
+
comment: string;
|
|
12
|
+
}
|
|
13
|
+
export interface MySQLIndexInfo {
|
|
14
|
+
name: string;
|
|
15
|
+
columns: string[];
|
|
16
|
+
unique: boolean;
|
|
17
|
+
isPrimaryKey: boolean;
|
|
18
|
+
indexType: string;
|
|
19
|
+
}
|
|
20
|
+
export interface MySQLForeignKeyInfo {
|
|
21
|
+
column: string;
|
|
22
|
+
referencesTable: string;
|
|
23
|
+
referencesColumn: string;
|
|
24
|
+
onDelete: string | null;
|
|
25
|
+
onUpdate: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface MySQLTableInfo {
|
|
28
|
+
name: string;
|
|
29
|
+
columns: MySQLColumnInfo[];
|
|
30
|
+
indexes: MySQLIndexInfo[];
|
|
31
|
+
foreignKeys: MySQLForeignKeyInfo[];
|
|
32
|
+
primaryKey: string[];
|
|
33
|
+
engine: string;
|
|
34
|
+
comment: string;
|
|
35
|
+
autoIncrement: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface MySQLSchemaInfo {
|
|
38
|
+
tables: MySQLTableInfo[];
|
|
39
|
+
databaseType: 'mysql';
|
|
40
|
+
databaseName: string;
|
|
41
|
+
}
|
|
42
|
+
export declare class MySQLExtractor {
|
|
43
|
+
private pool;
|
|
44
|
+
private databaseName;
|
|
45
|
+
constructor(connectionString: string);
|
|
46
|
+
extract(): Promise<MySQLSchemaInfo>;
|
|
47
|
+
private extractTables;
|
|
48
|
+
private extractColumns;
|
|
49
|
+
private extractIndexes;
|
|
50
|
+
private extractForeignKeys;
|
|
51
|
+
close(): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export declare const MYSQL_TYPE_MAPPINGS: ({
|
|
54
|
+
dbType: string;
|
|
55
|
+
tsType: string;
|
|
56
|
+
maxLength: string;
|
|
57
|
+
} | {
|
|
58
|
+
dbType: string;
|
|
59
|
+
tsType: string;
|
|
60
|
+
maxLength?: undefined;
|
|
61
|
+
})[];
|
|
62
|
+
//# sourceMappingURL=mysql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/extractors/mysql.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,YAAY,CAAS;gBAEjB,gBAAgB,EAAE,MAAM;IAiB9B,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;YAmC3B,aAAa;YAoBb,cAAc;YA2Bd,cAAc;YAuCd,kBAAkB;IA0B1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAGD,eAAO,MAAM,mBAAmB;;;;;;;;IAoB/B,CAAC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Schema Extractor
|
|
3
|
+
* Extracts database schema information from MySQL databases
|
|
4
|
+
*/
|
|
5
|
+
import mysql from 'mysql2/promise';
|
|
6
|
+
export class MySQLExtractor {
|
|
7
|
+
pool;
|
|
8
|
+
databaseName;
|
|
9
|
+
constructor(connectionString) {
|
|
10
|
+
// Parse connection string to extract database name
|
|
11
|
+
const url = new URL(connectionString);
|
|
12
|
+
this.databaseName = url.pathname.slice(1) || 'database';
|
|
13
|
+
this.pool = mysql.createPool({
|
|
14
|
+
host: url.hostname || 'localhost',
|
|
15
|
+
port: parseInt(url.port) || 3306,
|
|
16
|
+
user: url.username || 'root',
|
|
17
|
+
password: url.password || '',
|
|
18
|
+
database: this.databaseName,
|
|
19
|
+
waitForConnections: true,
|
|
20
|
+
connectionLimit: 10,
|
|
21
|
+
queueLimit: 0,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async extract() {
|
|
25
|
+
const connection = await this.pool.getConnection();
|
|
26
|
+
try {
|
|
27
|
+
const tables = await this.extractTables(connection);
|
|
28
|
+
const tablesWithDetails = await Promise.all(tables.map(async (table) => {
|
|
29
|
+
const tableName = table.name || '';
|
|
30
|
+
const columns = await this.extractColumns(connection, tableName);
|
|
31
|
+
const indexes = await this.extractIndexes(connection, tableName);
|
|
32
|
+
const foreignKeys = await this.extractForeignKeys(connection, tableName);
|
|
33
|
+
const primaryKey = indexes.filter((i) => i.isPrimaryKey).flatMap((i) => i.columns);
|
|
34
|
+
return {
|
|
35
|
+
name: tableName,
|
|
36
|
+
comment: table.comment || '',
|
|
37
|
+
engine: table.engine || 'InnoDB',
|
|
38
|
+
autoIncrement: table.autoIncrement || null,
|
|
39
|
+
columns,
|
|
40
|
+
indexes,
|
|
41
|
+
foreignKeys,
|
|
42
|
+
primaryKey,
|
|
43
|
+
};
|
|
44
|
+
}));
|
|
45
|
+
return {
|
|
46
|
+
tables: tablesWithDetails,
|
|
47
|
+
databaseType: 'mysql',
|
|
48
|
+
databaseName: this.databaseName,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
connection.release();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async extractTables(connection) {
|
|
56
|
+
const [rows] = await connection.query(`
|
|
57
|
+
SELECT
|
|
58
|
+
TABLE_NAME as table_name,
|
|
59
|
+
TABLE_COMMENT as table_comment,
|
|
60
|
+
ENGINE as engine,
|
|
61
|
+
AUTO_INCREMENT as auto_increment
|
|
62
|
+
FROM information_schema.TABLES
|
|
63
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'
|
|
64
|
+
ORDER BY TABLE_NAME
|
|
65
|
+
`, [this.databaseName]);
|
|
66
|
+
return rows.map((row) => ({
|
|
67
|
+
name: row.table_name,
|
|
68
|
+
comment: row.table_comment,
|
|
69
|
+
engine: row.engine,
|
|
70
|
+
autoIncrement: row.auto_increment?.toString() || null,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
async extractColumns(connection, tableName) {
|
|
74
|
+
const [rows] = await connection.query(`
|
|
75
|
+
SELECT
|
|
76
|
+
COLUMN_NAME as column_name,
|
|
77
|
+
COLUMN_TYPE as column_type,
|
|
78
|
+
IS_NULLABLE as is_nullable,
|
|
79
|
+
COLUMN_DEFAULT as column_default,
|
|
80
|
+
EXTRA as extra,
|
|
81
|
+
COLUMN_COMMENT as column_comment
|
|
82
|
+
FROM information_schema.COLUMNS
|
|
83
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
|
84
|
+
ORDER BY ORDINAL_POSITION
|
|
85
|
+
`, [this.databaseName, tableName]);
|
|
86
|
+
return rows.map((row) => ({
|
|
87
|
+
name: row.column_name,
|
|
88
|
+
type: row.column_type,
|
|
89
|
+
nullable: row.is_nullable === 'YES',
|
|
90
|
+
default: row.column_default,
|
|
91
|
+
extra: row.extra,
|
|
92
|
+
comment: row.column_comment,
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
async extractIndexes(connection, tableName) {
|
|
96
|
+
const [rows] = await connection.query(`
|
|
97
|
+
SELECT
|
|
98
|
+
INDEX_NAME as index_name,
|
|
99
|
+
NON_UNIQUE as non_unique,
|
|
100
|
+
INDEX_TYPE as index_type,
|
|
101
|
+
GROUP_CONcat(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns
|
|
102
|
+
FROM information_schema.STATISTICS
|
|
103
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
|
104
|
+
GROUP BY INDEX_NAME, NON_UNIQUE, INDEX_TYPE
|
|
105
|
+
`, [this.databaseName, tableName]);
|
|
106
|
+
// Also get primary key info
|
|
107
|
+
const [pkRows] = await connection.query(`
|
|
108
|
+
SELECT
|
|
109
|
+
INDEX_NAME as index_name
|
|
110
|
+
FROM information_schema.STATISTICS
|
|
111
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND INDEX_NAME = 'PRIMARY'
|
|
112
|
+
`, [this.databaseName, tableName]);
|
|
113
|
+
const primaryKeyIndexNames = pkRows.map((row) => row.index_name);
|
|
114
|
+
return rows.map((row) => {
|
|
115
|
+
const indexName = row.index_name;
|
|
116
|
+
const columns = row.columns.split(',');
|
|
117
|
+
return {
|
|
118
|
+
name: indexName,
|
|
119
|
+
columns,
|
|
120
|
+
unique: row.non_unique === 0,
|
|
121
|
+
isPrimaryKey: indexName === 'PRIMARY',
|
|
122
|
+
indexType: row.index_type,
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async extractForeignKeys(connection, tableName) {
|
|
127
|
+
const [rows] = await connection.query(`
|
|
128
|
+
SELECT
|
|
129
|
+
COLUMN_NAME as column_name,
|
|
130
|
+
REFERENCED_TABLE_NAME as referenced_table_name,
|
|
131
|
+
REFERENCED_COLUMN_NAME as referenced_column_name,
|
|
132
|
+
DELETE_RULE as delete_rule,
|
|
133
|
+
UPDATE_RULE as update_rule
|
|
134
|
+
FROM information_schema.KEY_COLUMN_USAGE
|
|
135
|
+
WHERE TABLE_SCHEMA = ?
|
|
136
|
+
AND TABLE_NAME = ?
|
|
137
|
+
AND REFERENCED_TABLE_NAME IS NOT NULL
|
|
138
|
+
`, [this.databaseName, tableName]);
|
|
139
|
+
return rows.map((row) => ({
|
|
140
|
+
column: row.column_name,
|
|
141
|
+
referencesTable: row.referenced_table_name,
|
|
142
|
+
referencesColumn: row.referenced_column_name,
|
|
143
|
+
onDelete: row.delete_rule,
|
|
144
|
+
onUpdate: row.update_rule,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
async close() {
|
|
148
|
+
await this.pool.end();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// MySQL-specific type mappings
|
|
152
|
+
export const MYSQL_TYPE_MAPPINGS = [
|
|
153
|
+
{ dbType: 'varchar', tsType: 'string', maxLength: '(n)' },
|
|
154
|
+
{ dbType: 'text', tsType: 'string' },
|
|
155
|
+
{ dbType: 'longtext', tsType: 'string' },
|
|
156
|
+
{ dbType: 'int', tsType: 'number' },
|
|
157
|
+
{ dbType: 'bigint', tsType: 'number' },
|
|
158
|
+
{ dbType: 'smallint', tsType: 'number' },
|
|
159
|
+
{ dbType: 'tinyint', tsType: 'number' },
|
|
160
|
+
{ dbType: 'decimal', tsType: 'number' },
|
|
161
|
+
{ dbType: 'float', tsType: 'number' },
|
|
162
|
+
{ dbType: 'double', tsType: 'number' },
|
|
163
|
+
{ dbType: 'boolean', tsType: 'boolean' },
|
|
164
|
+
{ dbType: 'tinyint(1)', tsType: 'boolean' },
|
|
165
|
+
{ dbType: 'date', tsType: 'Date' },
|
|
166
|
+
{ dbType: 'datetime', tsType: 'Date' },
|
|
167
|
+
{ dbType: 'timestamp', tsType: 'Date' },
|
|
168
|
+
{ dbType: 'json', tsType: 'Record<string, unknown>' },
|
|
169
|
+
{ dbType: 'enum', tsType: 'string' },
|
|
170
|
+
{ dbType: 'set', tsType: 'string[]' },
|
|
171
|
+
{ dbType: 'blob', tsType: 'Buffer' },
|
|
172
|
+
];
|
|
173
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/extractors/mysql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Schema Extractor
|
|
3
|
+
* Extracts database schema information from PostgreSQL databases
|
|
4
|
+
*/
|
|
5
|
+
export interface ColumnInfo {
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
nullable: boolean;
|
|
9
|
+
default: string | null;
|
|
10
|
+
description: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface IndexInfo {
|
|
13
|
+
name: string;
|
|
14
|
+
columns: string[];
|
|
15
|
+
unique: boolean;
|
|
16
|
+
isPrimaryKey: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface ForeignKeyInfo {
|
|
19
|
+
column: string;
|
|
20
|
+
referencesTable: string;
|
|
21
|
+
referencesColumn: string;
|
|
22
|
+
onDelete: string | null;
|
|
23
|
+
onUpdate: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface TableInfo {
|
|
26
|
+
name: string;
|
|
27
|
+
columns: ColumnInfo[];
|
|
28
|
+
indexes: IndexInfo[];
|
|
29
|
+
foreignKeys: ForeignKeyInfo[];
|
|
30
|
+
primaryKey: string[];
|
|
31
|
+
description: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface SchemaInfo {
|
|
34
|
+
tables: TableInfo[];
|
|
35
|
+
databaseType: 'postgresql';
|
|
36
|
+
schemaName: string;
|
|
37
|
+
}
|
|
38
|
+
export declare class PostgresExtractor {
|
|
39
|
+
private pool;
|
|
40
|
+
constructor(connectionString: string);
|
|
41
|
+
extract(schemaName?: string): Promise<SchemaInfo>;
|
|
42
|
+
private extractTables;
|
|
43
|
+
private extractColumns;
|
|
44
|
+
private extractIndexes;
|
|
45
|
+
private extractForeignKeys;
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/extractors/postgres.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAO;gBAEP,gBAAgB,EAAE,MAAM;IAO9B,OAAO,CAAC,UAAU,GAAE,MAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;YAiCnD,aAAa;YAiBb,cAAc;YA6Bd,cAAc;YA4Bd,kBAAkB;IAoC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|