@simonbackx/simple-database 1.24.0 → 1.26.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/dist/index.d.ts +9 -9
- package/dist/index.js.map +1 -1
- package/dist/migrations.d.ts +1 -1
- package/dist/migrations.js +6 -4
- package/dist/migrations.js.map +1 -1
- package/dist/src/classes/Column.d.ts +10 -6
- package/dist/src/classes/Column.js +62 -31
- package/dist/src/classes/Column.js.map +1 -1
- package/dist/src/classes/Database.d.ts +3 -2
- package/dist/src/classes/Database.js +26 -27
- package/dist/src/classes/Database.js.map +1 -1
- package/dist/src/classes/Factory.d.ts +1 -1
- package/dist/src/classes/Factory.js +5 -5
- package/dist/src/classes/ManyToManyRelation.d.ts +3 -3
- package/dist/src/classes/ManyToManyRelation.js +51 -51
- package/dist/src/classes/ManyToManyRelation.js.map +1 -1
- package/dist/src/classes/ManyToOneRelation.d.ts +1 -1
- package/dist/src/classes/ManyToOneRelation.js +2 -2
- package/dist/src/classes/ManyToOneRelation.js.map +1 -1
- package/dist/src/classes/Migration.js +19 -19
- package/dist/src/classes/Migration.js.map +1 -1
- package/dist/src/classes/Model.d.ts +41 -14
- package/dist/src/classes/Model.js +132 -88
- package/dist/src/classes/Model.js.map +1 -1
- package/dist/src/classes/Model.test.js +144 -144
- package/dist/src/classes/Model.test.js.map +1 -1
- package/dist/src/classes/OneToManyRelation.d.ts +3 -3
- package/dist/src/classes/OneToManyRelation.js +9 -9
- package/dist/src/classes/OneToManyRelation.js.map +1 -1
- package/dist/src/classes/data/boys.js +1000 -1000
- package/dist/src/classes/data/family-names.js +997 -997
- package/dist/src/classes/data/girls.js +999 -999
- package/dist/src/classes/data/streets.js +291 -291
- package/dist/src/decorators/Column.d.ts +4 -4
- package/dist/src/decorators/Column.js +1 -1
- package/dist/src/decorators/Column.js.map +1 -1
- package/dist/src/models/Migration.d.ts +1 -1
- package/dist/src/models/Migration.js +8 -8
- package/dist/src/models/Migration.js.map +1 -1
- package/dist/tests/jest.global.setup.d.ts +1 -0
- package/dist/tests/jest.global.setup.js +5 -3
- package/dist/tests/jest.global.setup.js.map +1 -1
- package/package.json +5 -8
|
@@ -11,28 +11,28 @@ class ManyToManyRelation {
|
|
|
11
11
|
if (this.modelLink) {
|
|
12
12
|
return this.modelLink.table;
|
|
13
13
|
}
|
|
14
|
-
return
|
|
14
|
+
return '_' + [this.modelA.table, this.modelB.table].sort().join('_');
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* e.g. modelsId
|
|
18
18
|
*/
|
|
19
19
|
get linkKeyA() {
|
|
20
|
-
return (this.modelA.table
|
|
21
|
-
this.modelA.primary.name.charAt(0).toUpperCase()
|
|
22
|
-
this.modelA.primary.name.substring(1)
|
|
23
|
-
(this.modelA === this.modelB ?
|
|
20
|
+
return (this.modelA.table
|
|
21
|
+
+ this.modelA.primary.name.charAt(0).toUpperCase()
|
|
22
|
+
+ this.modelA.primary.name.substring(1)
|
|
23
|
+
+ (this.modelA === this.modelB ? 'A' : ''));
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* e.g. parentsId
|
|
27
27
|
*/
|
|
28
28
|
get linkKeyB() {
|
|
29
|
-
return (this.modelB.table
|
|
30
|
-
this.modelB.primary.name.charAt(0).toUpperCase()
|
|
31
|
-
this.modelB.primary.name.substring(1)
|
|
32
|
-
(this.modelA === this.modelB ?
|
|
29
|
+
return (this.modelB.table
|
|
30
|
+
+ this.modelB.primary.name.charAt(0).toUpperCase()
|
|
31
|
+
+ this.modelB.primary.name.substring(1)
|
|
32
|
+
+ (this.modelA === this.modelB ? 'B' : ''));
|
|
33
33
|
}
|
|
34
34
|
constructor(modelA, modelB, modelKey, modelLink) {
|
|
35
|
-
this.sortOrder =
|
|
35
|
+
this.sortOrder = 'ASC';
|
|
36
36
|
this.modelA = modelA;
|
|
37
37
|
this.modelB = modelB;
|
|
38
38
|
this.modelKey = modelKey;
|
|
@@ -41,36 +41,36 @@ class ManyToManyRelation {
|
|
|
41
41
|
reverse(modelKey) {
|
|
42
42
|
return new ManyToManyRelation(this.modelB, this.modelA, modelKey, this.modelLink);
|
|
43
43
|
}
|
|
44
|
-
setSort(key, order =
|
|
44
|
+
setSort(key, order = 'ASC') {
|
|
45
45
|
this.sortKey = key;
|
|
46
46
|
this.sortOrder = order;
|
|
47
47
|
return this;
|
|
48
48
|
}
|
|
49
49
|
/// Generate a join query
|
|
50
50
|
joinQuery(namespaceA, namespaceB) {
|
|
51
|
-
const linkNamespace = namespaceA +
|
|
51
|
+
const linkNamespace = namespaceA + '_' + namespaceB;
|
|
52
52
|
let str = `LEFT JOIN ${this.linkTable} as ${linkNamespace} on ${linkNamespace}.${this.linkKeyA} = ${namespaceA}.${this.modelA.primary.name}\n`;
|
|
53
53
|
str += `LEFT JOIN ${this.modelB.table} as ${namespaceB} on ${linkNamespace}.${this.linkKeyB} = ${namespaceB}.${this.modelB.primary.name}`;
|
|
54
54
|
return str;
|
|
55
55
|
}
|
|
56
56
|
orderByQuery(namespaceA, namespaceB) {
|
|
57
57
|
if (this.sortKey === undefined) {
|
|
58
|
-
return
|
|
58
|
+
return '';
|
|
59
59
|
}
|
|
60
|
-
const linkNamespace = namespaceA +
|
|
60
|
+
const linkNamespace = namespaceA + '_' + namespaceB;
|
|
61
61
|
let str = `\nORDER BY ${linkNamespace}.${this.sortKey}`;
|
|
62
|
-
if (this.sortOrder
|
|
63
|
-
str +=
|
|
62
|
+
if (this.sortOrder === 'DESC') {
|
|
63
|
+
str += ' DESC';
|
|
64
64
|
}
|
|
65
|
-
return str +
|
|
65
|
+
return str + '\n';
|
|
66
66
|
}
|
|
67
67
|
/// Load the relation of a model and return the loaded models
|
|
68
68
|
async load(modelA, sorted = true, where, whereLink) {
|
|
69
|
-
const namespaceB =
|
|
70
|
-
const linkNamespace =
|
|
69
|
+
const namespaceB = 'B';
|
|
70
|
+
const linkNamespace = 'A_B';
|
|
71
71
|
let select = this.modelB.getDefaultSelect(namespaceB);
|
|
72
72
|
if (this.modelLink) {
|
|
73
|
-
select +=
|
|
73
|
+
select += ', ' + this.modelLink.getDefaultSelect(linkNamespace);
|
|
74
74
|
}
|
|
75
75
|
let str = `SELECT ${select} FROM ${this.linkTable} as ${linkNamespace}\n`;
|
|
76
76
|
str += `JOIN ${this.modelB.table} as ${namespaceB} on ${linkNamespace}.${this.linkKeyB} = ${namespaceB}.${this.modelB.primary.name}\n`;
|
|
@@ -78,7 +78,7 @@ class ManyToManyRelation {
|
|
|
78
78
|
const params = [modelA.getPrimaryKey()];
|
|
79
79
|
if (where) {
|
|
80
80
|
for (const key in where) {
|
|
81
|
-
if (
|
|
81
|
+
if (Object.hasOwnProperty.call(where, key)) {
|
|
82
82
|
str += ` AND ${namespaceB}.\`${key}\` = ?`;
|
|
83
83
|
params.push(where[key]);
|
|
84
84
|
}
|
|
@@ -86,14 +86,14 @@ class ManyToManyRelation {
|
|
|
86
86
|
}
|
|
87
87
|
if (whereLink) {
|
|
88
88
|
for (const key in whereLink) {
|
|
89
|
-
if (
|
|
89
|
+
if (Object.hasOwnProperty.call(whereLink, key)) {
|
|
90
90
|
str += ` AND ${linkNamespace}.\`${key}\` = ?`;
|
|
91
91
|
params.push(whereLink[key]);
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
if (sorted) {
|
|
96
|
-
str += this.orderByQuery(
|
|
96
|
+
str += this.orderByQuery('A', 'B');
|
|
97
97
|
}
|
|
98
98
|
const [rows] = await Database_1.Database.select(str, params);
|
|
99
99
|
const modelsB = this.modelB.fromRows(rows, namespaceB);
|
|
@@ -102,9 +102,9 @@ class ManyToManyRelation {
|
|
|
102
102
|
for (const row of rows) {
|
|
103
103
|
const model = this.modelLink.fromRow(row[linkNamespace]);
|
|
104
104
|
// Fin modelB
|
|
105
|
-
const modelB = modelsB.find(
|
|
105
|
+
const modelB = modelsB.find(m => m.getPrimaryKey() === row[linkNamespace][this.linkKeyB]);
|
|
106
106
|
if (!modelB) {
|
|
107
|
-
throw new Error(
|
|
107
|
+
throw new Error('Unexpected linking');
|
|
108
108
|
}
|
|
109
109
|
// Save link
|
|
110
110
|
modelB._link = model;
|
|
@@ -121,13 +121,13 @@ class ManyToManyRelation {
|
|
|
121
121
|
async setLinkTable(modelA, modelB, linkTableValues) {
|
|
122
122
|
const str = `UPDATE ${this.linkTable} SET ? WHERE ${Database_1.Database.escapeId(this.linkKeyA)} = ? AND ${Database_1.Database.escapeId(this.linkKeyB)} = ?`;
|
|
123
123
|
const [result] = await Database_1.Database.update(str, [linkTableValues, modelA.getPrimaryKey(), modelB.getPrimaryKey()]);
|
|
124
|
-
if (result.changedRows
|
|
124
|
+
if (result.changedRows !== 1) {
|
|
125
125
|
// Todo: add option to fail silently
|
|
126
|
-
throw new Error(
|
|
126
|
+
throw new Error('Failed to update link table. Check if combination exists');
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
async linkIds(modelA, modelsB, linkTableValues) {
|
|
130
|
-
if (modelsB.length
|
|
130
|
+
if (modelsB.length === 0) {
|
|
131
131
|
return 0;
|
|
132
132
|
}
|
|
133
133
|
// Nested arrays are turned into grouped lists (for bulk inserts), e.g. [['a', 'b'], ['c', 'd']] turns into ('a', 'b'), ('c', 'd')
|
|
@@ -135,57 +135,57 @@ class ManyToManyRelation {
|
|
|
135
135
|
if (linkTableValues !== undefined) {
|
|
136
136
|
const linkTableKeys = Object.keys(linkTableValues);
|
|
137
137
|
for (const property in linkTableValues) {
|
|
138
|
-
if (
|
|
139
|
-
if (linkTableValues[property].length
|
|
140
|
-
throw new Error(
|
|
141
|
-
property
|
|
142
|
-
|
|
143
|
-
linkTableValues[property].length
|
|
144
|
-
|
|
145
|
-
modelsB.length
|
|
146
|
-
|
|
138
|
+
if (Object.hasOwnProperty.call(linkTableValues, property)) {
|
|
139
|
+
if (linkTableValues[property].length !== modelsB.length) {
|
|
140
|
+
throw new Error('Amount of link table values for key '
|
|
141
|
+
+ property
|
|
142
|
+
+ ' ('
|
|
143
|
+
+ linkTableValues[property].length
|
|
144
|
+
+ ') are not equal to amount of models linked ('
|
|
145
|
+
+ modelsB.length
|
|
146
|
+
+ ')');
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
const query = `INSERT INTO ${Database_1.Database.escapeId(this.linkTable)} (
|
|
151
151
|
${Database_1.Database.escapeId(this.linkKeyA)},
|
|
152
152
|
${Database_1.Database.escapeId(this.linkKeyB)},
|
|
153
|
-
${linkTableKeys.map(
|
|
153
|
+
${linkTableKeys.map(k => Database_1.Database.escapeId(k)).join(', ')}
|
|
154
154
|
) VALUES ?`;
|
|
155
|
-
[result] = await Database_1.Database.insert(query, [modelsB.map((modelB, i) => [modelA, modelB, ...linkTableKeys.map(
|
|
155
|
+
[result] = await Database_1.Database.insert(query, [modelsB.map((modelB, i) => [modelA, modelB, ...linkTableKeys.map(k => linkTableValues[k][i])])]);
|
|
156
156
|
}
|
|
157
157
|
else {
|
|
158
158
|
const query = `INSERT INTO ${Database_1.Database.escapeId(this.linkTable)} (
|
|
159
159
|
${Database_1.Database.escapeId(this.linkKeyA)},
|
|
160
160
|
${Database_1.Database.escapeId(this.linkKeyB)}
|
|
161
161
|
) VALUES ?`;
|
|
162
|
-
[result] = await Database_1.Database.insert(query, [modelsB.map(
|
|
162
|
+
[result] = await Database_1.Database.insert(query, [modelsB.map(modelB => [modelA, modelB])]);
|
|
163
163
|
}
|
|
164
164
|
return result.affectedRows;
|
|
165
165
|
}
|
|
166
166
|
async link(modelA, modelsB, linkTableValues) {
|
|
167
167
|
const modelAId = modelA.getPrimaryKey();
|
|
168
168
|
if (!modelAId) {
|
|
169
|
-
throw new Error(
|
|
169
|
+
throw new Error('Cannot link if model is not saved yet');
|
|
170
170
|
}
|
|
171
171
|
const affectedRows = await this.linkIds(modelAId, modelsB.map((modelB) => {
|
|
172
172
|
const id = modelB.getPrimaryKey();
|
|
173
173
|
if (!id) {
|
|
174
|
-
throw new Error(
|
|
174
|
+
throw new Error('Cannot link to a model that is not saved yet');
|
|
175
175
|
}
|
|
176
176
|
return id;
|
|
177
177
|
}), linkTableValues);
|
|
178
178
|
// If the relation is loaded, also modify the value of the relation
|
|
179
179
|
if (this.isLoaded(modelA)) {
|
|
180
|
-
if (affectedRows
|
|
180
|
+
if (affectedRows === modelsB.length) {
|
|
181
181
|
const arr = modelA[this.modelKey];
|
|
182
182
|
arr.push(...modelsB);
|
|
183
183
|
}
|
|
184
184
|
else {
|
|
185
185
|
// This could happen in race conditions and simultanious requests
|
|
186
|
-
console.warn(
|
|
186
|
+
console.warn('Warning: linking expected to affect ' + modelsB.length + ' rows, but only affected ' + affectedRows + ' rows');
|
|
187
187
|
// TODO: Manually correct by doing a query (safest)
|
|
188
|
-
throw new Error(
|
|
188
|
+
throw new Error('Fallback behaviour net yet implemented');
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
}
|
|
@@ -197,7 +197,7 @@ class ManyToManyRelation {
|
|
|
197
197
|
const query = `DELETE FROM ${this.linkTable} WHERE ${this.linkKeyA} = ?`;
|
|
198
198
|
// Arrays are turned into list, e.g. ['a', 'b'] turns into 'a', 'b'
|
|
199
199
|
const [result] = await Database_1.Database.delete(query, [modelA]);
|
|
200
|
-
if (result.affectedRows
|
|
200
|
+
if (result.affectedRows === 0 && Model_1.Model.debug) {
|
|
201
201
|
console.warn("Cleared many to many relation, but didn't deleted any entries");
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -225,20 +225,20 @@ class ManyToManyRelation {
|
|
|
225
225
|
return result;
|
|
226
226
|
}
|
|
227
227
|
async unlink(modelA, ...modelsB) {
|
|
228
|
-
const result = await this.unlinkIds(modelA.getPrimaryKey(), ...modelsB.map(
|
|
228
|
+
const result = await this.unlinkIds(modelA.getPrimaryKey(), ...modelsB.map(modelB => modelB.getPrimaryKey()));
|
|
229
229
|
if (this.isLoaded(modelA)) {
|
|
230
|
-
if (result.affectedRows
|
|
230
|
+
if (result.affectedRows === modelsB.length) {
|
|
231
231
|
const arr = modelA[this.modelKey];
|
|
232
|
-
const idMap = modelsB.map(
|
|
232
|
+
const idMap = modelsB.map(model => model.getPrimaryKey());
|
|
233
233
|
modelA.setManyRelation(this, arr.filter((model) => {
|
|
234
234
|
return !idMap.includes(model.getPrimaryKey());
|
|
235
235
|
}));
|
|
236
236
|
}
|
|
237
237
|
else {
|
|
238
238
|
// This could happen in race conditions and simultanious requests
|
|
239
|
-
console.warn(
|
|
239
|
+
console.warn('Warning: unlinking expected to affect ' + modelsB.length + ' rows, but only affected ' + result.affectedRows + ' rows');
|
|
240
240
|
// TODO: Manually correct by doing a query (safest)
|
|
241
|
-
throw new Error(
|
|
241
|
+
throw new Error('Fallback behaviour net yet implemented');
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyRelation.js","sourceRoot":"","sources":["../../../src/classes/ManyToManyRelation.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AACtC,mCAAgC;AAEhC,MAAa,kBAAkB;IAgB3B;;OAEG;IACH,IAAI,SAAS;QACT,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"ManyToManyRelation.js","sourceRoot":"","sources":["../../../src/classes/ManyToManyRelation.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ class ManyToOneRelation {
|
|
|
21
21
|
}
|
|
22
22
|
/// Load the relation of a list of models
|
|
23
23
|
async load(modelsA) {
|
|
24
|
-
if (modelsA.length
|
|
24
|
+
if (modelsA.length === 0) {
|
|
25
25
|
return [];
|
|
26
26
|
}
|
|
27
27
|
let str = `SELECT ${this.model.getDefaultSelect()} FROM ${this.model.table}\n`;
|
|
@@ -31,7 +31,7 @@ class ManyToOneRelation {
|
|
|
31
31
|
for (const model of modelsA) {
|
|
32
32
|
const found = modelsB.find(m => m.getPrimaryKey() === model[this.foreignKey]);
|
|
33
33
|
if (!found) {
|
|
34
|
-
throw new Error(
|
|
34
|
+
throw new Error('Could not load many to one relation: no match found when loading');
|
|
35
35
|
}
|
|
36
36
|
model.setRelation(this, found);
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToOneRelation.js","sourceRoot":"","sources":["../../../src/classes/ManyToOneRelation.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAGtC,MAAa,iBAAiB;IAa1B,YAAY,KAAmC,EAAE,QAAa;QAC1D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,mCAAmC;IACnC,QAAQ,CAAC,KAAY;QACjB,OAAQ,KAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;IACvD,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,KAAY;QACd,OAAQ,KAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAK,KAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACjG,CAAC;IAED,yBAAyB;IACzB,SAAS,CAAC,UAAkB,EAAE,UAAkB;QAC5C,OAAO,aAAa,IAAI,CAAC,KAAK,CAAC,KAAK,OAAO,UAAU,OAAO,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC;IAC7I,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,IAAI,CAAkB,OAAY;QACpC,IAAI,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"ManyToOneRelation.js","sourceRoot":"","sources":["../../../src/classes/ManyToOneRelation.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAGtC,MAAa,iBAAiB;IAa1B,YAAY,KAAmC,EAAE,QAAa;QAC1D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,mCAAmC;IACnC,QAAQ,CAAC,KAAY;QACjB,OAAQ,KAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;IACvD,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,KAAY;QACd,OAAQ,KAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAK,KAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACjG,CAAC;IAED,yBAAyB;IACzB,SAAS,CAAC,UAAkB,EAAE,UAAkB;QAC5C,OAAO,aAAa,IAAI,CAAC,KAAK,CAAC,KAAK,OAAO,UAAU,OAAO,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC;IAC7I,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,IAAI,CAAkB,OAAY;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,EAAE,CAAC;SACb;QACD,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;QAC/E,GAAG,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;QAEjD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAQ,CAAC;QAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,KAAK,EAAE;gBACR,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;aACvF;YACD,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SAClC;QACD,OAAO,OAAiC,CAAC;IAC7C,CAAC;CACJ;AArDD,8CAqDC"}
|
|
@@ -47,43 +47,43 @@ class Migration {
|
|
|
47
47
|
static async runAll(folder) {
|
|
48
48
|
const dirname = __dirname;
|
|
49
49
|
// Get the current working directory by removing shared part of folder and dirname
|
|
50
|
-
const shared = dirname.split(
|
|
51
|
-
const cwd = folder.replace(shared,
|
|
50
|
+
const shared = dirname.split('/').filter((part, index) => part === folder.split('/')[index]).join('/');
|
|
51
|
+
const cwd = folder.replace(shared, '');
|
|
52
52
|
simple_logging_1.logger.log(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('Running all... ').addClass('migration', 'runAll'), new simple_logging_1.StyledText(cwd).addClass('migration', 'folder').addStyle('dim'));
|
|
53
|
-
process.env.DB_MULTIPLE_STATEMENTS =
|
|
53
|
+
process.env.DB_MULTIPLE_STATEMENTS = 'true';
|
|
54
54
|
// First check if we have migrations table
|
|
55
55
|
const setupMigration = await this.getMigration(__dirname + '/../migrations/000000000-setup-migrations.sql');
|
|
56
56
|
if (!setupMigration) {
|
|
57
|
-
throw new Error(
|
|
57
|
+
throw new Error('Setup migration missing');
|
|
58
58
|
}
|
|
59
59
|
await setupMigration.up();
|
|
60
|
-
await Migration_1.Migration.markAsExecuted(
|
|
61
|
-
const parts = folder.split(
|
|
60
|
+
await Migration_1.Migration.markAsExecuted('000000000-setup-migrations.sql');
|
|
61
|
+
const parts = folder.split('/');
|
|
62
62
|
const firstPart = parts.shift();
|
|
63
63
|
if (firstPart === undefined) {
|
|
64
|
-
throw new Error(
|
|
64
|
+
throw new Error('Invalid folder path');
|
|
65
65
|
}
|
|
66
66
|
let folderQueue = [firstPart];
|
|
67
67
|
const migrations = [];
|
|
68
68
|
for (const part of parts) {
|
|
69
|
-
if (part
|
|
69
|
+
if (part === '*') {
|
|
70
70
|
const newQueue = [];
|
|
71
71
|
for (folder of folderQueue) {
|
|
72
72
|
// Read all directories
|
|
73
|
-
const recursiveFolders = (await fs_1.promises.readdir(folder, { withFileTypes: true })).filter(dirent => dirent.isDirectory()).map(dirent => folder +
|
|
73
|
+
const recursiveFolders = (await fs_1.promises.readdir(folder, { withFileTypes: true })).filter(dirent => dirent.isDirectory()).map(dirent => folder + '/' + dirent.name);
|
|
74
74
|
newQueue.push(...recursiveFolders);
|
|
75
75
|
}
|
|
76
76
|
folderQueue = newQueue;
|
|
77
77
|
}
|
|
78
78
|
else {
|
|
79
|
-
folderQueue = folderQueue.map(folder => folder +
|
|
79
|
+
folderQueue = folderQueue.map(folder => folder + '/' + part);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
for (const p of folderQueue) {
|
|
83
83
|
if (await directoryExists(p)) {
|
|
84
84
|
const folderFiles = await fs_1.promises.readdir(p);
|
|
85
85
|
for (const file of folderFiles) {
|
|
86
|
-
const full = p +
|
|
86
|
+
const full = p + '/' + file;
|
|
87
87
|
const name = file;
|
|
88
88
|
if (!(await Migration_1.Migration.isExecuted(name))) {
|
|
89
89
|
migrations.push([name, full]);
|
|
@@ -110,20 +110,20 @@ class Migration {
|
|
|
110
110
|
try {
|
|
111
111
|
await simple_logging_1.logger.setContext({
|
|
112
112
|
prefixes: [new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix'), ' '],
|
|
113
|
-
tags: ['migration']
|
|
113
|
+
tags: ['migration'],
|
|
114
114
|
}, async () => {
|
|
115
115
|
await migration.up();
|
|
116
116
|
await Migration_1.Migration.markAsExecuted(name);
|
|
117
117
|
});
|
|
118
|
-
simple_logging_1.logger.log(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('✓').addClass('migration', 'success', 'tag'), ' ', new simple_logging_1.StyledText(
|
|
118
|
+
simple_logging_1.logger.log(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('✓').addClass('migration', 'success', 'tag'), ' ', new simple_logging_1.StyledText('Migration ' + name + ' ran successfully').addClass('migration', 'success', 'text'));
|
|
119
119
|
}
|
|
120
120
|
catch (e) {
|
|
121
121
|
// Logger.errorWithContext({textColor: ['dim', 'red'], prefix: ' FAILED ', addSpace: true, prefixColor: ['bgRed']}, "Migration " + name + " failed", e)
|
|
122
|
-
simple_logging_1.logger.error(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('✗').addClass('migration', 'failed', 'tag'), ' ', new simple_logging_1.StyledText(
|
|
122
|
+
simple_logging_1.logger.error(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('✗').addClass('migration', 'failed', 'tag'), ' ', new simple_logging_1.StyledText('Migration ' + name + ' failed').addClass('migration', 'failed', 'text'), ' ', new simple_logging_1.StyledText(e).addClass('migration', 'failed', 'error'));
|
|
123
123
|
return false;
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
simple_logging_1.logger.log(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('✨').addClass('migration', 'success', 'tag', 'all'), ' ', new simple_logging_1.StyledText(
|
|
126
|
+
simple_logging_1.logger.log(new simple_logging_1.StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'), ' ', new simple_logging_1.StyledText('✨').addClass('migration', 'success', 'tag', 'all'), ' ', new simple_logging_1.StyledText('All migrations done').addClass('migration', 'success', 'text', 'all'));
|
|
127
127
|
return true;
|
|
128
128
|
}
|
|
129
129
|
static async getMigration(file) {
|
|
@@ -134,19 +134,19 @@ class Migration {
|
|
|
134
134
|
// Ignore. This will contain the downgrade implementation.
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
|
-
const sqlStatement = await fs_1.promises.readFile(file, { encoding:
|
|
137
|
+
const sqlStatement = await fs_1.promises.readFile(file, { encoding: 'utf-8' });
|
|
138
138
|
migration = new Migration(async () => {
|
|
139
139
|
await Database_1.Database.statement(sqlStatement);
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
142
|
else {
|
|
143
|
-
if (file.includes(
|
|
143
|
+
if (file.includes('.test.')) {
|
|
144
144
|
return;
|
|
145
145
|
}
|
|
146
|
-
if (file.endsWith(
|
|
146
|
+
if (file.endsWith('.d.ts')) {
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
|
-
if (!file.endsWith(
|
|
149
|
+
if (!file.endsWith('.ts') && !file.endsWith('.js')) {
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
152
|
const imported = await (_a = file, Promise.resolve().then(() => __importStar(require(_a))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Migration.js","sourceRoot":"","sources":["../../../src/classes/Migration.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAAoC;AAEpC,mDAAkE;AAClE,yCAAsC;AACtC,+
|
|
1
|
+
{"version":3,"file":"Migration.js","sourceRoot":"","sources":["../../../src/classes/Migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Column } from
|
|
2
|
-
import { ManyToManyRelation } from
|
|
3
|
-
import { ManyToOneRelation } from
|
|
4
|
-
import { OneToManyRelation } from
|
|
1
|
+
import { Column, DatabaseStoredValue } from './Column';
|
|
2
|
+
import { ManyToManyRelation } from './ManyToManyRelation';
|
|
3
|
+
import { ManyToOneRelation } from './ManyToOneRelation';
|
|
4
|
+
import { OneToManyRelation } from './OneToManyRelation';
|
|
5
5
|
type SQLWhere = {
|
|
6
6
|
sign: string;
|
|
7
7
|
value: string | Date | number | null | (string | null)[] | (number | null)[];
|
|
@@ -10,8 +10,38 @@ type SQLWhere = {
|
|
|
10
10
|
type SQLWhereQuery = {
|
|
11
11
|
[key: string]: string | Date | number | null | SQLWhere | SQLWhere[];
|
|
12
12
|
};
|
|
13
|
+
type Listener<Value> = (value: Value) => Promise<void> | void;
|
|
14
|
+
/**
|
|
15
|
+
* Controls the fetching and decrypting of members
|
|
16
|
+
*/
|
|
17
|
+
export declare class ModelEventBus<Value> {
|
|
18
|
+
protected listeners: Map<any, {
|
|
19
|
+
listener: Listener<Value>;
|
|
20
|
+
}[]>;
|
|
21
|
+
addListener(owner: any, listener: Listener<Value>): void;
|
|
22
|
+
removeListener(owner: any): void;
|
|
23
|
+
sendEvent(value: Value): Promise<void[]>;
|
|
24
|
+
}
|
|
25
|
+
export type ModelEventType = 'created' | 'updated' | 'deleted';
|
|
26
|
+
export type ModelEvent<M extends Model = Model> = {
|
|
27
|
+
type: 'created';
|
|
28
|
+
model: M;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'updated';
|
|
31
|
+
model: M;
|
|
32
|
+
changedFields: Record<string, DatabaseStoredValue>;
|
|
33
|
+
originalFields: Record<string, DatabaseStoredValue>;
|
|
34
|
+
/**
|
|
35
|
+
* Use this method to compare changes
|
|
36
|
+
*/
|
|
37
|
+
getOldModel(): M;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'deleted';
|
|
40
|
+
model: M;
|
|
41
|
+
};
|
|
13
42
|
export declare class Model {
|
|
14
43
|
static primary: Column;
|
|
44
|
+
static modelEventBus: ModelEventBus<ModelEvent<Model>>;
|
|
15
45
|
/**
|
|
16
46
|
* Properties that are stored in the table (including foreign keys, but without mapped relations!)
|
|
17
47
|
*/
|
|
@@ -66,8 +96,8 @@ export declare class Model {
|
|
|
66
96
|
* Load the returned properties from a DB response row into the model
|
|
67
97
|
* If the row's primary key is null, undefined is returned
|
|
68
98
|
*/
|
|
69
|
-
static fromRow<T extends typeof Model>(this: T, row:
|
|
70
|
-
static fromRows<T extends typeof Model>(this: T, rows:
|
|
99
|
+
static fromRow<T extends typeof Model>(this: T, row: Record<string, DatabaseStoredValue>): InstanceType<T> | undefined;
|
|
100
|
+
static fromRows<T extends typeof Model>(this: T, rows: Record<string, Record<string, DatabaseStoredValue>>[], namespace: string): InstanceType<T>[];
|
|
71
101
|
private markSaved;
|
|
72
102
|
get static(): typeof Model;
|
|
73
103
|
getPrimaryKey(): number | string | null;
|
|
@@ -84,20 +114,17 @@ export declare class Model {
|
|
|
84
114
|
static buildWhereOperator(key: string, value: SQLWhere): [string, any[]];
|
|
85
115
|
static buildWhereQuery(where: SQLWhereQuery): [string, any[]];
|
|
86
116
|
/**
|
|
117
|
+
* @deprecated Use the new SQL package instead
|
|
87
118
|
* Get multiple models by a simple where
|
|
88
119
|
*/
|
|
89
120
|
static where<T extends typeof Model>(this: T, where: SQLWhereQuery, extra?: {
|
|
90
121
|
limit?: number;
|
|
91
122
|
sort?: (string | {
|
|
92
123
|
column: string | SQLWhereQuery;
|
|
93
|
-
direction?:
|
|
124
|
+
direction?: 'ASC' | 'DESC';
|
|
94
125
|
})[];
|
|
95
126
|
select?: string;
|
|
96
127
|
}): Promise<InstanceType<T>[]>;
|
|
97
|
-
/**
|
|
98
|
-
* Build your own select query, and cast the result to an arary of Model
|
|
99
|
-
*/
|
|
100
|
-
static select<T extends typeof Model>(this: T, query: string, params: any[], select?: string): Promise<InstanceType<T>[]>;
|
|
101
128
|
/**
|
|
102
129
|
* Get multiple models by a simple where
|
|
103
130
|
*/
|
|
@@ -105,10 +132,10 @@ export declare class Model {
|
|
|
105
132
|
/**
|
|
106
133
|
* Return an object of all the properties that are changed and their database representation
|
|
107
134
|
*/
|
|
108
|
-
getChangedDatabaseProperties():
|
|
109
|
-
fields:
|
|
135
|
+
getChangedDatabaseProperties(): {
|
|
136
|
+
fields: Record<string, DatabaseStoredValue>;
|
|
110
137
|
skipUpdate: number;
|
|
111
|
-
}
|
|
138
|
+
};
|
|
112
139
|
save(): Promise<boolean>;
|
|
113
140
|
delete(): Promise<void>;
|
|
114
141
|
}
|