@reldens/storage 0.32.0 → 0.34.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,605 @@
1
+ /**
2
+ *
3
+ * Reldens - EntitiesGenerator
4
+ *
5
+ */
6
+
7
+ const { FileHandler } = require('@reldens/server-utils');
8
+ const { ErrorManager, Logger, sc } = require('@reldens/utils');
9
+ const { ObjectionJsDataServer } = require('./objection-js/objection-js-data-server');
10
+ const { MikroOrmDataServer } = require('./mikro-orm/mikro-orm-data-server');
11
+ const { PrismaDataServer } = require('./prisma/prisma-data-server');
12
+ const { TypeMapper } = require('./type-mapper');
13
+
14
+ class EntitiesGenerator
15
+ {
16
+
17
+ constructor(props)
18
+ {
19
+ this.templatesFolderPath = FileHandler.joinPaths(__dirname, 'entity-templates');
20
+ this.templates = {
21
+ 'objection-js': FileHandler.joinPaths(this.templatesFolderPath, 'objection-js-model.template'),
22
+ 'mikro-orm': FileHandler.joinPaths(this.templatesFolderPath, 'mikro-orm-model.template'),
23
+ 'prisma': FileHandler.joinPaths(this.templatesFolderPath, 'prisma-model.template'),
24
+ 'entity': FileHandler.joinPaths(this.templatesFolderPath, 'entity.template'),
25
+ 'entities-config': FileHandler.joinPaths(this.templatesFolderPath, 'entities-config.template'),
26
+ 'entities-translations': FileHandler.joinPaths(this.templatesFolderPath, 'entities-translations.template'),
27
+ 'registered-models': FileHandler.joinPaths(this.templatesFolderPath, 'registered-models.template')
28
+ };
29
+ this.projectPath = sc.get(props, 'projectPath', FileHandler.joinPaths(__dirname, '..'));
30
+ this.generationFolder = FileHandler.joinPaths(this.projectPath, 'generated-entities');
31
+ this.entitiesFolder = FileHandler.joinPaths(this.generationFolder, 'entities');
32
+ this.modelsFolder = FileHandler.joinPaths(this.generationFolder, 'models');
33
+ this.entitiesConfigPath = FileHandler.joinPaths(this.generationFolder, 'entities-config.js');
34
+ this.entitiesTranslationsPath = FileHandler.joinPaths(this.generationFolder, 'entities-translations.js');
35
+ this.driverMap = {
36
+ 'objection-js': ObjectionJsDataServer,
37
+ 'mikro-orm': MikroOrmDataServer,
38
+ 'prisma': PrismaDataServer
39
+ };
40
+ this.server = sc.get(props, 'server', false);
41
+ this.connectionData = sc.get(props, 'connectionData', false);
42
+ if(!this.server && !this.connectionData){
43
+ ErrorManager.error('Either server or connectionData must be provided to EntitiesGenerator.');
44
+ }
45
+ this.generatedEntities = {};
46
+ }
47
+
48
+ ensureFoldersExist()
49
+ {
50
+ if(!FileHandler.exists(this.generationFolder)){
51
+ try {
52
+ FileHandler.createFolder(this.generationFolder, { recursive: true });
53
+ } catch (error) {
54
+ ErrorManager.error('Failed to create generation folder: '+error.message);
55
+ }
56
+ }
57
+ if(!FileHandler.exists(this.entitiesFolder)){
58
+ try {
59
+ FileHandler.createFolder(this.entitiesFolder, { recursive: true });
60
+ } catch (error) {
61
+ ErrorManager.error('Failed to create entities folder: '+error.message);
62
+ }
63
+ }
64
+ if(!FileHandler.exists(this.modelsFolder)){
65
+ try {
66
+ FileHandler.createFolder(this.modelsFolder, { recursive: true });
67
+ } catch (error) {
68
+ ErrorManager.error('Failed to create models folder: '+error.message);
69
+ }
70
+ }
71
+ for(let driverKey of Object.keys(this.driverMap)){
72
+ let driverFolder = FileHandler.joinPaths(this.modelsFolder, driverKey);
73
+ if(!FileHandler.exists(driverFolder)){
74
+ try {
75
+ FileHandler.createFolder(driverFolder, { recursive: true });
76
+ } catch (error) {
77
+ ErrorManager.error('Failed to create driver folder: '+error.message);
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ async generateEntityFile(tableName, tableData)
84
+ {
85
+ let entityTemplatePath = this.templates['entity'];
86
+ if(!FileHandler.exists(entityTemplatePath)){
87
+ ErrorManager.error('Entity template file not found: '+entityTemplatePath);
88
+ }
89
+ let entityTemplateContent;
90
+ try {
91
+ entityTemplateContent = FileHandler.fetchFileContents(entityTemplatePath);
92
+ } catch (error) {
93
+ ErrorManager.error('Failed to read entity template file: '+error.message);
94
+ }
95
+ let entityClassName = sc.capitalizedCamelCase(tableName)+'Entity';
96
+ let titleProperty = this.determineTitleProperty(tableData.columns);
97
+ for(let columnName in tableData.columns){
98
+ tableData.columns[columnName].tableName = tableName;
99
+ }
100
+ let propertiesConfig = this.generatePropertiesConfig(tableData.columns, titleProperty);
101
+ let titlePropertyDeclaration = titleProperty ? '\n let titleProperty = \''+titleProperty+'\';' : '';
102
+ let titlePropertyReturn = titleProperty ? '\n titleProperty,' : '';
103
+ let fieldsToRemoveFromEdit = ['id'];
104
+ if(tableData.columns['created_at']){
105
+ fieldsToRemoveFromEdit.push('created_at');
106
+ }
107
+ if(tableData.columns['updated_at']){
108
+ fieldsToRemoveFromEdit.push('updated_at');
109
+ }
110
+ let editPropertiesRemoval = this.getEditPropertiesRemoval(fieldsToRemoveFromEdit);
111
+ let listPropertiesDeclaration = this.getListPropertiesDeclaration(tableData.columns);
112
+ let needsSc = listPropertiesDeclaration.includes('sc.removeFromArray') || editPropertiesRemoval.includes('sc.removeFromArray');
113
+ let scRequire = needsSc ? '\nconst { sc } = require(\'@reldens/utils\');' : '';
114
+ let replacements = {
115
+ entityClassName,
116
+ propertiesConfig,
117
+ titlePropertyDeclaration,
118
+ titlePropertyReturn,
119
+ listPropertiesDeclaration,
120
+ editPropertiesRemoval,
121
+ scRequire
122
+ };
123
+ let entityContent = this.applyReplacements(entityTemplateContent, replacements);
124
+ let fileName = sc.kebabCase(tableName)+'-entity.js';
125
+ let filePath = FileHandler.joinPaths(this.entitiesFolder, fileName);
126
+ try {
127
+ FileHandler.writeFile(filePath, entityContent);
128
+ Logger.info('Generated entity file: '+filePath);
129
+ this.generatedEntities[tableName] = {
130
+ entityClassName,
131
+ entityFileName: fileName,
132
+ tableName,
133
+ titleProperty
134
+ };
135
+ return true;
136
+ } catch (error) {
137
+ ErrorManager.error('Failed to write entity file: '+error.message);
138
+ }
139
+ }
140
+
141
+ getEditPropertiesRemoval(fieldsToRemove)
142
+ {
143
+ if(1 === fieldsToRemove.length){
144
+ return 'let editProperties = [...showProperties];\n editProperties.splice(editProperties.indexOf(\''+fieldsToRemove[0]+'\'), 1);';
145
+ }
146
+ return 'let editProperties = sc.removeFromArray([...showProperties], [\''+fieldsToRemove.join('\', \'')+'\']);';
147
+ }
148
+
149
+ determineTitleProperty(columns)
150
+ {
151
+ if(columns['label']){
152
+ return 'label';
153
+ }
154
+ if(columns['title']){
155
+ return 'title';
156
+ }
157
+ if(columns['name']){
158
+ return 'name';
159
+ }
160
+ if(columns['key']){
161
+ return 'key';
162
+ }
163
+ return false;
164
+ }
165
+
166
+ generatePropertiesConfig(columns, titleProperty)
167
+ {
168
+ let propertiesConfig = [];
169
+ for(let columnName in columns){
170
+ let column = columns[columnName];
171
+ let propertyKey = titleProperty && columnName === titleProperty ? '[titleProperty]' : columnName;
172
+ if('id' === columnName){
173
+ propertiesConfig.push(columnName+': {}');
174
+ continue;
175
+ }
176
+ let props = this.getPropertyAttributes(column);
177
+ if(0 === props.length){
178
+ propertiesConfig.push(propertyKey+': {}');
179
+ continue;
180
+ }
181
+ propertiesConfig.push(propertyKey+': {\n '+props.join(',\n ')+'\n }');
182
+ }
183
+ return propertiesConfig.join(',\n ');
184
+ }
185
+
186
+ getPropertyAttributes(column)
187
+ {
188
+ let props = [];
189
+ let type = column.type.toLowerCase();
190
+ this.addTypeAttribute(props, column, type);
191
+ this.addRequiredAttribute(props, column);
192
+ return props;
193
+ }
194
+
195
+ addTypeAttribute(props, column, type)
196
+ {
197
+ if(this.isForeignKey(column)){
198
+ props.push('type: \'reference\'');
199
+ props.push('reference: \''+this.getReferenceTable(column)+'\'');
200
+ return;
201
+ }
202
+ if('date' === type || 'datetime' === type || 'timestamp' === type){
203
+ props.push('type: \'datetime\'');
204
+ return;
205
+ }
206
+ if('tinyint' === type){
207
+ props.push('type: \'boolean\'');
208
+ return;
209
+ }
210
+ if('enum' === type){
211
+ this.addEnumValues(props, column);
212
+ return;
213
+ }
214
+ if(type.includes('int')){
215
+ props.push('type: \'number\'');
216
+ return;
217
+ }
218
+ if('varchar' === type || 'char' === type){
219
+ return;
220
+ }
221
+ let jsType = TypeMapper.mapDbTypeToJsType(type);
222
+ if(jsType && 'string' !== jsType){
223
+ props.push('type: \''+jsType+'\'');
224
+ }
225
+ }
226
+
227
+ addEnumValues(props, column)
228
+ {
229
+ let enumValues = this.parseEnumValues(column.columnType);
230
+ if(0 === enumValues.length){
231
+ return;
232
+ }
233
+ let availableValues = [];
234
+ for(let i = 0; i < enumValues.length; i++){
235
+ availableValues.push('{value: '+(i+1)+', label: \''+enumValues[i]+'\'}');
236
+ }
237
+ props.push('availableValues: [\n '+availableValues.join(',\n ')+'\n ]');
238
+ }
239
+
240
+ parseEnumValues(columnType)
241
+ {
242
+ if(!columnType){
243
+ return [];
244
+ }
245
+ let match = columnType.match(/^enum\('(.+)'\)$/i);
246
+ if(!match){
247
+ return [];
248
+ }
249
+ let valuesString = match[1];
250
+ let values = valuesString.split('\',\'');
251
+ return values;
252
+ }
253
+
254
+ addRequiredAttribute(props, column)
255
+ {
256
+ if(!column.nullable && !column.default){
257
+ props.push('isRequired: true');
258
+ }
259
+ }
260
+
261
+ isForeignKey(column)
262
+ {
263
+ if(column.referencedTable){
264
+ return true;
265
+ }
266
+ return false;
267
+ }
268
+
269
+ getReferenceTable(column)
270
+ {
271
+ if(column.referencedTable){
272
+ return column.referencedTable;
273
+ }
274
+ let refTableName = column.name.replace('_id', '');
275
+ if(refTableName.includes('_')){
276
+ let parts = refTableName.split('_');
277
+ if(column.tableName && column.tableName === parts[0]){
278
+ refTableName = parts.slice(1).join('_');
279
+ }
280
+ }
281
+ return refTableName;
282
+ }
283
+
284
+ getListPropertiesDeclaration(columns)
285
+ {
286
+ let fieldsToRemove = this.getTextAndJsonFields(columns);
287
+ if(0 === fieldsToRemove.length){
288
+ return 'let listProperties = showProperties;';
289
+ }
290
+ if(1 === fieldsToRemove.length){
291
+ return 'let listProperties = [...showProperties];\n listProperties.splice(listProperties.indexOf(\''+fieldsToRemove[0]+'\'), 1);';
292
+ }
293
+ return 'let listProperties = sc.removeFromArray([...showProperties], [\''+fieldsToRemove.join('\', \'')+'\']);';
294
+ }
295
+
296
+ getTextAndJsonFields(columns)
297
+ {
298
+ let fieldsToRemove = [];
299
+ for(let columnName in columns){
300
+ let column = columns[columnName];
301
+ let type = column.type.toLowerCase();
302
+ if(['text', 'json', 'tinytext', 'mediumtext', 'longtext'].includes(type)){
303
+ fieldsToRemove.push(columnName);
304
+ }
305
+ }
306
+ return fieldsToRemove;
307
+ }
308
+
309
+ async generateModelFile(tableName, tableData, driverKey)
310
+ {
311
+ let modelTemplatePath = this.templates[driverKey];
312
+ if(!FileHandler.exists(modelTemplatePath)){
313
+ ErrorManager.error('Model template file not found: '+modelTemplatePath);
314
+ }
315
+ let modelTemplateContent;
316
+ try {
317
+ modelTemplateContent = FileHandler.fetchFileContents(modelTemplatePath);
318
+ } catch (error) {
319
+ ErrorManager.error('Failed to read model template file: '+error.message);
320
+ }
321
+ let modelClassName = sc.capitalizedCamelCase(tableName)+'Model';
322
+ let modelPropertiesList = Object.keys(tableData.columns).join(', ');
323
+ let modelPropertiesConstructor = Object.keys(tableData.columns)
324
+ .map(columnName => 'this.'+columnName+' = '+columnName+';')
325
+ .join('\n ');
326
+ let modelRelations = '';
327
+ let entityPropertiesDefinition = this.getEntityPropertiesDefinition(tableData.columns, driverKey);
328
+ let replacements = {
329
+ modelClassName,
330
+ tableName: driverKey === 'prisma' ? tableName.toLowerCase() : tableName,
331
+ modelPropertiesList,
332
+ modelPropertiesConstructor,
333
+ modelRelations,
334
+ entityPropertiesDefinition
335
+ };
336
+ let modelContent = this.applyReplacements(modelTemplateContent, replacements);
337
+ let fileName = sc.kebabCase(tableName)+'-model.js';
338
+ let driverFolder = FileHandler.joinPaths(this.modelsFolder, driverKey);
339
+ let filePath = FileHandler.joinPaths(driverFolder, fileName);
340
+ try {
341
+ FileHandler.writeFile(filePath, modelContent);
342
+ Logger.info('Generated model file: '+filePath);
343
+ this.generatedEntities[tableName].modelClassName = modelClassName;
344
+ this.generatedEntities[tableName].modelFileName = fileName;
345
+ this.generatedEntities[tableName].driverKey = driverKey;
346
+ return true;
347
+ } catch (error) {
348
+ ErrorManager.error('Failed to write model file: '+error.message);
349
+ }
350
+ }
351
+
352
+ getEntityPropertiesDefinition(columns, driverKey)
353
+ {
354
+ if('mikro-orm' === driverKey){
355
+ let entityProps = [];
356
+ for(let columnName in columns){
357
+ let column = columns[columnName];
358
+ let isPrimary = 'PRI' === column.key;
359
+ let type = TypeMapper.mapDbTypeToJsType(column.type);
360
+ let propDef = columnName+': { type: \''+type+'\'';
361
+ if(isPrimary){
362
+ propDef += ', primary: true';
363
+ }
364
+ if(column.nullable){
365
+ propDef += ', nullable: true';
366
+ }
367
+ propDef += ' }';
368
+ entityProps.push(propDef);
369
+ }
370
+ return entityProps.join(',\n ');
371
+ }
372
+ if('prisma' === driverKey){
373
+ let prismaProps = [];
374
+ for(let columnName in columns){
375
+ let column = columns[columnName];
376
+ let prismaType = TypeMapper.mapDbTypeToPrismaType(column.type);
377
+ let isPrimary = 'PRI' === column.key;
378
+ let propDef = columnName+': {\n type: \''+prismaType+'\'';
379
+ if(isPrimary){
380
+ propDef += ',\n id: true';
381
+ }
382
+ if(column.nullable){
383
+ propDef += ',\n optional: true';
384
+ }
385
+ propDef += '\n }';
386
+ prismaProps.push(propDef);
387
+ }
388
+ return prismaProps.join(',\n ');
389
+ }
390
+ return '';
391
+ }
392
+
393
+ generateEntitiesConfigFile()
394
+ {
395
+ let configTemplatePath = this.templates['entities-config'];
396
+ if(!FileHandler.exists(configTemplatePath)){
397
+ ErrorManager.error('Entities config template file not found: '+configTemplatePath);
398
+ }
399
+ let configTemplateContent;
400
+ try {
401
+ configTemplateContent = FileHandler.fetchFileContents(configTemplatePath);
402
+ } catch (error) {
403
+ ErrorManager.error('Failed to read entities config template file: '+error.message);
404
+ }
405
+ if(!configTemplateContent || 'string' !== typeof configTemplateContent){
406
+ ErrorManager.error('Invalid entities config template content');
407
+ }
408
+ let requireStatements = this.getRequireStatements();
409
+ let entitiesConfigExport = this.getEntitiesConfigExport();
410
+ let replacements = {
411
+ requireStatements,
412
+ entitiesConfigExport
413
+ };
414
+ let configContent = this.applyReplacements(configTemplateContent, replacements);
415
+ try {
416
+ FileHandler.writeFile(this.entitiesConfigPath, configContent);
417
+ Logger.info('Generated entities config file: '+this.entitiesConfigPath);
418
+ return true;
419
+ } catch (error) {
420
+ ErrorManager.error('Failed to write entities config file: '+error.message);
421
+ }
422
+ }
423
+
424
+ getRequireStatements()
425
+ {
426
+ let requireStatements = [];
427
+ for(let tableName in this.generatedEntities){
428
+ let entity = this.generatedEntities[tableName];
429
+ requireStatements.push('const { '+entity.entityClassName+' } = require(\'./entities/'+entity.entityFileName.replace('.js', '')+'\');');
430
+ }
431
+ return requireStatements.join('\n');
432
+ }
433
+
434
+ getEntitiesConfigExport()
435
+ {
436
+ let entitiesConfigExport = [];
437
+ for(let tableName in this.generatedEntities){
438
+ let entity = this.generatedEntities[tableName];
439
+ let camelCaseKey = sc.camelCase(tableName);
440
+ entitiesConfigExport.push(camelCaseKey+': '+entity.entityClassName+'.propertiesConfig()');
441
+ }
442
+ return entitiesConfigExport.join(',\n ');
443
+ }
444
+
445
+ generateEntitiesTranslationsFile()
446
+ {
447
+ let translationsTemplatePath = this.templates['entities-translations'];
448
+ if(!FileHandler.exists(translationsTemplatePath)){
449
+ ErrorManager.error('Entities translations template file not found: '+translationsTemplatePath);
450
+ }
451
+ let translationsTemplateContent;
452
+ try {
453
+ translationsTemplateContent = FileHandler.fetchFileContents(translationsTemplatePath);
454
+ } catch (error) {
455
+ ErrorManager.error('Failed to read entities translations template file: '+error.message);
456
+ }
457
+ if(!translationsTemplateContent || 'string' !== typeof translationsTemplateContent){
458
+ ErrorManager.error('Invalid entities translations template content');
459
+ }
460
+ let labels = this.getTranslationLabels();
461
+ let translationsContent = translationsTemplateContent.replace(
462
+ /{{labels}}/g,
463
+ labels
464
+ );
465
+ try {
466
+ FileHandler.writeFile(this.entitiesTranslationsPath, translationsContent);
467
+ Logger.info('Generated entities translations file: '+this.entitiesTranslationsPath);
468
+ return true;
469
+ } catch (error) {
470
+ ErrorManager.error('Failed to write entities translations file: '+error.message);
471
+ }
472
+ }
473
+
474
+ getTranslationLabels()
475
+ {
476
+ let labels = [];
477
+ for(let tableName in this.generatedEntities){
478
+ let humanReadable = tableName
479
+ .split('_')
480
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
481
+ .join(' ');
482
+ labels.push('\''+tableName+'\': \''+humanReadable+'\'');
483
+ }
484
+ return labels.join(',\n ');
485
+ }
486
+
487
+ generateRegisteredModelsFile(driverKey)
488
+ {
489
+ let registeredTemplatePath = this.templates['registered-models'];
490
+ if(!FileHandler.exists(registeredTemplatePath)){
491
+ ErrorManager.error('Registered models template file not found: '+registeredTemplatePath);
492
+ }
493
+ let registeredTemplateContent;
494
+ try {
495
+ registeredTemplateContent = FileHandler.fetchFileContents(registeredTemplatePath);
496
+ } catch (error) {
497
+ ErrorManager.error('Failed to read registered models template file: '+error.message);
498
+ }
499
+ if(!registeredTemplateContent || 'string' !== typeof registeredTemplateContent){
500
+ ErrorManager.error('Invalid registered models template content');
501
+ }
502
+ let registeredModels = this.getRegisteredModels(driverKey);
503
+ let registeredEntitiesObject = this.getRegisteredEntitiesObject(driverKey);
504
+ let replacements = {
505
+ registeredModels,
506
+ registeredEntitiesObject
507
+ };
508
+ let registeredContent = this.applyReplacements(registeredTemplateContent, replacements);
509
+ let driverFolder = FileHandler.joinPaths(this.modelsFolder, driverKey);
510
+ let filePath = FileHandler.joinPaths(driverFolder, 'registered-models-'+driverKey+'.js');
511
+ try {
512
+ FileHandler.writeFile(filePath, registeredContent);
513
+ Logger.info('Generated registered models file: '+filePath);
514
+ return true;
515
+ } catch (error) {
516
+ ErrorManager.error('Failed to write registered models file: '+error.message);
517
+ }
518
+ }
519
+
520
+ getRegisteredModels(driverKey)
521
+ {
522
+ let registeredModels = [];
523
+ for(let tableName in this.generatedEntities){
524
+ let entity = this.generatedEntities[tableName];
525
+ if(entity.driverKey === driverKey){
526
+ registeredModels.push('const { '+entity.modelClassName+' } = require(\'./'+entity.modelFileName.replace('.js', '')+'\');');
527
+ }
528
+ }
529
+ return registeredModels.join('\n');
530
+ }
531
+
532
+ getRegisteredEntitiesObject(driverKey)
533
+ {
534
+ let registeredEntitiesObject = [];
535
+ for(let tableName in this.generatedEntities){
536
+ let entity = this.generatedEntities[tableName];
537
+ if(entity.driverKey === driverKey){
538
+ let camelCaseKey = sc.camelCase(tableName);
539
+ registeredEntitiesObject.push(camelCaseKey+': '+entity.modelClassName);
540
+ }
541
+ }
542
+ return registeredEntitiesObject.join(',\n ');
543
+ }
544
+
545
+ applyReplacements(content, replacements)
546
+ {
547
+ let result = content;
548
+ for(let placeholder in replacements){
549
+ result = result.replace(
550
+ new RegExp('{{'+placeholder+'}}', 'g'),
551
+ replacements[placeholder]
552
+ );
553
+ }
554
+ return result;
555
+ }
556
+
557
+ async generate()
558
+ {
559
+ if(!this.server){
560
+ this.createServer();
561
+ }
562
+ try {
563
+ await this.server.connect();
564
+ } catch (error) {
565
+ ErrorManager.error('Failed to connect to database: '+error.message);
566
+ }
567
+ let tables = await this.server.fetchEntitiesFromDatabase();
568
+ if(!tables){
569
+ ErrorManager.error('Failed to fetch tables from database.');
570
+ }
571
+ this.ensureFoldersExist();
572
+ let driverKey = sc.get(this.connectionData, 'driver', 'objection-js');
573
+ for(let tableName in tables){
574
+ let tableData = tables[tableName];
575
+ await this.generateEntityFile(tableName, tableData);
576
+ await this.generateModelFile(tableName, tableData, driverKey);
577
+ }
578
+ this.generateEntitiesConfigFile();
579
+ this.generateEntitiesTranslationsFile();
580
+ this.generateRegisteredModelsFile(driverKey);
581
+ return true;
582
+ }
583
+
584
+ createServer()
585
+ {
586
+ let driverKey = sc.get(this.connectionData, 'driver', 'objection-js');
587
+ let driverClassMapped = this.driverMap[driverKey];
588
+ if(!driverClassMapped){
589
+ ErrorManager.error('Unsupported driver: '+driverKey);
590
+ }
591
+ this.server = new driverClassMapped({
592
+ client: sc.get(this.connectionData, 'client', 'mysql2'),
593
+ config: {
594
+ user: sc.get(this.connectionData, 'user', ''),
595
+ password: sc.get(this.connectionData, 'password', ''),
596
+ database: sc.get(this.connectionData, 'database', ''),
597
+ host: sc.get(this.connectionData, 'host', 'localhost'),
598
+ port: sc.get(this.connectionData, 'port', 3306)
599
+ }
600
+ });
601
+ }
602
+
603
+ }
604
+
605
+ module.exports.EntitiesGenerator = EntitiesGenerator;
@@ -0,0 +1,26 @@
1
+ /**
2
+ *
3
+ * Reldens - EntityProperties
4
+ *
5
+ */
6
+
7
+ const { Logger } = require('@reldens/utils');
8
+
9
+ class EntityProperties
10
+ {
11
+
12
+ static propertiesDefinition()
13
+ {
14
+ Logger.alert('Method not implemented propertiesDefinition().');
15
+ return {};
16
+ }
17
+
18
+ static propertiesConfig(extraProps)
19
+ {
20
+ Logger.alert('Method not implemented propertiesConfig().', extraProps);
21
+ return {};
22
+ }
23
+
24
+ }
25
+
26
+ module.exports.EntityProperties = EntityProperties;
@@ -0,0 +1,13 @@
1
+ /**
2
+ *
3
+ * Reldens - Entities Config
4
+ *
5
+ */
6
+
7
+ {{requireStatements}}
8
+
9
+ let entitiesConfig = {
10
+ {{entitiesConfigExport}}
11
+ };
12
+
13
+ module.exports.entitiesConfig = entitiesConfig;
@@ -0,0 +1,11 @@
1
+ /**
2
+ *
3
+ * Reldens - Entities Translations
4
+ *
5
+ */
6
+
7
+ module.exports.entitiesTranslations = {
8
+ labels: {
9
+ {{labels}}
10
+ }
11
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ *
3
+ * Reldens - {{entityClassName}}
4
+ *
5
+ */
6
+
7
+ const { EntityProperties } = require('@reldens/storage');{{scRequire}}
8
+
9
+ class {{entityClassName}} extends EntityProperties
10
+ {
11
+
12
+ static propertiesConfig(extraProps)
13
+ {{{titlePropertyDeclaration}}
14
+ let properties = {
15
+ {{propertiesConfig}}
16
+ };
17
+ let showProperties = Object.keys(properties);
18
+ {{editPropertiesRemoval}}
19
+ {{listPropertiesDeclaration}}
20
+ return {
21
+ showProperties,
22
+ editProperties,
23
+ listProperties,
24
+ filterProperties: listProperties,
25
+ properties,{{titlePropertyReturn}}
26
+ ...extraProps
27
+ };
28
+ }
29
+
30
+ }
31
+
32
+ module.exports.{{entityClassName}} = {{entityClassName}};