@reldens/storage 0.90.0 → 0.91.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 +4 -1
- package/lib/generators/entities-generation.js +40 -6
- package/lib/generators/models-generation.js +10 -9
- package/lib/objection-js/objection-js-data-server.js +27 -2
- package/lib/relation-key.js +9 -0
- package/package.json +2 -2
- package/tests/fixtures/expected-entities/entities/test-products-entity.js +1 -0
- package/tests/fixtures/expected-entities/entities/test-reviews-entity.js +1 -0
- package/tests/utils/test-helpers.js +1 -1
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
|
-
|
|
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
|
|
253
|
+
return RELATION_PREFIX+relatedTable;
|
|
253
254
|
}
|
|
254
255
|
let columnHint = this.extractColumnHintFromPrismaName(prismaName, relatedTable, tableName);
|
|
255
256
|
if(columnHint){
|
|
256
|
-
return
|
|
257
|
+
return RELATION_PREFIX+relatedTable+'_'+columnHint;
|
|
257
258
|
}
|
|
258
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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){
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reldens/storage",
|
|
3
3
|
"scope": "@reldens",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.91.0",
|
|
5
5
|
"description": "Reldens - Storage",
|
|
6
6
|
"author": "Damian A. Pastorini",
|
|
7
7
|
"license": "MIT",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"@reldens/utils": "^0.54.0",
|
|
60
60
|
"knex": "3.1.0",
|
|
61
61
|
"mysql": "2.18.1",
|
|
62
|
-
"mysql2": "3.16.
|
|
62
|
+
"mysql2": "3.16.3",
|
|
63
63
|
"objection": "3.1.5",
|
|
64
64
|
"prisma": "6.19.2"
|
|
65
65
|
}
|
|
@@ -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.
|
|
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
|
];
|