@reldens/storage 0.42.0 → 0.43.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.
|
@@ -44,58 +44,20 @@ class EntitiesGenerator
|
|
|
44
44
|
};
|
|
45
45
|
this.server = sc.get(props, 'server', false);
|
|
46
46
|
this.connectionData = sc.get(props, 'connectionData', false);
|
|
47
|
-
if(!this.server && !this.connectionData){
|
|
48
|
-
ErrorManager.error('Either server or connectionData must be provided to EntitiesGenerator.');
|
|
49
|
-
}
|
|
50
47
|
this.generatedEntities = {};
|
|
51
48
|
}
|
|
52
49
|
|
|
53
|
-
ensureFoldersExist()
|
|
54
|
-
{
|
|
55
|
-
if(!FileHandler.exists(this.generationFolder)){
|
|
56
|
-
try {
|
|
57
|
-
FileHandler.createFolder(this.generationFolder, { recursive: true });
|
|
58
|
-
} catch (error) {
|
|
59
|
-
ErrorManager.error('Failed to create generation folder: '+error.message);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if(!FileHandler.exists(this.entitiesFolder)){
|
|
63
|
-
try {
|
|
64
|
-
FileHandler.createFolder(this.entitiesFolder, { recursive: true });
|
|
65
|
-
} catch (error) {
|
|
66
|
-
ErrorManager.error('Failed to create entities folder: '+error.message);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if(!FileHandler.exists(this.modelsFolder)){
|
|
70
|
-
try {
|
|
71
|
-
FileHandler.createFolder(this.modelsFolder, { recursive: true });
|
|
72
|
-
} catch (error) {
|
|
73
|
-
ErrorManager.error('Failed to create models folder: '+error.message);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
for(let driverKey of Object.keys(this.driverMap)){
|
|
77
|
-
let driverFolder = FileHandler.joinPaths(this.modelsFolder, driverKey);
|
|
78
|
-
if(!FileHandler.exists(driverFolder)){
|
|
79
|
-
try {
|
|
80
|
-
FileHandler.createFolder(driverFolder, { recursive: true });
|
|
81
|
-
} catch (error) {
|
|
82
|
-
ErrorManager.error('Failed to create driver folder: '+error.message);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
50
|
async generateEntityFile(tableName, tableData)
|
|
89
51
|
{
|
|
90
52
|
let entityTemplatePath = this.templates['entity'];
|
|
91
53
|
if(!FileHandler.exists(entityTemplatePath)){
|
|
92
|
-
|
|
54
|
+
Logger.critical('Entity template file not found: '+entityTemplatePath);
|
|
55
|
+
return false;
|
|
93
56
|
}
|
|
94
|
-
let entityTemplateContent;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
ErrorManager.error('Failed to read entity template file: '+error.message);
|
|
57
|
+
let entityTemplateContent = FileHandler.fetchFileContents(entityTemplatePath);
|
|
58
|
+
if(!entityTemplateContent) {
|
|
59
|
+
Logger.critical('Failed to read entity template file: '+entityTemplatePath);
|
|
60
|
+
return false;
|
|
99
61
|
}
|
|
100
62
|
let entityClassName = sc.capitalizedCamelCase(tableName)+'Entity';
|
|
101
63
|
let titleProperty = this.determineTitleProperty(tableData.columns);
|
|
@@ -114,7 +76,8 @@ class EntitiesGenerator
|
|
|
114
76
|
}
|
|
115
77
|
let editPropertiesRemoval = this.getEditPropertiesRemoval(fieldsToRemoveFromEdit);
|
|
116
78
|
let listPropertiesDeclaration = this.getListPropertiesDeclaration(tableData.columns);
|
|
117
|
-
let needsSc = listPropertiesDeclaration.includes('sc.removeFromArray')
|
|
79
|
+
let needsSc = listPropertiesDeclaration.includes('sc.removeFromArray')
|
|
80
|
+
|| editPropertiesRemoval.includes('sc.removeFromArray');
|
|
118
81
|
let scRequire = needsSc ? '\nconst { sc } = require(\'@reldens/utils\');' : '';
|
|
119
82
|
let replacements = {
|
|
120
83
|
entityClassName,
|
|
@@ -128,25 +91,26 @@ class EntitiesGenerator
|
|
|
128
91
|
let entityContent = this.applyReplacements(entityTemplateContent, replacements);
|
|
129
92
|
let fileName = sc.kebabCase(tableName)+'-entity.js';
|
|
130
93
|
let filePath = FileHandler.joinPaths(this.entitiesFolder, fileName);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
this.generatedEntities[tableName] = {
|
|
135
|
-
entityClassName,
|
|
136
|
-
entityFileName: fileName,
|
|
137
|
-
tableName,
|
|
138
|
-
titleProperty
|
|
139
|
-
};
|
|
140
|
-
return true;
|
|
141
|
-
} catch (error) {
|
|
142
|
-
ErrorManager.error('Failed to write entity file: '+error.message);
|
|
94
|
+
if(!FileHandler.writeFile(filePath, entityContent)){
|
|
95
|
+
Logger.critical('Failed to write entity file: '+filePath);
|
|
96
|
+
return false;
|
|
143
97
|
}
|
|
98
|
+
Logger.info('Generated entity file: '+filePath);
|
|
99
|
+
this.generatedEntities[tableName] = {
|
|
100
|
+
entityClassName,
|
|
101
|
+
entityFileName: fileName,
|
|
102
|
+
tableName,
|
|
103
|
+
titleProperty
|
|
104
|
+
};
|
|
105
|
+
return true;
|
|
144
106
|
}
|
|
145
107
|
|
|
146
108
|
getEditPropertiesRemoval(fieldsToRemove)
|
|
147
109
|
{
|
|
148
110
|
if(1 === fieldsToRemove.length){
|
|
149
|
-
return 'let editProperties = [...showProperties];\n editProperties.splice(editProperties.indexOf(\''+
|
|
111
|
+
return 'let editProperties = [...showProperties];\n editProperties.splice(editProperties.indexOf(\''+
|
|
112
|
+
fieldsToRemove[0]
|
|
113
|
+
+'\'), 1);';
|
|
150
114
|
}
|
|
151
115
|
return 'let editProperties = sc.removeFromArray([...showProperties], [\''+fieldsToRemove.join('\', \'')+'\']);';
|
|
152
116
|
}
|
|
@@ -183,7 +147,9 @@ class EntitiesGenerator
|
|
|
183
147
|
propertiesConfig.push(propertyKey+': {}');
|
|
184
148
|
continue;
|
|
185
149
|
}
|
|
186
|
-
propertiesConfig.push(
|
|
150
|
+
propertiesConfig.push(
|
|
151
|
+
propertyKey+': {\n '+props.join(',\n ')+ '\n }'
|
|
152
|
+
);
|
|
187
153
|
}
|
|
188
154
|
return propertiesConfig.join(',\n ');
|
|
189
155
|
}
|
|
@@ -239,7 +205,11 @@ class EntitiesGenerator
|
|
|
239
205
|
for(let i = 0; i < enumValues.length; i++){
|
|
240
206
|
availableValues.push('{value: '+(i+1)+', label: \''+enumValues[i]+'\'}');
|
|
241
207
|
}
|
|
242
|
-
props.push(
|
|
208
|
+
props.push(
|
|
209
|
+
'availableValues: [\n '+
|
|
210
|
+
availableValues.join(',\n ')+
|
|
211
|
+
'\n ]'
|
|
212
|
+
);
|
|
243
213
|
}
|
|
244
214
|
|
|
245
215
|
parseEnumValues(columnType)
|
|
@@ -284,7 +254,9 @@ class EntitiesGenerator
|
|
|
284
254
|
return 'let listProperties = showProperties;';
|
|
285
255
|
}
|
|
286
256
|
if(1 === fieldsToRemove.length){
|
|
287
|
-
return 'let listProperties = [...showProperties];\n listProperties.splice(listProperties.indexOf(\''+
|
|
257
|
+
return 'let listProperties = [...showProperties];\n listProperties.splice(listProperties.indexOf(\''+
|
|
258
|
+
fieldsToRemove[0]+
|
|
259
|
+
'\'), 1);';
|
|
288
260
|
}
|
|
289
261
|
return 'let listProperties = sc.removeFromArray([...showProperties], [\''+fieldsToRemove.join('\', \'')+'\']);';
|
|
290
262
|
}
|
|
@@ -306,13 +278,13 @@ class EntitiesGenerator
|
|
|
306
278
|
{
|
|
307
279
|
let modelTemplatePath = this.templates[driverKey];
|
|
308
280
|
if(!FileHandler.exists(modelTemplatePath)){
|
|
309
|
-
|
|
281
|
+
Logger.critical('Model template file "'+modelTemplatePath+'" not found for driver "'+driverKey+'".');
|
|
282
|
+
return false;
|
|
310
283
|
}
|
|
311
|
-
let modelTemplateContent;
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
ErrorManager.error('Failed to read model template file: '+error.message);
|
|
284
|
+
let modelTemplateContent = FileHandler.fetchFileContents(modelTemplatePath);
|
|
285
|
+
if(!modelTemplateContent){
|
|
286
|
+
Logger.critical('Failed to read model template file: '+modelTemplatePath);
|
|
287
|
+
return false;
|
|
316
288
|
}
|
|
317
289
|
let modelClassName = sc.capitalizedCamelCase(tableName)+'Model';
|
|
318
290
|
let modelPropertiesList = Object.keys(tableData.columns).join(', ');
|
|
@@ -332,17 +304,20 @@ class EntitiesGenerator
|
|
|
332
304
|
let modelContent = this.applyReplacements(modelTemplateContent, replacements);
|
|
333
305
|
let fileName = sc.kebabCase(tableName)+'-model.js';
|
|
334
306
|
let driverFolder = FileHandler.joinPaths(this.modelsFolder, driverKey);
|
|
307
|
+
if(!FileHandler.createFolder(driverFolder)){
|
|
308
|
+
Logger.critical('Failed to create driver folder.');
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
335
311
|
let filePath = FileHandler.joinPaths(driverFolder, fileName);
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
this.generatedEntities[tableName].modelClassName = modelClassName;
|
|
340
|
-
this.generatedEntities[tableName].modelFileName = fileName;
|
|
341
|
-
this.generatedEntities[tableName].driverKey = driverKey;
|
|
342
|
-
return true;
|
|
343
|
-
} catch (error) {
|
|
344
|
-
ErrorManager.error('Failed to write model file: '+error.message);
|
|
312
|
+
if(!FileHandler.writeFile(filePath, modelContent)){
|
|
313
|
+
Logger.critical('Failed to write model file: '+filePath);
|
|
314
|
+
return false;
|
|
345
315
|
}
|
|
316
|
+
Logger.info('Generated model file: '+filePath);
|
|
317
|
+
this.generatedEntities[tableName].modelClassName = modelClassName;
|
|
318
|
+
this.generatedEntities[tableName].modelFileName = fileName;
|
|
319
|
+
this.generatedEntities[tableName].driverKey = driverKey;
|
|
320
|
+
return true;
|
|
346
321
|
}
|
|
347
322
|
|
|
348
323
|
getEntityPropertiesDefinition(columns, driverKey)
|
|
@@ -390,16 +365,13 @@ class EntitiesGenerator
|
|
|
390
365
|
{
|
|
391
366
|
let configTemplatePath = this.templates['entities-config'];
|
|
392
367
|
if(!FileHandler.exists(configTemplatePath)){
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
let configTemplateContent;
|
|
396
|
-
try {
|
|
397
|
-
configTemplateContent = FileHandler.fetchFileContents(configTemplatePath);
|
|
398
|
-
} catch (error) {
|
|
399
|
-
ErrorManager.error('Failed to read entities config template file: '+error.message);
|
|
368
|
+
Logger.critical('Entities config template file not found: '+configTemplatePath);
|
|
369
|
+
return false;
|
|
400
370
|
}
|
|
401
|
-
|
|
402
|
-
|
|
371
|
+
let configTemplateContent = FileHandler.fetchFileContents(configTemplatePath);
|
|
372
|
+
if(!configTemplateContent) {
|
|
373
|
+
Logger.critical('Failed to read entities config template file: '+configTemplatePath);
|
|
374
|
+
return false;
|
|
403
375
|
}
|
|
404
376
|
let requireStatements = this.getRequireStatements();
|
|
405
377
|
let entitiesConfigExport = this.getEntitiesConfigExport();
|
|
@@ -408,13 +380,12 @@ class EntitiesGenerator
|
|
|
408
380
|
entitiesConfigExport
|
|
409
381
|
};
|
|
410
382
|
let configContent = this.applyReplacements(configTemplateContent, replacements);
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
return true;
|
|
415
|
-
} catch (error) {
|
|
416
|
-
ErrorManager.error('Failed to write entities config file: '+error.message);
|
|
383
|
+
if (!FileHandler.writeFile(this.entitiesConfigPath, configContent)){
|
|
384
|
+
Logger.critical('Failed to write entities config file: '+this.entitiesConfigPath);
|
|
385
|
+
return false;
|
|
417
386
|
}
|
|
387
|
+
Logger.info('Generated entities config file: '+this.entitiesConfigPath);
|
|
388
|
+
return true;
|
|
418
389
|
}
|
|
419
390
|
|
|
420
391
|
getRequireStatements()
|
|
@@ -422,7 +393,10 @@ class EntitiesGenerator
|
|
|
422
393
|
let requireStatements = [];
|
|
423
394
|
for(let tableName in this.generatedEntities){
|
|
424
395
|
let entity = this.generatedEntities[tableName];
|
|
425
|
-
|
|
396
|
+
let nameWithoutExtension = entity.entityFileName.replace('.js', '');
|
|
397
|
+
requireStatements.push(
|
|
398
|
+
'const { '+ entity.entityClassName+' } = require(\'./entities/'+nameWithoutExtension+'\');'
|
|
399
|
+
);
|
|
426
400
|
}
|
|
427
401
|
return requireStatements.join('\n');
|
|
428
402
|
}
|
|
@@ -442,39 +416,29 @@ class EntitiesGenerator
|
|
|
442
416
|
{
|
|
443
417
|
let translationsTemplatePath = this.templates['entities-translations'];
|
|
444
418
|
if(!FileHandler.exists(translationsTemplatePath)){
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
let translationsTemplateContent;
|
|
448
|
-
try {
|
|
449
|
-
translationsTemplateContent = FileHandler.fetchFileContents(translationsTemplatePath);
|
|
450
|
-
} catch (error) {
|
|
451
|
-
ErrorManager.error('Failed to read entities translations template file: '+error.message);
|
|
419
|
+
Logger.critical('Entities translations template file not found: '+translationsTemplatePath);
|
|
420
|
+
return false;
|
|
452
421
|
}
|
|
453
|
-
|
|
454
|
-
|
|
422
|
+
let translationsTemplateContent = FileHandler.fetchFileContents(translationsTemplatePath);
|
|
423
|
+
if(!translationsTemplateContent){
|
|
424
|
+
Logger.critical('Failed to read entities translations template file: '+translationsTemplatePath);
|
|
425
|
+
return false;
|
|
455
426
|
}
|
|
456
427
|
let labels = this.getTranslationLabels();
|
|
457
|
-
let translationsContent = translationsTemplateContent.replace(
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
try {
|
|
462
|
-
FileHandler.writeFile(this.entitiesTranslationsPath, translationsContent);
|
|
463
|
-
Logger.info('Generated entities translations file: '+this.entitiesTranslationsPath);
|
|
464
|
-
return true;
|
|
465
|
-
} catch (error) {
|
|
466
|
-
ErrorManager.error('Failed to write entities translations file: '+error.message);
|
|
428
|
+
let translationsContent = translationsTemplateContent.replace(/{{labels}}/g, labels);
|
|
429
|
+
if(!FileHandler.writeFile(this.entitiesTranslationsPath, translationsContent)){
|
|
430
|
+
Logger.critical('Failed to write entities translations file: '+this.entitiesTranslationsPath);
|
|
431
|
+
return false;
|
|
467
432
|
}
|
|
433
|
+
Logger.info('Generated entities translations file: '+this.entitiesTranslationsPath);
|
|
434
|
+
return true;
|
|
468
435
|
}
|
|
469
436
|
|
|
470
437
|
getTranslationLabels()
|
|
471
438
|
{
|
|
472
439
|
let labels = [];
|
|
473
440
|
for(let tableName in this.generatedEntities){
|
|
474
|
-
let humanReadable = tableName
|
|
475
|
-
.split('_')
|
|
476
|
-
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
477
|
-
.join(' ');
|
|
441
|
+
let humanReadable = tableName.split('_').map(word => word.charAt(0).toUpperCase()+word.slice(1)).join(' ');
|
|
478
442
|
labels.push('\''+tableName+'\': \''+humanReadable+'\'');
|
|
479
443
|
}
|
|
480
444
|
return labels.join(',\n ');
|
|
@@ -484,33 +448,27 @@ class EntitiesGenerator
|
|
|
484
448
|
{
|
|
485
449
|
let registeredTemplatePath = this.templates['registered-models'];
|
|
486
450
|
if(!FileHandler.exists(registeredTemplatePath)){
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
let registeredTemplateContent;
|
|
490
|
-
try {
|
|
491
|
-
registeredTemplateContent = FileHandler.fetchFileContents(registeredTemplatePath);
|
|
492
|
-
} catch (error) {
|
|
493
|
-
ErrorManager.error('Failed to read registered models template file: '+error.message);
|
|
451
|
+
Logger.critical('Registered models template file not found: '+registeredTemplatePath);
|
|
452
|
+
return false;
|
|
494
453
|
}
|
|
495
|
-
|
|
496
|
-
|
|
454
|
+
let registeredTemplateContent = FileHandler.fetchFileContents(registeredTemplatePath);
|
|
455
|
+
if(!registeredTemplateContent){
|
|
456
|
+
Logger.critical('Failed to read registered models template file: '+registeredTemplatePath);
|
|
457
|
+
return false;
|
|
497
458
|
}
|
|
498
|
-
let registeredModels = this.getRegisteredModels(driverKey);
|
|
499
|
-
let registeredEntitiesObject = this.getRegisteredEntitiesObject(driverKey);
|
|
500
459
|
let replacements = {
|
|
501
|
-
registeredModels,
|
|
502
|
-
registeredEntitiesObject
|
|
460
|
+
registeredModels: this.getRegisteredModels(driverKey),
|
|
461
|
+
registeredEntitiesObject: this.getRegisteredEntitiesObject(driverKey)
|
|
503
462
|
};
|
|
504
463
|
let registeredContent = this.applyReplacements(registeredTemplateContent, replacements);
|
|
505
464
|
let driverFolder = FileHandler.joinPaths(this.modelsFolder, driverKey);
|
|
506
465
|
let filePath = FileHandler.joinPaths(driverFolder, 'registered-models-'+driverKey+'.js');
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
return true;
|
|
511
|
-
} catch (error) {
|
|
512
|
-
ErrorManager.error('Failed to write registered models file: '+error.message);
|
|
466
|
+
if(!FileHandler.writeFile(filePath, registeredContent)){
|
|
467
|
+
Logger.critical('Failed to write registered models file: '+filePath);
|
|
468
|
+
return false;
|
|
513
469
|
}
|
|
470
|
+
Logger.info('Generated registered models file: '+filePath);
|
|
471
|
+
return true;
|
|
514
472
|
}
|
|
515
473
|
|
|
516
474
|
getRegisteredModels(driverKey)
|
|
@@ -518,9 +476,12 @@ class EntitiesGenerator
|
|
|
518
476
|
let registeredModels = [];
|
|
519
477
|
for(let tableName in this.generatedEntities){
|
|
520
478
|
let entity = this.generatedEntities[tableName];
|
|
521
|
-
if(
|
|
522
|
-
|
|
479
|
+
if(driverKey !== entity.driverKey){
|
|
480
|
+
continue;
|
|
523
481
|
}
|
|
482
|
+
registeredModels.push(
|
|
483
|
+
'const { '+entity.modelClassName+' } = require(\'./'+entity.modelFileName.replace('.js', '')+'\');'
|
|
484
|
+
);
|
|
524
485
|
}
|
|
525
486
|
return registeredModels.join('\n');
|
|
526
487
|
}
|
|
@@ -530,10 +491,10 @@ class EntitiesGenerator
|
|
|
530
491
|
let registeredEntitiesObject = [];
|
|
531
492
|
for(let tableName in this.generatedEntities){
|
|
532
493
|
let entity = this.generatedEntities[tableName];
|
|
533
|
-
if(
|
|
534
|
-
|
|
535
|
-
registeredEntitiesObject.push(camelCaseKey+': '+entity.modelClassName);
|
|
494
|
+
if(driverKey !== entity.driverKey){
|
|
495
|
+
continue;
|
|
536
496
|
}
|
|
497
|
+
registeredEntitiesObject.push(sc.camelCase(tableName)+': '+entity.modelClassName);
|
|
537
498
|
}
|
|
538
499
|
return registeredEntitiesObject.join(',\n ');
|
|
539
500
|
}
|
|
@@ -541,15 +502,13 @@ class EntitiesGenerator
|
|
|
541
502
|
applyReplacements(content, replacements)
|
|
542
503
|
{
|
|
543
504
|
let result = content;
|
|
544
|
-
for(let placeholder
|
|
545
|
-
result = result.replace(
|
|
546
|
-
new RegExp('{{'+placeholder+'}}', 'g'),
|
|
547
|
-
replacements[placeholder]
|
|
548
|
-
);
|
|
505
|
+
for(let placeholder of Object.keys(replacements)){
|
|
506
|
+
result = result.replace(new RegExp('{{'+placeholder+'}}','g'), replacements[placeholder]);
|
|
549
507
|
}
|
|
550
508
|
return result;
|
|
551
509
|
}
|
|
552
510
|
|
|
511
|
+
|
|
553
512
|
async generate()
|
|
554
513
|
{
|
|
555
514
|
if(!this.server){
|
|
@@ -566,7 +525,9 @@ class EntitiesGenerator
|
|
|
566
525
|
Logger.critical('EntitiesGenerator tables fetch failed.');
|
|
567
526
|
return false;
|
|
568
527
|
}
|
|
569
|
-
this.ensureFoldersExist()
|
|
528
|
+
if(!this.ensureFoldersExist()){
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
570
531
|
let driverKey = sc.get(
|
|
571
532
|
this.connectionData,
|
|
572
533
|
'driver',
|
|
@@ -595,7 +556,8 @@ class EntitiesGenerator
|
|
|
595
556
|
let driverKey = sc.get(this.connectionData, 'driver', 'objection-js');
|
|
596
557
|
let driverClassMapped = this.driverMap[driverKey];
|
|
597
558
|
if(!driverClassMapped){
|
|
598
|
-
|
|
559
|
+
Logger.critical('Unsupported driver: '+driverKey);
|
|
560
|
+
return false;
|
|
599
561
|
}
|
|
600
562
|
this.server = new driverClassMapped({
|
|
601
563
|
client: sc.get(this.connectionData, 'client', 'mysql2'),
|
|
@@ -610,6 +572,23 @@ class EntitiesGenerator
|
|
|
610
572
|
return this.server;
|
|
611
573
|
}
|
|
612
574
|
|
|
575
|
+
ensureFoldersExist()
|
|
576
|
+
{
|
|
577
|
+
if(!FileHandler.createFolder(this.generationFolder)){
|
|
578
|
+
Logger.critical('Failed to create generation folder.');
|
|
579
|
+
return false;
|
|
580
|
+
}
|
|
581
|
+
if(!FileHandler.createFolder(this.entitiesFolder)){
|
|
582
|
+
Logger.critical('Failed to create entities folder.');
|
|
583
|
+
return false;
|
|
584
|
+
}
|
|
585
|
+
if(!FileHandler.createFolder(this.modelsFolder)){
|
|
586
|
+
Logger.critical('Failed to create models folder.');
|
|
587
|
+
return false;
|
|
588
|
+
}
|
|
589
|
+
return true;
|
|
590
|
+
}
|
|
591
|
+
|
|
613
592
|
}
|
|
614
593
|
|
|
615
594
|
module.exports.EntitiesGenerator = EntitiesGenerator;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
const {
|
|
7
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
8
8
|
|
|
9
9
|
class MySQLTablesProvider
|
|
10
10
|
{
|
|
@@ -30,7 +30,8 @@ class MySQLTablesProvider
|
|
|
30
30
|
try {
|
|
31
31
|
let result = await server.rawQuery(tablesQuery);
|
|
32
32
|
if(!sc.isArray(result) || 0 === result.length){
|
|
33
|
-
|
|
33
|
+
Logger.critical('No tables found in the database.');
|
|
34
|
+
return false;
|
|
34
35
|
}
|
|
35
36
|
let tables = {};
|
|
36
37
|
for(let row of result){
|
|
@@ -63,18 +64,20 @@ class MySQLTablesProvider
|
|
|
63
64
|
' AND REFERENCED_TABLE_NAME IS NOT NULL;';
|
|
64
65
|
|
|
65
66
|
let foreignKeysResult = await server.rawQuery(foreignKeysQuery);
|
|
66
|
-
if(sc.isArray(foreignKeysResult)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
if(!sc.isArray(foreignKeysResult) || 0 < foreignKeysResult.length){
|
|
68
|
+
return tables;
|
|
69
|
+
}
|
|
70
|
+
for(let row of foreignKeysResult){
|
|
71
|
+
if(tables[row.TABLE_NAME] && tables[row.TABLE_NAME].columns[row.COLUMN_NAME]){
|
|
72
|
+
tables[row.TABLE_NAME].columns[row.COLUMN_NAME].referencedTable = row.REFERENCED_TABLE_NAME;
|
|
73
|
+
tables[row.TABLE_NAME].columns[row.COLUMN_NAME].referencedColumn = row.REFERENCED_COLUMN_NAME;
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
return tables;
|
|
75
77
|
} catch(error) {
|
|
76
|
-
|
|
78
|
+
Logger.critical('Failed to fetch tables from database: '+error.message);
|
|
77
79
|
}
|
|
80
|
+
return false;
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
}
|
|
@@ -31,9 +31,9 @@ class PrismaSchemaGenerator
|
|
|
31
31
|
execSync('npx prisma generate', { stdio: 'inherit' });
|
|
32
32
|
return true;
|
|
33
33
|
} catch(error) {
|
|
34
|
-
|
|
35
|
-
return false;
|
|
34
|
+
Logger.critical('Failed to generate Prisma schema. '+error.message);
|
|
36
35
|
}
|
|
36
|
+
return false;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
generateSchemaFile()
|