@strapi/database 5.48.1 → 5.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +5 -1
- package/dist/connection.js.map +1 -1
- package/dist/dialects/index.d.ts.map +1 -1
- package/dist/dialects/postgresql/index.d.ts +0 -1
- package/dist/dialects/postgresql/index.d.ts.map +1 -1
- package/dist/dialects/sqlite/index.d.ts +0 -1
- package/dist/dialects/sqlite/index.d.ts.map +1 -1
- package/dist/dialects/sqlite/index.js +8 -3
- package/dist/dialects/sqlite/index.js.map +1 -1
- package/dist/entity-manager/entity-repository.d.ts.map +1 -1
- package/dist/entity-manager/index.d.ts.map +1 -1
- package/dist/entity-manager/morph-relations.d.ts +0 -1
- package/dist/entity-manager/morph-relations.d.ts.map +1 -1
- package/dist/entity-manager/regular-relations.d.ts +1 -7
- package/dist/entity-manager/regular-relations.d.ts.map +1 -1
- package/dist/entity-manager/relations-orderer.d.ts +3 -3
- package/dist/entity-manager/relations-orderer.d.ts.map +1 -1
- package/dist/entity-manager/relations-orderer.js +5 -1
- package/dist/entity-manager/relations-orderer.js.map +1 -1
- package/dist/fields/datetime.js +3 -2
- package/dist/fields/datetime.js.map +1 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +5 -1
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/shared/parsers.d.ts.map +1 -1
- package/dist/fields/shared/parsers.js +3 -2
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/timestamp.js +3 -2
- package/dist/fields/timestamp.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.d.ts.map +1 -1
- package/dist/lifecycles/subscribers/index.d.ts +1 -1
- package/dist/lifecycles/subscribers/index.d.ts.map +1 -1
- package/dist/lifecycles/subscribers/timestamps.js +10 -6
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -1
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/metadata.d.ts +1 -1
- package/dist/metadata/metadata.d.ts.map +1 -1
- package/dist/metadata/relations.d.ts +2 -2
- package/dist/metadata/relations.d.ts.map +1 -1
- package/dist/metadata/relations.js +6 -2
- package/dist/metadata/relations.js.map +1 -1
- package/dist/migrations/common.d.ts.map +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +5 -1
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -1
- package/dist/migrations/internal.d.ts.map +1 -1
- package/dist/migrations/logger.d.ts.map +1 -1
- package/dist/migrations/storage.d.ts.map +1 -1
- package/dist/migrations/users.d.ts.map +1 -1
- package/dist/migrations/users.js +6 -2
- package/dist/migrations/users.js.map +1 -1
- package/dist/query/helpers/join.d.ts.map +1 -1
- package/dist/query/helpers/order-by.d.ts.map +1 -1
- package/dist/query/helpers/order-by.js +11 -7
- package/dist/query/helpers/order-by.js.map +1 -1
- package/dist/query/helpers/populate/apply.d.ts.map +1 -1
- package/dist/query/helpers/populate/apply.js +50 -47
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +7 -8
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/populate/process.d.ts.map +1 -1
- package/dist/query/helpers/populate/process.js +7 -3
- package/dist/query/helpers/populate/process.js.map +1 -1
- package/dist/query/helpers/search.d.ts.map +1 -1
- package/dist/query/helpers/search.js +5 -1
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/streams/readable.d.ts +0 -1
- package/dist/query/helpers/streams/readable.d.ts.map +1 -1
- package/dist/query/helpers/transform.d.ts.map +1 -1
- package/dist/query/helpers/transform.js +10 -6
- package/dist/query/helpers/transform.js.map +1 -1
- package/dist/query/helpers/where.d.ts +1 -1
- package/dist/query/helpers/where.d.ts.map +1 -1
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs.map +1 -1
- package/dist/query/query-builder.d.ts.map +1 -1
- package/dist/query/query-builder.js +30 -26
- package/dist/query/query-builder.js.map +1 -1
- package/dist/repairs/index.d.ts.map +1 -1
- package/dist/repairs/operations/process-unidirectional-join-tables.d.ts.map +1 -1
- package/dist/repairs/operations/remove-orphan-morph-types.d.ts.map +1 -1
- package/dist/schema/builder.d.ts +1 -1
- package/dist/schema/builder.d.ts.map +1 -1
- package/dist/schema/builder.js +5 -1
- package/dist/schema/builder.js.map +1 -1
- package/dist/schema/diff.d.ts.map +1 -1
- package/dist/schema/diff.js +19 -15
- package/dist/schema/diff.js.map +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +5 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/storage.d.ts.map +1 -1
- package/dist/schema/storage.js +5 -1
- package/dist/schema/storage.js.map +1 -1
- package/dist/transaction-context.d.ts.map +1 -1
- package/dist/utils/async-curry.d.ts.map +1 -1
- package/dist/utils/identifiers/hash.js +5 -1
- package/dist/utils/identifiers/hash.js.map +1 -1
- package/dist/utils/identifiers/index.d.ts.map +1 -1
- package/dist/utils/identifiers/index.js +5 -1
- package/dist/utils/identifiers/index.js.map +1 -1
- package/dist/utils/knex.d.ts.map +1 -1
- package/dist/utils/knex.js +6 -1
- package/dist/utils/knex.js.map +1 -1
- package/dist/utils/types.d.ts +1 -1
- package/dist/utils/types.d.ts.map +1 -1
- package/dist/validations/relations/bidirectional.d.ts.map +1 -1
- package/dist/validations/relations/index.d.ts.map +1 -1
- package/package.json +8 -4
package/dist/schema/diff.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash/fp');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
8
|
+
|
|
5
9
|
// TODO: get that list dynamically instead
|
|
6
10
|
const RESERVED_TABLE_NAMES = [
|
|
7
11
|
'strapi_migrations',
|
|
@@ -49,10 +53,10 @@ var createSchemaDiff = ((db)=>{
|
|
|
49
53
|
*/ const diffIndexes = (oldIndex, index)=>{
|
|
50
54
|
const changes = [];
|
|
51
55
|
// use xor to avoid differences in order
|
|
52
|
-
if (
|
|
56
|
+
if (___default.default.xor(oldIndex.columns, index.columns).length > 0) {
|
|
53
57
|
changes.push('columns');
|
|
54
58
|
}
|
|
55
|
-
if (oldIndex.type && index.type &&
|
|
59
|
+
if (oldIndex.type && index.type && ___default.default.toLower(oldIndex.type) !== ___default.default.toLower(index.type)) {
|
|
56
60
|
changes.push('type');
|
|
57
61
|
}
|
|
58
62
|
return {
|
|
@@ -69,27 +73,27 @@ var createSchemaDiff = ((db)=>{
|
|
|
69
73
|
* @param {Object} foreignKey - newly generate foreignKey info
|
|
70
74
|
*/ const diffForeignKeys = (oldForeignKey, foreignKey)=>{
|
|
71
75
|
const changes = [];
|
|
72
|
-
if (
|
|
76
|
+
if (___default.default.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {
|
|
73
77
|
changes.push('columns');
|
|
74
78
|
}
|
|
75
|
-
if (
|
|
79
|
+
if (___default.default.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {
|
|
76
80
|
changes.push('referencedColumns');
|
|
77
81
|
}
|
|
78
82
|
if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {
|
|
79
83
|
changes.push('referencedTable');
|
|
80
84
|
}
|
|
81
|
-
if (
|
|
82
|
-
if (!
|
|
85
|
+
if (___default.default.isNil(oldForeignKey.onDelete) || ___default.default.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {
|
|
86
|
+
if (!___default.default.isNil(foreignKey.onDelete) && ___default.default.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION') {
|
|
83
87
|
changes.push('onDelete');
|
|
84
88
|
}
|
|
85
|
-
} else if (
|
|
89
|
+
} else if (___default.default.toUpper(oldForeignKey.onDelete) !== ___default.default.toUpper(foreignKey.onDelete ?? '')) {
|
|
86
90
|
changes.push('onDelete');
|
|
87
91
|
}
|
|
88
|
-
if (
|
|
89
|
-
if (!
|
|
92
|
+
if (___default.default.isNil(oldForeignKey.onUpdate) || ___default.default.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {
|
|
93
|
+
if (!___default.default.isNil(foreignKey.onUpdate) && ___default.default.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION') {
|
|
90
94
|
changes.push('onUpdate');
|
|
91
95
|
}
|
|
92
|
-
} else if (
|
|
96
|
+
} else if (___default.default.toUpper(oldForeignKey.onUpdate) !== ___default.default.toUpper(foreignKey.onUpdate ?? '')) {
|
|
93
97
|
changes.push('onUpdate');
|
|
94
98
|
}
|
|
95
99
|
return {
|
|
@@ -103,10 +107,10 @@ var createSchemaDiff = ((db)=>{
|
|
|
103
107
|
const diffDefault = (oldColumn, column)=>{
|
|
104
108
|
const oldDefaultTo = oldColumn.defaultTo;
|
|
105
109
|
const { defaultTo } = column;
|
|
106
|
-
if (oldDefaultTo === null ||
|
|
107
|
-
return
|
|
110
|
+
if (oldDefaultTo === null || ___default.default.toLower(oldDefaultTo) === 'null') {
|
|
111
|
+
return ___default.default.isNil(defaultTo) || ___default.default.toLower(defaultTo) === 'null';
|
|
108
112
|
}
|
|
109
|
-
return
|
|
113
|
+
return ___default.default.toLower(oldDefaultTo) === ___default.default.toLower(column.defaultTo) || ___default.default.toLower(oldDefaultTo) === ___default.default.toLower(`'${column.defaultTo}'`);
|
|
110
114
|
};
|
|
111
115
|
/**
|
|
112
116
|
* Compares two columns info
|
|
@@ -342,14 +346,14 @@ var createSchemaDiff = ((db)=>{
|
|
|
342
346
|
if (!isInUserSchema && wasTracked && !isReserved) {
|
|
343
347
|
const dependencies = persistedTables.filter((table)=>{
|
|
344
348
|
const dependsOn = table?.dependsOn;
|
|
345
|
-
if (!
|
|
349
|
+
if (!___default.default.isArray(dependsOn)) {
|
|
346
350
|
return;
|
|
347
351
|
}
|
|
348
352
|
return dependsOn.some((table)=>table.name === databaseTable.name);
|
|
349
353
|
}).map((dependsOnTable)=>{
|
|
350
354
|
return databaseSchema.tables.find((databaseTable)=>databaseTable.name === dependsOnTable.name);
|
|
351
355
|
})// In case the table is not found, filter undefined values
|
|
352
|
-
.filter((table)=>!
|
|
356
|
+
.filter((table)=>!___default.default.isNil(table));
|
|
353
357
|
removedTables.push(databaseTable, ...dependencies);
|
|
354
358
|
}
|
|
355
359
|
}
|
package/dist/schema/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","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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"}
|
|
1
|
+
{"version":3,"file":"diff.js","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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAC5C,OAAO,gBAAgB,MAAM,QAAQ,CAAC;AACtC,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAG5C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEnC,mBAAmB,SAAS,CAAC;AAI7B,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IAChD,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAChD,aAAa,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAC5C,OAAO,gBAAgB,MAAM,QAAQ,CAAC;AACtC,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAG5C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEnC,mBAAmB,SAAS,CAAC;AAI7B,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IAChD,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAChD,aAAa,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,eAAO,MAAM,oBAAoB,GAAI,IAAI,QAAQ,KAAG,cA0GnD,CAAC"}
|
package/dist/schema/index.js
CHANGED
|
@@ -6,7 +6,11 @@ var diff = require('./diff.js');
|
|
|
6
6
|
var storage = require('./storage.js');
|
|
7
7
|
var schema = require('./schema.js');
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var createDebug__default = /*#__PURE__*/_interopDefault(createDebug);
|
|
12
|
+
|
|
13
|
+
const debug = createDebug__default.default('strapi::database');
|
|
10
14
|
const createSchemaProvider = (db)=>{
|
|
11
15
|
const state = {};
|
|
12
16
|
return {
|
package/dist/schema/index.js.map
CHANGED
|
@@ -1 +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":"
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAU,MAAM,EAAS,MAAM,SAAS,CAAC;AA0NrD,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAU,MAAM,EAAS,MAAM,SAAS,CAAC;AA0NrD,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,KAAG,MAUrD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/schema/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/schema/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;yBAItB,IAAI,QAAQ;YAmBV,OAAO,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI,CAAC;uBAmCU,MAAM;gBASP,MAAM;;;AApE5B,wBA4FE"}
|
package/dist/schema/storage.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var crypto = require('crypto');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
8
|
+
|
|
5
9
|
const TABLE_NAME = 'strapi_database_schema';
|
|
6
10
|
var createSchemaStorage = ((db)=>{
|
|
7
11
|
const hasSchemaTable = ()=>db.getSchemaConnection().hasTable(TABLE_NAME);
|
|
@@ -47,7 +51,7 @@ var createSchemaStorage = ((db)=>{
|
|
|
47
51
|
...schema,
|
|
48
52
|
tables: schema.tables.toSorted((a, b)=>a.name.localeCompare(b.name))
|
|
49
53
|
};
|
|
50
|
-
return
|
|
54
|
+
return crypto__default.default.createHash('sha256').update(JSON.stringify(sorted)).digest('hex');
|
|
51
55
|
},
|
|
52
56
|
async add (schema) {
|
|
53
57
|
await checkTableExists();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n // NOTE: We get the ID first before fetching the exact entry for performance on MySQL/MariaDB\n // See: https://github.com/strapi/strapi/issues/20312\n const getSchemaID = await db\n .getConnection()\n .select('id')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!getSchemaID) {\n return null;\n }\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .where({ id: getSchemaID.id })\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n // Sort tables by name for deterministic hashing regardless of insertion order\n const sorted = {\n ...schema,\n tables: schema.tables.toSorted((a, b) => a.name.localeCompare(b.name)),\n };\n return crypto.createHash('sha256').update(JSON.stringify(sorted)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","getSchemaID","getConnection","select","from","orderBy","first","res","where","id","parsedSchema","schema","JSON","parse","hashSchema","sorted","tables","toSorted","a","b","name","localeCompare","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.js","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n // NOTE: We get the ID first before fetching the exact entry for performance on MySQL/MariaDB\n // See: https://github.com/strapi/strapi/issues/20312\n const getSchemaID = await db\n .getConnection()\n .select('id')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!getSchemaID) {\n return null;\n }\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .where({ id: getSchemaID.id })\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n // Sort tables by name for deterministic hashing regardless of insertion order\n const sorted = {\n ...schema,\n tables: schema.tables.toSorted((a, b) => a.name.localeCompare(b.name)),\n };\n return crypto.createHash('sha256').update(JSON.stringify(sorted)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","getSchemaID","getConnection","select","from","orderBy","first","res","where","id","parsedSchema","schema","JSON","parse","hashSchema","sorted","tables","toSorted","a","b","name","localeCompare","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../src/transaction-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;CAC7B;AACD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,iBAAiB,EAAE,QAAQ,EAAE,CAAC;CAC/B;AAID,QAAA,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../src/transaction-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;CAC7B;AACD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,iBAAiB,EAAE,QAAQ,EAAE,CAAC;CAC/B;AAID,QAAA,MAAM,cAAc;QACR,SAAS,SAAS,QAAQ,OAAO,IAAI,CAAC,WAAW,MAAM,SAAS;;gBAkBxD,IAAI,CAAC,WAAW;kBA0Bd,IAAI,CAAC,WAAW;iBA0BvB,QAAQ;mBAON,QAAQ;CAMxB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-curry.d.ts","sourceRoot":"","sources":["../../src/utils/async-curry.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"async-curry.d.ts","sourceRoot":"","sources":["../../src/utils/async-curry.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,EAC9C,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAChC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAS9B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GAC/F,IAAI,SAAS,EAAE,GACb,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1B,CAAC,GAAG,EAAE,KAAK,KAAK,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,GAC/C,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
var crypto = require('node:crypto');
|
|
4
4
|
var _ = require('lodash/fp');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
9
|
+
|
|
6
10
|
/**
|
|
7
11
|
* Creates a hash of the given data with the specified string length as a string of hex characters
|
|
8
12
|
*
|
|
@@ -20,7 +24,7 @@ var _ = require('lodash/fp');
|
|
|
20
24
|
if (!_.isInteger(len) || len <= 0) {
|
|
21
25
|
throw new Error(`createHash length must be a positive integer, received ${len}`);
|
|
22
26
|
}
|
|
23
|
-
const hash =
|
|
27
|
+
const hash = crypto__default.default.createHash('shake256', {
|
|
24
28
|
outputLength: Math.ceil(len / 2)
|
|
25
29
|
}).update(data);
|
|
26
30
|
return hash.digest('hex').substring(0, len);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sources":["../../../src/utils/identifiers/hash.ts"],"sourcesContent":["/**\n * @fileoverview This file contains utility functions for shortening identifiers for use in a database schema.\n * The functions in this file are used to generate shorter names for database tables and columns\n * to avoid breaking the constraints of databases.\n *\n * IMPORTANT\n * Any changes here that result in a different output string from any of the naming methods will\n * cause the schema creation to delete data it doesn't recognize because the name\n * is different.\n *\n * If there are any test failures after updating this code, it means there is a breaking change that\n * will cause data loss, so beware; do not update the test to match your changes\n *\n * @internal\n */\n\nimport crypto from 'node:crypto';\nimport { isInteger } from 'lodash/fp';\n\n/**\n * Creates a hash of the given data with the specified string length as a string of hex characters\n *\n * @example\n * createHash(\"myData\", 5); // \"03f85\"\n * createHash(\"myData\", 2); // \"03\"\n * createHash(\"myData\", 1); // \"0\"\n *\n * @param data - The data to be hashed\n * @param len - The length of the hash\n * @returns The generated hash\n * @throws Error if the length is not a positive integer\n * @internal\n */\nexport function createHash(data: string, len: number): string {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`createHash length must be a positive integer, received ${len}`);\n }\n\n const hash = crypto.createHash('shake256', { outputLength: Math.ceil(len / 2) }).update(data);\n return hash.digest('hex').substring(0, len);\n}\n"],"names":["createHash","data","len","isInteger","Error","hash","crypto","outputLength","Math","ceil","update","digest","substring"],"mappings":"
|
|
1
|
+
{"version":3,"file":"hash.js","sources":["../../../src/utils/identifiers/hash.ts"],"sourcesContent":["/**\n * @fileoverview This file contains utility functions for shortening identifiers for use in a database schema.\n * The functions in this file are used to generate shorter names for database tables and columns\n * to avoid breaking the constraints of databases.\n *\n * IMPORTANT\n * Any changes here that result in a different output string from any of the naming methods will\n * cause the schema creation to delete data it doesn't recognize because the name\n * is different.\n *\n * If there are any test failures after updating this code, it means there is a breaking change that\n * will cause data loss, so beware; do not update the test to match your changes\n *\n * @internal\n */\n\nimport crypto from 'node:crypto';\nimport { isInteger } from 'lodash/fp';\n\n/**\n * Creates a hash of the given data with the specified string length as a string of hex characters\n *\n * @example\n * createHash(\"myData\", 5); // \"03f85\"\n * createHash(\"myData\", 2); // \"03\"\n * createHash(\"myData\", 1); // \"0\"\n *\n * @param data - The data to be hashed\n * @param len - The length of the hash\n * @returns The generated hash\n * @throws Error if the length is not a positive integer\n * @internal\n */\nexport function createHash(data: string, len: number): string {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`createHash length must be a positive integer, received ${len}`);\n }\n\n const hash = crypto.createHash('shake256', { outputLength: Math.ceil(len / 2) }).update(data);\n return hash.digest('hex').substring(0, len);\n}\n"],"names":["createHash","data","len","isInteger","Error","hash","crypto","outputLength","Math","ceil","update","digest","substring"],"mappings":";;;;;;;;;AAmBA;;;;;;;;;;;;;AAaC,IACM,SAASA,UAAAA,CAAWC,IAAY,EAAEC,GAAW,EAAA;AAClD,IAAA,IAAI,CAACC,WAAAA,CAAUD,GAAAA,CAAAA,IAAQA,GAAAA,IAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,uDAAuD,EAAEF,GAAAA,CAAAA,CAAK,CAAA;AACjF,IAAA;AAEA,IAAA,MAAMG,IAAAA,GAAOC,uBAAAA,CAAON,UAAU,CAAC,UAAA,EAAY;QAAEO,YAAAA,EAAcC,IAAAA,CAAKC,IAAI,CAACP,GAAAA,GAAM,CAAA;AAAG,KAAA,CAAA,CAAGQ,MAAM,CAACT,IAAAA,CAAAA;AACxF,IAAA,OAAOI,KAAKM,MAAM,CAAC,KAAA,CAAA,CAAOC,SAAS,CAAC,CAAA,EAAGV,GAAAA,CAAAA;AACzC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/identifiers/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,SAAS,EAEV,MAAM,SAAS,CAAC;AAIjB,qBAAa,WAAW;;IACtB,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/identifiers/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,SAAS,EAEV,MAAM,SAAS,CAAC;AAIjB,qBAAa,WAAW;;IACtB,SAAS,EAAG,IAAI,CAAU;IAE1B,YAAY,EAAG,OAAO,CAAU;IAEhC,YAAY,EAAG,OAAO,CAAU;IAEhC,WAAW,EAAG,CAAC,CAAU;IAEzB,cAAc,EAAG,EAAE,CAAU;IAE7B,oBAAoB,EAAG,GAAG,CAAU;IAEpC,gBAAgB,EAAG,CAAC,CAAU;gBAmBlB,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAI1C,IAAI,cAAc;;;;;;;;;;;;MAEjB;IAED,IAAI,OAAO,uBAEV;IAED,aAAa,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAAS,CAKhD;IAGF;;;;;SAKK;IACL,OAAO,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAyBhD;IAEF;;OAEG;IAEH,YAAY,GAAI,MAAM,MAAM,EAAE,UAAU,WAAW,YAEjD;IAEF,gBAAgB,GAAI,gBAAgB,MAAM,EAAE,eAAe,MAAM,EAAE,UAAU,WAAW,YAKtF;IAEF,iBAAiB,GAAI,gBAAgB,MAAM,EAAE,eAAe,MAAM,EAAE,UAAU,WAAW,YAKvF;IAEF;;OAEG;IAEH,aAAa,GAAI,eAAe,MAAM,EAAE,UAAU,WAAW,YAE3D;IAEF,4BAA4B,GAAI,eAAe,MAAM,EAAE,UAAU,WAAW,YAE1E;IAEF,mCAAmC,GAAI,eAAe,MAAM,EAAE,UAAU,WAAW,YAEjF;IAEF,kBAAkB,GAAI,cAAc,MAAM,EAAE,UAAU,WAAW,YAE/D;IAEF,yBAAyB,GAAI,cAAc,MAAM,EAAE,UAAU,WAAW,YAMtE;IAEF;;OAEG;IACH,6BAA6B,GAAI,cAAc,MAAM,EAAE,UAAU,WAAW,YAE1E;IAEF,6BAA6B,GAAI,eAAe,MAAM,EAAE,UAAU,WAAW,YAE3E;IAEF,sBAAsB,GAAI,eAAe,MAAM,EAAE,UAAU,WAAW,YAEpE;IAEF;;;;;;;;;;OAUG;IAGH,YAAY,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAErD;IAEF,cAAc,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAEvD;IAEF,kBAAkB,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAE3D;IAEF,mBAAmB,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAE5D;IAGF,qBAAqB,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAE9D;IAEF,mBAAmB,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAE5D;IAEF,0BAA0B,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAEnE;IAEF,oBAAoB,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAE7D;IAEF,iBAAiB,GAAI,OAAO,SAAS,EAAE,UAAU,WAAW,YAE1D;IAEF;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,YAwB3C;IAEF;;;;;;;OAOG;IACH,iBAAiB,GAAI,YAAY,SAAS,EAAE,KAAG,MAAM,CAqJnD;IAIF,OAAO,sBAA6B;IAEpC,kBAAkB,GAAI,WAAW,MAAM,YAErC;IAEF,kBAAkB,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,UAUvD;IAEF,YAAY,GAAI,WAAW,MAAM,YAE/B;CACH;AAID,eAAO,MAAM,WAAW,aAAwD,CAAC"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
var _ = require('lodash/fp');
|
|
4
4
|
var hash = require('./hash.js');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
9
|
+
|
|
6
10
|
/**
|
|
7
11
|
* This file contains utility functions for generating names used in the database.
|
|
8
12
|
* These names include table names, column names, join table names, index names, and more.
|
|
@@ -74,7 +78,7 @@ class Identifiers {
|
|
|
74
78
|
* we get names 'myModel' and 'my_model' they would be converted to the same
|
|
75
79
|
* final string my_model which generally works but is not entirely safe
|
|
76
80
|
* */ this.getName = (names, options)=>{
|
|
77
|
-
const tokens =
|
|
81
|
+
const tokens = ___default.default.castArray(names).map((name)=>{
|
|
78
82
|
return {
|
|
79
83
|
name,
|
|
80
84
|
compressible: true
|