@reldens/storage 0.90.0 → 0.92.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/index.js CHANGED
@@ -20,6 +20,7 @@ const { PrismaDriver } = require('./lib/prisma/prisma-driver');
20
20
  const { PrismaDataServer } = require('./lib/prisma/prisma-data-server');
21
21
  const { PrismaSchemaGenerator } = require('./lib/prisma/prisma-schema-generator');
22
22
  const { PrismaClientLoader } = require('./lib/prisma/prisma-client-loader');
23
+ const { RELATION_PREFIX } = require('./lib/relation-key');
23
24
 
24
25
  module.exports = {
25
26
  // base:
@@ -52,5 +53,7 @@ module.exports = {
52
53
  EntitiesGenerator,
53
54
  EntityProperties,
54
55
  TypeMapper,
55
- MySQLTablesProvider
56
+ MySQLTablesProvider,
57
+ // relation key:
58
+ RELATION_PREFIX
56
59
  };
@@ -8,6 +8,7 @@ const { FileHandler } = require('@reldens/server-utils');
8
8
  const { Logger, sc } = require('@reldens/utils');
9
9
  const { TypeMapper } = require('../type-mapper');
10
10
  const { BaseGenerator } = require('./base-generator');
11
+ const { RELATION_PREFIX } = require('../relation-key');
11
12
 
12
13
  class EntitiesGeneration extends BaseGenerator
13
14
  {
@@ -18,6 +19,7 @@ class EntitiesGeneration extends BaseGenerator
18
19
  this.entitiesFolder = sc.get(props, 'entitiesFolder', '');
19
20
  this.templatePath = sc.get(props, 'templatePath', '');
20
21
  this.generatedEntities = {};
22
+ this.removeIdFromMultipleRelations = sc.get(props, 'removeIdFromMultipleRelations', true);
21
23
  }
22
24
 
23
25
  async generateEntityFile(tableName, tableData)
@@ -152,20 +154,49 @@ class EntitiesGeneration extends BaseGenerator
152
154
  return false;
153
155
  }
154
156
 
157
+ countReferencesPerTable(columns)
158
+ {
159
+ let counts = {};
160
+ for(let columnName of Object.keys(columns)){
161
+ let column = columns[columnName];
162
+ if(!sc.hasOwn(column, 'referencedTable')){
163
+ continue;
164
+ }
165
+ if(!counts[column.referencedTable]){
166
+ counts[column.referencedTable] = 0;
167
+ }
168
+ counts[column.referencedTable]++;
169
+ }
170
+ return counts;
171
+ }
172
+
173
+ generateForwardRelationKey(referencedTable, columnName, referenceCounts)
174
+ {
175
+ if(1 === referenceCounts[referencedTable]){
176
+ return RELATION_PREFIX+referencedTable;
177
+ }
178
+ let columnSuffix = columnName;
179
+ if(this.removeIdFromMultipleRelations){
180
+ columnSuffix = columnName.replace(/_id$/i, '');
181
+ }
182
+ return RELATION_PREFIX+referencedTable+'_'+columnSuffix;
183
+ }
184
+
155
185
  generatePropertiesConfig(columns, titleProperty, primaryKeyColumn)
156
186
  {
187
+ let referenceCounts = this.countReferencesPerTable(columns);
157
188
  let propertiesConfig = [];
158
189
  for(let columnName of Object.keys(columns)){
159
190
  let column = columns[columnName];
160
191
  let propertyKey = titleProperty && titleProperty === columnName ? '[titleProperty]' : columnName;
161
192
  let isPrimaryKey = primaryKeyColumn && primaryKeyColumn === columnName;
162
193
  if(isPrimaryKey){
163
- let props = this.getPropertyAttributes(column);
194
+ let props = this.getPropertyAttributes(column, columnName, referenceCounts);
164
195
  props.unshift('isId: true');
165
196
  propertiesConfig.push(propertyKey+': {\n '+props.join(',\n ')+ '\n }');
166
197
  continue;
167
198
  }
168
- let props = this.getPropertyAttributes(column);
199
+ let props = this.getPropertyAttributes(column, columnName, referenceCounts);
169
200
  if(0 === props.length){
170
201
  let dbType = column.type.toLowerCase();
171
202
  propertiesConfig.push(propertyKey+': {\n dbType: \''+dbType+'\'\n }');
@@ -178,21 +209,24 @@ class EntitiesGeneration extends BaseGenerator
178
209
  return propertiesConfig.join(',\n ');
179
210
  }
180
211
 
181
- getPropertyAttributes(column)
212
+ getPropertyAttributes(column, columnName, referenceCounts)
182
213
  {
183
214
  let props = [];
184
215
  let type = column.type.toLowerCase();
185
- this.addTypeAttribute(props, column, type);
216
+ this.addTypeAttribute(props, column, type, columnName, referenceCounts);
186
217
  this.addRequiredAttribute(props, column);
187
218
  props.push('dbType: \''+type+'\'');
188
219
  return props;
189
220
  }
190
221
 
191
- addTypeAttribute(props, column, type)
222
+ addTypeAttribute(props, column, type, columnName, referenceCounts)
192
223
  {
193
224
  if(column.referencedTable){
194
225
  props.push('type: \'reference\'');
195
- props.push('reference: \''+this.getReferenceTable(column)+'\'');
226
+ let referenceTable = this.getReferenceTable(column);
227
+ props.push('reference: \''+referenceTable+'\'');
228
+ let alias = this.generateForwardRelationKey(referenceTable, columnName, referenceCounts);
229
+ props.push('alias: \''+alias+'\'');
196
230
  return;
197
231
  }
198
232
  if('date' === type || 'datetime' === type || 'timestamp' === type){
@@ -8,6 +8,7 @@ const { FileHandler } = require('@reldens/server-utils');
8
8
  const { Logger, sc } = require('@reldens/utils');
9
9
  const { TypeMapper } = require('../type-mapper');
10
10
  const { BaseGenerator } = require('./base-generator');
11
+ const { RELATION_PREFIX } = require('../relation-key');
11
12
 
12
13
  class ModelsGeneration extends BaseGenerator
13
14
  {
@@ -249,13 +250,13 @@ class ModelsGeneration extends BaseGenerator
249
250
  generatePrismaReverseRelationKey(relatedTable, prismaName, tableName, referenceCount)
250
251
  {
251
252
  if(1 === referenceCount){
252
- return 'related_'+relatedTable;
253
+ return RELATION_PREFIX+relatedTable;
253
254
  }
254
255
  let columnHint = this.extractColumnHintFromPrismaName(prismaName, relatedTable, tableName);
255
256
  if(columnHint){
256
- return 'related_'+relatedTable+'_'+columnHint;
257
+ return RELATION_PREFIX+relatedTable+'_'+columnHint;
257
258
  }
258
- return 'related_'+relatedTable;
259
+ return RELATION_PREFIX+relatedTable;
259
260
  }
260
261
 
261
262
  extractColumnHintFromPrismaName(prismaName, relatedTable, tableName)
@@ -420,25 +421,25 @@ class ModelsGeneration extends BaseGenerator
420
421
  generateForwardRelationKey(referencedTable, columnName, referenceCounts)
421
422
  {
422
423
  if(1 === referenceCounts[referencedTable]){
423
- return 'related_'+referencedTable;
424
+ return RELATION_PREFIX+referencedTable;
424
425
  }
425
426
  let columnSuffix = columnName;
426
427
  if(this.removeIdFromMultipleRelations){
427
428
  columnSuffix = columnName.replace(/_id$/i, '');
428
429
  }
429
- return 'related_'+referencedTable+'_'+columnSuffix;
430
+ return RELATION_PREFIX+referencedTable+'_'+columnSuffix;
430
431
  }
431
432
 
432
433
  generateReverseRelationKey(referencingTable, columnName, referenceCount)
433
434
  {
434
435
  if(1 === referenceCount){
435
- return 'related_'+referencingTable;
436
+ return RELATION_PREFIX+referencingTable;
436
437
  }
437
438
  let columnSuffix = columnName;
438
439
  if(this.removeIdFromMultipleRelations){
439
440
  columnSuffix = columnName.replace(/_id$/i, '');
440
441
  }
441
- return 'related_'+referencingTable+'_'+columnSuffix;
442
+ return RELATION_PREFIX+referencingTable+'_'+columnSuffix;
442
443
  }
443
444
 
444
445
  determineForwardRelationType(tableName, columnName, column)
@@ -578,7 +579,7 @@ class ModelsGeneration extends BaseGenerator
578
579
  findMappedByKey(currentTable, referencingTable, reverseRelation)
579
580
  {
580
581
  if(!this.allTablesData[referencingTable]){
581
- return 'related_'+currentTable;
582
+ return RELATION_PREFIX+currentTable;
582
583
  }
583
584
  let referencingTableData = this.allTablesData[referencingTable];
584
585
  let forwardRelations = this.detectObjectionJsRelations(referencingTable, referencingTableData);
@@ -588,7 +589,7 @@ class ModelsGeneration extends BaseGenerator
588
589
  return forwardKey;
589
590
  }
590
591
  }
591
- return 'related_'+currentTable;
592
+ return RELATION_PREFIX+currentTable;
592
593
  }
593
594
 
594
595
  generateFkMappings(tableName, tableData, driverKey)
@@ -9,7 +9,7 @@ const { ObjectionJsDriver } = require('./objection-js-driver');
9
9
  const { MySQLTablesProvider } = require('../mysql-tables-provider');
10
10
  const { Model } = require('objection');
11
11
  const Knex = require('knex');
12
- const { Logger } = require('@reldens/utils');
12
+ const { Logger, sc } = require('@reldens/utils');
13
13
 
14
14
  class ObjectionJsDataServer extends BaseDataServer
15
15
  {
@@ -21,6 +21,16 @@ class ObjectionJsDataServer extends BaseDataServer
21
21
  if(!this.rawModel){
22
22
  this.rawModel = Model;
23
23
  }
24
+ this.validMySQL2Options = [
25
+ 'authPlugins', 'authSwitchHandler', 'bigNumberStrings', 'charset', 'charsetNumber', 'compress',
26
+ 'connectAttributes', 'connectTimeout', 'database', 'dateStrings', 'debug', 'decimalNumbers',
27
+ 'enableKeepAlive', 'flags', 'host', 'insecureAuth', 'infileStreamFactory', 'isServer',
28
+ 'keepAliveInitialDelay', 'localAddress', 'maxPreparedStatements', 'multipleStatements',
29
+ 'namedPlaceholders', 'nestTables', 'password', 'password1', 'password2', 'password3', 'passwordSha1',
30
+ 'pool', 'port', 'queryFormat', 'rowsAsArray', 'socketPath', 'ssl', 'stream', 'stringifyObjects',
31
+ 'supportBigNumbers', 'timezone', 'trace', 'typeCast', 'uri', 'user', 'disableEval', 'connectionLimit',
32
+ 'maxIdle', 'idleTimeout', 'Promise', 'queueLimit', 'waitForConnections', 'jsonStrings', 'gracefulEnd'
33
+ ];
24
34
  }
25
35
 
26
36
  async connect()
@@ -28,9 +38,10 @@ class ObjectionJsDataServer extends BaseDataServer
28
38
  if(this.initialized){
29
39
  return this.initialized;
30
40
  }
41
+ let connectionConfig = this.sanitizeConnectionConfig(this.config);
31
42
  this.knex = await Knex({
32
43
  client: this.client,
33
- connection: this.config,
44
+ connection: connectionConfig,
34
45
  pool: this.poolConfig,
35
46
  debug: this.debug,
36
47
  multipleStatements: this.multipleStatements
@@ -47,6 +58,20 @@ class ObjectionJsDataServer extends BaseDataServer
47
58
  return this.initialized;
48
59
  }
49
60
 
61
+ sanitizeConnectionConfig(config)
62
+ {
63
+ if('mysql2' !== this.client){
64
+ return config;
65
+ }
66
+ let cleanConfig = {};
67
+ for(let prop of this.validMySQL2Options){
68
+ if(sc.hasOwn(config, prop)){
69
+ cleanConfig[prop] = config[prop];
70
+ }
71
+ }
72
+ return cleanConfig;
73
+ }
74
+
50
75
  async disconnect()
51
76
  {
52
77
  if(!this.knex){
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * Reldens - Relation Key
4
+ *
5
+ */
6
+
7
+ module.exports = {
8
+ RELATION_PREFIX: process.env.RELDENS_RELATION_PREFIX || 'related_'
9
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@reldens/storage",
3
3
  "scope": "@reldens",
4
- "version": "0.90.0",
4
+ "version": "0.92.0",
5
5
  "description": "Reldens - Storage",
6
6
  "author": "Damian A. Pastorini",
7
7
  "license": "MIT",
@@ -51,15 +51,15 @@
51
51
  "test:driver": "node tests/run-tests.js --driver="
52
52
  },
53
53
  "dependencies": {
54
- "@mikro-orm/core": "6.6.6",
55
- "@mikro-orm/mongodb": "6.6.6",
56
- "@mikro-orm/mysql": "6.6.6",
54
+ "@mikro-orm/core": "6.6.9",
55
+ "@mikro-orm/mongodb": "6.6.9",
56
+ "@mikro-orm/mysql": "6.6.9",
57
57
  "@prisma/client": "6.19.2",
58
- "@reldens/server-utils": "^0.46.0",
59
- "@reldens/utils": "^0.54.0",
58
+ "@reldens/server-utils": "^0.47.0",
59
+ "@reldens/utils": "^0.55.0",
60
60
  "knex": "3.1.0",
61
61
  "mysql": "2.18.1",
62
- "mysql2": "3.16.2",
62
+ "mysql2": "3.19.1",
63
63
  "objection": "3.1.5",
64
64
  "prisma": "6.19.2"
65
65
  }
@@ -23,6 +23,7 @@ class TestProductsEntity extends EntityProperties
23
23
  category_id: {
24
24
  type: 'reference',
25
25
  reference: 'test_categories',
26
+ alias: 'related_test_categories',
26
27
  isRequired: true,
27
28
  dbType: 'int'
28
29
  },
@@ -23,6 +23,7 @@ class TestReviewsEntity extends EntityProperties
23
23
  product_id: {
24
24
  type: 'reference',
25
25
  reference: 'test_products',
26
+ alias: 'related_test_products',
26
27
  isRequired: true,
27
28
  dbType: 'int'
28
29
  },
@@ -284,7 +284,7 @@ class TestHelpers
284
284
  {name: '@prisma/client', version: '6.19.2'},
285
285
  {name: 'knex', version: '3.1.0'},
286
286
  {name: 'mysql', version: '2.18.1'},
287
- {name: 'mysql2', version: '3.16.2'},
287
+ {name: 'mysql2', version: '3.16.3'},
288
288
  {name: 'objection', version: '3.1.5'},
289
289
  {name: 'prisma', version: '6.19.2'}
290
290
  ];