@strapi/database 4.14.4 → 4.14.6
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/README.md +3 -0
- package/dist/connection.d.ts +3 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/dialects/dialect.d.ts +27 -0
- package/dist/dialects/dialect.d.ts.map +1 -0
- package/dist/dialects/index.d.ts +5 -0
- package/dist/dialects/index.d.ts.map +1 -0
- package/dist/dialects/mysql/constants.d.ts +3 -0
- package/dist/dialects/mysql/constants.d.ts.map +1 -0
- package/dist/dialects/mysql/database-inspector.d.ts +12 -0
- package/dist/dialects/mysql/database-inspector.d.ts.map +1 -0
- package/dist/dialects/mysql/index.d.ts +20 -0
- package/dist/dialects/mysql/index.d.ts.map +1 -0
- package/dist/dialects/mysql/schema-inspector.d.ts +13 -0
- package/dist/dialects/mysql/schema-inspector.d.ts.map +1 -0
- package/dist/dialects/postgresql/index.d.ts +14 -0
- package/dist/dialects/postgresql/index.d.ts.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.d.ts +14 -0
- package/dist/dialects/postgresql/schema-inspector.d.ts.map +1 -0
- package/dist/dialects/sqlite/index.d.ts +19 -0
- package/dist/dialects/sqlite/index.d.ts.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.d.ts +13 -0
- package/dist/dialects/sqlite/schema-inspector.d.ts.map +1 -0
- package/dist/entity-manager/entity-repository.d.ts +4 -0
- package/dist/entity-manager/entity-repository.d.ts.map +1 -0
- package/dist/entity-manager/index.d.ts +5 -0
- package/dist/entity-manager/index.d.ts.map +1 -0
- package/dist/entity-manager/morph-relations.d.ts +13 -0
- package/dist/entity-manager/morph-relations.d.ts.map +1 -0
- package/dist/entity-manager/regular-relations.d.ts +83 -0
- package/dist/entity-manager/regular-relations.d.ts.map +1 -0
- package/dist/entity-manager/relations/cloning/regular-relations.d.ts +17 -0
- package/dist/entity-manager/relations/cloning/regular-relations.d.ts.map +1 -0
- package/dist/entity-manager/relations-orderer.d.ts +73 -0
- package/dist/entity-manager/relations-orderer.d.ts.map +1 -0
- package/dist/entity-manager/types.d.ts +97 -0
- package/dist/entity-manager/types.d.ts.map +1 -0
- package/dist/errors/database.d.ts +5 -0
- package/dist/errors/database.d.ts.map +1 -0
- package/dist/errors/index.d.ts +8 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/invalid-date.d.ts +5 -0
- package/dist/errors/invalid-date.d.ts.map +1 -0
- package/dist/errors/invalid-datetime.d.ts +5 -0
- package/dist/errors/invalid-datetime.d.ts.map +1 -0
- package/dist/errors/invalid-relation.d.ts +5 -0
- package/dist/errors/invalid-relation.d.ts.map +1 -0
- package/dist/errors/invalid-time.d.ts +5 -0
- package/dist/errors/invalid-time.d.ts.map +1 -0
- package/dist/errors/not-null.d.ts +7 -0
- package/dist/errors/not-null.d.ts.map +1 -0
- package/dist/fields/biginteger.d.ts +4 -0
- package/dist/fields/biginteger.d.ts.map +1 -0
- package/dist/fields/boolean.d.ts +6 -0
- package/dist/fields/boolean.d.ts.map +1 -0
- package/dist/fields/date.d.ts +6 -0
- package/dist/fields/date.d.ts.map +1 -0
- package/dist/fields/datetime.d.ts +6 -0
- package/dist/fields/datetime.d.ts.map +1 -0
- package/dist/fields/field.d.ts +7 -0
- package/dist/fields/field.d.ts.map +1 -0
- package/dist/fields/index.d.ts +4 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/json.d.ts +6 -0
- package/dist/fields/json.d.ts.map +1 -0
- package/dist/fields/number.d.ts +6 -0
- package/dist/fields/number.d.ts.map +1 -0
- package/dist/fields/shared/parsers.d.ts +4 -0
- package/dist/fields/shared/parsers.d.ts.map +1 -0
- package/dist/fields/string.d.ts +6 -0
- package/dist/fields/string.d.ts.map +1 -0
- package/dist/fields/time.d.ts +6 -0
- package/dist/fields/time.d.ts.map +1 -0
- package/dist/fields/timestamp.d.ts +6 -0
- package/dist/fields/timestamp.d.ts.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6211 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6179 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lifecycles/index.d.ts +17 -0
- package/dist/lifecycles/index.d.ts.map +1 -0
- package/dist/lifecycles/subscribers/index.d.ts +5 -0
- package/dist/lifecycles/subscribers/index.d.ts.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.d.ts +6 -0
- package/dist/lifecycles/subscribers/models-lifecycles.d.ts.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.d.ts +3 -0
- package/dist/lifecycles/subscribers/timestamps.d.ts.map +1 -0
- package/dist/lifecycles/types.d.ts +25 -0
- package/dist/lifecycles/types.d.ts.map +1 -0
- package/dist/metadata/index.d.ts +10 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/metadata.d.ts +22 -0
- package/dist/metadata/metadata.d.ts.map +1 -0
- package/dist/metadata/relations.d.ts +16 -0
- package/dist/metadata/relations.d.ts.map +1 -0
- package/dist/migrations/index.d.ts +12 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/storage.d.ts +15 -0
- package/dist/migrations/storage.d.ts.map +1 -0
- package/dist/query/helpers/index.d.ts +8 -0
- package/dist/query/helpers/index.d.ts.map +1 -0
- package/dist/query/helpers/join.d.ts +30 -0
- package/dist/query/helpers/join.d.ts.map +1 -0
- package/dist/query/helpers/order-by.d.ts +14 -0
- package/dist/query/helpers/order-by.d.ts.map +1 -0
- package/dist/query/helpers/populate/apply.d.ts +11 -0
- package/dist/query/helpers/populate/apply.d.ts.map +1 -0
- package/dist/query/helpers/populate/index.d.ts +4 -0
- package/dist/query/helpers/populate/index.d.ts.map +1 -0
- package/dist/query/helpers/populate/process.d.ts +24 -0
- package/dist/query/helpers/populate/process.d.ts.map +1 -0
- package/dist/query/helpers/search.d.ts +4 -0
- package/dist/query/helpers/search.d.ts.map +1 -0
- package/dist/query/helpers/streams/index.d.ts +2 -0
- package/dist/query/helpers/streams/index.d.ts.map +1 -0
- package/dist/query/helpers/streams/readable.d.ts +39 -0
- package/dist/query/helpers/streams/readable.d.ts.map +1 -0
- package/dist/query/helpers/transform.d.ts +8 -0
- package/dist/query/helpers/transform.d.ts.map +1 -0
- package/dist/query/helpers/where.d.ts +19 -0
- package/dist/query/helpers/where.d.ts.map +1 -0
- package/dist/query/index.d.ts +3 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/query-builder.d.ts +79 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/types.d.ts +8 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/schema/builder.d.ts +33 -0
- package/dist/schema/builder.d.ts.map +1 -0
- package/dist/schema/diff.d.ts +7 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/index.d.ts +20 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/schema.d.ts +4 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/storage.d.ts +10 -0
- package/dist/schema/storage.d.ts.map +1 -0
- package/dist/schema/types.d.ts +103 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/transaction-context.d.ts +22 -0
- package/dist/transaction-context.d.ts.map +1 -0
- package/dist/types/index.d.ts +169 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/content-types.d.ts +13 -0
- package/dist/utils/content-types.d.ts.map +1 -0
- package/dist/utils/knex.d.ts +12 -0
- package/dist/utils/knex.d.ts.map +1 -0
- package/dist/utils/types.d.ts +10 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/validations/index.d.ts +6 -0
- package/dist/validations/index.d.ts.map +1 -0
- package/dist/validations/relations/bidirectional.d.ts +12 -0
- package/dist/validations/relations/bidirectional.d.ts.map +1 -0
- package/dist/validations/relations/index.d.ts +7 -0
- package/dist/validations/relations/index.d.ts.map +1 -0
- package/package.json +20 -8
- package/.eslintignore +0 -2
- package/.eslintrc.js +0 -4
- package/jest.config.js +0 -6
- package/lib/__tests__/index.test.js +0 -93
- package/lib/__tests__/lifecycles.test.js +0 -55
- package/lib/connection.js +0 -64
- package/lib/dialects/dialect.js +0 -63
- package/lib/dialects/index.js +0 -53
- package/lib/dialects/mysql/constants.js +0 -6
- package/lib/dialects/mysql/database-inspector.js +0 -37
- package/lib/dialects/mysql/index.js +0 -92
- package/lib/dialects/mysql/schema-inspector.js +0 -234
- package/lib/dialects/postgresql/index.js +0 -65
- package/lib/dialects/postgresql/schema-inspector.js +0 -283
- package/lib/dialects/sqlite/index.js +0 -87
- package/lib/dialects/sqlite/schema-inspector.js +0 -151
- package/lib/entity-manager/__tests__/relations-orderer.test.js +0 -186
- package/lib/entity-manager/__tests__/sort-connect-array.test.js +0 -79
- package/lib/entity-manager/entity-repository.js +0 -164
- package/lib/entity-manager/index.js +0 -1385
- package/lib/entity-manager/morph-relations.js +0 -63
- package/lib/entity-manager/regular-relations.js +0 -506
- package/lib/entity-manager/relations/cloning/regular-relations.js +0 -76
- package/lib/entity-manager/relations-orderer.js +0 -225
- package/lib/errors/database.js +0 -12
- package/lib/errors/index.js +0 -17
- package/lib/errors/invalid-date.js +0 -14
- package/lib/errors/invalid-datetime.js +0 -14
- package/lib/errors/invalid-relation.js +0 -14
- package/lib/errors/invalid-time.js +0 -14
- package/lib/errors/not-null.js +0 -15
- package/lib/fields/biginteger.js +0 -17
- package/lib/fields/boolean.js +0 -39
- package/lib/fields/date.js +0 -16
- package/lib/fields/datetime.js +0 -19
- package/lib/fields/field.js +0 -17
- package/lib/fields/index.d.ts +0 -9
- package/lib/fields/index.js +0 -50
- package/lib/fields/json.js +0 -21
- package/lib/fields/number.js +0 -23
- package/lib/fields/shared/parsers.js +0 -71
- package/lib/fields/string.js +0 -17
- package/lib/fields/time.js +0 -17
- package/lib/fields/timestamp.js +0 -19
- package/lib/index.d.ts +0 -198
- package/lib/index.js +0 -129
- package/lib/lifecycles/index.d.ts +0 -51
- package/lib/lifecycles/index.js +0 -90
- package/lib/lifecycles/subscribers/index.d.ts +0 -11
- package/lib/lifecycles/subscribers/models-lifecycles.js +0 -19
- package/lib/lifecycles/subscribers/timestamps.js +0 -65
- package/lib/metadata/index.js +0 -244
- package/lib/metadata/relations.js +0 -578
- package/lib/migrations/index.d.ts +0 -9
- package/lib/migrations/index.js +0 -75
- package/lib/migrations/storage.js +0 -44
- package/lib/query/helpers/index.js +0 -11
- package/lib/query/helpers/join.js +0 -96
- package/lib/query/helpers/order-by.js +0 -70
- package/lib/query/helpers/populate/apply.js +0 -664
- package/lib/query/helpers/populate/index.js +0 -9
- package/lib/query/helpers/populate/process.js +0 -102
- package/lib/query/helpers/search.js +0 -84
- package/lib/query/helpers/streams/index.js +0 -5
- package/lib/query/helpers/streams/readable.js +0 -174
- package/lib/query/helpers/transform.js +0 -84
- package/lib/query/helpers/where.js +0 -365
- package/lib/query/index.js +0 -7
- package/lib/query/query-builder.js +0 -514
- package/lib/schema/__tests__/schema-diff.test.js +0 -231
- package/lib/schema/builder.js +0 -386
- package/lib/schema/diff.js +0 -399
- package/lib/schema/index.d.ts +0 -49
- package/lib/schema/index.js +0 -94
- package/lib/schema/schema.js +0 -202
- package/lib/schema/storage.js +0 -76
- package/lib/transaction-context.js +0 -68
- package/lib/types/index.d.ts +0 -6
- package/lib/types/index.js +0 -35
- package/lib/utils/content-types.js +0 -40
- package/lib/utils/knex.js +0 -22
- package/lib/validations/index.js +0 -20
- package/lib/validations/relations/bidirectional.js +0 -89
- package/lib/validations/relations/index.js +0 -14
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const createSchemaDiff = require('../diff');
|
|
4
|
-
|
|
5
|
-
let diffSchemas;
|
|
6
|
-
describe('diffSchemas', () => {
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
const schemaDiff = createSchemaDiff({
|
|
9
|
-
dialect: {
|
|
10
|
-
usesForeignKeys() {
|
|
11
|
-
return true;
|
|
12
|
-
},
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
diffSchemas = schemaDiff.diff.bind(schemaDiff);
|
|
17
|
-
|
|
18
|
-
global.strapi = {
|
|
19
|
-
store: {
|
|
20
|
-
get: () => [],
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test('New Table', async () => {
|
|
26
|
-
const testTable = {
|
|
27
|
-
name: 'my_table',
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const srcSchema = {
|
|
31
|
-
tables: [],
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const destSchema = {
|
|
35
|
-
tables: [testTable],
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({
|
|
39
|
-
status: 'CHANGED',
|
|
40
|
-
diff: {
|
|
41
|
-
tables: {
|
|
42
|
-
added: [testTable],
|
|
43
|
-
updated: [],
|
|
44
|
-
unchanged: [],
|
|
45
|
-
removed: [],
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test('Removed Table', async () => {
|
|
52
|
-
const testTable = {
|
|
53
|
-
name: 'my_table',
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const srcSchema = {
|
|
57
|
-
tables: [testTable],
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const destSchema = {
|
|
61
|
-
tables: [],
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({
|
|
65
|
-
status: 'CHANGED',
|
|
66
|
-
diff: {
|
|
67
|
-
tables: {
|
|
68
|
-
added: [],
|
|
69
|
-
updated: [],
|
|
70
|
-
unchanged: [],
|
|
71
|
-
removed: [testTable],
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('Unchanged Table', async () => {
|
|
78
|
-
const testTable = {
|
|
79
|
-
name: 'my_table',
|
|
80
|
-
columns: [],
|
|
81
|
-
indexes: [],
|
|
82
|
-
foreignKeys: [],
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const srcSchema = {
|
|
86
|
-
tables: [testTable],
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const destSchema = {
|
|
90
|
-
tables: [testTable],
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({
|
|
94
|
-
status: 'UNCHANGED',
|
|
95
|
-
diff: {
|
|
96
|
-
tables: {
|
|
97
|
-
added: [],
|
|
98
|
-
updated: [],
|
|
99
|
-
unchanged: [testTable],
|
|
100
|
-
removed: [],
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe('Changed table', () => {
|
|
107
|
-
test('added column', async () => {
|
|
108
|
-
const srcSchema = {
|
|
109
|
-
tables: [
|
|
110
|
-
{
|
|
111
|
-
name: 'my_table',
|
|
112
|
-
columns: [],
|
|
113
|
-
indexes: [],
|
|
114
|
-
foreignKeys: [],
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const destSchema = {
|
|
120
|
-
tables: [
|
|
121
|
-
{
|
|
122
|
-
name: 'my_table',
|
|
123
|
-
indexes: [],
|
|
124
|
-
foreignKeys: [],
|
|
125
|
-
columns: [
|
|
126
|
-
{
|
|
127
|
-
name: 'test_column',
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
},
|
|
131
|
-
],
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({
|
|
135
|
-
status: 'CHANGED',
|
|
136
|
-
diff: {
|
|
137
|
-
tables: {
|
|
138
|
-
added: [],
|
|
139
|
-
updated: [
|
|
140
|
-
{
|
|
141
|
-
name: 'my_table',
|
|
142
|
-
columns: {
|
|
143
|
-
added: [
|
|
144
|
-
{
|
|
145
|
-
name: 'test_column',
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
updated: [],
|
|
149
|
-
unchanged: [],
|
|
150
|
-
removed: [],
|
|
151
|
-
},
|
|
152
|
-
foreignKeys: {
|
|
153
|
-
added: [],
|
|
154
|
-
updated: [],
|
|
155
|
-
unchanged: [],
|
|
156
|
-
removed: [],
|
|
157
|
-
},
|
|
158
|
-
indexes: {
|
|
159
|
-
added: [],
|
|
160
|
-
updated: [],
|
|
161
|
-
unchanged: [],
|
|
162
|
-
removed: [],
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
|
-
],
|
|
166
|
-
unchanged: [],
|
|
167
|
-
removed: [],
|
|
168
|
-
},
|
|
169
|
-
},
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test.todo('updated column');
|
|
174
|
-
test.todo('unchanged column');
|
|
175
|
-
test.todo('removed column');
|
|
176
|
-
|
|
177
|
-
test.todo('added index');
|
|
178
|
-
test.todo('updated index');
|
|
179
|
-
test.todo('unchanged index');
|
|
180
|
-
test.todo('removed index');
|
|
181
|
-
|
|
182
|
-
test.todo('added foreign key');
|
|
183
|
-
test.todo('updated foreign key');
|
|
184
|
-
test.todo('unchanged foreign key');
|
|
185
|
-
test.todo('removed foreign key');
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
test('With persisted DB tables', async () => {
|
|
189
|
-
const testTables = [
|
|
190
|
-
{
|
|
191
|
-
name: 'my_table',
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
name: 'my_table_1',
|
|
195
|
-
},
|
|
196
|
-
];
|
|
197
|
-
|
|
198
|
-
const coreStoreTable = {
|
|
199
|
-
name: 'strapi_core_store_settings',
|
|
200
|
-
columns: [],
|
|
201
|
-
indexes: [],
|
|
202
|
-
foreignKeys: [],
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
global.strapi = {
|
|
206
|
-
store: {
|
|
207
|
-
get: async () => [testTables[0].name, 'table2'],
|
|
208
|
-
},
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
const srcSchema = {
|
|
212
|
-
tables: [...testTables, coreStoreTable],
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
const destSchema = {
|
|
216
|
-
tables: [coreStoreTable],
|
|
217
|
-
};
|
|
218
|
-
|
|
219
|
-
expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({
|
|
220
|
-
status: 'CHANGED',
|
|
221
|
-
diff: {
|
|
222
|
-
tables: {
|
|
223
|
-
added: [],
|
|
224
|
-
updated: [],
|
|
225
|
-
unchanged: [coreStoreTable],
|
|
226
|
-
removed: [testTables[1]],
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
});
|
package/lib/schema/builder.js
DELETED
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { isNil, prop, omit, castArray } = require('lodash/fp');
|
|
4
|
-
const debug = require('debug')('strapi::database');
|
|
5
|
-
|
|
6
|
-
module.exports = (db) => {
|
|
7
|
-
const helpers = createHelpers(db);
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
/**
|
|
11
|
-
* Returns a knex schema builder instance
|
|
12
|
-
* @param {string} table - table name
|
|
13
|
-
*/
|
|
14
|
-
getSchemaBuilder(trx) {
|
|
15
|
-
return db.getSchemaConnection(trx);
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Creates schema in DB
|
|
20
|
-
* @param {Schema} schema - database schema
|
|
21
|
-
*/
|
|
22
|
-
async createSchema(schema) {
|
|
23
|
-
await db.connection.transaction(async (trx) => {
|
|
24
|
-
await this.createTables(schema.tables, trx);
|
|
25
|
-
});
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Creates a list of tables in a schema
|
|
30
|
-
* @param {KnexInstance} trx
|
|
31
|
-
* @param {Table[]} tables
|
|
32
|
-
*/
|
|
33
|
-
async createTables(tables, trx) {
|
|
34
|
-
for (const table of tables) {
|
|
35
|
-
debug(`Creating table: ${table.name}`);
|
|
36
|
-
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
37
|
-
await helpers.createTable(schemaBuilder, table);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// create FKs once all the tables exist
|
|
41
|
-
for (const table of tables) {
|
|
42
|
-
debug(`Creating table foreign keys: ${table.name}`);
|
|
43
|
-
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
44
|
-
await helpers.createTableForeignKeys(schemaBuilder, table);
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
/**
|
|
48
|
-
* Drops schema from DB
|
|
49
|
-
* @param {Schema} schema - database schema
|
|
50
|
-
* @param {object} opts
|
|
51
|
-
* @param {boolean} opts.dropDatabase - weather to drop the entire database or simply drop the tables
|
|
52
|
-
*/
|
|
53
|
-
async dropSchema(schema, { dropDatabase = false } = {}) {
|
|
54
|
-
if (dropDatabase) {
|
|
55
|
-
// TODO: drop database & return as it will drop everything
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
await db.connection.transaction(async (trx) => {
|
|
60
|
-
for (const table of schema.tables.reverse()) {
|
|
61
|
-
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
62
|
-
await helpers.dropTable(schemaBuilder, table);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Applies a schema diff update in the DB
|
|
69
|
-
* @param {*} schemaDiff
|
|
70
|
-
*/
|
|
71
|
-
// TODO: implement force option to disable removal in DB
|
|
72
|
-
async updateSchema(schemaDiff) {
|
|
73
|
-
const { forceMigration } = db.config.settings;
|
|
74
|
-
|
|
75
|
-
await db.dialect.startSchemaUpdate();
|
|
76
|
-
await db.connection.transaction(async (trx) => {
|
|
77
|
-
await this.createTables(schemaDiff.tables.added, trx);
|
|
78
|
-
|
|
79
|
-
if (forceMigration) {
|
|
80
|
-
// drop all delete table foreign keys then delete the tables
|
|
81
|
-
for (const table of schemaDiff.tables.removed) {
|
|
82
|
-
debug(`Removing table foreign keys: ${table.name}`);
|
|
83
|
-
|
|
84
|
-
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
85
|
-
await helpers.dropTableForeignKeys(schemaBuilder, table);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
for (const table of schemaDiff.tables.removed) {
|
|
89
|
-
debug(`Removing table: ${table.name}`);
|
|
90
|
-
|
|
91
|
-
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
92
|
-
await helpers.dropTable(schemaBuilder, table);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
for (const table of schemaDiff.tables.updated) {
|
|
97
|
-
debug(`Updating table: ${table.name}`);
|
|
98
|
-
// alter table
|
|
99
|
-
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
100
|
-
|
|
101
|
-
await helpers.alterTable(schemaBuilder, table);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
await db.dialect.endSchemaUpdate();
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const createHelpers = (db) => {
|
|
111
|
-
/**
|
|
112
|
-
* Creates a foreign key on a table
|
|
113
|
-
* @param {Knex.TableBuilder} tableBuilder
|
|
114
|
-
* @param {ForeignKey} foreignKey
|
|
115
|
-
*/
|
|
116
|
-
const createForeignKey = (tableBuilder, foreignKey) => {
|
|
117
|
-
const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;
|
|
118
|
-
|
|
119
|
-
const constraint = tableBuilder
|
|
120
|
-
.foreign(columns, name)
|
|
121
|
-
.references(referencedColumns)
|
|
122
|
-
.inTable(
|
|
123
|
-
db.connection.getSchemaName()
|
|
124
|
-
? `${db.connection.getSchemaName()}.${referencedTable}`
|
|
125
|
-
: referencedTable
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
if (onDelete) {
|
|
129
|
-
constraint.onDelete(onDelete);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (onUpdate) {
|
|
133
|
-
constraint.onUpdate(onUpdate);
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Drops a foreign key from a table
|
|
139
|
-
* @param {Knex.TableBuilder} tableBuilder
|
|
140
|
-
* @param {ForeignKey} foreignKey
|
|
141
|
-
*/
|
|
142
|
-
const dropForeignKey = (tableBuilder, foreignKey) => {
|
|
143
|
-
const { name, columns } = foreignKey;
|
|
144
|
-
|
|
145
|
-
tableBuilder.dropForeign(columns, name);
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Creates an index on a table
|
|
150
|
-
* @param {Knex.TableBuilder} tableBuilder
|
|
151
|
-
* @param {Index} index
|
|
152
|
-
*/
|
|
153
|
-
const createIndex = (tableBuilder, index) => {
|
|
154
|
-
const { type, columns, name } = index;
|
|
155
|
-
|
|
156
|
-
switch (type) {
|
|
157
|
-
case 'primary': {
|
|
158
|
-
return tableBuilder.primary(columns, name);
|
|
159
|
-
}
|
|
160
|
-
case 'unique': {
|
|
161
|
-
return tableBuilder.unique(columns, name);
|
|
162
|
-
}
|
|
163
|
-
default: {
|
|
164
|
-
return tableBuilder.index(columns, name, type);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Drops an index from table
|
|
171
|
-
* @param {Knex.TableBuilder} tableBuilder
|
|
172
|
-
* @param {Index} index
|
|
173
|
-
*/
|
|
174
|
-
const dropIndex = (tableBuilder, index) => {
|
|
175
|
-
if (!db.config.settings.forceMigration) {
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const { type, columns, name } = index;
|
|
180
|
-
|
|
181
|
-
switch (type) {
|
|
182
|
-
case 'primary': {
|
|
183
|
-
return tableBuilder.dropPrimary(name);
|
|
184
|
-
}
|
|
185
|
-
case 'unique': {
|
|
186
|
-
return tableBuilder.dropUnique(columns, name);
|
|
187
|
-
}
|
|
188
|
-
default: {
|
|
189
|
-
return tableBuilder.dropIndex(columns, name);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Creates a column in a table
|
|
196
|
-
* @param {Knex.TableBuilder} tableBuilder
|
|
197
|
-
* @param {Column} column
|
|
198
|
-
*/
|
|
199
|
-
const createColumn = (tableBuilder, column) => {
|
|
200
|
-
const { type, name, args = [], defaultTo, unsigned, notNullable } = column;
|
|
201
|
-
|
|
202
|
-
const col = tableBuilder[type](name, ...args);
|
|
203
|
-
|
|
204
|
-
if (unsigned === true) {
|
|
205
|
-
col.unsigned();
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if (!isNil(defaultTo)) {
|
|
209
|
-
const [value, opts] = castArray(defaultTo);
|
|
210
|
-
|
|
211
|
-
if (prop('isRaw', opts)) {
|
|
212
|
-
col.defaultTo(db.connection.raw(value), omit('isRaw', opts));
|
|
213
|
-
} else {
|
|
214
|
-
col.defaultTo(value, opts);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (notNullable === true) {
|
|
219
|
-
col.notNullable();
|
|
220
|
-
} else {
|
|
221
|
-
col.nullable();
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return col;
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Drops a column from a table
|
|
229
|
-
* @param {Knex.TableBuilder} tableBuilder
|
|
230
|
-
* @param {Column} column
|
|
231
|
-
*/
|
|
232
|
-
const dropColumn = (tableBuilder, column) => {
|
|
233
|
-
if (!db.config.settings.forceMigration) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return tableBuilder.dropColumn(column.name);
|
|
238
|
-
};
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Creates a table in a database
|
|
242
|
-
* @param {SchemaBuilder} schemaBuilder
|
|
243
|
-
* @param {Table} table
|
|
244
|
-
*/
|
|
245
|
-
const createTable = async (schemaBuilder, table) => {
|
|
246
|
-
await schemaBuilder.createTable(table.name, (tableBuilder) => {
|
|
247
|
-
// columns
|
|
248
|
-
(table.columns || []).forEach((column) => createColumn(tableBuilder, column));
|
|
249
|
-
|
|
250
|
-
// indexes
|
|
251
|
-
(table.indexes || []).forEach((index) => createIndex(tableBuilder, index));
|
|
252
|
-
|
|
253
|
-
// foreign keys
|
|
254
|
-
|
|
255
|
-
if (!db.dialect.canAlterConstraints()) {
|
|
256
|
-
(table.foreignKeys || []).forEach((foreignKey) =>
|
|
257
|
-
createForeignKey(tableBuilder, foreignKey)
|
|
258
|
-
);
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
const alterTable = async (schemaBuilder, table) => {
|
|
264
|
-
await schemaBuilder.alterTable(table.name, (tableBuilder) => {
|
|
265
|
-
// Delete indexes / fks / columns
|
|
266
|
-
|
|
267
|
-
for (const removedIndex of table.indexes.removed) {
|
|
268
|
-
debug(`Dropping index ${removedIndex.name}`);
|
|
269
|
-
dropIndex(tableBuilder, removedIndex);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
for (const updateddIndex of table.indexes.updated) {
|
|
273
|
-
debug(`Dropping updated index ${updateddIndex.name}`);
|
|
274
|
-
dropIndex(tableBuilder, updateddIndex.object);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
for (const removedForeignKey of table.foreignKeys.removed) {
|
|
278
|
-
debug(`Dropping foreign key ${removedForeignKey.name}`);
|
|
279
|
-
dropForeignKey(tableBuilder, removedForeignKey);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
for (const updatedForeignKey of table.foreignKeys.updated) {
|
|
283
|
-
debug(`Dropping updated foreign key ${updatedForeignKey.name}`);
|
|
284
|
-
dropForeignKey(tableBuilder, updatedForeignKey.object);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
for (const removedColumn of table.columns.removed) {
|
|
288
|
-
debug(`Dropping column ${removedColumn.name}`);
|
|
289
|
-
dropColumn(tableBuilder, removedColumn);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Update existing columns / foreign keys / indexes
|
|
293
|
-
for (const updatedColumn of table.columns.updated) {
|
|
294
|
-
debug(`Updating column ${updatedColumn.name}`);
|
|
295
|
-
|
|
296
|
-
const { object } = updatedColumn;
|
|
297
|
-
|
|
298
|
-
if (object.type === 'increments') {
|
|
299
|
-
createColumn(tableBuilder, { ...object, type: 'integer' }).alter();
|
|
300
|
-
} else {
|
|
301
|
-
createColumn(tableBuilder, object).alter();
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
for (const updatedForeignKey of table.foreignKeys.updated) {
|
|
306
|
-
debug(`Recreating updated foreign key ${updatedForeignKey.name}`);
|
|
307
|
-
createForeignKey(tableBuilder, updatedForeignKey.object);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
for (const updatedIndex of table.indexes.updated) {
|
|
311
|
-
debug(`Recreating updated index ${updatedIndex.name}`);
|
|
312
|
-
createIndex(tableBuilder, updatedIndex.object);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
for (const addedColumn of table.columns.added) {
|
|
316
|
-
debug(`Creating column ${addedColumn.name}`);
|
|
317
|
-
|
|
318
|
-
if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {
|
|
319
|
-
tableBuilder.integer(addedColumn.name).unsigned();
|
|
320
|
-
tableBuilder.primary(addedColumn.name);
|
|
321
|
-
} else {
|
|
322
|
-
createColumn(tableBuilder, addedColumn);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
for (const addedForeignKey of table.foreignKeys.added) {
|
|
327
|
-
debug(`Creating foreign keys ${addedForeignKey.name}`);
|
|
328
|
-
createForeignKey(tableBuilder, addedForeignKey);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
for (const addedIndex of table.indexes.added) {
|
|
332
|
-
debug(`Creating index ${addedIndex.name}`);
|
|
333
|
-
createIndex(tableBuilder, addedIndex);
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Drops a table from a database
|
|
340
|
-
* @param {Knex.SchemaBuilder} schemaBuilder
|
|
341
|
-
* @param {Table} table
|
|
342
|
-
*/
|
|
343
|
-
const dropTable = (schemaBuilder, table) => {
|
|
344
|
-
if (!db.config.settings.forceMigration) {
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
return schemaBuilder.dropTableIfExists(table.name);
|
|
349
|
-
};
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Creates a table foreign keys constraints
|
|
353
|
-
* @param {SchemaBuilder} schemaBuilder
|
|
354
|
-
* @param {Table} table
|
|
355
|
-
*/
|
|
356
|
-
const createTableForeignKeys = async (schemaBuilder, table) => {
|
|
357
|
-
// foreign keys
|
|
358
|
-
await schemaBuilder.table(table.name, (tableBuilder) => {
|
|
359
|
-
(table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));
|
|
360
|
-
});
|
|
361
|
-
};
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Drops a table foreign keys constraints
|
|
365
|
-
* @param {SchemaBuilder} schemaBuilder
|
|
366
|
-
* @param {Table} table
|
|
367
|
-
*/
|
|
368
|
-
const dropTableForeignKeys = async (schemaBuilder, table) => {
|
|
369
|
-
if (!db.config.settings.forceMigration) {
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// foreign keys
|
|
374
|
-
await schemaBuilder.table(table.name, (tableBuilder) => {
|
|
375
|
-
(table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));
|
|
376
|
-
});
|
|
377
|
-
};
|
|
378
|
-
|
|
379
|
-
return {
|
|
380
|
-
createTable,
|
|
381
|
-
alterTable,
|
|
382
|
-
dropTable,
|
|
383
|
-
createTableForeignKeys,
|
|
384
|
-
dropTableForeignKeys,
|
|
385
|
-
};
|
|
386
|
-
};
|