@strapi/database 4.15.0-alpha.0 → 4.15.1

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 (242) hide show
  1. package/README.md +3 -0
  2. package/dist/connection.d.ts +3 -0
  3. package/dist/connection.d.ts.map +1 -0
  4. package/dist/dialects/dialect.d.ts +27 -0
  5. package/dist/dialects/dialect.d.ts.map +1 -0
  6. package/dist/dialects/index.d.ts +5 -0
  7. package/dist/dialects/index.d.ts.map +1 -0
  8. package/dist/dialects/mysql/constants.d.ts +3 -0
  9. package/dist/dialects/mysql/constants.d.ts.map +1 -0
  10. package/dist/dialects/mysql/database-inspector.d.ts +12 -0
  11. package/dist/dialects/mysql/database-inspector.d.ts.map +1 -0
  12. package/dist/dialects/mysql/index.d.ts +20 -0
  13. package/dist/dialects/mysql/index.d.ts.map +1 -0
  14. package/dist/dialects/mysql/schema-inspector.d.ts +13 -0
  15. package/dist/dialects/mysql/schema-inspector.d.ts.map +1 -0
  16. package/dist/dialects/postgresql/index.d.ts +14 -0
  17. package/dist/dialects/postgresql/index.d.ts.map +1 -0
  18. package/dist/dialects/postgresql/schema-inspector.d.ts +14 -0
  19. package/dist/dialects/postgresql/schema-inspector.d.ts.map +1 -0
  20. package/dist/dialects/sqlite/index.d.ts +19 -0
  21. package/dist/dialects/sqlite/index.d.ts.map +1 -0
  22. package/dist/dialects/sqlite/schema-inspector.d.ts +13 -0
  23. package/dist/dialects/sqlite/schema-inspector.d.ts.map +1 -0
  24. package/dist/entity-manager/entity-repository.d.ts +4 -0
  25. package/dist/entity-manager/entity-repository.d.ts.map +1 -0
  26. package/dist/entity-manager/index.d.ts +5 -0
  27. package/dist/entity-manager/index.d.ts.map +1 -0
  28. package/dist/entity-manager/morph-relations.d.ts +13 -0
  29. package/dist/entity-manager/morph-relations.d.ts.map +1 -0
  30. package/dist/entity-manager/regular-relations.d.ts +83 -0
  31. package/dist/entity-manager/regular-relations.d.ts.map +1 -0
  32. package/dist/entity-manager/relations/cloning/regular-relations.d.ts +17 -0
  33. package/dist/entity-manager/relations/cloning/regular-relations.d.ts.map +1 -0
  34. package/dist/entity-manager/relations-orderer.d.ts +73 -0
  35. package/dist/entity-manager/relations-orderer.d.ts.map +1 -0
  36. package/dist/entity-manager/types.d.ts +97 -0
  37. package/dist/entity-manager/types.d.ts.map +1 -0
  38. package/dist/errors/database.d.ts +5 -0
  39. package/dist/errors/database.d.ts.map +1 -0
  40. package/dist/errors/index.d.ts +8 -0
  41. package/dist/errors/index.d.ts.map +1 -0
  42. package/dist/errors/invalid-date.d.ts +5 -0
  43. package/dist/errors/invalid-date.d.ts.map +1 -0
  44. package/dist/errors/invalid-datetime.d.ts +5 -0
  45. package/dist/errors/invalid-datetime.d.ts.map +1 -0
  46. package/dist/errors/invalid-relation.d.ts +5 -0
  47. package/dist/errors/invalid-relation.d.ts.map +1 -0
  48. package/dist/errors/invalid-time.d.ts +5 -0
  49. package/dist/errors/invalid-time.d.ts.map +1 -0
  50. package/dist/errors/not-null.d.ts +7 -0
  51. package/dist/errors/not-null.d.ts.map +1 -0
  52. package/dist/fields/biginteger.d.ts +4 -0
  53. package/dist/fields/biginteger.d.ts.map +1 -0
  54. package/dist/fields/boolean.d.ts +6 -0
  55. package/dist/fields/boolean.d.ts.map +1 -0
  56. package/dist/fields/date.d.ts +6 -0
  57. package/dist/fields/date.d.ts.map +1 -0
  58. package/dist/fields/datetime.d.ts +6 -0
  59. package/dist/fields/datetime.d.ts.map +1 -0
  60. package/dist/fields/field.d.ts +7 -0
  61. package/dist/fields/field.d.ts.map +1 -0
  62. package/dist/fields/index.d.ts +4 -0
  63. package/dist/fields/index.d.ts.map +1 -0
  64. package/dist/fields/json.d.ts +6 -0
  65. package/dist/fields/json.d.ts.map +1 -0
  66. package/dist/fields/number.d.ts +6 -0
  67. package/dist/fields/number.d.ts.map +1 -0
  68. package/dist/fields/shared/parsers.d.ts +4 -0
  69. package/dist/fields/shared/parsers.d.ts.map +1 -0
  70. package/dist/fields/string.d.ts +6 -0
  71. package/dist/fields/string.d.ts.map +1 -0
  72. package/dist/fields/time.d.ts +6 -0
  73. package/dist/fields/time.d.ts.map +1 -0
  74. package/dist/fields/timestamp.d.ts +6 -0
  75. package/dist/fields/timestamp.d.ts.map +1 -0
  76. package/dist/index.d.ts +46 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +6189 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/index.mjs +6157 -0
  81. package/dist/index.mjs.map +1 -0
  82. package/dist/lifecycles/index.d.ts +17 -0
  83. package/dist/lifecycles/index.d.ts.map +1 -0
  84. package/dist/lifecycles/subscribers/index.d.ts +5 -0
  85. package/dist/lifecycles/subscribers/index.d.ts.map +1 -0
  86. package/dist/lifecycles/subscribers/models-lifecycles.d.ts +6 -0
  87. package/dist/lifecycles/subscribers/models-lifecycles.d.ts.map +1 -0
  88. package/dist/lifecycles/subscribers/timestamps.d.ts +3 -0
  89. package/dist/lifecycles/subscribers/timestamps.d.ts.map +1 -0
  90. package/dist/lifecycles/types.d.ts +25 -0
  91. package/dist/lifecycles/types.d.ts.map +1 -0
  92. package/dist/metadata/index.d.ts +10 -0
  93. package/dist/metadata/index.d.ts.map +1 -0
  94. package/dist/metadata/metadata.d.ts +22 -0
  95. package/dist/metadata/metadata.d.ts.map +1 -0
  96. package/dist/metadata/relations.d.ts +16 -0
  97. package/dist/metadata/relations.d.ts.map +1 -0
  98. package/dist/migrations/index.d.ts +12 -0
  99. package/dist/migrations/index.d.ts.map +1 -0
  100. package/dist/migrations/storage.d.ts +15 -0
  101. package/dist/migrations/storage.d.ts.map +1 -0
  102. package/dist/query/helpers/index.d.ts +8 -0
  103. package/dist/query/helpers/index.d.ts.map +1 -0
  104. package/dist/query/helpers/join.d.ts +30 -0
  105. package/dist/query/helpers/join.d.ts.map +1 -0
  106. package/dist/query/helpers/order-by.d.ts +14 -0
  107. package/dist/query/helpers/order-by.d.ts.map +1 -0
  108. package/dist/query/helpers/populate/apply.d.ts +11 -0
  109. package/dist/query/helpers/populate/apply.d.ts.map +1 -0
  110. package/dist/query/helpers/populate/index.d.ts +4 -0
  111. package/dist/query/helpers/populate/index.d.ts.map +1 -0
  112. package/dist/query/helpers/populate/process.d.ts +24 -0
  113. package/dist/query/helpers/populate/process.d.ts.map +1 -0
  114. package/dist/query/helpers/search.d.ts +4 -0
  115. package/dist/query/helpers/search.d.ts.map +1 -0
  116. package/dist/query/helpers/streams/index.d.ts +2 -0
  117. package/dist/query/helpers/streams/index.d.ts.map +1 -0
  118. package/dist/query/helpers/streams/readable.d.ts +39 -0
  119. package/dist/query/helpers/streams/readable.d.ts.map +1 -0
  120. package/dist/query/helpers/transform.d.ts +8 -0
  121. package/dist/query/helpers/transform.d.ts.map +1 -0
  122. package/dist/query/helpers/where.d.ts +19 -0
  123. package/dist/query/helpers/where.d.ts.map +1 -0
  124. package/dist/query/index.d.ts +3 -0
  125. package/dist/query/index.d.ts.map +1 -0
  126. package/dist/query/query-builder.d.ts +79 -0
  127. package/dist/query/query-builder.d.ts.map +1 -0
  128. package/dist/query/types.d.ts +8 -0
  129. package/dist/query/types.d.ts.map +1 -0
  130. package/dist/schema/builder.d.ts +33 -0
  131. package/dist/schema/builder.d.ts.map +1 -0
  132. package/dist/schema/diff.d.ts +7 -0
  133. package/dist/schema/diff.d.ts.map +1 -0
  134. package/dist/schema/index.d.ts +20 -0
  135. package/dist/schema/index.d.ts.map +1 -0
  136. package/dist/schema/schema.d.ts +4 -0
  137. package/dist/schema/schema.d.ts.map +1 -0
  138. package/dist/schema/storage.d.ts +10 -0
  139. package/dist/schema/storage.d.ts.map +1 -0
  140. package/dist/schema/types.d.ts +103 -0
  141. package/dist/schema/types.d.ts.map +1 -0
  142. package/dist/transaction-context.d.ts +22 -0
  143. package/dist/transaction-context.d.ts.map +1 -0
  144. package/dist/types/index.d.ts +169 -0
  145. package/dist/types/index.d.ts.map +1 -0
  146. package/dist/utils/content-types.d.ts +13 -0
  147. package/dist/utils/content-types.d.ts.map +1 -0
  148. package/dist/utils/knex.d.ts +12 -0
  149. package/dist/utils/knex.d.ts.map +1 -0
  150. package/dist/utils/types.d.ts +10 -0
  151. package/dist/utils/types.d.ts.map +1 -0
  152. package/dist/validations/index.d.ts +6 -0
  153. package/dist/validations/index.d.ts.map +1 -0
  154. package/dist/validations/relations/bidirectional.d.ts +12 -0
  155. package/dist/validations/relations/bidirectional.d.ts.map +1 -0
  156. package/dist/validations/relations/index.d.ts +7 -0
  157. package/dist/validations/relations/index.d.ts.map +1 -0
  158. package/package.json +21 -9
  159. package/.eslintignore +0 -2
  160. package/.eslintrc.js +0 -4
  161. package/jest.config.js +0 -6
  162. package/lib/__tests__/index.test.js +0 -93
  163. package/lib/__tests__/lifecycles.test.js +0 -55
  164. package/lib/connection.js +0 -64
  165. package/lib/dialects/dialect.js +0 -63
  166. package/lib/dialects/index.js +0 -53
  167. package/lib/dialects/mysql/constants.js +0 -6
  168. package/lib/dialects/mysql/database-inspector.js +0 -37
  169. package/lib/dialects/mysql/index.js +0 -92
  170. package/lib/dialects/mysql/schema-inspector.js +0 -234
  171. package/lib/dialects/postgresql/index.js +0 -65
  172. package/lib/dialects/postgresql/schema-inspector.js +0 -283
  173. package/lib/dialects/sqlite/index.js +0 -87
  174. package/lib/dialects/sqlite/schema-inspector.js +0 -151
  175. package/lib/entity-manager/__tests__/relations-orderer.test.js +0 -186
  176. package/lib/entity-manager/__tests__/sort-connect-array.test.js +0 -79
  177. package/lib/entity-manager/entity-repository.js +0 -164
  178. package/lib/entity-manager/index.js +0 -1385
  179. package/lib/entity-manager/morph-relations.js +0 -63
  180. package/lib/entity-manager/regular-relations.js +0 -506
  181. package/lib/entity-manager/relations/cloning/regular-relations.js +0 -76
  182. package/lib/entity-manager/relations-orderer.js +0 -225
  183. package/lib/errors/database.js +0 -12
  184. package/lib/errors/index.js +0 -17
  185. package/lib/errors/invalid-date.js +0 -14
  186. package/lib/errors/invalid-datetime.js +0 -14
  187. package/lib/errors/invalid-relation.js +0 -14
  188. package/lib/errors/invalid-time.js +0 -14
  189. package/lib/errors/not-null.js +0 -15
  190. package/lib/fields/biginteger.js +0 -17
  191. package/lib/fields/boolean.js +0 -39
  192. package/lib/fields/date.js +0 -16
  193. package/lib/fields/datetime.js +0 -19
  194. package/lib/fields/field.js +0 -17
  195. package/lib/fields/index.d.ts +0 -9
  196. package/lib/fields/index.js +0 -50
  197. package/lib/fields/json.js +0 -21
  198. package/lib/fields/number.js +0 -23
  199. package/lib/fields/shared/parsers.js +0 -71
  200. package/lib/fields/string.js +0 -17
  201. package/lib/fields/time.js +0 -17
  202. package/lib/fields/timestamp.js +0 -19
  203. package/lib/index.d.ts +0 -198
  204. package/lib/index.js +0 -129
  205. package/lib/lifecycles/index.d.ts +0 -51
  206. package/lib/lifecycles/index.js +0 -90
  207. package/lib/lifecycles/subscribers/index.d.ts +0 -11
  208. package/lib/lifecycles/subscribers/models-lifecycles.js +0 -19
  209. package/lib/lifecycles/subscribers/timestamps.js +0 -65
  210. package/lib/metadata/index.js +0 -244
  211. package/lib/metadata/relations.js +0 -578
  212. package/lib/migrations/index.d.ts +0 -9
  213. package/lib/migrations/index.js +0 -75
  214. package/lib/migrations/storage.js +0 -44
  215. package/lib/query/helpers/index.js +0 -11
  216. package/lib/query/helpers/join.js +0 -96
  217. package/lib/query/helpers/order-by.js +0 -70
  218. package/lib/query/helpers/populate/apply.js +0 -664
  219. package/lib/query/helpers/populate/index.js +0 -9
  220. package/lib/query/helpers/populate/process.js +0 -102
  221. package/lib/query/helpers/search.js +0 -84
  222. package/lib/query/helpers/streams/index.js +0 -5
  223. package/lib/query/helpers/streams/readable.js +0 -174
  224. package/lib/query/helpers/transform.js +0 -84
  225. package/lib/query/helpers/where.js +0 -365
  226. package/lib/query/index.js +0 -7
  227. package/lib/query/query-builder.js +0 -514
  228. package/lib/schema/__tests__/schema-diff.test.js +0 -231
  229. package/lib/schema/builder.js +0 -386
  230. package/lib/schema/diff.js +0 -399
  231. package/lib/schema/index.d.ts +0 -49
  232. package/lib/schema/index.js +0 -94
  233. package/lib/schema/schema.js +0 -202
  234. package/lib/schema/storage.js +0 -76
  235. package/lib/transaction-context.js +0 -68
  236. package/lib/types/index.d.ts +0 -6
  237. package/lib/types/index.js +0 -35
  238. package/lib/utils/content-types.js +0 -40
  239. package/lib/utils/knex.js +0 -22
  240. package/lib/validations/index.js +0 -20
  241. package/lib/validations/relations/bidirectional.js +0 -89
  242. 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
- });
@@ -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
- };