@proteinjs/db 1.0.14 → 1.0.16

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.
Files changed (105) hide show
  1. package/.eslintrc.js +20 -0
  2. package/.prettierignore +3 -0
  3. package/.prettierrc +8 -0
  4. package/CHANGELOG.md +14 -24
  5. package/LICENSE +21 -0
  6. package/dist/generated/index.js +1 -1
  7. package/dist/generated/index.js.map +1 -1
  8. package/dist/src/Columns.d.ts.map +1 -1
  9. package/dist/src/Columns.js +34 -17
  10. package/dist/src/Columns.js.map +1 -1
  11. package/dist/src/Db.d.ts.map +1 -1
  12. package/dist/src/Db.js +45 -18
  13. package/dist/src/Db.js.map +1 -1
  14. package/dist/src/MigrationRunner.d.ts.map +1 -1
  15. package/dist/src/MigrationRunner.js +15 -7
  16. package/dist/src/MigrationRunner.js.map +1 -1
  17. package/dist/src/QueryBuilderFactory.d.ts.map +1 -1
  18. package/dist/src/QueryBuilderFactory.js +5 -7
  19. package/dist/src/QueryBuilderFactory.js.map +1 -1
  20. package/dist/src/Record.d.ts.map +1 -1
  21. package/dist/src/Record.js +4 -2
  22. package/dist/src/Record.js.map +1 -1
  23. package/dist/src/StatementConfigFactory.d.ts.map +1 -1
  24. package/dist/src/StatementConfigFactory.js +3 -2
  25. package/dist/src/StatementConfigFactory.js.map +1 -1
  26. package/dist/src/Table.d.ts.map +1 -1
  27. package/dist/src/Table.js +6 -3
  28. package/dist/src/Table.js.map +1 -1
  29. package/dist/src/auth/TableAuth.d.ts.map +1 -1
  30. package/dist/src/auth/TableAuth.js +16 -11
  31. package/dist/src/auth/TableAuth.js.map +1 -1
  32. package/dist/src/auth/TableServiceAuth.d.ts.map +1 -1
  33. package/dist/src/auth/TableServiceAuth.js +12 -6
  34. package/dist/src/auth/TableServiceAuth.js.map +1 -1
  35. package/dist/src/reference/Reference.d.ts.map +1 -1
  36. package/dist/src/reference/Reference.js.map +1 -1
  37. package/dist/src/reference/ReferenceArray.d.ts.map +1 -1
  38. package/dist/src/reference/ReferenceArray.js.map +1 -1
  39. package/dist/src/schema/SchemaMetadata.d.ts.map +1 -1
  40. package/dist/src/schema/SchemaMetadata.js +18 -15
  41. package/dist/src/schema/SchemaMetadata.js.map +1 -1
  42. package/dist/src/schema/SchemaOperations.d.ts.map +1 -1
  43. package/dist/src/schema/TableManager.d.ts.map +1 -1
  44. package/dist/src/schema/TableManager.js +24 -9
  45. package/dist/src/schema/TableManager.js.map +1 -1
  46. package/dist/src/serializers/GraphSerializer.d.ts.map +1 -1
  47. package/dist/src/serializers/QueryBuilderSerializer.d.ts.map +1 -1
  48. package/dist/src/serializers/ReferenceArraySerializer.d.ts.map +1 -1
  49. package/dist/src/serializers/ReferenceArraySerializer.js.map +1 -1
  50. package/dist/src/serializers/ReferenceSerializer.d.ts.map +1 -1
  51. package/dist/src/serializers/TableSerializer.d.ts.map +1 -1
  52. package/dist/src/services/DbService.d.ts.map +1 -1
  53. package/dist/src/source/SourceRecord.d.ts.map +1 -1
  54. package/dist/src/source/SourceRecord.js +7 -3
  55. package/dist/src/source/SourceRecord.js.map +1 -1
  56. package/dist/src/source/SourceRecordLoader.d.ts.map +1 -1
  57. package/dist/src/source/SourceRecordLoader.js +11 -4
  58. package/dist/src/source/SourceRecordLoader.js.map +1 -1
  59. package/dist/src/source/SourceRecordRepo.d.ts.map +1 -1
  60. package/dist/src/source/SourceRecordRepo.js.map +1 -1
  61. package/dist/src/tables/MigrationTable.d.ts.map +1 -1
  62. package/dist/src/tables/MigrationTable.js.map +1 -1
  63. package/dist/src/tables/tables.d.ts.map +1 -1
  64. package/dist/src/tables/tables.js.map +1 -1
  65. package/dist/test/CrudTests.d.ts +2 -0
  66. package/dist/test/CrudTests.d.ts.map +1 -1
  67. package/dist/test/CrudTests.js +19 -4
  68. package/dist/test/CrudTests.js.map +1 -1
  69. package/dist/test/TableManagerTests.d.ts.map +1 -1
  70. package/dist/test/TableManagerTests.js +17 -9
  71. package/dist/test/TableManagerTests.js.map +1 -1
  72. package/generated/index.ts +15 -18
  73. package/index.ts +1 -1
  74. package/jest.config.js +8 -17
  75. package/package.json +49 -43
  76. package/src/Columns.ts +284 -241
  77. package/src/Db.ts +188 -147
  78. package/src/MigrationRunner.ts +24 -10
  79. package/src/QueryBuilderFactory.ts +6 -9
  80. package/src/Record.ts +35 -29
  81. package/src/StatementConfigFactory.ts +14 -16
  82. package/src/Table.ts +91 -88
  83. package/src/auth/TableAuth.ts +37 -27
  84. package/src/auth/TableServiceAuth.ts +11 -9
  85. package/src/opt/moment.ts +1 -1
  86. package/src/reference/Reference.ts +7 -7
  87. package/src/reference/ReferenceArray.ts +8 -8
  88. package/src/schema/SchemaMetadata.ts +84 -64
  89. package/src/schema/SchemaOperations.ts +2 -2
  90. package/src/schema/TableManager.ts +178 -168
  91. package/src/serializers/GraphSerializer.ts +4 -4
  92. package/src/serializers/QueryBuilderSerializer.ts +11 -11
  93. package/src/serializers/ReferenceArraySerializer.ts +12 -8
  94. package/src/serializers/ReferenceSerializer.ts +7 -7
  95. package/src/serializers/TableSerializer.ts +5 -5
  96. package/src/services/DbService.ts +3 -3
  97. package/src/services/MigrationRunnerService.ts +1 -1
  98. package/src/source/SourceRecord.ts +43 -24
  99. package/src/source/SourceRecordLoader.ts +29 -18
  100. package/src/source/SourceRecordRepo.ts +3 -3
  101. package/src/tables/MigrationTable.ts +5 -5
  102. package/src/tables/tables.ts +1 -1
  103. package/test/CrudTests.ts +46 -26
  104. package/test/TableManagerTests.ts +329 -154
  105. package/tsconfig.json +18 -22
package/src/Columns.ts CHANGED
@@ -8,283 +8,326 @@ import { Reference } from './reference/Reference';
8
8
  import { QueryBuilderFactory } from './QueryBuilderFactory';
9
9
 
10
10
  export class IntegerColumn implements Column<number, number> {
11
- constructor(
12
- public name: string,
13
- public options?: ColumnOptions,
14
- public large = false
15
- ) {}
11
+ constructor(
12
+ public name: string,
13
+ public options?: ColumnOptions,
14
+ public large = false
15
+ ) {}
16
16
  }
17
17
 
18
18
  export class StringColumn<T = string> implements Column<T, string> {
19
- constructor(
20
- public name: string,
21
- public options?: ColumnOptions,
22
- public maxLength: number|'MAX' = 255
23
- ) {
24
- this.options = Object.assign({
25
- ui: {
26
- hidden: maxLength === 'MAX',
27
- },
28
- }, options);
29
- }
19
+ constructor(
20
+ public name: string,
21
+ public options?: ColumnOptions,
22
+ public maxLength: number | 'MAX' = 255
23
+ ) {
24
+ this.options = Object.assign(
25
+ {
26
+ ui: {
27
+ hidden: maxLength === 'MAX',
28
+ },
29
+ },
30
+ options
31
+ );
32
+ }
30
33
  }
31
34
 
32
35
  export class FloatColumn implements Column<number, number> {
33
- constructor(
34
- public name: string,
35
- public options?: ColumnOptions
36
- ) {}
36
+ constructor(
37
+ public name: string,
38
+ public options?: ColumnOptions
39
+ ) {}
37
40
  }
38
41
 
39
42
  export class DecimalColumn implements Column<number, number> {
40
- constructor(
41
- public name: string,
42
- public options?: ColumnOptions,
43
- public large = false
44
- ) {}
43
+ constructor(
44
+ public name: string,
45
+ public options?: ColumnOptions,
46
+ public large = false
47
+ ) {}
45
48
  }
46
49
 
47
50
  export class BooleanColumn implements Column<boolean, boolean> {
48
- constructor(
49
- public name: string,
50
- public options?: ColumnOptions
51
- ) {}
52
-
53
- async serialize(fieldValue: boolean|undefined): Promise<boolean> {
54
- if (fieldValue)
55
- return true;
56
-
57
- return false;
58
- }
59
-
60
- async deserialize(serializedFieldValue: boolean): Promise<boolean> {
61
- if (serializedFieldValue)
62
- return true;
63
-
64
- return false;
65
- }
51
+ constructor(
52
+ public name: string,
53
+ public options?: ColumnOptions
54
+ ) {}
55
+
56
+ async serialize(fieldValue: boolean | undefined): Promise<boolean> {
57
+ if (fieldValue) {
58
+ return true;
59
+ }
60
+
61
+ return false;
62
+ }
63
+
64
+ async deserialize(serializedFieldValue: boolean): Promise<boolean> {
65
+ if (serializedFieldValue) {
66
+ return true;
67
+ }
68
+
69
+ return false;
70
+ }
66
71
  }
67
72
 
68
73
  export class DateColumn implements Column<Date, Date> {
69
- constructor(
70
- public name: string,
71
- public options?: ColumnOptions
72
- ) {}
74
+ constructor(
75
+ public name: string,
76
+ public options?: ColumnOptions
77
+ ) {}
73
78
  }
74
79
 
75
80
  export class DateTimeColumn implements Column<moment.Moment, Date> {
76
- constructor(
77
- public name: string,
78
- public options?: ColumnOptions
79
- ) {}
80
-
81
- async serialize(fieldValue: moment.Moment|undefined): Promise<Date|undefined> {
82
- if (typeof fieldValue === 'undefined')
83
- return;
84
-
85
- if (typeof fieldValue.toDate === 'undefined')
86
- return moment(fieldValue).toDate();
87
-
88
- return fieldValue.toDate();
89
- }
90
-
91
- async deserialize(serializedFieldValue: Date): Promise<moment.Moment> {
92
- return moment(serializedFieldValue);
93
- }
81
+ constructor(
82
+ public name: string,
83
+ public options?: ColumnOptions
84
+ ) {}
85
+
86
+ async serialize(fieldValue: moment.Moment | undefined): Promise<Date | undefined> {
87
+ if (typeof fieldValue === 'undefined') {
88
+ return;
89
+ }
90
+
91
+ if (typeof fieldValue.toDate === 'undefined') {
92
+ return moment(fieldValue).toDate();
93
+ }
94
+
95
+ return fieldValue.toDate();
96
+ }
97
+
98
+ async deserialize(serializedFieldValue: Date): Promise<moment.Moment> {
99
+ return moment(serializedFieldValue);
100
+ }
94
101
  }
95
102
 
96
103
  export class BinaryColumn implements Column<number, number> {
97
- constructor(
98
- public name: string,
99
- public options?: ColumnOptions,
100
- public maxLength?: number|'MAX',
101
- ) {
102
- this.options = Object.assign({
103
- ui: {
104
- hidden: true,
105
- },
106
- }, options);
107
- }
104
+ constructor(
105
+ public name: string,
106
+ public options?: ColumnOptions,
107
+ public maxLength?: number | 'MAX'
108
+ ) {
109
+ this.options = Object.assign(
110
+ {
111
+ ui: {
112
+ hidden: true,
113
+ },
114
+ },
115
+ options
116
+ );
117
+ }
108
118
  }
109
119
 
110
120
  export class UuidColumn extends StringColumn {
111
- constructor(
112
- name: string,
113
- options?: ColumnOptions
114
- ) {
115
- super(name, Object.assign({
116
- defaultValue: async () => uuidv1(),
117
- ui: {
118
- hidden: true,
119
- },
120
- }, options), 36);
121
- }
121
+ constructor(name: string, options?: ColumnOptions) {
122
+ super(
123
+ name,
124
+ Object.assign(
125
+ {
126
+ defaultValue: async () => uuidv1(),
127
+ ui: {
128
+ hidden: true,
129
+ },
130
+ },
131
+ options
132
+ ),
133
+ 36
134
+ );
135
+ }
122
136
  }
123
137
 
124
138
  export class PasswordColumn extends StringColumn {
125
- constructor(
126
- name: string,
127
- options?: ColumnOptions
128
- ) {
129
- super(name, Object.assign({ ui: { hidden: true } }, options));
130
- }
139
+ constructor(name: string, options?: ColumnOptions) {
140
+ super(name, Object.assign({ ui: { hidden: true } }, options));
141
+ }
131
142
  }
132
143
 
133
144
  export class ObjectColumn<T> extends StringColumn<T> {
134
- constructor(
135
- name: string,
136
- options?: ColumnOptions
137
- ) {
138
- super(name, Object.assign({
139
- ui: {
140
- hidden: true,
141
- },
142
- }, options), 'MAX'); // MAX is 4gb
143
- }
144
-
145
- async serialize(fieldValue: T|undefined): Promise<string|undefined> {
146
- if (typeof fieldValue === 'undefined' || fieldValue == null)
147
- return;
148
-
149
- return JSON.stringify(fieldValue);
150
- }
151
-
152
- async deserialize(serializedFieldValue: string): Promise<T|undefined> {
153
- if (typeof serializedFieldValue === 'undefined' || serializedFieldValue == null)
154
- return;
155
-
156
- return JSON.parse(serializedFieldValue);
157
- }
145
+ constructor(name: string, options?: ColumnOptions) {
146
+ super(
147
+ name,
148
+ Object.assign(
149
+ {
150
+ ui: {
151
+ hidden: true,
152
+ },
153
+ },
154
+ options
155
+ ),
156
+ 'MAX'
157
+ ); // MAX is 4gb
158
+ }
159
+
160
+ async serialize(fieldValue: T | undefined): Promise<string | undefined> {
161
+ if (typeof fieldValue === 'undefined' || fieldValue == null) {
162
+ return;
163
+ }
164
+
165
+ return JSON.stringify(fieldValue);
166
+ }
167
+
168
+ async deserialize(serializedFieldValue: string): Promise<T | undefined> {
169
+ if (typeof serializedFieldValue === 'undefined' || serializedFieldValue == null) {
170
+ return;
171
+ }
172
+
173
+ return JSON.parse(serializedFieldValue);
174
+ }
158
175
  }
159
176
 
160
177
  export class ArrayColumn<T> extends ObjectColumn<T[]> {
161
- constructor(
162
- name: string,
163
- options?: ColumnOptions
164
- ) {
165
- super(name, Object.assign({
166
- ui: {
167
- hidden: true,
168
- },
169
- }, options));
170
- }
178
+ constructor(name: string, options?: ColumnOptions) {
179
+ super(
180
+ name,
181
+ Object.assign(
182
+ {
183
+ ui: {
184
+ hidden: true,
185
+ },
186
+ },
187
+ options
188
+ )
189
+ );
190
+ }
171
191
  }
172
192
 
173
193
  export class ReferenceArrayColumn<T extends Record> extends ObjectColumn<ReferenceArray<T>> {
174
- /**
175
- * A column that stores an array of references to other records.
176
- *
177
- * @param name name of column
178
- * @param referenceTable name of table that the reference records are in
179
- * @param cascadeDelete if true referenced records will be deleted when this record is deleted
180
- * @param options generic column options
181
- */
182
- constructor(
183
- name: string,
184
- public referenceTable: string,
185
- public cascadeDelete: boolean,
186
- options?: ColumnOptions
187
- ) {
188
- super(name, Object.assign({
189
- ui: {
190
- hidden: true,
191
- },
192
- }, options));
193
- }
194
-
195
- async serialize(fieldValue: ReferenceArray<T>|undefined): Promise<string|undefined> {
196
- if (typeof fieldValue === 'undefined')
197
- return;
198
-
199
- const ids = (await fieldValue.get()).map(record => record.id);
200
- return await super.serialize(ids as any);
201
- }
202
-
203
- async deserialize(serializedFieldValue: string): Promise<ReferenceArray<T>> {
204
- let ids = (await super.deserialize(serializedFieldValue)) as string[]|undefined;
205
- if (typeof ids === 'undefined')
206
- ids = [];
207
-
208
- return new ReferenceArray(this.referenceTable, ids);
209
- }
210
-
211
- async beforeDelete(table: Table<any>, columnPropertyName: string, records: any[]) {
212
- if (!this.cascadeDelete)
213
- return;
214
-
215
- const recordIdsToDelete: string[] = [];
216
- for (let record of records) {
217
- const referenceArray = record[columnPropertyName] as ReferenceArray<Record>;
218
- const referenceRecords = await referenceArray.get();
219
- for (let referenceRecord of referenceRecords)
220
- recordIdsToDelete.push(referenceRecord.id);
221
- }
222
-
223
- if (recordIdsToDelete.length < 1)
224
- return;
225
-
226
- const referenceTable = tableByName(this.referenceTable);
227
- const qb = new QueryBuilderFactory().getQueryBuilder(referenceTable)
228
- .condition({ field: 'id', operator: 'IN', value: recordIdsToDelete })
229
- ;
230
- await new Db().delete(referenceTable, qb);
231
- }
194
+ /**
195
+ * A column that stores an array of references to other records.
196
+ *
197
+ * @param name name of column
198
+ * @param referenceTable name of table that the reference records are in
199
+ * @param cascadeDelete if true referenced records will be deleted when this record is deleted
200
+ * @param options generic column options
201
+ */
202
+ constructor(
203
+ name: string,
204
+ public referenceTable: string,
205
+ public cascadeDelete: boolean,
206
+ options?: ColumnOptions
207
+ ) {
208
+ super(
209
+ name,
210
+ Object.assign(
211
+ {
212
+ ui: {
213
+ hidden: true,
214
+ },
215
+ },
216
+ options
217
+ )
218
+ );
219
+ }
220
+
221
+ async serialize(fieldValue: ReferenceArray<T> | undefined): Promise<string | undefined> {
222
+ if (typeof fieldValue === 'undefined') {
223
+ return;
224
+ }
225
+
226
+ const ids = (await fieldValue.get()).map((record) => record.id);
227
+ return await super.serialize(ids as any);
228
+ }
229
+
230
+ async deserialize(serializedFieldValue: string): Promise<ReferenceArray<T>> {
231
+ let ids = (await super.deserialize(serializedFieldValue)) as string[] | undefined;
232
+ if (typeof ids === 'undefined') {
233
+ ids = [];
234
+ }
235
+
236
+ return new ReferenceArray(this.referenceTable, ids);
237
+ }
238
+
239
+ async beforeDelete(table: Table<any>, columnPropertyName: string, records: any[]) {
240
+ if (!this.cascadeDelete) {
241
+ return;
242
+ }
243
+
244
+ const recordIdsToDelete: string[] = [];
245
+ for (const record of records) {
246
+ const referenceArray = record[columnPropertyName] as ReferenceArray<Record>;
247
+ const referenceRecords = await referenceArray.get();
248
+ for (const referenceRecord of referenceRecords) {
249
+ recordIdsToDelete.push(referenceRecord.id);
250
+ }
251
+ }
252
+
253
+ if (recordIdsToDelete.length < 1) {
254
+ return;
255
+ }
256
+
257
+ const referenceTable = tableByName(this.referenceTable);
258
+ const qb = new QueryBuilderFactory()
259
+ .getQueryBuilder(referenceTable)
260
+ .condition({ field: 'id', operator: 'IN', value: recordIdsToDelete });
261
+ await new Db().delete(referenceTable, qb);
262
+ }
232
263
  }
233
264
 
234
265
  export class ReferenceColumn<T extends Record> extends StringColumn<Reference<T>> {
235
- /**
236
- * A column that stores a reference (id) to another record.
237
- *
238
- * @param name name of column
239
- * @param referenceTable name of table that the reference record is in
240
- * @param cascadeDelete if true referenced record will be deleted when this record is deleted
241
- * @param options generic column options
242
- */
243
- constructor(
244
- name: string,
245
- public referenceTable: string,
246
- public cascadeDelete: boolean,
247
- options?: ColumnOptions
248
- ) {
249
- super(name, Object.assign({
250
- ui: {
251
- hidden: true,
252
- },
253
- }, options), 36);
254
- }
255
-
256
- async serialize(fieldValue: Reference<T>|undefined): Promise<string|undefined> {
257
- if (typeof fieldValue === 'undefined')
258
- return;
259
-
260
- if (!fieldValue._id)
261
- return;
262
-
263
- return fieldValue._id;
264
- }
265
-
266
- async deserialize(serializedFieldValue: string): Promise<Reference<T>> {
267
- return new Reference(this.referenceTable, serializedFieldValue);
268
- }
269
-
270
- async beforeDelete(table: Table<any>, columnPropertyName: string, records: any[]) {
271
- if (!this.cascadeDelete)
272
- return;
273
-
274
- const recordIdsToDelete: string[] = [];
275
- for (let record of records) {
276
- const reference = record[columnPropertyName] as Reference<Record>;
277
- if (reference && reference._id)
278
- recordIdsToDelete.push(reference._id);
279
- }
280
-
281
- if (recordIdsToDelete.length < 1)
282
- return;
283
-
284
- const referenceTable = tableByName(this.referenceTable);
285
- const qb = new QueryBuilderFactory().getQueryBuilder(referenceTable)
286
- .condition({ field: 'id', operator: 'IN', value: recordIdsToDelete })
287
- ;
288
- await new Db().delete(referenceTable, qb);
289
- }
290
- }
266
+ /**
267
+ * A column that stores a reference (id) to another record.
268
+ *
269
+ * @param name name of column
270
+ * @param referenceTable name of table that the reference record is in
271
+ * @param cascadeDelete if true referenced record will be deleted when this record is deleted
272
+ * @param options generic column options
273
+ */
274
+ constructor(
275
+ name: string,
276
+ public referenceTable: string,
277
+ public cascadeDelete: boolean,
278
+ options?: ColumnOptions
279
+ ) {
280
+ super(
281
+ name,
282
+ Object.assign(
283
+ {
284
+ ui: {
285
+ hidden: true,
286
+ },
287
+ },
288
+ options
289
+ ),
290
+ 36
291
+ );
292
+ }
293
+
294
+ async serialize(fieldValue: Reference<T> | undefined): Promise<string | undefined> {
295
+ if (typeof fieldValue === 'undefined') {
296
+ return;
297
+ }
298
+
299
+ if (!fieldValue._id) {
300
+ return;
301
+ }
302
+
303
+ return fieldValue._id;
304
+ }
305
+
306
+ async deserialize(serializedFieldValue: string): Promise<Reference<T>> {
307
+ return new Reference(this.referenceTable, serializedFieldValue);
308
+ }
309
+
310
+ async beforeDelete(table: Table<any>, columnPropertyName: string, records: any[]) {
311
+ if (!this.cascadeDelete) {
312
+ return;
313
+ }
314
+
315
+ const recordIdsToDelete: string[] = [];
316
+ for (const record of records) {
317
+ const reference = record[columnPropertyName] as Reference<Record>;
318
+ if (reference && reference._id) {
319
+ recordIdsToDelete.push(reference._id);
320
+ }
321
+ }
322
+
323
+ if (recordIdsToDelete.length < 1) {
324
+ return;
325
+ }
326
+
327
+ const referenceTable = tableByName(this.referenceTable);
328
+ const qb = new QueryBuilderFactory()
329
+ .getQueryBuilder(referenceTable)
330
+ .condition({ field: 'id', operator: 'IN', value: recordIdsToDelete });
331
+ await new Db().delete(referenceTable, qb);
332
+ }
333
+ }