@reldens/storage 0.88.0 → 0.90.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/.claude/driver-methods-complete-analysis.md +1978 -0
- package/.claude/test-architecture.md +973 -0
- package/CLAUDE.md +132 -3
- package/bin/reldens-storage.js +1 -1
- package/lib/base-driver.js +8 -0
- package/lib/entities-generator.js +1 -3
- package/lib/entity-templates/entities-translations.template +3 -0
- package/lib/entity-templates/mikro-orm-model.template +2 -1
- package/lib/generators/entities-generation.js +12 -1
- package/lib/generators/entities-translations-generation.js +40 -4
- package/lib/generators/models-generation.js +126 -5
- package/lib/mikro-orm/mikro-orm-data-server.js +24 -10
- package/lib/mikro-orm/mikro-orm-driver.js +184 -116
- package/lib/objection-js/objection-js-driver.js +111 -19
- package/lib/prisma/prisma-data-server.js +3 -2
- package/lib/prisma/prisma-driver.js +12 -10
- package/lib/prisma/prisma-filter-processor.js +193 -146
- package/lib/prisma/prisma-metadata-loader.js +0 -4
- package/lib/prisma/prisma-relation-resolver.js +292 -267
- package/lib/prisma/prisma-type-caster.js +280 -260
- package/package.json +15 -6
- package/tests/.env.test.example +7 -0
- package/tests/fixtures/categories-fixtures.js +164 -0
- package/tests/fixtures/expected-entities/entities/test-categories-entity.js +70 -0
- package/tests/fixtures/expected-entities/entities/test-products-entity.js +95 -0
- package/tests/fixtures/expected-entities/entities/test-reviews-entity.js +84 -0
- package/tests/fixtures/expected-entities/entities-config.js +17 -0
- package/tests/fixtures/expected-entities/entities-translations.js +53 -0
- package/tests/fixtures/expected-entities-mikro-orm/models/mikro-orm/registered-models-mikro-orm.js +23 -0
- package/tests/fixtures/expected-entities-mikro-orm/models/mikro-orm/test-categories-model.js +57 -0
- package/tests/fixtures/expected-entities-mikro-orm/models/mikro-orm/test-products-model.js +79 -0
- package/tests/fixtures/expected-entities-mikro-orm/models/mikro-orm/test-reviews-model.js +70 -0
- package/tests/fixtures/expected-entities-objection-js/models/objection-js/registered-models-objection-js.js +23 -0
- package/tests/fixtures/expected-entities-objection-js/models/objection-js/test-categories-model.js +33 -0
- package/tests/fixtures/expected-entities-objection-js/models/objection-js/test-products-model.js +42 -0
- package/tests/fixtures/expected-entities-objection-js/models/objection-js/test-reviews-model.js +33 -0
- package/tests/fixtures/expected-entities-prisma/models/prisma/registered-models-prisma.js +23 -0
- package/tests/fixtures/expected-entities-prisma/models/prisma/test-categories-model.js +43 -0
- package/tests/fixtures/expected-entities-prisma/models/prisma/test-products-model.js +50 -0
- package/tests/fixtures/expected-entities-prisma/models/prisma/test-reviews-model.js +46 -0
- package/tests/fixtures/products-fixtures.js +119 -0
- package/tests/fixtures/reviews-fixtures.js +42 -0
- package/tests/fixtures/sql/test-schema.sql +59 -0
- package/tests/integration/test-drivers.js +257 -0
- package/tests/integration/test-nested-filters.js +408 -0
- package/tests/integration/test-relations.js +349 -0
- package/tests/run-tests.js +213 -0
- package/tests/unit/test-drivers.js +89 -0
- package/tests/unit/test-entities-generator.js +533 -0
- package/tests/unit/test-entity-manager.js +128 -0
- package/tests/unit/test-type-mapper.js +232 -0
- package/tests/utils/custom-reporter.js +73 -0
- package/tests/utils/driver-registry.js +144 -0
- package/tests/utils/prisma-subprocess-worker.js +150 -0
- package/tests/utils/test-helpers.js +726 -0
- package/tests/utils/test-runner.js +63 -0
|
@@ -1,260 +1,280 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Reldens - PrismaTypeCaster
|
|
4
|
-
*
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const { Logger, sc } = require('@reldens/utils');
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
17
|
-
this.
|
|
18
|
-
this.
|
|
19
|
-
this.
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
updateMetadata(metadata)
|
|
25
|
-
{
|
|
26
|
-
this.idFieldType = sc.get(metadata, 'idFieldType', this.idFieldType);
|
|
27
|
-
this.jsonFields = sc.get(metadata, 'jsonFields', this.jsonFields);
|
|
28
|
-
this.fieldTypes = sc.get(metadata, 'fieldTypes', this.fieldTypes);
|
|
29
|
-
this.fieldDefaults = sc.get(metadata, 'fieldDefaults', this.fieldDefaults);
|
|
30
|
-
this.requiredFields = sc.get(metadata, 'requiredFields', this.requiredFields);
|
|
31
|
-
this.optionalFields = sc.get(metadata, 'optionalFields', this.optionalFields);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
isNumericFieldType(fieldType)
|
|
35
|
-
{
|
|
36
|
-
return ('Int' === fieldType || 'BigInt' === fieldType || 'Float' === fieldType || 'Decimal' === fieldType);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
isBooleanFieldType(fieldType)
|
|
40
|
-
{
|
|
41
|
-
return 'Boolean' === fieldType;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
isDateTimeFieldType(fieldType)
|
|
45
|
-
{
|
|
46
|
-
return 'DateTime' === fieldType || 'Date' === fieldType;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
isJsonFieldType(fieldType)
|
|
50
|
-
{
|
|
51
|
-
return 'Json' === fieldType;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
isJsonFieldByName(fieldName)
|
|
55
|
-
{
|
|
56
|
-
if(this.jsonFields.has(fieldName)){
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
if(!this.rawModel || !this.rawModel.properties){
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
return 'json' === sc.get(this.rawModel.properties[fieldName], 'dbType', '');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
isStringFieldType(fieldType)
|
|
66
|
-
{
|
|
67
|
-
return 'String' === fieldType;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
isNullOrEmpty(value)
|
|
71
|
-
{
|
|
72
|
-
return null === value || undefined === value || '' === value;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
isValidCastedValue(value)
|
|
76
|
-
{
|
|
77
|
-
return undefined !== value;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
castValue(value, fieldType, fieldName = null)
|
|
81
|
-
{
|
|
82
|
-
if('id' === fieldName){
|
|
83
|
-
return this.castToIdType(value);
|
|
84
|
-
}
|
|
85
|
-
if(this.isNullOrEmpty(value)){
|
|
86
|
-
if(sc.hasOwn(this.fieldDefaults, fieldName)){
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
if(-1 !== this.optionalFields.indexOf(fieldName)){
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
if(-1 !== this.requiredFields.indexOf(fieldName)){
|
|
93
|
-
Logger.warning('Required field '+fieldName+' cannot be null or empty');
|
|
94
|
-
return undefined;
|
|
95
|
-
}
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
if(this.isJsonFieldByName(fieldName)){
|
|
99
|
-
return this.castToJsonType(value);
|
|
100
|
-
}
|
|
101
|
-
if(this.isNumericFieldType(fieldType)){
|
|
102
|
-
return this.castToNumericType(value, fieldType);
|
|
103
|
-
}
|
|
104
|
-
if(this.isBooleanFieldType(fieldType)){
|
|
105
|
-
return this.castToBooleanType(value);
|
|
106
|
-
}
|
|
107
|
-
if(this.isDateTimeFieldType(fieldType)){
|
|
108
|
-
return this.castToDateType(value);
|
|
109
|
-
}
|
|
110
|
-
if(this.isStringFieldType(fieldType)){
|
|
111
|
-
return this.castToStringType(value);
|
|
112
|
-
}
|
|
113
|
-
return value;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
castToIdType(value)
|
|
117
|
-
{
|
|
118
|
-
if(this.isNullOrEmpty(value)){
|
|
119
|
-
return value;
|
|
120
|
-
}
|
|
121
|
-
if(this.isNumericFieldType(this.idFieldType)){
|
|
122
|
-
let numeric = Number(value);
|
|
123
|
-
if(!isNaN(numeric)){
|
|
124
|
-
return ('Int' === this.idFieldType || 'BigInt' === this.idFieldType) ? Math.floor(numeric) : numeric;
|
|
125
|
-
}
|
|
126
|
-
Logger.warning('Cannot cast non-numeric value "'+value+'" to ID type '+this.idFieldType);
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
return String(value);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
castToNumericType(value, fieldType)
|
|
133
|
-
{
|
|
134
|
-
if(this.isNullOrEmpty(value)){
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
let numericValue = Number(value);
|
|
138
|
-
if(isNaN(numericValue)){
|
|
139
|
-
Logger.warning('Cannot convert value to numeric: '+value);
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
if('Int' === fieldType || 'BigInt' === fieldType){
|
|
143
|
-
return Math.floor(numericValue);
|
|
144
|
-
}
|
|
145
|
-
return numericValue;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
castToBooleanType(value)
|
|
149
|
-
{
|
|
150
|
-
if(this.isNullOrEmpty(value)){
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
if('boolean' === typeof value){
|
|
154
|
-
return value;
|
|
155
|
-
}
|
|
156
|
-
if('number' === typeof value){
|
|
157
|
-
return 0 !== value;
|
|
158
|
-
}
|
|
159
|
-
if('string' === typeof value){
|
|
160
|
-
let lowerValue = value.toLowerCase();
|
|
161
|
-
if('true' === lowerValue || '1' === lowerValue || 'yes' === lowerValue){
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
if('false' === lowerValue || '0' === lowerValue || 'no' === lowerValue){
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return Boolean(value);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
castToDateType(dateValue)
|
|
172
|
-
{
|
|
173
|
-
if(dateValue instanceof Date){
|
|
174
|
-
return dateValue;
|
|
175
|
-
}
|
|
176
|
-
if(this.isNullOrEmpty(dateValue)){
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
let dateString = String(dateValue);
|
|
180
|
-
if(dateString.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)){
|
|
181
|
-
return new Date(dateString.replace(' ', 'T')+'Z');
|
|
182
|
-
}
|
|
183
|
-
if(dateString.match(/^\d{4}-\d{2}-\d{2}$/)){
|
|
184
|
-
return new Date(dateString+'T00:00:00Z');
|
|
185
|
-
}
|
|
186
|
-
try {
|
|
187
|
-
let parsedDate = new Date(dateString);
|
|
188
|
-
if(isNaN(parsedDate.getTime())){
|
|
189
|
-
Logger.warning('Invalid date value: '+dateString);
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
return parsedDate;
|
|
193
|
-
} catch(error) {
|
|
194
|
-
Logger.warning('Failed to convert date value: '+dateString);
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
castToJsonType(value)
|
|
200
|
-
{
|
|
201
|
-
if(this.isNullOrEmpty(value)){
|
|
202
|
-
return
|
|
203
|
-
}
|
|
204
|
-
if('object' === typeof value){
|
|
205
|
-
return value;
|
|
206
|
-
}
|
|
207
|
-
if('string' === typeof value){
|
|
208
|
-
if(value.startsWith('%') && value.endsWith('%')){
|
|
209
|
-
return value;
|
|
210
|
-
}
|
|
211
|
-
try {
|
|
212
|
-
return JSON.parse(value);
|
|
213
|
-
} catch(error) {
|
|
214
|
-
return value;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return value;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
castToStringType(value)
|
|
221
|
-
{
|
|
222
|
-
if(null === value || undefined === value){
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
if('string' === typeof value){
|
|
226
|
-
if('null' === value){
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
return value;
|
|
230
|
-
}
|
|
231
|
-
return String(value);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
{
|
|
236
|
-
if(
|
|
237
|
-
return data;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - PrismaTypeCaster
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
8
|
+
|
|
9
|
+
class PrismaTypeCaster
|
|
10
|
+
{
|
|
11
|
+
|
|
12
|
+
constructor(props)
|
|
13
|
+
{
|
|
14
|
+
this.idFieldType = sc.get(props, 'idFieldType', 'String');
|
|
15
|
+
this.jsonFields = sc.get(props, 'jsonFields', new Set());
|
|
16
|
+
this.fieldTypes = sc.get(props, 'fieldTypes', {});
|
|
17
|
+
this.fieldDefaults = sc.get(props, 'fieldDefaults', {});
|
|
18
|
+
this.requiredFields = sc.get(props, 'requiredFields', []);
|
|
19
|
+
this.optionalFields = sc.get(props, 'optionalFields', []);
|
|
20
|
+
this.rawModel = sc.get(props, 'rawModel', false);
|
|
21
|
+
this.prismaDbNull = sc.get(props, 'prismaDbNull', null);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
updateMetadata(metadata)
|
|
25
|
+
{
|
|
26
|
+
this.idFieldType = sc.get(metadata, 'idFieldType', this.idFieldType);
|
|
27
|
+
this.jsonFields = sc.get(metadata, 'jsonFields', this.jsonFields);
|
|
28
|
+
this.fieldTypes = sc.get(metadata, 'fieldTypes', this.fieldTypes);
|
|
29
|
+
this.fieldDefaults = sc.get(metadata, 'fieldDefaults', this.fieldDefaults);
|
|
30
|
+
this.requiredFields = sc.get(metadata, 'requiredFields', this.requiredFields);
|
|
31
|
+
this.optionalFields = sc.get(metadata, 'optionalFields', this.optionalFields);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
isNumericFieldType(fieldType)
|
|
35
|
+
{
|
|
36
|
+
return ('Int' === fieldType || 'BigInt' === fieldType || 'Float' === fieldType || 'Decimal' === fieldType);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
isBooleanFieldType(fieldType)
|
|
40
|
+
{
|
|
41
|
+
return 'Boolean' === fieldType;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
isDateTimeFieldType(fieldType)
|
|
45
|
+
{
|
|
46
|
+
return 'DateTime' === fieldType || 'Date' === fieldType;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
isJsonFieldType(fieldType)
|
|
50
|
+
{
|
|
51
|
+
return 'Json' === fieldType;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
isJsonFieldByName(fieldName)
|
|
55
|
+
{
|
|
56
|
+
if(this.jsonFields.has(fieldName)){
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if(!this.rawModel || !this.rawModel.properties){
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return 'json' === sc.get(this.rawModel.properties[fieldName], 'dbType', '');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
isStringFieldType(fieldType)
|
|
66
|
+
{
|
|
67
|
+
return 'String' === fieldType;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
isNullOrEmpty(value)
|
|
71
|
+
{
|
|
72
|
+
return null === value || undefined === value || '' === value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
isValidCastedValue(value)
|
|
76
|
+
{
|
|
77
|
+
return undefined !== value;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
castValue(value, fieldType, fieldName = null)
|
|
81
|
+
{
|
|
82
|
+
if('id' === fieldName){
|
|
83
|
+
return this.castToIdType(value);
|
|
84
|
+
}
|
|
85
|
+
if(this.isNullOrEmpty(value)){
|
|
86
|
+
if(sc.hasOwn(this.fieldDefaults, fieldName)){
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
if(-1 !== this.optionalFields.indexOf(fieldName)){
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
if(-1 !== this.requiredFields.indexOf(fieldName)){
|
|
93
|
+
Logger.warning('Required field '+fieldName+' cannot be null or empty');
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
if(this.isJsonFieldByName(fieldName)){
|
|
99
|
+
return this.castToJsonType(value);
|
|
100
|
+
}
|
|
101
|
+
if(this.isNumericFieldType(fieldType)){
|
|
102
|
+
return this.castToNumericType(value, fieldType);
|
|
103
|
+
}
|
|
104
|
+
if(this.isBooleanFieldType(fieldType)){
|
|
105
|
+
return this.castToBooleanType(value);
|
|
106
|
+
}
|
|
107
|
+
if(this.isDateTimeFieldType(fieldType)){
|
|
108
|
+
return this.castToDateType(value);
|
|
109
|
+
}
|
|
110
|
+
if(this.isStringFieldType(fieldType)){
|
|
111
|
+
return this.castToStringType(value);
|
|
112
|
+
}
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
castToIdType(value)
|
|
117
|
+
{
|
|
118
|
+
if(this.isNullOrEmpty(value)){
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
if(this.isNumericFieldType(this.idFieldType)){
|
|
122
|
+
let numeric = Number(value);
|
|
123
|
+
if(!isNaN(numeric)){
|
|
124
|
+
return ('Int' === this.idFieldType || 'BigInt' === this.idFieldType) ? Math.floor(numeric) : numeric;
|
|
125
|
+
}
|
|
126
|
+
Logger.warning('Cannot cast non-numeric value "'+value+'" to ID type '+this.idFieldType);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
return String(value);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
castToNumericType(value, fieldType)
|
|
133
|
+
{
|
|
134
|
+
if(this.isNullOrEmpty(value)){
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
let numericValue = Number(value);
|
|
138
|
+
if(isNaN(numericValue)){
|
|
139
|
+
Logger.warning('Cannot convert value to numeric: '+value);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
if('Int' === fieldType || 'BigInt' === fieldType){
|
|
143
|
+
return Math.floor(numericValue);
|
|
144
|
+
}
|
|
145
|
+
return numericValue;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
castToBooleanType(value)
|
|
149
|
+
{
|
|
150
|
+
if(this.isNullOrEmpty(value)){
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if('boolean' === typeof value){
|
|
154
|
+
return value;
|
|
155
|
+
}
|
|
156
|
+
if('number' === typeof value){
|
|
157
|
+
return 0 !== value;
|
|
158
|
+
}
|
|
159
|
+
if('string' === typeof value){
|
|
160
|
+
let lowerValue = value.toLowerCase();
|
|
161
|
+
if('true' === lowerValue || '1' === lowerValue || 'yes' === lowerValue){
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
if('false' === lowerValue || '0' === lowerValue || 'no' === lowerValue){
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return Boolean(value);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
castToDateType(dateValue)
|
|
172
|
+
{
|
|
173
|
+
if(dateValue instanceof Date){
|
|
174
|
+
return dateValue;
|
|
175
|
+
}
|
|
176
|
+
if(this.isNullOrEmpty(dateValue)){
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
let dateString = String(dateValue);
|
|
180
|
+
if(dateString.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)){
|
|
181
|
+
return new Date(dateString.replace(' ', 'T')+'Z');
|
|
182
|
+
}
|
|
183
|
+
if(dateString.match(/^\d{4}-\d{2}-\d{2}$/)){
|
|
184
|
+
return new Date(dateString+'T00:00:00Z');
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
let parsedDate = new Date(dateString);
|
|
188
|
+
if(isNaN(parsedDate.getTime())){
|
|
189
|
+
Logger.warning('Invalid date value: '+dateString);
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
return parsedDate;
|
|
193
|
+
} catch(error) {
|
|
194
|
+
Logger.warning('Failed to convert date value: '+dateString);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
castToJsonType(value)
|
|
200
|
+
{
|
|
201
|
+
if(this.isNullOrEmpty(value)){
|
|
202
|
+
return this.prismaDbNull || null;
|
|
203
|
+
}
|
|
204
|
+
if('object' === typeof value){
|
|
205
|
+
return value;
|
|
206
|
+
}
|
|
207
|
+
if('string' === typeof value){
|
|
208
|
+
if(value.startsWith('%') && value.endsWith('%')){
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
return JSON.parse(value);
|
|
213
|
+
} catch(error) {
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
castToStringType(value)
|
|
221
|
+
{
|
|
222
|
+
if(null === value || undefined === value){
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
if('string' === typeof value){
|
|
226
|
+
if('null' === value){
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
return value;
|
|
230
|
+
}
|
|
231
|
+
return String(value);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
castFieldsInData(data)
|
|
235
|
+
{
|
|
236
|
+
if(!sc.isObject(data)){
|
|
237
|
+
return data;
|
|
238
|
+
}
|
|
239
|
+
let casted = {};
|
|
240
|
+
for(let key of Object.keys(data)){
|
|
241
|
+
let value = data[key];
|
|
242
|
+
if('number' === typeof value && (0 === value || 1 === value)){
|
|
243
|
+
casted[key] = 0 !== value;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
casted[key] = value;
|
|
247
|
+
}
|
|
248
|
+
return casted;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
normalizeReturnData(data)
|
|
252
|
+
{
|
|
253
|
+
if(null === data || undefined === data){
|
|
254
|
+
return data;
|
|
255
|
+
}
|
|
256
|
+
if('boolean' === typeof data){
|
|
257
|
+
return data ? 1 : 0;
|
|
258
|
+
}
|
|
259
|
+
if('bigint' === typeof data){
|
|
260
|
+
return Number(data);
|
|
261
|
+
}
|
|
262
|
+
if(data instanceof Date){
|
|
263
|
+
return data;
|
|
264
|
+
}
|
|
265
|
+
if(sc.isArray(data)){
|
|
266
|
+
return data.map(item => this.normalizeReturnData(item));
|
|
267
|
+
}
|
|
268
|
+
if(sc.isObject(data)){
|
|
269
|
+
let result = {};
|
|
270
|
+
for(let key of Object.keys(data)){
|
|
271
|
+
result[key] = this.normalizeReturnData(data[key]);
|
|
272
|
+
}
|
|
273
|
+
return result;
|
|
274
|
+
}
|
|
275
|
+
return data;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
module.exports.PrismaTypeCaster = PrismaTypeCaster;
|
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.90.0",
|
|
5
5
|
"description": "Reldens - Storage",
|
|
6
6
|
"author": "Damian A. Pastorini",
|
|
7
7
|
"license": "MIT",
|
|
@@ -41,16 +41,25 @@
|
|
|
41
41
|
"bugs": {
|
|
42
42
|
"url": "https://github.com/damian-pastorini/reldens-storage/issues"
|
|
43
43
|
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"test": "node tests/run-tests.js",
|
|
46
|
+
"test:watch": "node --watch tests/run-tests.js",
|
|
47
|
+
"test:filter": "node tests/run-tests.js --filter=",
|
|
48
|
+
"test:unit": "node tests/run-tests.js --suite=unit",
|
|
49
|
+
"test:integration": "node tests/run-tests.js --suite=integration",
|
|
50
|
+
"test:coverage": "node --test --experimental-test-coverage tests/run-tests.js",
|
|
51
|
+
"test:driver": "node tests/run-tests.js --driver="
|
|
52
|
+
},
|
|
44
53
|
"dependencies": {
|
|
45
|
-
"@mikro-orm/core": "6.6.
|
|
46
|
-
"@mikro-orm/mongodb": "6.6.
|
|
47
|
-
"@mikro-orm/mysql": "6.6.
|
|
54
|
+
"@mikro-orm/core": "6.6.6",
|
|
55
|
+
"@mikro-orm/mongodb": "6.6.6",
|
|
56
|
+
"@mikro-orm/mysql": "6.6.6",
|
|
48
57
|
"@prisma/client": "6.19.2",
|
|
49
|
-
"@reldens/server-utils": "^0.
|
|
58
|
+
"@reldens/server-utils": "^0.46.0",
|
|
50
59
|
"@reldens/utils": "^0.54.0",
|
|
51
60
|
"knex": "3.1.0",
|
|
52
61
|
"mysql": "2.18.1",
|
|
53
|
-
"mysql2": "3.16.
|
|
62
|
+
"mysql2": "3.16.2",
|
|
54
63
|
"objection": "3.1.5",
|
|
55
64
|
"prisma": "6.19.2"
|
|
56
65
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
RELDENS_TEST_DB_HOST=localhost
|
|
2
|
+
RELDENS_TEST_DB_PORT=3306
|
|
3
|
+
RELDENS_TEST_DB_USER=test_user
|
|
4
|
+
RELDENS_TEST_DB_PASSWORD=test_password
|
|
5
|
+
RELDENS_TEST_DB_NAME=reldens_storage_test
|
|
6
|
+
RELDENS_TEST_DB_CLIENT=mysql
|
|
7
|
+
RELDENS_DB_URL=mysql://test_user:test_password@localhost:3306/reldens_storage_test
|