@strapi/database 5.12.0 → 5.12.2
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/connection.js +43 -0
- package/dist/connection.js.map +1 -0
- package/dist/connection.mjs +41 -0
- package/dist/connection.mjs.map +1 -0
- package/dist/dialects/dialect.js +54 -0
- package/dist/dialects/dialect.js.map +1 -0
- package/dist/dialects/dialect.mjs +52 -0
- package/dist/dialects/dialect.mjs.map +1 -0
- package/dist/dialects/index.js +44 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/index.mjs +42 -0
- package/dist/dialects/index.mjs.map +1 -0
- package/dist/dialects/mysql/constants.js +8 -0
- package/dist/dialects/mysql/constants.js.map +1 -0
- package/dist/dialects/mysql/constants.mjs +5 -0
- package/dist/dialects/mysql/constants.mjs.map +1 -0
- package/dist/dialects/mysql/database-inspector.js +35 -0
- package/dist/dialects/mysql/database-inspector.js.map +1 -0
- package/dist/dialects/mysql/database-inspector.mjs +33 -0
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
- package/dist/dialects/mysql/index.js +75 -0
- package/dist/dialects/mysql/index.js.map +1 -0
- package/dist/dialects/mysql/index.mjs +73 -0
- package/dist/dialects/mysql/index.mjs.map +1 -0
- package/dist/dialects/mysql/schema-inspector.js +297 -0
- package/dist/dialects/mysql/schema-inspector.js.map +1 -0
- package/dist/dialects/mysql/schema-inspector.mjs +295 -0
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/postgresql/index.js +62 -0
- package/dist/dialects/postgresql/index.js.map +1 -0
- package/dist/dialects/postgresql/index.mjs +60 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.js +316 -0
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/sqlite/index.js +82 -0
- package/dist/dialects/sqlite/index.js.map +1 -0
- package/dist/dialects/sqlite/index.mjs +80 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.js +211 -0
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
- package/dist/entity-manager/entity-repository.js +139 -0
- package/dist/entity-manager/entity-repository.js.map +1 -0
- package/dist/entity-manager/entity-repository.mjs +137 -0
- package/dist/entity-manager/entity-repository.mjs.map +1 -0
- package/dist/entity-manager/index.js +1186 -0
- package/dist/entity-manager/index.js.map +1 -0
- package/dist/entity-manager/index.mjs +1184 -0
- package/dist/entity-manager/index.mjs.map +1 -0
- package/dist/entity-manager/morph-relations.js +73 -0
- package/dist/entity-manager/morph-relations.js.map +1 -0
- package/dist/entity-manager/morph-relations.mjs +69 -0
- package/dist/entity-manager/morph-relations.mjs.map +1 -0
- package/dist/entity-manager/regular-relations.js +247 -0
- package/dist/entity-manager/regular-relations.js.map +1 -0
- package/dist/entity-manager/regular-relations.mjs +242 -0
- package/dist/entity-manager/regular-relations.mjs.map +1 -0
- package/dist/entity-manager/relations-orderer.js +221 -0
- package/dist/entity-manager/relations-orderer.js.map +1 -0
- package/dist/entity-manager/relations-orderer.mjs +218 -0
- package/dist/entity-manager/relations-orderer.mjs.map +1 -0
- package/dist/errors/database.js +13 -0
- package/dist/errors/database.js.map +1 -0
- package/dist/errors/database.mjs +11 -0
- package/dist/errors/database.mjs.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.mjs +7 -0
- package/dist/errors/index.mjs.map +1 -0
- package/dist/errors/invalid-date.js +13 -0
- package/dist/errors/invalid-date.js.map +1 -0
- package/dist/errors/invalid-date.mjs +11 -0
- package/dist/errors/invalid-date.mjs.map +1 -0
- package/dist/errors/invalid-datetime.js +13 -0
- package/dist/errors/invalid-datetime.js.map +1 -0
- package/dist/errors/invalid-datetime.mjs +11 -0
- package/dist/errors/invalid-datetime.mjs.map +1 -0
- package/dist/errors/invalid-relation.js +13 -0
- package/dist/errors/invalid-relation.js.map +1 -0
- package/dist/errors/invalid-relation.mjs +11 -0
- package/dist/errors/invalid-relation.mjs.map +1 -0
- package/dist/errors/invalid-time.js +13 -0
- package/dist/errors/invalid-time.js.map +1 -0
- package/dist/errors/invalid-time.mjs +11 -0
- package/dist/errors/invalid-time.mjs.map +1 -0
- package/dist/errors/not-null.js +17 -0
- package/dist/errors/not-null.js.map +1 -0
- package/dist/errors/not-null.mjs +15 -0
- package/dist/errors/not-null.mjs.map +1 -0
- package/dist/fields/biginteger.js +9 -0
- package/dist/fields/biginteger.js.map +1 -0
- package/dist/fields/biginteger.mjs +7 -0
- package/dist/fields/biginteger.mjs.map +1 -0
- package/dist/fields/boolean.js +48 -0
- package/dist/fields/boolean.js.map +1 -0
- package/dist/fields/boolean.mjs +46 -0
- package/dist/fields/boolean.mjs.map +1 -0
- package/dist/fields/date.js +16 -0
- package/dist/fields/date.js.map +1 -0
- package/dist/fields/date.mjs +14 -0
- package/dist/fields/date.mjs.map +1 -0
- package/dist/fields/datetime.js +37 -0
- package/dist/fields/datetime.js.map +1 -0
- package/dist/fields/datetime.mjs +16 -0
- package/dist/fields/datetime.mjs.map +1 -0
- package/dist/fields/field.js +16 -0
- package/dist/fields/field.js.map +1 -0
- package/dist/fields/field.mjs +14 -0
- package/dist/fields/field.mjs.map +1 -0
- package/dist/fields/index.js +45 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +43 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/fields/json.js +36 -0
- package/dist/fields/json.js.map +1 -0
- package/dist/fields/json.mjs +34 -0
- package/dist/fields/json.mjs.map +1 -0
- package/dist/fields/number.js +20 -0
- package/dist/fields/number.js.map +1 -0
- package/dist/fields/number.mjs +18 -0
- package/dist/fields/number.mjs.map +1 -0
- package/dist/fields/shared/parsers.js +91 -0
- package/dist/fields/shared/parsers.js.map +1 -0
- package/dist/fields/shared/parsers.mjs +68 -0
- package/dist/fields/shared/parsers.mjs.map +1 -0
- package/dist/fields/string.js +16 -0
- package/dist/fields/string.js.map +1 -0
- package/dist/fields/string.mjs +14 -0
- package/dist/fields/string.mjs.map +1 -0
- package/dist/fields/time.js +17 -0
- package/dist/fields/time.js.map +1 -0
- package/dist/fields/time.mjs +15 -0
- package/dist/fields/time.mjs.map +1 -0
- package/dist/fields/timestamp.js +37 -0
- package/dist/fields/timestamp.js.map +1 -0
- package/dist/fields/timestamp.mjs +16 -0
- package/dist/fields/timestamp.mjs.map +1 -0
- package/dist/index.js +33 -8569
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -8532
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js +73 -0
- package/dist/lifecycles/index.js.map +1 -0
- package/dist/lifecycles/index.mjs +71 -0
- package/dist/lifecycles/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/index.js +10 -0
- package/dist/lifecycles/subscribers/index.js.map +1 -0
- package/dist/lifecycles/subscribers/index.mjs +8 -0
- package/dist/lifecycles/subscribers/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.js +55 -0
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
- package/dist/metadata/index.js +24 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/index.mjs +16 -0
- package/dist/metadata/index.mjs.map +1 -0
- package/dist/metadata/metadata.js +100 -0
- package/dist/metadata/metadata.js.map +1 -0
- package/dist/metadata/metadata.mjs +98 -0
- package/dist/metadata/metadata.mjs.map +1 -0
- package/dist/metadata/relations.js +545 -0
- package/dist/metadata/relations.js.map +1 -0
- package/dist/metadata/relations.mjs +536 -0
- package/dist/metadata/relations.mjs.map +1 -0
- package/dist/migrations/common.js +8 -0
- package/dist/migrations/common.js.map +1 -0
- package/dist/migrations/common.mjs +6 -0
- package/dist/migrations/common.mjs.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +37 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/index.js +26 -0
- package/dist/migrations/internal-migrations/index.js.map +1 -0
- package/dist/migrations/internal-migrations/index.mjs +24 -0
- package/dist/migrations/internal-migrations/index.mjs.map +1 -0
- package/dist/migrations/internal.js +63 -0
- package/dist/migrations/internal.js.map +1 -0
- package/dist/migrations/internal.mjs +61 -0
- package/dist/migrations/internal.mjs.map +1 -0
- package/dist/migrations/logger.js +24 -0
- package/dist/migrations/logger.js.map +1 -0
- package/dist/migrations/logger.mjs +22 -0
- package/dist/migrations/logger.mjs.map +1 -0
- package/dist/migrations/storage.js +39 -0
- package/dist/migrations/storage.js.map +1 -0
- package/dist/migrations/storage.mjs +37 -0
- package/dist/migrations/storage.mjs.map +1 -0
- package/dist/migrations/users.js +87 -0
- package/dist/migrations/users.js.map +1 -0
- package/dist/migrations/users.mjs +85 -0
- package/dist/migrations/users.mjs.map +1 -0
- package/dist/query/helpers/join.js +127 -0
- package/dist/query/helpers/join.js.map +1 -0
- package/dist/query/helpers/join.mjs +122 -0
- package/dist/query/helpers/join.mjs.map +1 -0
- package/dist/query/helpers/order-by.js +167 -0
- package/dist/query/helpers/order-by.js.map +1 -0
- package/dist/query/helpers/order-by.mjs +163 -0
- package/dist/query/helpers/order-by.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.js +592 -0
- package/dist/query/helpers/populate/apply.js.map +1 -0
- package/dist/query/helpers/populate/apply.mjs +590 -0
- package/dist/query/helpers/populate/apply.mjs.map +1 -0
- package/dist/query/helpers/populate/process.js +92 -0
- package/dist/query/helpers/populate/process.js.map +1 -0
- package/dist/query/helpers/populate/process.mjs +90 -0
- package/dist/query/helpers/populate/process.mjs.map +1 -0
- package/dist/query/helpers/search.js +67 -0
- package/dist/query/helpers/search.js.map +1 -0
- package/dist/query/helpers/search.mjs +65 -0
- package/dist/query/helpers/search.mjs.map +1 -0
- package/dist/query/helpers/streams/readable.js +131 -0
- package/dist/query/helpers/streams/readable.js.map +1 -0
- package/dist/query/helpers/streams/readable.mjs +129 -0
- package/dist/query/helpers/streams/readable.mjs.map +1 -0
- package/dist/query/helpers/transform.js +77 -0
- package/dist/query/helpers/transform.js.map +1 -0
- package/dist/query/helpers/transform.mjs +73 -0
- package/dist/query/helpers/transform.mjs.map +1 -0
- package/dist/query/helpers/where.js +372 -0
- package/dist/query/helpers/where.js.map +1 -0
- package/dist/query/helpers/where.mjs +369 -0
- package/dist/query/helpers/where.mjs.map +1 -0
- package/dist/query/query-builder.js +507 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +505 -0
- package/dist/query/query-builder.mjs.map +1 -0
- package/dist/repairs/index.js +13 -0
- package/dist/repairs/index.js.map +1 -0
- package/dist/repairs/index.mjs +11 -0
- package/dist/repairs/index.mjs.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
- package/dist/schema/builder.js +354 -0
- package/dist/schema/builder.js.map +1 -0
- package/dist/schema/builder.mjs +352 -0
- package/dist/schema/builder.mjs.map +1 -0
- package/dist/schema/diff.js +379 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/diff.mjs +377 -0
- package/dist/schema/diff.mjs.map +1 -0
- package/dist/schema/index.js +93 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +91 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/schema.js +266 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.mjs +264 -0
- package/dist/schema/schema.mjs.map +1 -0
- package/dist/schema/storage.js +58 -0
- package/dist/schema/storage.js.map +1 -0
- package/dist/schema/storage.mjs +56 -0
- package/dist/schema/storage.mjs.map +1 -0
- package/dist/transaction-context.js +65 -0
- package/dist/transaction-context.js.map +1 -0
- package/dist/transaction-context.mjs +63 -0
- package/dist/transaction-context.mjs.map +1 -0
- package/dist/utils/async-curry.js +19 -0
- package/dist/utils/async-curry.js.map +1 -0
- package/dist/utils/async-curry.mjs +17 -0
- package/dist/utils/async-curry.mjs.map +1 -0
- package/dist/utils/identifiers/hash.js +30 -0
- package/dist/utils/identifiers/hash.js.map +1 -0
- package/dist/utils/identifiers/hash.mjs +28 -0
- package/dist/utils/identifiers/hash.mjs.map +1 -0
- package/dist/utils/identifiers/index.js +414 -0
- package/dist/utils/identifiers/index.js.map +1 -0
- package/dist/utils/identifiers/index.mjs +411 -0
- package/dist/utils/identifiers/index.mjs.map +1 -0
- package/dist/utils/knex.js +21 -0
- package/dist/utils/knex.js.map +1 -0
- package/dist/utils/knex.mjs +18 -0
- package/dist/utils/knex.mjs.map +1 -0
- package/dist/utils/types.js +51 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/types.mjs +44 -0
- package/dist/utils/types.mjs.map +1 -0
- package/dist/validations/index.js +12 -0
- package/dist/validations/index.js.map +1 -0
- package/dist/validations/index.mjs +10 -0
- package/dist/validations/index.mjs.map +1 -0
- package/dist/validations/relations/bidirectional.js +64 -0
- package/dist/validations/relations/bidirectional.js.map +1 -0
- package/dist/validations/relations/bidirectional.mjs +62 -0
- package/dist/validations/relations/bidirectional.mjs.map +1 -0
- package/dist/validations/relations/index.js +13 -0
- package/dist/validations/relations/index.js.map +1 -0
- package/dist/validations/relations/index.mjs +11 -0
- package/dist/validations/relations/index.mjs.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import _ from 'lodash/fp';
|
|
2
|
+
|
|
3
|
+
// TODO: get that list dynamically instead
|
|
4
|
+
const RESERVED_TABLE_NAMES = [
|
|
5
|
+
'strapi_migrations',
|
|
6
|
+
'strapi_migrations_internal',
|
|
7
|
+
'strapi_database_schema'
|
|
8
|
+
];
|
|
9
|
+
const statuses = {
|
|
10
|
+
CHANGED: 'CHANGED',
|
|
11
|
+
UNCHANGED: 'UNCHANGED'
|
|
12
|
+
};
|
|
13
|
+
// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff
|
|
14
|
+
// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl
|
|
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
|
+
hasColumn (table, columnName) {
|
|
23
|
+
return table.columns.findIndex((column)=>column.name === columnName) !== -1;
|
|
24
|
+
},
|
|
25
|
+
findColumn (table, columnName) {
|
|
26
|
+
return table.columns.find((column)=>column.name === columnName);
|
|
27
|
+
},
|
|
28
|
+
hasIndex (table, columnName) {
|
|
29
|
+
return table.indexes.findIndex((column)=>column.name === columnName) !== -1;
|
|
30
|
+
},
|
|
31
|
+
findIndex (table, columnName) {
|
|
32
|
+
return table.indexes.find((column)=>column.name === columnName);
|
|
33
|
+
},
|
|
34
|
+
hasForeignKey (table, columnName) {
|
|
35
|
+
return table.foreignKeys.findIndex((column)=>column.name === columnName) !== -1;
|
|
36
|
+
},
|
|
37
|
+
findForeignKey (table, columnName) {
|
|
38
|
+
return table.foreignKeys.find((column)=>column.name === columnName);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var createSchemaDiff = ((db)=>{
|
|
42
|
+
const hasChangedStatus = (diff)=>diff.status === statuses.CHANGED;
|
|
43
|
+
/**
|
|
44
|
+
* Compares two indexes info
|
|
45
|
+
* @param {Object} oldIndex - index info read from DB
|
|
46
|
+
* @param {Object} index - newly generate index info
|
|
47
|
+
*/ const diffIndexes = (oldIndex, index)=>{
|
|
48
|
+
const changes = [];
|
|
49
|
+
// use xor to avoid differences in order
|
|
50
|
+
if (_.xor(oldIndex.columns, index.columns).length > 0) {
|
|
51
|
+
changes.push('columns');
|
|
52
|
+
}
|
|
53
|
+
if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {
|
|
54
|
+
changes.push('type');
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
|
|
58
|
+
diff: {
|
|
59
|
+
name: index.name,
|
|
60
|
+
object: index
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Compares two foreign keys info
|
|
66
|
+
* @param {Object} oldForeignKey - foreignKey info read from DB
|
|
67
|
+
* @param {Object} foreignKey - newly generate foreignKey info
|
|
68
|
+
*/ const diffForeignKeys = (oldForeignKey, foreignKey)=>{
|
|
69
|
+
const changes = [];
|
|
70
|
+
if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {
|
|
71
|
+
changes.push('columns');
|
|
72
|
+
}
|
|
73
|
+
if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {
|
|
74
|
+
changes.push('referencedColumns');
|
|
75
|
+
}
|
|
76
|
+
if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {
|
|
77
|
+
changes.push('referencedTable');
|
|
78
|
+
}
|
|
79
|
+
if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {
|
|
80
|
+
if (!_.isNil(foreignKey.onDelete) && _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION') {
|
|
81
|
+
changes.push('onDelete');
|
|
82
|
+
}
|
|
83
|
+
} else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {
|
|
84
|
+
changes.push('onDelete');
|
|
85
|
+
}
|
|
86
|
+
if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {
|
|
87
|
+
if (!_.isNil(foreignKey.onUpdate) && _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION') {
|
|
88
|
+
changes.push('onUpdate');
|
|
89
|
+
}
|
|
90
|
+
} else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {
|
|
91
|
+
changes.push('onUpdate');
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
|
|
95
|
+
diff: {
|
|
96
|
+
name: foreignKey.name,
|
|
97
|
+
object: foreignKey
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
const diffDefault = (oldColumn, column)=>{
|
|
102
|
+
const oldDefaultTo = oldColumn.defaultTo;
|
|
103
|
+
const { defaultTo } = column;
|
|
104
|
+
if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {
|
|
105
|
+
return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';
|
|
106
|
+
}
|
|
107
|
+
return _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) || _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`);
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Compares two columns info
|
|
111
|
+
* @param {Object} oldColumn - column info read from DB
|
|
112
|
+
* @param {Object} column - newly generate column info
|
|
113
|
+
*/ const diffColumns = (oldColumn, column)=>{
|
|
114
|
+
const changes = [];
|
|
115
|
+
const isIgnoredType = [
|
|
116
|
+
'increments'
|
|
117
|
+
].includes(column.type);
|
|
118
|
+
const oldType = oldColumn.type;
|
|
119
|
+
const type = db.dialect.getSqlType(column.type);
|
|
120
|
+
if (oldType !== type && !isIgnoredType) {
|
|
121
|
+
changes.push('type');
|
|
122
|
+
}
|
|
123
|
+
// NOTE: compare args at some point and split them into specific properties instead
|
|
124
|
+
if (oldColumn.notNullable !== column.notNullable) {
|
|
125
|
+
changes.push('notNullable');
|
|
126
|
+
}
|
|
127
|
+
const hasSameDefault = diffDefault(oldColumn, column);
|
|
128
|
+
if (!hasSameDefault) {
|
|
129
|
+
changes.push('defaultTo');
|
|
130
|
+
}
|
|
131
|
+
if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {
|
|
132
|
+
changes.push('unsigned');
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
|
|
136
|
+
diff: {
|
|
137
|
+
name: column.name,
|
|
138
|
+
object: column
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
const diffTableColumns = (diffCtx)=>{
|
|
143
|
+
const { databaseTable, userSchemaTable, previousTable } = diffCtx;
|
|
144
|
+
const addedColumns = [];
|
|
145
|
+
const updatedColumns = [];
|
|
146
|
+
const unchangedColumns = [];
|
|
147
|
+
const removedColumns = [];
|
|
148
|
+
for (const userSchemaColumn of userSchemaTable.columns){
|
|
149
|
+
const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);
|
|
150
|
+
if (databaseColumn) {
|
|
151
|
+
const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);
|
|
152
|
+
if (status === statuses.CHANGED) {
|
|
153
|
+
updatedColumns.push(diff);
|
|
154
|
+
} else {
|
|
155
|
+
unchangedColumns.push(databaseColumn);
|
|
156
|
+
}
|
|
157
|
+
} else {
|
|
158
|
+
addedColumns.push(userSchemaColumn);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const databaseColumn of databaseTable.columns){
|
|
162
|
+
if (!helpers.hasColumn(userSchemaTable, databaseColumn.name) && previousTable && helpers.hasColumn(previousTable, databaseColumn.name)) {
|
|
163
|
+
removedColumns.push(databaseColumn);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const hasChanged = [
|
|
167
|
+
addedColumns,
|
|
168
|
+
updatedColumns,
|
|
169
|
+
removedColumns
|
|
170
|
+
].some((arr)=>arr.length > 0);
|
|
171
|
+
return {
|
|
172
|
+
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
173
|
+
diff: {
|
|
174
|
+
added: addedColumns,
|
|
175
|
+
updated: updatedColumns,
|
|
176
|
+
unchanged: unchangedColumns,
|
|
177
|
+
removed: removedColumns
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
const diffTableIndexes = (diffCtx)=>{
|
|
182
|
+
const { databaseTable, userSchemaTable, previousTable } = diffCtx;
|
|
183
|
+
const addedIndexes = [];
|
|
184
|
+
const updatedIndexes = [];
|
|
185
|
+
const unchangedIndexes = [];
|
|
186
|
+
const removedIndexes = [];
|
|
187
|
+
for (const userSchemaIndex of userSchemaTable.indexes){
|
|
188
|
+
const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);
|
|
189
|
+
if (databaseIndex) {
|
|
190
|
+
const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);
|
|
191
|
+
if (status === statuses.CHANGED) {
|
|
192
|
+
updatedIndexes.push(diff);
|
|
193
|
+
} else {
|
|
194
|
+
unchangedIndexes.push(databaseIndex);
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
addedIndexes.push(userSchemaIndex);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const databaseIndex of databaseTable.indexes){
|
|
201
|
+
if (!helpers.hasIndex(userSchemaTable, databaseIndex.name) && previousTable && helpers.hasIndex(previousTable, databaseIndex.name)) {
|
|
202
|
+
removedIndexes.push(databaseIndex);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const hasChanged = [
|
|
206
|
+
addedIndexes,
|
|
207
|
+
updatedIndexes,
|
|
208
|
+
removedIndexes
|
|
209
|
+
].some((arr)=>arr.length > 0);
|
|
210
|
+
return {
|
|
211
|
+
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
212
|
+
diff: {
|
|
213
|
+
added: addedIndexes,
|
|
214
|
+
updated: updatedIndexes,
|
|
215
|
+
unchanged: unchangedIndexes,
|
|
216
|
+
removed: removedIndexes
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
};
|
|
220
|
+
const diffTableForeignKeys = (diffCtx)=>{
|
|
221
|
+
const { databaseTable, userSchemaTable, previousTable } = diffCtx;
|
|
222
|
+
const addedForeignKeys = [];
|
|
223
|
+
const updatedForeignKeys = [];
|
|
224
|
+
const unchangedForeignKeys = [];
|
|
225
|
+
const removedForeignKeys = [];
|
|
226
|
+
if (!db.dialect.usesForeignKeys()) {
|
|
227
|
+
return {
|
|
228
|
+
status: statuses.UNCHANGED,
|
|
229
|
+
diff: {
|
|
230
|
+
added: addedForeignKeys,
|
|
231
|
+
updated: updatedForeignKeys,
|
|
232
|
+
unchanged: unchangedForeignKeys,
|
|
233
|
+
removed: removedForeignKeys
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
for (const userSchemaForeignKeys of userSchemaTable.foreignKeys){
|
|
238
|
+
const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);
|
|
239
|
+
if (databaseForeignKeys) {
|
|
240
|
+
const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);
|
|
241
|
+
if (status === statuses.CHANGED) {
|
|
242
|
+
updatedForeignKeys.push(diff);
|
|
243
|
+
} else {
|
|
244
|
+
unchangedForeignKeys.push(databaseForeignKeys);
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
addedForeignKeys.push(userSchemaForeignKeys);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
for (const databaseForeignKeys of databaseTable.foreignKeys){
|
|
251
|
+
if (!helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) && previousTable && helpers.hasForeignKey(previousTable, databaseForeignKeys.name)) {
|
|
252
|
+
removedForeignKeys.push(databaseForeignKeys);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const hasChanged = [
|
|
256
|
+
addedForeignKeys,
|
|
257
|
+
updatedForeignKeys,
|
|
258
|
+
removedForeignKeys
|
|
259
|
+
].some((arr)=>arr.length > 0);
|
|
260
|
+
return {
|
|
261
|
+
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
262
|
+
diff: {
|
|
263
|
+
added: addedForeignKeys,
|
|
264
|
+
updated: updatedForeignKeys,
|
|
265
|
+
unchanged: unchangedForeignKeys,
|
|
266
|
+
removed: removedForeignKeys
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
const diffTables = (diffCtx)=>{
|
|
271
|
+
const { databaseTable } = diffCtx;
|
|
272
|
+
const columnsDiff = diffTableColumns(diffCtx);
|
|
273
|
+
const indexesDiff = diffTableIndexes(diffCtx);
|
|
274
|
+
const foreignKeysDiff = diffTableForeignKeys(diffCtx);
|
|
275
|
+
const hasChanged = [
|
|
276
|
+
columnsDiff,
|
|
277
|
+
indexesDiff,
|
|
278
|
+
foreignKeysDiff
|
|
279
|
+
].some(hasChangedStatus);
|
|
280
|
+
return {
|
|
281
|
+
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
282
|
+
diff: {
|
|
283
|
+
name: databaseTable.name,
|
|
284
|
+
indexes: indexesDiff.diff,
|
|
285
|
+
foreignKeys: foreignKeysDiff.diff,
|
|
286
|
+
columns: columnsDiff.diff
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
const diffSchemas = async (schemaDiffCtx)=>{
|
|
291
|
+
const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;
|
|
292
|
+
const addedTables = [];
|
|
293
|
+
const updatedTables = [];
|
|
294
|
+
const unchangedTables = [];
|
|
295
|
+
const removedTables = [];
|
|
296
|
+
// for each table in the user schema, check if it already exists in the database schema
|
|
297
|
+
for (const userSchemaTable of userSchema.tables){
|
|
298
|
+
const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);
|
|
299
|
+
const previousTable = previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);
|
|
300
|
+
if (databaseTable) {
|
|
301
|
+
const { status, diff } = diffTables({
|
|
302
|
+
previousTable,
|
|
303
|
+
databaseTable,
|
|
304
|
+
userSchemaTable
|
|
305
|
+
});
|
|
306
|
+
if (status === statuses.CHANGED) {
|
|
307
|
+
updatedTables.push(diff);
|
|
308
|
+
} else {
|
|
309
|
+
unchangedTables.push(databaseTable);
|
|
310
|
+
}
|
|
311
|
+
} else {
|
|
312
|
+
addedTables.push(userSchemaTable);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// maintain audit logs table from EE -> CE
|
|
316
|
+
const parsePersistedTable = (persistedTable)=>{
|
|
317
|
+
if (typeof persistedTable === 'string') {
|
|
318
|
+
return persistedTable;
|
|
319
|
+
}
|
|
320
|
+
return persistedTable.name;
|
|
321
|
+
};
|
|
322
|
+
const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings') ? await strapi.store.get({
|
|
323
|
+
type: 'core',
|
|
324
|
+
key: 'persisted_tables'
|
|
325
|
+
}) ?? [] : [];
|
|
326
|
+
const reservedTables = [
|
|
327
|
+
...RESERVED_TABLE_NAMES,
|
|
328
|
+
...persistedTables.map(parsePersistedTable)
|
|
329
|
+
];
|
|
330
|
+
// for all tables in the database schema, check if they are not in the user schema
|
|
331
|
+
for (const databaseTable of databaseSchema.tables){
|
|
332
|
+
const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);
|
|
333
|
+
const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);
|
|
334
|
+
const isReserved = reservedTables.includes(databaseTable.name);
|
|
335
|
+
// NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch
|
|
336
|
+
if (!isInUserSchema && !wasTracked) {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
// if a db table is not in the user schema I want to delete it
|
|
340
|
+
if (!isInUserSchema && wasTracked && !isReserved) {
|
|
341
|
+
const dependencies = persistedTables.filter((table)=>{
|
|
342
|
+
const dependsOn = table?.dependsOn;
|
|
343
|
+
if (!_.isArray(dependsOn)) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
return dependsOn.some((table)=>table.name === databaseTable.name);
|
|
347
|
+
}).map((dependsOnTable)=>{
|
|
348
|
+
return databaseSchema.tables.find((databaseTable)=>databaseTable.name === dependsOnTable.name);
|
|
349
|
+
})// In case the table is not found, filter undefined values
|
|
350
|
+
.filter((table)=>!_.isNil(table));
|
|
351
|
+
removedTables.push(databaseTable, ...dependencies);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const hasChanged = [
|
|
355
|
+
addedTables,
|
|
356
|
+
updatedTables,
|
|
357
|
+
removedTables
|
|
358
|
+
].some((arr)=>arr.length > 0);
|
|
359
|
+
return {
|
|
360
|
+
status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
|
|
361
|
+
diff: {
|
|
362
|
+
tables: {
|
|
363
|
+
added: addedTables,
|
|
364
|
+
updated: updatedTables,
|
|
365
|
+
unchanged: unchangedTables,
|
|
366
|
+
removed: removedTables
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
return {
|
|
372
|
+
diff: diffSchemas
|
|
373
|
+
};
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
export { createSchemaDiff as default };
|
|
377
|
+
//# sourceMappingURL=diff.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.mjs","sources":["../../src/schema/diff.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type {\n Schema,\n Table,\n SchemaDiff,\n Index,\n ForeignKey,\n Column,\n IndexDiff,\n IndexesDiff,\n ForeignKeyDiff,\n ForeignKeysDiff,\n ColumnDiff,\n TableDiff,\n ColumnsDiff,\n} from './types';\nimport type { Database } from '..';\n\ntype PersistedTable = {\n name: string;\n dependsOn?: Array<{ name: string }>;\n};\n\ntype TableDiffContext = {\n previousTable?: Table;\n databaseTable: Table;\n userSchemaTable: Table;\n};\n\ntype SchemaDiffContext = {\n previousSchema?: Schema;\n databaseSchema: Schema;\n userSchema: Schema;\n};\n\n// TODO: get that list dynamically instead\nconst RESERVED_TABLE_NAMES = [\n 'strapi_migrations',\n 'strapi_migrations_internal',\n 'strapi_database_schema',\n];\n\nconst statuses = {\n CHANGED: 'CHANGED',\n UNCHANGED: 'UNCHANGED',\n} as const;\n\n// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff\n// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl\n\nconst helpers = {\n hasTable(schema: Schema, tableName: string) {\n return schema.tables.findIndex((table) => table.name === tableName) !== -1;\n },\n findTable(schema: Schema, tableName: string) {\n return schema.tables.find((table) => table.name === tableName);\n },\n hasColumn(table: Table, columnName: string) {\n return table.columns.findIndex((column) => column.name === columnName) !== -1;\n },\n findColumn(table: Table, columnName: string) {\n return table.columns.find((column) => column.name === columnName);\n },\n\n hasIndex(table: Table, columnName: string) {\n return table.indexes.findIndex((column) => column.name === columnName) !== -1;\n },\n findIndex(table: Table, columnName: string) {\n return table.indexes.find((column) => column.name === columnName);\n },\n\n hasForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;\n },\n findForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.find((column) => column.name === columnName);\n },\n};\n\nexport default (db: Database) => {\n const hasChangedStatus = (diff: { status: 'CHANGED' | 'UNCHANGED' }) =>\n diff.status === statuses.CHANGED;\n\n /**\n * Compares two indexes info\n * @param {Object} oldIndex - index info read from DB\n * @param {Object} index - newly generate index info\n */\n const diffIndexes = (oldIndex: Index, index: Index): IndexDiff => {\n const changes: string[] = [];\n\n // use xor to avoid differences in order\n if (_.xor(oldIndex.columns, index.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {\n changes.push('type');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: index.name,\n object: index,\n },\n };\n };\n\n /**\n * Compares two foreign keys info\n * @param {Object} oldForeignKey - foreignKey info read from DB\n * @param {Object} foreignKey - newly generate foreignKey info\n */\n const diffForeignKeys = (oldForeignKey: ForeignKey, foreignKey: ForeignKey): ForeignKeyDiff => {\n const changes: string[] = [];\n\n if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {\n changes.push('columns');\n }\n\n if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {\n changes.push('referencedColumns');\n }\n\n if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {\n changes.push('referencedTable');\n }\n\n if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onDelete) &&\n _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {\n changes.push('onDelete');\n }\n\n if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onUpdate) &&\n _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {\n changes.push('onUpdate');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: foreignKey.name,\n object: foreignKey,\n },\n };\n };\n\n const diffDefault = (oldColumn: Column, column: Column) => {\n const oldDefaultTo = oldColumn.defaultTo;\n const { defaultTo } = column;\n\n if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {\n return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';\n }\n\n return (\n _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||\n _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)\n );\n };\n\n /**\n * Compares two columns info\n * @param {Object} oldColumn - column info read from DB\n * @param {Object} column - newly generate column info\n */\n const diffColumns = (oldColumn: Column, column: Column): ColumnDiff => {\n const changes: string[] = [];\n\n const isIgnoredType = ['increments'].includes(column.type);\n const oldType = oldColumn.type;\n const type = db.dialect.getSqlType(column.type);\n\n if (oldType !== type && !isIgnoredType) {\n changes.push('type');\n }\n\n // NOTE: compare args at some point and split them into specific properties instead\n\n if (oldColumn.notNullable !== column.notNullable) {\n changes.push('notNullable');\n }\n\n const hasSameDefault = diffDefault(oldColumn, column);\n if (!hasSameDefault) {\n changes.push('defaultTo');\n }\n\n if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {\n changes.push('unsigned');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: column.name,\n object: column,\n },\n };\n };\n\n const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedColumns: Column[] = [];\n const updatedColumns: ColumnDiff['diff'][] = [];\n const unchangedColumns: Column[] = [];\n const removedColumns: Column[] = [];\n\n for (const userSchemaColumn of userSchemaTable.columns) {\n const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);\n\n if (databaseColumn) {\n const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);\n\n if (status === statuses.CHANGED) {\n updatedColumns.push(diff);\n } else {\n unchangedColumns.push(databaseColumn);\n }\n } else {\n addedColumns.push(userSchemaColumn);\n }\n }\n\n for (const databaseColumn of databaseTable.columns) {\n if (\n !helpers.hasColumn(userSchemaTable, databaseColumn.name) &&\n previousTable &&\n helpers.hasColumn(previousTable, databaseColumn.name)\n ) {\n removedColumns.push(databaseColumn);\n }\n }\n\n const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedColumns,\n updated: updatedColumns,\n unchanged: unchangedColumns,\n removed: removedColumns,\n },\n };\n };\n\n const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedIndexes: Index[] = [];\n const updatedIndexes: IndexDiff['diff'][] = [];\n const unchangedIndexes: Index[] = [];\n const removedIndexes: Index[] = [];\n\n for (const userSchemaIndex of userSchemaTable.indexes) {\n const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);\n if (databaseIndex) {\n const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);\n\n if (status === statuses.CHANGED) {\n updatedIndexes.push(diff);\n } else {\n unchangedIndexes.push(databaseIndex);\n }\n } else {\n addedIndexes.push(userSchemaIndex);\n }\n }\n\n for (const databaseIndex of databaseTable.indexes) {\n if (\n !helpers.hasIndex(userSchemaTable, databaseIndex.name) &&\n previousTable &&\n helpers.hasIndex(previousTable, databaseIndex.name)\n ) {\n removedIndexes.push(databaseIndex);\n }\n }\n\n const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedIndexes,\n updated: updatedIndexes,\n unchanged: unchangedIndexes,\n removed: removedIndexes,\n },\n };\n };\n\n const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedForeignKeys: ForeignKey[] = [];\n const updatedForeignKeys: ForeignKeyDiff['diff'][] = [];\n const unchangedForeignKeys: ForeignKey[] = [];\n const removedForeignKeys: ForeignKey[] = [];\n\n if (!db.dialect.usesForeignKeys()) {\n return {\n status: statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n }\n\n for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) {\n const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);\n if (databaseForeignKeys) {\n const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);\n\n if (status === statuses.CHANGED) {\n updatedForeignKeys.push(diff);\n } else {\n unchangedForeignKeys.push(databaseForeignKeys);\n }\n } else {\n addedForeignKeys.push(userSchemaForeignKeys);\n }\n }\n\n for (const databaseForeignKeys of databaseTable.foreignKeys) {\n if (\n !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) &&\n previousTable &&\n helpers.hasForeignKey(previousTable, databaseForeignKeys.name)\n ) {\n removedForeignKeys.push(databaseForeignKeys);\n }\n }\n\n const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(\n (arr) => arr.length > 0\n );\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n };\n\n const diffTables = (diffCtx: TableDiffContext): TableDiff => {\n const { databaseTable } = diffCtx;\n\n const columnsDiff = diffTableColumns(diffCtx);\n const indexesDiff = diffTableIndexes(diffCtx);\n const foreignKeysDiff = diffTableForeignKeys(diffCtx);\n\n const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: databaseTable.name,\n indexes: indexesDiff.diff,\n foreignKeys: foreignKeysDiff.diff,\n columns: columnsDiff.diff,\n },\n };\n };\n\n const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise<SchemaDiff> => {\n const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;\n\n const addedTables: Table[] = [];\n const updatedTables: TableDiff['diff'][] = [];\n const unchangedTables: Table[] = [];\n const removedTables: Table[] = [];\n\n // for each table in the user schema, check if it already exists in the database schema\n for (const userSchemaTable of userSchema.tables) {\n const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);\n const previousTable =\n previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);\n\n if (databaseTable) {\n const { status, diff } = diffTables({\n previousTable,\n databaseTable,\n userSchemaTable,\n });\n\n if (status === statuses.CHANGED) {\n updatedTables.push(diff);\n } else {\n unchangedTables.push(databaseTable);\n }\n } else {\n addedTables.push(userSchemaTable);\n }\n }\n\n // maintain audit logs table from EE -> CE\n const parsePersistedTable = (persistedTable: string | Table) => {\n if (typeof persistedTable === 'string') {\n return persistedTable;\n }\n return persistedTable.name;\n };\n\n const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings')\n ? // TODO: replace with low level db query instead\n ((await strapi.store.get({\n type: 'core',\n key: 'persisted_tables',\n })) ?? [])\n : [];\n\n const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];\n\n // for all tables in the database schema, check if they are not in the user schema\n for (const databaseTable of databaseSchema.tables) {\n const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);\n const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);\n const isReserved = reservedTables.includes(databaseTable.name);\n\n // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch\n if (!isInUserSchema && !wasTracked) {\n continue;\n }\n\n // if a db table is not in the user schema I want to delete it\n if (!isInUserSchema && wasTracked && !isReserved) {\n const dependencies = persistedTables\n .filter((table: PersistedTable) => {\n const dependsOn = table?.dependsOn;\n\n if (!_.isArray(dependsOn)) {\n return;\n }\n\n return dependsOn.some((table) => table.name === databaseTable.name);\n })\n .map((dependsOnTable: PersistedTable) => {\n return databaseSchema.tables.find(\n (databaseTable) => databaseTable.name === dependsOnTable.name\n );\n })\n // In case the table is not found, filter undefined values\n .filter((table: PersistedTable) => !_.isNil(table));\n\n removedTables.push(databaseTable, ...dependencies);\n }\n }\n\n const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n tables: {\n added: addedTables,\n updated: updatedTables,\n unchanged: unchangedTables,\n removed: removedTables,\n },\n },\n };\n };\n\n return {\n diff: diffSchemas,\n };\n};\n"],"names":["RESERVED_TABLE_NAMES","statuses","CHANGED","UNCHANGED","helpers","hasTable","schema","tableName","tables","findIndex","table","name","findTable","find","hasColumn","columnName","columns","column","findColumn","hasIndex","indexes","hasForeignKey","foreignKeys","findForeignKey","db","hasChangedStatus","diff","status","diffIndexes","oldIndex","index","changes","_","xor","length","push","type","toLower","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","isNil","onDelete","toUpper","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","diffColumns","isIgnoredType","includes","oldType","dialect","getSqlType","notNullable","hasSameDefault","unsigned","supportsUnsigned","diffTableColumns","diffCtx","databaseTable","userSchemaTable","previousTable","addedColumns","updatedColumns","unchangedColumns","removedColumns","userSchemaColumn","databaseColumn","hasChanged","some","arr","added","updated","unchanged","removed","diffTableIndexes","addedIndexes","updatedIndexes","unchangedIndexes","removedIndexes","userSchemaIndex","databaseIndex","diffTableForeignKeys","addedForeignKeys","updatedForeignKeys","unchangedForeignKeys","removedForeignKeys","usesForeignKeys","userSchemaForeignKeys","databaseForeignKeys","diffTables","columnsDiff","indexesDiff","foreignKeysDiff","diffSchemas","schemaDiffCtx","previousSchema","databaseSchema","userSchema","addedTables","updatedTables","unchangedTables","removedTables","parsePersistedTable","persistedTable","persistedTables","strapi","store","get","key","reservedTables","map","isInUserSchema","wasTracked","isReserved","dependencies","filter","dependsOn","isArray","dependsOnTable"],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var createDebug = require('debug');
|
|
4
|
+
var builder = require('./builder.js');
|
|
5
|
+
var diff = require('./diff.js');
|
|
6
|
+
var storage = require('./storage.js');
|
|
7
|
+
var schema = require('./schema.js');
|
|
8
|
+
|
|
9
|
+
const debug = createDebug('strapi::database');
|
|
10
|
+
const createSchemaProvider = (db)=>{
|
|
11
|
+
const state = {};
|
|
12
|
+
return {
|
|
13
|
+
get schema () {
|
|
14
|
+
if (!state.schema) {
|
|
15
|
+
debug('Converting metadata to database schema');
|
|
16
|
+
state.schema = schema.metadataToSchema(db.metadata);
|
|
17
|
+
}
|
|
18
|
+
return state.schema;
|
|
19
|
+
},
|
|
20
|
+
builder: builder(db),
|
|
21
|
+
schemaDiff: diff(db),
|
|
22
|
+
schemaStorage: storage(db),
|
|
23
|
+
/**
|
|
24
|
+
* Drops the database schema
|
|
25
|
+
*/ async drop () {
|
|
26
|
+
debug('Dropping database schema');
|
|
27
|
+
const DBSchema = await db.dialect.schemaInspector.getSchema();
|
|
28
|
+
await this.builder.dropSchema(DBSchema);
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* Creates the database schema
|
|
32
|
+
*/ async create () {
|
|
33
|
+
debug('Created database schema');
|
|
34
|
+
await this.builder.createSchema(this.schema);
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Resets the database schema
|
|
38
|
+
*/ async reset () {
|
|
39
|
+
debug('Resetting database schema');
|
|
40
|
+
await this.drop();
|
|
41
|
+
await this.create();
|
|
42
|
+
},
|
|
43
|
+
async syncSchema () {
|
|
44
|
+
debug('Synchronizing database schema');
|
|
45
|
+
const databaseSchema = await db.dialect.schemaInspector.getSchema();
|
|
46
|
+
const storedSchema = await this.schemaStorage.read();
|
|
47
|
+
/*
|
|
48
|
+
3way diff - DB schema / previous metadataSchema / new metadataSchema
|
|
49
|
+
|
|
50
|
+
- When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored
|
|
51
|
+
- If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else
|
|
52
|
+
- Apply this logic to Tables / Columns / Indexes / FKs ...
|
|
53
|
+
- Handle errors (indexes or fks on incompatible stuff ...)
|
|
54
|
+
|
|
55
|
+
*/ const { status, diff } = await this.schemaDiff.diff({
|
|
56
|
+
previousSchema: storedSchema?.schema,
|
|
57
|
+
databaseSchema,
|
|
58
|
+
userSchema: this.schema
|
|
59
|
+
});
|
|
60
|
+
if (status === 'CHANGED') {
|
|
61
|
+
await this.builder.updateSchema(diff);
|
|
62
|
+
}
|
|
63
|
+
await this.schemaStorage.add(this.schema);
|
|
64
|
+
return status;
|
|
65
|
+
},
|
|
66
|
+
// TODO: support options to migrate softly or forcefully
|
|
67
|
+
// TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup
|
|
68
|
+
// TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)
|
|
69
|
+
async sync () {
|
|
70
|
+
if (await db.migrations.shouldRun()) {
|
|
71
|
+
debug('Found migrations to run');
|
|
72
|
+
await db.migrations.up();
|
|
73
|
+
return this.syncSchema();
|
|
74
|
+
}
|
|
75
|
+
const oldSchema = await this.schemaStorage.read();
|
|
76
|
+
if (!oldSchema) {
|
|
77
|
+
debug('Schema not persisted yet');
|
|
78
|
+
return this.syncSchema();
|
|
79
|
+
}
|
|
80
|
+
const { hash: oldHash } = oldSchema;
|
|
81
|
+
const hash = await this.schemaStorage.hashSchema(this.schema);
|
|
82
|
+
if (oldHash !== hash) {
|
|
83
|
+
debug('Schema changed');
|
|
84
|
+
return this.syncSchema();
|
|
85
|
+
}
|
|
86
|
+
debug('Schema unchanged');
|
|
87
|
+
return 'UNCHANGED';
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
exports.createSchemaProvider = createSchemaProvider;
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import createDebug from 'debug';
|
|
2
|
+
import createSchemaBuilder from './builder.mjs';
|
|
3
|
+
import createSchemaDiff from './diff.mjs';
|
|
4
|
+
import createSchemaStorage from './storage.mjs';
|
|
5
|
+
import { metadataToSchema } from './schema.mjs';
|
|
6
|
+
|
|
7
|
+
const debug = createDebug('strapi::database');
|
|
8
|
+
const createSchemaProvider = (db)=>{
|
|
9
|
+
const state = {};
|
|
10
|
+
return {
|
|
11
|
+
get schema () {
|
|
12
|
+
if (!state.schema) {
|
|
13
|
+
debug('Converting metadata to database schema');
|
|
14
|
+
state.schema = metadataToSchema(db.metadata);
|
|
15
|
+
}
|
|
16
|
+
return state.schema;
|
|
17
|
+
},
|
|
18
|
+
builder: createSchemaBuilder(db),
|
|
19
|
+
schemaDiff: createSchemaDiff(db),
|
|
20
|
+
schemaStorage: createSchemaStorage(db),
|
|
21
|
+
/**
|
|
22
|
+
* Drops the database schema
|
|
23
|
+
*/ async drop () {
|
|
24
|
+
debug('Dropping database schema');
|
|
25
|
+
const DBSchema = await db.dialect.schemaInspector.getSchema();
|
|
26
|
+
await this.builder.dropSchema(DBSchema);
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* Creates the database schema
|
|
30
|
+
*/ async create () {
|
|
31
|
+
debug('Created database schema');
|
|
32
|
+
await this.builder.createSchema(this.schema);
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Resets the database schema
|
|
36
|
+
*/ async reset () {
|
|
37
|
+
debug('Resetting database schema');
|
|
38
|
+
await this.drop();
|
|
39
|
+
await this.create();
|
|
40
|
+
},
|
|
41
|
+
async syncSchema () {
|
|
42
|
+
debug('Synchronizing database schema');
|
|
43
|
+
const databaseSchema = await db.dialect.schemaInspector.getSchema();
|
|
44
|
+
const storedSchema = await this.schemaStorage.read();
|
|
45
|
+
/*
|
|
46
|
+
3way diff - DB schema / previous metadataSchema / new metadataSchema
|
|
47
|
+
|
|
48
|
+
- When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored
|
|
49
|
+
- If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else
|
|
50
|
+
- Apply this logic to Tables / Columns / Indexes / FKs ...
|
|
51
|
+
- Handle errors (indexes or fks on incompatible stuff ...)
|
|
52
|
+
|
|
53
|
+
*/ const { status, diff } = await this.schemaDiff.diff({
|
|
54
|
+
previousSchema: storedSchema?.schema,
|
|
55
|
+
databaseSchema,
|
|
56
|
+
userSchema: this.schema
|
|
57
|
+
});
|
|
58
|
+
if (status === 'CHANGED') {
|
|
59
|
+
await this.builder.updateSchema(diff);
|
|
60
|
+
}
|
|
61
|
+
await this.schemaStorage.add(this.schema);
|
|
62
|
+
return status;
|
|
63
|
+
},
|
|
64
|
+
// TODO: support options to migrate softly or forcefully
|
|
65
|
+
// TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup
|
|
66
|
+
// TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)
|
|
67
|
+
async sync () {
|
|
68
|
+
if (await db.migrations.shouldRun()) {
|
|
69
|
+
debug('Found migrations to run');
|
|
70
|
+
await db.migrations.up();
|
|
71
|
+
return this.syncSchema();
|
|
72
|
+
}
|
|
73
|
+
const oldSchema = await this.schemaStorage.read();
|
|
74
|
+
if (!oldSchema) {
|
|
75
|
+
debug('Schema not persisted yet');
|
|
76
|
+
return this.syncSchema();
|
|
77
|
+
}
|
|
78
|
+
const { hash: oldHash } = oldSchema;
|
|
79
|
+
const hash = await this.schemaStorage.hashSchema(this.schema);
|
|
80
|
+
if (oldHash !== hash) {
|
|
81
|
+
debug('Schema changed');
|
|
82
|
+
return this.syncSchema();
|
|
83
|
+
}
|
|
84
|
+
debug('Schema unchanged');
|
|
85
|
+
return 'UNCHANGED';
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export { createSchemaProvider };
|
|
91
|
+
//# sourceMappingURL=index.mjs.map
|