@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
package/lib/schema/diff.js
DELETED
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const _ = require('lodash/fp');
|
|
4
|
-
|
|
5
|
-
const RESERVED_TABLE_NAMES = ['strapi_migrations', 'strapi_database_schema'];
|
|
6
|
-
|
|
7
|
-
const statuses = {
|
|
8
|
-
CHANGED: 'CHANGED',
|
|
9
|
-
UNCHANGED: 'UNCHANGED',
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff
|
|
13
|
-
// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl
|
|
14
|
-
|
|
15
|
-
const helpers = {
|
|
16
|
-
hasTable(schema, tableName) {
|
|
17
|
-
return schema.tables.findIndex((table) => table.name === tableName) !== -1;
|
|
18
|
-
},
|
|
19
|
-
findTable(schema, tableName) {
|
|
20
|
-
return schema.tables.find((table) => table.name === tableName);
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
hasColumn(table, columnName) {
|
|
24
|
-
return table.columns.findIndex((column) => column.name === columnName) !== -1;
|
|
25
|
-
},
|
|
26
|
-
findColumn(table, columnName) {
|
|
27
|
-
return table.columns.find((column) => column.name === columnName);
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
hasIndex(table, columnName) {
|
|
31
|
-
return table.indexes.findIndex((column) => column.name === columnName) !== -1;
|
|
32
|
-
},
|
|
33
|
-
findIndex(table, columnName) {
|
|
34
|
-
return table.indexes.find((column) => column.name === columnName);
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
hasForeignKey(table, columnName) {
|
|
38
|
-
return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;
|
|
39
|
-
},
|
|
40
|
-
findForeignKey(table, columnName) {
|
|
41
|
-
return table.foreignKeys.find((column) => column.name === columnName);
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
module.exports = (db) => {
|
|
46
|
-
const hasChangedStatus = (diff) => diff.status === statuses.CHANGED;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Compares two indexes info
|
|
50
|
-
* @param {Object} oldIndex - index info read from DB
|
|
51
|
-
* @param {Object} index - newly generate index info
|
|
52
|
-
*/
|
|
53
|
-
const diffIndexes = (oldIndex, index) => {
|
|
54
|
-
const changes = [];
|
|
55
|
-
|
|
56
|
-
if (!_.isEqual(oldIndex.columns, index.columns)) {
|
|
57
|
-
changes.push('columns');
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (_.toLower(oldIndex.type) !== _.toLower(index.type)) {
|
|
61
|
-
changes.push('type');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
|
|
66
|
-
diff: {
|
|
67
|
-
name: index.name,
|
|
68
|
-
object: index,
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Compares two foreign keys info
|
|
75
|
-
* @param {Object} oldForeignKey - foreignKey info read from DB
|
|
76
|
-
* @param {Object} foreignKey - newly generate foreignKey info
|
|
77
|
-
*/
|
|
78
|
-
const diffForeignKeys = (oldForeignKey, foreignKey) => {
|
|
79
|
-
const changes = [];
|
|
80
|
-
|
|
81
|
-
if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {
|
|
82
|
-
changes.push('columns');
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {
|
|
86
|
-
changes.push('referencedColumns');
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {
|
|
90
|
-
changes.push('referencedTable');
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {
|
|
94
|
-
if (!_.isNil(foreignKey.onDelete) && _.toUpper(oldForeignKey.onDelete) !== 'NO ACTION') {
|
|
95
|
-
changes.push('onDelete');
|
|
96
|
-
}
|
|
97
|
-
} else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete)) {
|
|
98
|
-
changes.push('onDelete');
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {
|
|
102
|
-
if (!_.isNil(foreignKey.onUpdate) && _.toUpper(oldForeignKey.onUpdate) !== 'NO ACTION') {
|
|
103
|
-
changes.push('onUpdate');
|
|
104
|
-
}
|
|
105
|
-
} else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate)) {
|
|
106
|
-
changes.push('onUpdate');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return {
|
|
110
|
-
status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
|
|
111
|
-
diff: {
|
|
112
|
-
name: foreignKey.name,
|
|
113
|
-
object: foreignKey,
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const diffDefault = (oldColumn, column) => {
|
|
119
|
-
const oldDefaultTo = oldColumn.defaultTo;
|
|
120
|
-
const { defaultTo } = column;
|
|
121
|
-
|
|
122
|
-
if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {
|
|
123
|
-
return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return (
|
|
127
|
-
_.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||
|
|
128
|
-
_.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)
|
|
129
|
-
);
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Compares two columns info
|
|
134
|
-
* @param {Object} oldColumn - column info read from DB
|
|
135
|
-
* @param {Object} column - newly generate column info
|
|
136
|
-
*/
|
|
137
|
-
const diffColumns = (oldColumn, column) => {
|
|
138
|
-
const changes = [];
|
|
139
|
-
|
|
140
|
-
const isIgnoredType = ['increments'].includes(column.type);
|
|
141
|
-
const oldType = oldColumn.type;
|
|
142
|
-
const type = db.dialect.getSqlType(column.type);
|
|
143
|
-
|
|
144
|
-
if (oldType !== type && !isIgnoredType) {
|
|
145
|
-
changes.push('type');
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// NOTE: compare args at some point and split them into specific properties instead
|
|
149
|
-
|
|
150
|
-
if (oldColumn.notNullable !== column.notNullable) {
|
|
151
|
-
changes.push('notNullable');
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const hasSameDefault = diffDefault(oldColumn, column);
|
|
155
|
-
if (!hasSameDefault) {
|
|
156
|
-
changes.push('defaultTo');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {
|
|
160
|
-
changes.push('unsigned');
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return {
|
|
164
|
-
status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
|
|
165
|
-
diff: {
|
|
166
|
-
name: column.name,
|
|
167
|
-
object: column,
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
const diffTableColumns = (srcTable, destTable) => {
|
|
173
|
-
const addedColumns = [];
|
|
174
|
-
const updatedColumns = [];
|
|
175
|
-
const unchangedColumns = [];
|
|
176
|
-
const removedColumns = [];
|
|
177
|
-
|
|
178
|
-
for (const destColumn of destTable.columns) {
|
|
179
|
-
if (!helpers.hasColumn(srcTable, destColumn.name)) {
|
|
180
|
-
addedColumns.push(destColumn);
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const srcColumn = helpers.findColumn(srcTable, destColumn.name);
|
|
185
|
-
const { status, diff } = diffColumns(srcColumn, destColumn);
|
|
186
|
-
|
|
187
|
-
if (status === statuses.CHANGED) {
|
|
188
|
-
updatedColumns.push(diff);
|
|
189
|
-
} else {
|
|
190
|
-
unchangedColumns.push(srcColumn);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
for (const srcColumn of srcTable.columns) {
|
|
195
|
-
if (!helpers.hasColumn(destTable, srcColumn.name)) {
|
|
196
|
-
removedColumns.push(srcColumn);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);
|
|
201
|
-
|
|
202
|
-
return {
|
|
203
|
-
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
204
|
-
diff: {
|
|
205
|
-
added: addedColumns,
|
|
206
|
-
updated: updatedColumns,
|
|
207
|
-
unchanged: unchangedColumns,
|
|
208
|
-
removed: removedColumns,
|
|
209
|
-
},
|
|
210
|
-
};
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
const diffTableIndexes = (srcTable, destTable) => {
|
|
214
|
-
const addedIndexes = [];
|
|
215
|
-
const updatedIndexes = [];
|
|
216
|
-
const unchangedIndexes = [];
|
|
217
|
-
const removedIndexes = [];
|
|
218
|
-
|
|
219
|
-
for (const destIndex of destTable.indexes) {
|
|
220
|
-
if (helpers.hasIndex(srcTable, destIndex.name)) {
|
|
221
|
-
const srcIndex = helpers.findIndex(srcTable, destIndex.name);
|
|
222
|
-
const { status, diff } = diffIndexes(srcIndex, destIndex);
|
|
223
|
-
|
|
224
|
-
if (status === statuses.CHANGED) {
|
|
225
|
-
updatedIndexes.push(diff);
|
|
226
|
-
} else {
|
|
227
|
-
unchangedIndexes.push(srcIndex);
|
|
228
|
-
}
|
|
229
|
-
} else {
|
|
230
|
-
addedIndexes.push(destIndex);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
for (const srcIndex of srcTable.indexes) {
|
|
235
|
-
if (!helpers.hasIndex(destTable, srcIndex.name)) {
|
|
236
|
-
removedIndexes.push(srcIndex);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);
|
|
241
|
-
|
|
242
|
-
return {
|
|
243
|
-
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
244
|
-
diff: {
|
|
245
|
-
added: addedIndexes,
|
|
246
|
-
updated: updatedIndexes,
|
|
247
|
-
unchanged: unchangedIndexes,
|
|
248
|
-
removed: removedIndexes,
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
const diffTableForeignKeys = (srcTable, destTable) => {
|
|
254
|
-
const addedForeignKeys = [];
|
|
255
|
-
const updatedForeignKeys = [];
|
|
256
|
-
const unchangedForeignKeys = [];
|
|
257
|
-
const removedForeignKeys = [];
|
|
258
|
-
|
|
259
|
-
if (!db.dialect.usesForeignKeys()) {
|
|
260
|
-
return {
|
|
261
|
-
status: statuses.UNCHANGED,
|
|
262
|
-
diff: {
|
|
263
|
-
added: addedForeignKeys,
|
|
264
|
-
updated: updatedForeignKeys,
|
|
265
|
-
unchanged: unchangedForeignKeys,
|
|
266
|
-
removed: removedForeignKeys,
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
for (const destForeignKey of destTable.foreignKeys) {
|
|
272
|
-
if (helpers.hasForeignKey(srcTable, destForeignKey.name)) {
|
|
273
|
-
const srcForeignKey = helpers.findForeignKey(srcTable, destForeignKey.name);
|
|
274
|
-
const { status, diff } = diffForeignKeys(srcForeignKey, destForeignKey);
|
|
275
|
-
|
|
276
|
-
if (status === statuses.CHANGED) {
|
|
277
|
-
updatedForeignKeys.push(diff);
|
|
278
|
-
} else {
|
|
279
|
-
unchangedForeignKeys.push(srcForeignKey);
|
|
280
|
-
}
|
|
281
|
-
} else {
|
|
282
|
-
addedForeignKeys.push(destForeignKey);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
for (const srcForeignKey of srcTable.foreignKeys) {
|
|
287
|
-
if (!helpers.hasForeignKey(destTable, srcForeignKey.name)) {
|
|
288
|
-
removedForeignKeys.push(srcForeignKey);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(
|
|
293
|
-
(arr) => arr.length > 0
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
return {
|
|
297
|
-
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
298
|
-
diff: {
|
|
299
|
-
added: addedForeignKeys,
|
|
300
|
-
updated: updatedForeignKeys,
|
|
301
|
-
unchanged: unchangedForeignKeys,
|
|
302
|
-
removed: removedForeignKeys,
|
|
303
|
-
},
|
|
304
|
-
};
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
const diffTables = (srcTable, destTable) => {
|
|
308
|
-
const columnsDiff = diffTableColumns(srcTable, destTable);
|
|
309
|
-
const indexesDiff = diffTableIndexes(srcTable, destTable);
|
|
310
|
-
const foreignKeysDiff = diffTableForeignKeys(srcTable, destTable);
|
|
311
|
-
|
|
312
|
-
const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);
|
|
313
|
-
|
|
314
|
-
return {
|
|
315
|
-
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
316
|
-
diff: {
|
|
317
|
-
name: srcTable.name,
|
|
318
|
-
indexes: indexesDiff.diff,
|
|
319
|
-
foreignKeys: foreignKeysDiff.diff,
|
|
320
|
-
columns: columnsDiff.diff,
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
const diffSchemas = async (srcSchema, destSchema) => {
|
|
326
|
-
const addedTables = [];
|
|
327
|
-
const updatedTables = [];
|
|
328
|
-
const unchangedTables = [];
|
|
329
|
-
const removedTables = [];
|
|
330
|
-
|
|
331
|
-
for (const destTable of destSchema.tables) {
|
|
332
|
-
if (helpers.hasTable(srcSchema, destTable.name)) {
|
|
333
|
-
const srcTable = helpers.findTable(srcSchema, destTable.name);
|
|
334
|
-
|
|
335
|
-
const { status, diff } = diffTables(srcTable, destTable);
|
|
336
|
-
|
|
337
|
-
if (status === statuses.CHANGED) {
|
|
338
|
-
updatedTables.push(diff);
|
|
339
|
-
} else {
|
|
340
|
-
unchangedTables.push(srcTable);
|
|
341
|
-
}
|
|
342
|
-
} else {
|
|
343
|
-
addedTables.push(destTable);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
const parsePersistedTable = (persistedTable) => {
|
|
348
|
-
if (typeof persistedTable === 'string') {
|
|
349
|
-
return persistedTable;
|
|
350
|
-
}
|
|
351
|
-
return persistedTable.name;
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
const persistedTables = helpers.hasTable(srcSchema, 'strapi_core_store_settings')
|
|
355
|
-
? (await strapi.store.get({
|
|
356
|
-
type: 'core',
|
|
357
|
-
key: 'persisted_tables',
|
|
358
|
-
})) ?? []
|
|
359
|
-
: [];
|
|
360
|
-
|
|
361
|
-
const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];
|
|
362
|
-
|
|
363
|
-
for (const srcTable of srcSchema.tables) {
|
|
364
|
-
if (!helpers.hasTable(destSchema, srcTable.name) && !reservedTables.includes(srcTable.name)) {
|
|
365
|
-
const dependencies = persistedTables
|
|
366
|
-
.filter((table) => {
|
|
367
|
-
const dependsOn = table?.dependsOn;
|
|
368
|
-
if (!_.isArray(dependsOn)) return;
|
|
369
|
-
return dependsOn.some((table) => table.name === srcTable.name);
|
|
370
|
-
})
|
|
371
|
-
.map((dependsOnTable) => {
|
|
372
|
-
return srcSchema.tables.find((srcTable) => srcTable.name === dependsOnTable.name);
|
|
373
|
-
})
|
|
374
|
-
// In case the table is not found, filter undefined values
|
|
375
|
-
.filter((table) => !_.isNil(table));
|
|
376
|
-
|
|
377
|
-
removedTables.push(srcTable, ...dependencies);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);
|
|
382
|
-
|
|
383
|
-
return {
|
|
384
|
-
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
385
|
-
diff: {
|
|
386
|
-
tables: {
|
|
387
|
-
added: addedTables,
|
|
388
|
-
updated: updatedTables,
|
|
389
|
-
unchanged: unchangedTables,
|
|
390
|
-
removed: removedTables,
|
|
391
|
-
},
|
|
392
|
-
},
|
|
393
|
-
};
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
return {
|
|
397
|
-
diff: diffSchemas,
|
|
398
|
-
};
|
|
399
|
-
};
|
package/lib/schema/index.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Database } from '../';
|
|
2
|
-
import { Action } from '../lifecycles';
|
|
3
|
-
|
|
4
|
-
type Type =
|
|
5
|
-
| 'string'
|
|
6
|
-
| 'text'
|
|
7
|
-
| 'richtext'
|
|
8
|
-
| 'json'
|
|
9
|
-
| 'enumeration'
|
|
10
|
-
| 'password'
|
|
11
|
-
| 'email'
|
|
12
|
-
| 'integer'
|
|
13
|
-
| 'biginteger'
|
|
14
|
-
| 'float'
|
|
15
|
-
| 'decimal'
|
|
16
|
-
| 'date'
|
|
17
|
-
| 'time'
|
|
18
|
-
| 'datetime'
|
|
19
|
-
| 'timestamp'
|
|
20
|
-
| 'boolean'
|
|
21
|
-
| 'relation';
|
|
22
|
-
|
|
23
|
-
export interface Attribute {
|
|
24
|
-
type: Type;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface Model {
|
|
28
|
-
uid: string;
|
|
29
|
-
tableName: string;
|
|
30
|
-
attributes: {
|
|
31
|
-
id: {
|
|
32
|
-
type: 'increments';
|
|
33
|
-
};
|
|
34
|
-
[k: string]: Attribute;
|
|
35
|
-
};
|
|
36
|
-
lifecycles?: {
|
|
37
|
-
[k in Action]: () => void;
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface SchemaProvider {
|
|
42
|
-
sync(): Promise<void>;
|
|
43
|
-
syncSchema(): Promise<void>;
|
|
44
|
-
reset(): Promise<void>;
|
|
45
|
-
create(): Promise<void>;
|
|
46
|
-
drop(): Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export default function (db: Database): SchemaProvider;
|
package/lib/schema/index.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const debug = require('debug')('strapi::database');
|
|
4
|
-
|
|
5
|
-
const createSchemaBuilder = require('./builder');
|
|
6
|
-
const createSchemaDiff = require('./diff');
|
|
7
|
-
const createSchemaStorage = require('./storage');
|
|
8
|
-
const { metadataToSchema } = require('./schema');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @type {import('.').default}
|
|
12
|
-
*/
|
|
13
|
-
const createSchemaProvider = (db) => {
|
|
14
|
-
const schema = metadataToSchema(db.metadata);
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
builder: createSchemaBuilder(db),
|
|
18
|
-
schemaDiff: createSchemaDiff(db),
|
|
19
|
-
schemaStorage: createSchemaStorage(db),
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Drops the database schema
|
|
23
|
-
*/
|
|
24
|
-
async drop() {
|
|
25
|
-
debug('Dropping database schema');
|
|
26
|
-
|
|
27
|
-
const DBSchema = await db.dialect.schemaInspector.getSchema();
|
|
28
|
-
await this.builder.dropSchema(DBSchema);
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Creates the database schema
|
|
33
|
-
*/
|
|
34
|
-
async create() {
|
|
35
|
-
debug('Created database schema');
|
|
36
|
-
await this.builder.createSchema(schema);
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Resets the database schema
|
|
41
|
-
*/
|
|
42
|
-
async reset() {
|
|
43
|
-
debug('Resetting database schema');
|
|
44
|
-
await this.drop();
|
|
45
|
-
await this.create();
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
async syncSchema() {
|
|
49
|
-
debug('Synchronizing database schema');
|
|
50
|
-
|
|
51
|
-
const DBSchema = await db.dialect.schemaInspector.getSchema();
|
|
52
|
-
|
|
53
|
-
const { status, diff } = await this.schemaDiff.diff(DBSchema, schema);
|
|
54
|
-
|
|
55
|
-
if (status === 'CHANGED') {
|
|
56
|
-
await this.builder.updateSchema(diff);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
await this.schemaStorage.add(schema);
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
// TODO: support options to migrate softly or forcefully
|
|
63
|
-
// TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup
|
|
64
|
-
// TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)
|
|
65
|
-
async sync() {
|
|
66
|
-
if (await db.migrations.shouldRun()) {
|
|
67
|
-
debug('Found migrations to run');
|
|
68
|
-
await db.migrations.up();
|
|
69
|
-
|
|
70
|
-
return this.syncSchema();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const oldSchema = await this.schemaStorage.read();
|
|
74
|
-
|
|
75
|
-
if (!oldSchema) {
|
|
76
|
-
debug('Schema not persisted yet');
|
|
77
|
-
return this.syncSchema();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const { hash: oldHash } = oldSchema;
|
|
81
|
-
const hash = await this.schemaStorage.hashSchema(schema);
|
|
82
|
-
|
|
83
|
-
if (oldHash !== hash) {
|
|
84
|
-
debug('Schema changed');
|
|
85
|
-
|
|
86
|
-
return this.syncSchema();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
debug('Schema unchanged');
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
module.exports = createSchemaProvider;
|