@diagramers/cli 1.0.57 → 1.0.61
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 +37 -12
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +18 -0
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/extend.d.ts.map +1 -1
- package/dist/commands/extend.js +30 -5
- package/dist/commands/extend.js.map +1 -1
- package/dist/services/api-generator.d.ts +1 -0
- package/dist/services/api-generator.d.ts.map +1 -1
- package/dist/services/api-generator.js +330 -0
- package/dist/services/api-generator.js.map +1 -1
- package/dist/services/project-extender.d.ts +4 -0
- package/dist/services/project-extender.d.ts.map +1 -1
- package/dist/services/project-extender.js +330 -0
- package/dist/services/project-extender.js.map +1 -1
- package/dist/services/table-generator.d.ts +1 -1
- package/dist/services/table-generator.d.ts.map +1 -1
- package/dist/services/table-generator.js +212 -61
- package/dist/services/table-generator.js.map +1 -1
- package/package.json +1 -1
@@ -36,63 +36,92 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.generateTable = generateTable;
|
37
37
|
const fs = __importStar(require("fs"));
|
38
38
|
const path = __importStar(require("path"));
|
39
|
-
|
39
|
+
// Function to convert plural table names to singular for file names
|
40
|
+
function pluralToSingular(word) {
|
41
|
+
if (word.endsWith('ies')) {
|
42
|
+
return word.slice(0, -3) + 'y'; // categories -> category
|
43
|
+
}
|
44
|
+
else if (word.endsWith('es')) {
|
45
|
+
return word.slice(0, -2); // boxes -> box
|
46
|
+
}
|
47
|
+
else if (word.endsWith('s')) {
|
48
|
+
return word.slice(0, -1); // users -> user, products -> product
|
49
|
+
}
|
50
|
+
return word; // already singular
|
51
|
+
}
|
52
|
+
async function generateTable(tableName, options = {}) {
|
40
53
|
// Validate table name
|
41
54
|
if (!tableName || !/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(tableName)) {
|
42
55
|
throw new Error('Invalid table name. Use only letters, numbers, hyphens, and underscores. Must start with a letter.');
|
43
56
|
}
|
44
|
-
const
|
57
|
+
const singularName = pluralToSingular(tableName);
|
58
|
+
const tableNameCapitalized = singularName.charAt(0).toUpperCase() + singularName.slice(1);
|
45
59
|
const currentDir = process.cwd();
|
46
60
|
// Check for required API project structure
|
47
|
-
const requiredDirs = [
|
48
|
-
'src/entities',
|
49
|
-
'src/schemas'
|
50
|
-
];
|
61
|
+
const requiredDirs = ['src/modules'];
|
51
62
|
const missingDirs = requiredDirs.filter(dir => !fs.existsSync(path.join(currentDir, dir)));
|
52
63
|
if (missingDirs.length > 0) {
|
53
64
|
throw new Error(`This command should be run from a diagramers API project. Missing directories: ${missingDirs.join(', ')}`);
|
54
65
|
}
|
55
|
-
|
56
|
-
const
|
57
|
-
fs.
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
66
|
+
// Create module directory structure
|
67
|
+
const modulePath = path.join(currentDir, 'src/modules', tableName);
|
68
|
+
if (!fs.existsSync(modulePath)) {
|
69
|
+
fs.mkdirSync(modulePath, { recursive: true });
|
70
|
+
fs.mkdirSync(path.join(modulePath, 'entities'), { recursive: true });
|
71
|
+
fs.mkdirSync(path.join(modulePath, 'schemas'), { recursive: true });
|
72
|
+
}
|
73
|
+
console.log(`📝 Creating entity for table '${tableName}'...`);
|
74
|
+
const entityContent = generateEntityContent(singularName, tableNameCapitalized, options);
|
75
|
+
fs.writeFileSync(path.join(modulePath, 'entities', `${singularName}.entity.ts`), entityContent);
|
76
|
+
console.log(`📋 Creating schema for table '${tableName}'...`);
|
77
|
+
const schemaContent = generateSchemaContent(singularName, tableNameCapitalized, tableName, options);
|
78
|
+
fs.writeFileSync(path.join(modulePath, 'schemas', `${singularName}.schema.ts`), schemaContent);
|
79
|
+
// Add to seeder
|
80
|
+
console.log(`🌱 Adding '${tableName}' to database seeder...`);
|
81
|
+
await addToSeeder(currentDir, tableName, singularName, tableNameCapitalized, options);
|
63
82
|
console.log('✅ Table generation completed!');
|
64
|
-
console.log(`📊 Entity: src/
|
65
|
-
console.log(`📋 Schema: src/
|
66
|
-
console.log('
|
83
|
+
console.log(`📊 Entity: src/modules/${tableName}/entities/${singularName}.entity.ts`);
|
84
|
+
console.log(`📋 Schema: src/modules/${tableName}/schemas/${singularName}.schema.ts`);
|
85
|
+
console.log('🌱 Added to database seeder');
|
67
86
|
}
|
68
|
-
function generateEntityContent(
|
87
|
+
function generateEntityContent(singularName, tableNameCapitalized, options) {
|
88
|
+
const fields = options.fields || ['name', 'description'];
|
89
|
+
let fieldDefinitions = '';
|
90
|
+
fields.forEach((field) => {
|
91
|
+
const fieldType = getFieldType(field);
|
92
|
+
const isOptional = field === 'description' || field.includes('?');
|
93
|
+
const cleanField = field.replace('?', '');
|
94
|
+
fieldDefinitions += ` ${cleanField}${isOptional ? '?' : ''}: ${fieldType};\n`;
|
95
|
+
});
|
69
96
|
return `import * as mongoose from 'mongoose';
|
70
97
|
import { ObjectId } from "bson";
|
71
98
|
|
72
99
|
export interface I${tableNameCapitalized} extends mongoose.Document {
|
73
|
-
_id: ObjectId
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
createdAt: Date,
|
78
|
-
updatedAt: Date
|
100
|
+
_id: ObjectId;
|
101
|
+
${fieldDefinitions} status: number;
|
102
|
+
createdAt: Date;
|
103
|
+
updatedAt: Date;
|
79
104
|
}`;
|
80
105
|
}
|
81
|
-
function generateSchemaContent(tableName,
|
106
|
+
function generateSchemaContent(singularName, tableNameCapitalized, tableName, options) {
|
107
|
+
const fields = options.fields || ['name', 'description'];
|
108
|
+
let schemaFields = '';
|
109
|
+
fields.forEach((field) => {
|
110
|
+
const isOptional = field === 'description' || field.includes('?');
|
111
|
+
const cleanField = field.replace('?', '');
|
112
|
+
const mongooseType = getMongooseType(cleanField);
|
113
|
+
const required = !isOptional;
|
114
|
+
schemaFields += ` ${cleanField}: {
|
115
|
+
type: ${mongooseType},
|
116
|
+
required: ${required},
|
117
|
+
},\n`;
|
118
|
+
});
|
82
119
|
return `import * as mongoose from 'mongoose';
|
83
|
-
import { I${tableNameCapitalized} } from '../entities/${
|
120
|
+
import { I${tableNameCapitalized} } from '../entities/${singularName}.entity';
|
84
121
|
|
85
|
-
export const ${
|
122
|
+
export const ${singularName}Schema = new mongoose.Schema(
|
86
123
|
{
|
87
|
-
|
88
|
-
type: mongoose.SchemaTypes.String,
|
89
|
-
required: true,
|
90
|
-
},
|
91
|
-
description: {
|
92
|
-
type: mongoose.SchemaTypes.String,
|
93
|
-
required: false,
|
94
|
-
},
|
95
|
-
status: {
|
124
|
+
${schemaFields} status: {
|
96
125
|
type: mongoose.SchemaTypes.Number,
|
97
126
|
default: 1,
|
98
127
|
}
|
@@ -100,38 +129,160 @@ export const ${tableName}Schema = new mongoose.Schema(
|
|
100
129
|
{ timestamps: true, suppressReservedKeysWarning: true },
|
101
130
|
);
|
102
131
|
|
103
|
-
export const ${tableNameCapitalized}
|
132
|
+
export const ${tableNameCapitalized}Model = mongoose.model<I${tableNameCapitalized}>('${tableName}', ${singularName}Schema);`;
|
133
|
+
}
|
134
|
+
function getFieldType(field) {
|
135
|
+
const cleanField = field.replace('?', '').toLowerCase();
|
136
|
+
if (cleanField.includes('id') || cleanField === '_id')
|
137
|
+
return 'ObjectId';
|
138
|
+
if (cleanField.includes('email'))
|
139
|
+
return 'string';
|
140
|
+
if (cleanField.includes('password'))
|
141
|
+
return 'string';
|
142
|
+
if (cleanField.includes('phone'))
|
143
|
+
return 'string';
|
144
|
+
if (cleanField.includes('url'))
|
145
|
+
return 'string';
|
146
|
+
if (cleanField.includes('date') || cleanField.includes('time'))
|
147
|
+
return 'Date';
|
148
|
+
if (cleanField.includes('count') || cleanField.includes('number') || cleanField.includes('age'))
|
149
|
+
return 'number';
|
150
|
+
if (cleanField.includes('is') || cleanField.includes('has') || cleanField.includes('verified'))
|
151
|
+
return 'boolean';
|
152
|
+
if (cleanField.includes('status'))
|
153
|
+
return 'number';
|
154
|
+
return 'string'; // default
|
104
155
|
}
|
105
|
-
function
|
106
|
-
const
|
107
|
-
if (
|
108
|
-
|
156
|
+
function getMongooseType(field) {
|
157
|
+
const cleanField = field.toLowerCase();
|
158
|
+
if (cleanField.includes('id') || cleanField === '_id')
|
159
|
+
return 'mongoose.SchemaTypes.ObjectId';
|
160
|
+
if (cleanField.includes('date') || cleanField.includes('time'))
|
161
|
+
return 'mongoose.SchemaTypes.Date';
|
162
|
+
if (cleanField.includes('count') || cleanField.includes('number') || cleanField.includes('age'))
|
163
|
+
return 'mongoose.SchemaTypes.Number';
|
164
|
+
if (cleanField.includes('is') || cleanField.includes('has') || cleanField.includes('verified'))
|
165
|
+
return 'mongoose.SchemaTypes.Boolean';
|
166
|
+
if (cleanField.includes('status'))
|
167
|
+
return 'mongoose.SchemaTypes.Number';
|
168
|
+
return 'mongoose.SchemaTypes.String'; // default
|
169
|
+
}
|
170
|
+
async function addToSeeder(currentDir, tableName, singularName, tableNameCapitalized, options) {
|
171
|
+
const seederPath = path.join(currentDir, 'src/core/database/seeder.ts');
|
172
|
+
if (!fs.existsSync(seederPath)) {
|
173
|
+
console.log('⚠️ Seeder file not found, skipping seeder update');
|
109
174
|
return;
|
110
175
|
}
|
111
|
-
let
|
176
|
+
let seederContent = fs.readFileSync(seederPath, 'utf8');
|
112
177
|
// Add import
|
113
|
-
const importStatement = `import { ${tableNameCapitalized}
|
114
|
-
if (!
|
115
|
-
// Find the last import
|
116
|
-
const
|
117
|
-
const
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
178
|
+
const importStatement = `import { ${tableNameCapitalized}Model } from '../../modules/${tableName}/schemas/${singularName}.schema';`;
|
179
|
+
if (!seederContent.includes(importStatement)) {
|
180
|
+
// Find the last import and add after it
|
181
|
+
const lastImportIndex = seederContent.lastIndexOf('import');
|
182
|
+
const nextLineIndex = seederContent.indexOf('\n', lastImportIndex);
|
183
|
+
seederContent = seederContent.slice(0, nextLineIndex) + '\n' + importStatement + seederContent.slice(nextLineIndex);
|
184
|
+
}
|
185
|
+
// Add to SeedData interface
|
186
|
+
const seedDataInterface = ` ${tableName}?: any[];`;
|
187
|
+
if (!seederContent.includes(seedDataInterface)) {
|
188
|
+
const interfaceMatch = seederContent.match(/export interface SeedData \{([^}]*)\}/s);
|
189
|
+
if (interfaceMatch) {
|
190
|
+
const beforeClosing = interfaceMatch[0].lastIndexOf('}');
|
191
|
+
const beforeText = interfaceMatch[0].slice(0, beforeClosing);
|
192
|
+
const afterText = interfaceMatch[0].slice(beforeClosing);
|
193
|
+
const newInterface = beforeText + seedDataInterface + '\n' + afterText;
|
194
|
+
seederContent = seederContent.replace(interfaceMatch[0], newInterface);
|
122
195
|
}
|
123
196
|
}
|
124
|
-
// Add
|
125
|
-
const
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
197
|
+
// Add seeder method
|
198
|
+
const seederMethod = ` private async seed${tableNameCapitalized}s(data: any[]): Promise<void> {
|
199
|
+
if (data.length === 0) return;
|
200
|
+
|
201
|
+
logger.info(\`[DatabaseSeeder] Seeding \${data.length} ${tableName}...\`);
|
202
|
+
|
203
|
+
for (const ${singularName}Data of data) {
|
204
|
+
try {
|
205
|
+
const existing = await ${tableNameCapitalized}Model.findOne({ name: ${singularName}Data.name });
|
206
|
+
if (!existing) {
|
207
|
+
const ${singularName} = new ${tableNameCapitalized}Model({
|
208
|
+
...${singularName}Data,
|
209
|
+
status: 1
|
210
|
+
});
|
211
|
+
await ${singularName}.save();
|
212
|
+
logger.info(\`[DatabaseSeeder] Created ${singularName}: \${${singularName}Data.name}\`);
|
213
|
+
} else {
|
214
|
+
logger.info(\`[DatabaseSeeder] ${tableNameCapitalized} \${${singularName}Data.name} already exists, skipping\`);
|
132
215
|
}
|
216
|
+
} catch (error) {
|
217
|
+
logger.error(\`[DatabaseSeeder] Failed to create ${singularName} \${${singularName}Data.name}:\`, error);
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}`;
|
221
|
+
// Add method before closing class brace
|
222
|
+
const classEndIndex = seederContent.lastIndexOf('}');
|
223
|
+
seederContent = seederContent.slice(0, classEndIndex) + seederMethod + '\n\n' + seederContent.slice(classEndIndex);
|
224
|
+
// Add seeder call in seed method
|
225
|
+
const seederCall = ` if (data.${tableName}) {
|
226
|
+
await this.seed${tableNameCapitalized}s(data.${tableName});
|
227
|
+
}`;
|
228
|
+
// Find the seed method and add the call
|
229
|
+
const seedMethodMatch = seederContent.match(/async seed\([^{]*\{([^}]*(?:\{[^}]*\}[^}]*)*)\}/s);
|
230
|
+
if (seedMethodMatch) {
|
231
|
+
const beforeClosing = seedMethodMatch[0].lastIndexOf('}');
|
232
|
+
const beforeText = seedMethodMatch[0].slice(0, beforeClosing);
|
233
|
+
const afterText = seedMethodMatch[0].slice(beforeClosing);
|
234
|
+
const newSeedMethod = beforeText + '\n' + seederCall + '\n ' + afterText;
|
235
|
+
seederContent = seederContent.replace(seedMethodMatch[0], newSeedMethod);
|
236
|
+
}
|
237
|
+
// Add default seed data
|
238
|
+
const defaultData = generateDefaultSeedData(tableName, options);
|
239
|
+
const defaultDataLine = ` ${tableName}: ${JSON.stringify(defaultData, null, 6)},`;
|
240
|
+
// Find defaultData object and add the line
|
241
|
+
const defaultDataMatch = seederContent.match(/const defaultData: SeedData = \{([^}]*(?:\{[^}]*\}[^}]*)*)\}/s);
|
242
|
+
if (defaultDataMatch) {
|
243
|
+
const beforeClosing = defaultDataMatch[0].lastIndexOf('}');
|
244
|
+
const beforeText = defaultDataMatch[0].slice(0, beforeClosing);
|
245
|
+
const afterText = defaultDataMatch[0].slice(beforeClosing);
|
246
|
+
const newDefaultData = beforeText + '\n' + defaultDataLine + '\n ' + afterText;
|
247
|
+
seederContent = seederContent.replace(defaultDataMatch[0], newDefaultData);
|
248
|
+
}
|
249
|
+
fs.writeFileSync(seederPath, seederContent);
|
250
|
+
}
|
251
|
+
function generateDefaultSeedData(tableName, options) {
|
252
|
+
const fields = options.fields || ['name', 'description'];
|
253
|
+
const sampleData = [];
|
254
|
+
// Generate 3 sample records
|
255
|
+
for (let i = 1; i <= 3; i++) {
|
256
|
+
const record = {};
|
257
|
+
fields.forEach((field) => {
|
258
|
+
const cleanField = field.replace('?', '');
|
259
|
+
if (cleanField === 'name') {
|
260
|
+
record[cleanField] = `Sample ${tableName.charAt(0).toUpperCase() + tableName.slice(1, -1)} ${i}`;
|
261
|
+
}
|
262
|
+
else if (cleanField === 'description') {
|
263
|
+
record[cleanField] = `Description for sample ${tableName.slice(0, -1)} ${i}`;
|
264
|
+
}
|
265
|
+
else if (cleanField.includes('email')) {
|
266
|
+
record[cleanField] = `sample${i}@example.com`;
|
267
|
+
}
|
268
|
+
else if (cleanField.includes('phone')) {
|
269
|
+
record[cleanField] = `+1234567890${i}`;
|
270
|
+
}
|
271
|
+
else if (cleanField.includes('url')) {
|
272
|
+
record[cleanField] = `https://example.com/${cleanField}${i}`;
|
273
|
+
}
|
274
|
+
else if (cleanField.includes('count') || cleanField.includes('number') || cleanField.includes('age')) {
|
275
|
+
record[cleanField] = i * 10;
|
276
|
+
}
|
277
|
+
else if (cleanField.includes('is') || cleanField.includes('has') || cleanField.includes('verified')) {
|
278
|
+
record[cleanField] = i % 2 === 1;
|
279
|
+
}
|
280
|
+
else {
|
281
|
+
record[cleanField] = `Sample ${cleanField} ${i}`;
|
282
|
+
}
|
283
|
+
});
|
284
|
+
sampleData.push(record);
|
133
285
|
}
|
134
|
-
|
135
|
-
console.log('📊 Updated dbcontext.ts');
|
286
|
+
return sampleData;
|
136
287
|
}
|
137
288
|
//# sourceMappingURL=table-generator.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"table-generator.js","sourceRoot":"","sources":["../../src/services/table-generator.ts"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"table-generator.js","sourceRoot":"","sources":["../../src/services/table-generator.ts"],"names":[],"mappings":"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"}
|