@payloadcms/drizzle 4.0.0-canary.37 → 4.0.0-canary.39
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/exports/postgres.d.ts +1 -0
- package/dist/exports/postgres.d.ts.map +1 -1
- package/dist/exports/postgres.js +1 -0
- package/dist/exports/postgres.js.map +1 -1
- package/dist/exports/sqlite.d.ts +1 -0
- package/dist/exports/sqlite.d.ts.map +1 -1
- package/dist/exports/sqlite.js +1 -0
- package/dist/exports/sqlite.js.map +1 -1
- package/dist/index.d.ts +1 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/migrate.js +4 -2
- package/dist/migrate.js.map +1 -1
- package/dist/migrateDown.js +4 -2
- package/dist/migrateDown.js.map +1 -1
- package/dist/migrateFresh.js +4 -2
- package/dist/migrateFresh.js.map +1 -1
- package/dist/migrateRefresh.js +4 -2
- package/dist/migrateRefresh.js.map +1 -1
- package/dist/migrateReset.js +4 -2
- package/dist/migrateReset.js.map +1 -1
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts +35 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js +185 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts +15 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js +114 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts +15 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts.map +1 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +110 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -0
- package/dist/utilities/getSizesToVariantsRenames.d.ts +54 -0
- package/dist/utilities/getSizesToVariantsRenames.d.ts.map +1 -0
- package/dist/utilities/getSizesToVariantsRenames.js +251 -0
- package/dist/utilities/getSizesToVariantsRenames.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import toSnakeCase from 'to-snake-case';
|
|
2
|
+
import { maxGeneratedIdentifierLength } from './validateIdentifierLength.js';
|
|
3
|
+
export function findSizesToVariantsFieldCollision({ columns, existingColumns }) {
|
|
4
|
+
const firstRename = columns[0];
|
|
5
|
+
if (!firstRename) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
const fromField = getSizesToVariantsField({
|
|
9
|
+
columnName: firstRename.from
|
|
10
|
+
});
|
|
11
|
+
const toField = getSizesToVariantsField({
|
|
12
|
+
columnName: firstRename.to
|
|
13
|
+
});
|
|
14
|
+
if (!fromField || !toField) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const hasSourceField = [
|
|
18
|
+
...existingColumns
|
|
19
|
+
].some((column)=>isSizesToVariantsFieldColumn({
|
|
20
|
+
column,
|
|
21
|
+
field: fromField
|
|
22
|
+
}));
|
|
23
|
+
const plannedDestinationColumns = new Set(columns.map(({ to })=>to));
|
|
24
|
+
const hasUnexpectedDestinationField = [
|
|
25
|
+
...existingColumns
|
|
26
|
+
].some((column)=>isSizesToVariantsFieldColumn({
|
|
27
|
+
column,
|
|
28
|
+
field: toField
|
|
29
|
+
}) && !plannedDestinationColumns.has(column));
|
|
30
|
+
return hasSourceField && hasUnexpectedDestinationField ? {
|
|
31
|
+
from: fromField.fieldPath,
|
|
32
|
+
to: toField.fieldPath
|
|
33
|
+
} : undefined;
|
|
34
|
+
}
|
|
35
|
+
export function assertNoSizesToVariantsColumnCollisions({ columns, existingColumns, tableName }) {
|
|
36
|
+
for (const { from, to } of columns){
|
|
37
|
+
if (existingColumns.has(from) && existingColumns.has(to)) {
|
|
38
|
+
throw new Error(`Cannot run the sizes-to-variants migration because table "${tableName}" contains both "${from}" and "${to}". Move or rename the existing destination data before running this migration.`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const fieldCollision = findSizesToVariantsFieldCollision({
|
|
42
|
+
columns,
|
|
43
|
+
existingColumns
|
|
44
|
+
});
|
|
45
|
+
if (fieldCollision) {
|
|
46
|
+
throw new Error(`Cannot run the sizes-to-variants migration because table "${tableName}" contains both the "${fieldCollision.from}" and "${fieldCollision.to}" fields. Move or rename the existing destination data before running this migration.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const columnPrefixes = [
|
|
50
|
+
{
|
|
51
|
+
current: 'variants_',
|
|
52
|
+
legacy: 'sizes_'
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
current: 'version_variants_',
|
|
56
|
+
legacy: 'version_sizes_'
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
const generatedVariantMetadataFieldNames = [
|
|
60
|
+
'_objectKey',
|
|
61
|
+
'filename',
|
|
62
|
+
'filesize',
|
|
63
|
+
'height',
|
|
64
|
+
'mimeType',
|
|
65
|
+
'prefix',
|
|
66
|
+
'url',
|
|
67
|
+
'width'
|
|
68
|
+
];
|
|
69
|
+
/**
|
|
70
|
+
* Plans the column and index renames that move every upload collection's stored image sizes
|
|
71
|
+
* between the legacy `sizes` group and `variants`. Reads the current (`variants`) schema the
|
|
72
|
+
* adapter built from the config, so it covers each collection's main and versions tables without
|
|
73
|
+
* re-deriving Payload's column naming.
|
|
74
|
+
*
|
|
75
|
+
* Index names come from the schema on `up`, and on `down` are rebuilt the way `buildIndexName`
|
|
76
|
+
* named them before the rename. The runner still has to locate the verified generated legacy name
|
|
77
|
+
* on `up`, since it may have a numeric suffix that keeps the name unique.
|
|
78
|
+
*/ export function getSizesToVariantsRenames({ adapter, direction }) {
|
|
79
|
+
const plan = [];
|
|
80
|
+
for (const collection of adapter.payload.config.collections){
|
|
81
|
+
if (!collection.upload) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const upload = typeof collection.upload === 'object' ? collection.upload : undefined;
|
|
85
|
+
const generatedVariantColumnKeys = new Set((upload?.variants ?? []).flatMap(({ name })=>generatedVariantMetadataFieldNames.flatMap((metadataFieldName)=>[
|
|
86
|
+
`variants_${name}_${metadataFieldName}`,
|
|
87
|
+
`version_variants_${name}_${metadataFieldName}`
|
|
88
|
+
])));
|
|
89
|
+
if (generatedVariantColumnKeys.size === 0) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const tableNames = [
|
|
93
|
+
adapter.tableNameMap.get(toSnakeCase(collection.slug))
|
|
94
|
+
];
|
|
95
|
+
if (collection.versions) {
|
|
96
|
+
tableNames.push(adapter.tableNameMap.get(`_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`));
|
|
97
|
+
}
|
|
98
|
+
for (const tableName of tableNames){
|
|
99
|
+
const rawTable = tableName ? adapter.rawTables[tableName] : undefined;
|
|
100
|
+
if (!tableName || !rawTable) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const columns = [];
|
|
104
|
+
for (const [columnKey, { name }] of Object.entries(rawTable.columns)){
|
|
105
|
+
if (!generatedVariantColumnKeys.has(columnKey)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const prefix = columnPrefixes.find(({ current })=>name.startsWith(current));
|
|
109
|
+
if (!prefix) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const legacyName = `${prefix.legacy}${name.slice(prefix.current.length)}`;
|
|
113
|
+
columns.push(direction === 'up' ? {
|
|
114
|
+
from: legacyName,
|
|
115
|
+
to: name
|
|
116
|
+
} : {
|
|
117
|
+
from: name,
|
|
118
|
+
to: legacyName
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (columns.length === 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const indexes = Object.values(rawTable.indexes ?? {}).map((index)=>planIndexRename({
|
|
125
|
+
columns,
|
|
126
|
+
direction,
|
|
127
|
+
index,
|
|
128
|
+
rawColumns: rawTable.columns,
|
|
129
|
+
tableName
|
|
130
|
+
})).filter((index)=>Boolean(index));
|
|
131
|
+
plan.push({
|
|
132
|
+
columns,
|
|
133
|
+
indexes,
|
|
134
|
+
tableName
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return plan;
|
|
139
|
+
}
|
|
140
|
+
function getSizesToVariantsField({ columnName }) {
|
|
141
|
+
if (columnName === 'version_sizes' || columnName.startsWith('version_sizes_')) {
|
|
142
|
+
return {
|
|
143
|
+
columnName: 'version_sizes',
|
|
144
|
+
columnPrefix: 'version_sizes_',
|
|
145
|
+
fieldPath: 'version.sizes'
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (columnName === 'version_variants' || columnName.startsWith('version_variants_')) {
|
|
149
|
+
return {
|
|
150
|
+
columnName: 'version_variants',
|
|
151
|
+
columnPrefix: 'version_variants_',
|
|
152
|
+
fieldPath: 'version.variants'
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (columnName === 'sizes' || columnName.startsWith('sizes_')) {
|
|
156
|
+
return {
|
|
157
|
+
columnName: 'sizes',
|
|
158
|
+
columnPrefix: 'sizes_',
|
|
159
|
+
fieldPath: 'sizes'
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (columnName === 'variants' || columnName.startsWith('variants_')) {
|
|
163
|
+
return {
|
|
164
|
+
columnName: 'variants',
|
|
165
|
+
columnPrefix: 'variants_',
|
|
166
|
+
fieldPath: 'variants'
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
function isSizesToVariantsFieldColumn({ column, field }) {
|
|
172
|
+
return column === field.columnName || column.startsWith(field.columnPrefix);
|
|
173
|
+
}
|
|
174
|
+
function planIndexRename({ columns, direction, index, rawColumns, tableName }) {
|
|
175
|
+
// `on` holds the column's schema key (e.g. `variants_heroLarge_filename`), not its database name.
|
|
176
|
+
const currentColumns = [
|
|
177
|
+
index.on
|
|
178
|
+
].flat().map((key)=>rawColumns[key]?.name ?? key);
|
|
179
|
+
const renamedColumns = currentColumns.map((column)=>columns.find((rename)=>(direction === 'up' ? rename.to : rename.from) === column));
|
|
180
|
+
if (renamedColumns.every((rename)=>!rename)) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const unique = Boolean(index.unique);
|
|
184
|
+
if (direction === 'up') {
|
|
185
|
+
const legacyColumns = currentColumns.map((column, i)=>renamedColumns[i]?.from ?? column);
|
|
186
|
+
return {
|
|
187
|
+
columns: currentColumns,
|
|
188
|
+
legacyNameBase: getLegacyIndexNameBase({
|
|
189
|
+
currentColumns,
|
|
190
|
+
indexName: index.name,
|
|
191
|
+
legacyColumns,
|
|
192
|
+
tableName
|
|
193
|
+
}),
|
|
194
|
+
to: index.name,
|
|
195
|
+
unique
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
const legacyColumns = currentColumns.map((column, i)=>renamedColumns[i]?.to ?? column);
|
|
199
|
+
const legacyNameBase = getLegacyIndexNameBase({
|
|
200
|
+
currentColumns,
|
|
201
|
+
indexName: index.name,
|
|
202
|
+
legacyColumns,
|
|
203
|
+
tableName
|
|
204
|
+
});
|
|
205
|
+
return {
|
|
206
|
+
columns: legacyColumns,
|
|
207
|
+
from: index.name,
|
|
208
|
+
legacyNameBase,
|
|
209
|
+
to: buildGeneratedLegacyIndexName(legacyNameBase),
|
|
210
|
+
unique
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function getLegacyIndexNameBase({ currentColumns, indexName, legacyColumns, tableName }) {
|
|
214
|
+
const currentColumn = currentColumns.length === 1 ? currentColumns[0] : undefined;
|
|
215
|
+
const legacyColumn = legacyColumns.length === 1 ? legacyColumns[0] : undefined;
|
|
216
|
+
const currentFieldPath = currentColumn ? getGeneratedVariantFieldPath(currentColumn) : undefined;
|
|
217
|
+
const legacyFieldPath = legacyColumn ? getGeneratedVariantFieldPath(legacyColumn) : undefined;
|
|
218
|
+
if (currentColumn && currentFieldPath && legacyColumn && legacyFieldPath) {
|
|
219
|
+
const currentFieldIndexNameBase = `${tableName}_${currentFieldPath}_${currentColumn}`;
|
|
220
|
+
if (isGeneratedLegacyIndexName({
|
|
221
|
+
indexName,
|
|
222
|
+
legacyNameBase: currentFieldIndexNameBase
|
|
223
|
+
})) {
|
|
224
|
+
return `${tableName}_${legacyFieldPath}_${legacyColumn}`;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return legacyColumns.join('_');
|
|
228
|
+
}
|
|
229
|
+
function getGeneratedVariantFieldPath(columnName) {
|
|
230
|
+
for (const metadataFieldName of generatedVariantMetadataFieldNames){
|
|
231
|
+
const metadataColumnSuffix = `_${toSnakeCase(metadataFieldName)}`;
|
|
232
|
+
if (columnName.endsWith(metadataColumnSuffix)) {
|
|
233
|
+
return columnName.slice(0, -metadataColumnSuffix.length);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
/** Mirrors `buildIndexName` for an index that didn't collide, without registering the name. */ export function isGeneratedLegacyIndexName({ indexName, legacyNameBase }) {
|
|
239
|
+
const suffixMatch = indexName.match(/(?:_(\d+))?_idx$/);
|
|
240
|
+
if (!suffixMatch) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
return indexName === buildGeneratedLegacyIndexName(legacyNameBase, Number(suffixMatch[1] ?? 0));
|
|
244
|
+
}
|
|
245
|
+
export function buildGeneratedLegacyIndexName(name, number = 0) {
|
|
246
|
+
const suffix = `${number ? `_${number}` : ''}_idx`;
|
|
247
|
+
const indexName = `${name}${suffix}`;
|
|
248
|
+
return indexName.length > maxGeneratedIdentifierLength ? `${name.slice(0, maxGeneratedIdentifierLength - suffix.length)}${suffix}` : indexName;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
//# sourceMappingURL=getSizesToVariantsRenames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSizesToVariantsRenames.ts"],"sourcesContent":["import toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, RawIndex, RawTable } from '../types.js'\n\nimport { maxGeneratedIdentifierLength } from './validateIdentifierLength.js'\n\nexport type SizesToVariantsDirection = 'down' | 'up'\n\nexport type SizesToVariantsColumnRename = {\n from: string\n to: string\n}\n\nexport type SizesToVariantsIndexRename = {\n /** Columns the index covers, named as they are after the column renames. */\n columns: string[]\n /** The index name to rename from on `down`. The generated legacy name is resolved on `up`. */\n from?: string\n /** Base used to verify a generated legacy index name, including a possible numeric suffix. */\n legacyNameBase?: string\n to: string\n unique: boolean\n}\n\nexport type SizesToVariantsTableRenames = {\n columns: SizesToVariantsColumnRename[]\n indexes: SizesToVariantsIndexRename[]\n tableName: string\n}\n\nexport function findSizesToVariantsFieldCollision({\n columns,\n existingColumns,\n}: {\n columns: SizesToVariantsColumnRename[]\n existingColumns: Set<string>\n}): { from: string; to: string } | undefined {\n const firstRename = columns[0]\n\n if (!firstRename) {\n return undefined\n }\n\n const fromField = getSizesToVariantsField({ columnName: firstRename.from })\n const toField = getSizesToVariantsField({ columnName: firstRename.to })\n\n if (!fromField || !toField) {\n return undefined\n }\n\n const hasSourceField = [...existingColumns].some((column) =>\n isSizesToVariantsFieldColumn({ column, field: fromField }),\n )\n const plannedDestinationColumns = new Set(columns.map(({ to }) => to))\n const hasUnexpectedDestinationField = [...existingColumns].some(\n (column) =>\n isSizesToVariantsFieldColumn({ column, field: toField }) &&\n !plannedDestinationColumns.has(column),\n )\n\n return hasSourceField && hasUnexpectedDestinationField\n ? { from: fromField.fieldPath, to: toField.fieldPath }\n : undefined\n}\n\nexport function assertNoSizesToVariantsColumnCollisions({\n columns,\n existingColumns,\n tableName,\n}: {\n columns: SizesToVariantsColumnRename[]\n existingColumns: Set<string>\n tableName: string\n}): void {\n for (const { from, to } of columns) {\n if (existingColumns.has(from) && existingColumns.has(to)) {\n throw new Error(\n `Cannot run the sizes-to-variants migration because table \"${tableName}\" contains both \"${from}\" and \"${to}\". Move or rename the existing destination data before running this migration.`,\n )\n }\n }\n\n const fieldCollision = findSizesToVariantsFieldCollision({ columns, existingColumns })\n\n if (fieldCollision) {\n throw new Error(\n `Cannot run the sizes-to-variants migration because table \"${tableName}\" contains both the \"${fieldCollision.from}\" and \"${fieldCollision.to}\" fields. Move or rename the existing destination data before running this migration.`,\n )\n }\n}\n\nconst columnPrefixes = [\n { current: 'variants_', legacy: 'sizes_' },\n { current: 'version_variants_', legacy: 'version_sizes_' },\n]\nconst generatedVariantMetadataFieldNames = [\n '_objectKey',\n 'filename',\n 'filesize',\n 'height',\n 'mimeType',\n 'prefix',\n 'url',\n 'width',\n]\n\n/**\n * Plans the column and index renames that move every upload collection's stored image sizes\n * between the legacy `sizes` group and `variants`. Reads the current (`variants`) schema the\n * adapter built from the config, so it covers each collection's main and versions tables without\n * re-deriving Payload's column naming.\n *\n * Index names come from the schema on `up`, and on `down` are rebuilt the way `buildIndexName`\n * named them before the rename. The runner still has to locate the verified generated legacy name\n * on `up`, since it may have a numeric suffix that keeps the name unique.\n */\nexport function getSizesToVariantsRenames({\n adapter,\n direction,\n}: {\n adapter: DrizzleAdapter\n direction: SizesToVariantsDirection\n}): SizesToVariantsTableRenames[] {\n const plan: SizesToVariantsTableRenames[] = []\n\n for (const collection of adapter.payload.config.collections) {\n if (!collection.upload) {\n continue\n }\n\n const upload = typeof collection.upload === 'object' ? collection.upload : undefined\n const generatedVariantColumnKeys = new Set(\n (upload?.variants ?? []).flatMap(({ name }) =>\n generatedVariantMetadataFieldNames.flatMap((metadataFieldName) => [\n `variants_${name}_${metadataFieldName}`,\n `version_variants_${name}_${metadataFieldName}`,\n ]),\n ),\n )\n\n if (generatedVariantColumnKeys.size === 0) {\n continue\n }\n\n const tableNames = [adapter.tableNameMap.get(toSnakeCase(collection.slug))]\n\n if (collection.versions) {\n tableNames.push(\n adapter.tableNameMap.get(`_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`),\n )\n }\n\n for (const tableName of tableNames) {\n const rawTable = tableName ? adapter.rawTables[tableName] : undefined\n\n if (!tableName || !rawTable) {\n continue\n }\n\n const columns: SizesToVariantsColumnRename[] = []\n\n for (const [columnKey, { name }] of Object.entries(rawTable.columns)) {\n if (!generatedVariantColumnKeys.has(columnKey)) {\n continue\n }\n\n const prefix = columnPrefixes.find(({ current }) => name.startsWith(current))\n\n if (!prefix) {\n continue\n }\n\n const legacyName = `${prefix.legacy}${name.slice(prefix.current.length)}`\n\n columns.push(\n direction === 'up' ? { from: legacyName, to: name } : { from: name, to: legacyName },\n )\n }\n\n if (columns.length === 0) {\n continue\n }\n\n const indexes = Object.values(rawTable.indexes ?? {})\n .map((index) =>\n planIndexRename({ columns, direction, index, rawColumns: rawTable.columns, tableName }),\n )\n .filter((index): index is SizesToVariantsIndexRename => Boolean(index))\n\n plan.push({ columns, indexes, tableName })\n }\n }\n\n return plan\n}\n\nfunction getSizesToVariantsField({\n columnName,\n}: {\n columnName: string\n}): { columnName: string; columnPrefix: string; fieldPath: string } | undefined {\n if (columnName === 'version_sizes' || columnName.startsWith('version_sizes_')) {\n return {\n columnName: 'version_sizes',\n columnPrefix: 'version_sizes_',\n fieldPath: 'version.sizes',\n }\n }\n\n if (columnName === 'version_variants' || columnName.startsWith('version_variants_')) {\n return {\n columnName: 'version_variants',\n columnPrefix: 'version_variants_',\n fieldPath: 'version.variants',\n }\n }\n\n if (columnName === 'sizes' || columnName.startsWith('sizes_')) {\n return { columnName: 'sizes', columnPrefix: 'sizes_', fieldPath: 'sizes' }\n }\n\n if (columnName === 'variants' || columnName.startsWith('variants_')) {\n return { columnName: 'variants', columnPrefix: 'variants_', fieldPath: 'variants' }\n }\n\n return undefined\n}\n\nfunction isSizesToVariantsFieldColumn({\n column,\n field,\n}: {\n column: string\n field: { columnName: string; columnPrefix: string }\n}): boolean {\n return column === field.columnName || column.startsWith(field.columnPrefix)\n}\n\nfunction planIndexRename({\n columns,\n direction,\n index,\n rawColumns,\n tableName,\n}: {\n columns: SizesToVariantsColumnRename[]\n direction: SizesToVariantsDirection\n index: RawIndex\n rawColumns: RawTable['columns']\n tableName: string\n}): SizesToVariantsIndexRename | undefined {\n // `on` holds the column's schema key (e.g. `variants_heroLarge_filename`), not its database name.\n const currentColumns = [index.on].flat().map((key) => rawColumns[key]?.name ?? key)\n const renamedColumns = currentColumns.map((column) =>\n columns.find((rename) => (direction === 'up' ? rename.to : rename.from) === column),\n )\n\n if (renamedColumns.every((rename) => !rename)) {\n return undefined\n }\n\n const unique = Boolean(index.unique)\n\n if (direction === 'up') {\n const legacyColumns = currentColumns.map((column, i) => renamedColumns[i]?.from ?? column)\n\n return {\n columns: currentColumns,\n legacyNameBase: getLegacyIndexNameBase({\n currentColumns,\n indexName: index.name,\n legacyColumns,\n tableName,\n }),\n to: index.name,\n unique,\n }\n }\n\n const legacyColumns = currentColumns.map((column, i) => renamedColumns[i]?.to ?? column)\n const legacyNameBase = getLegacyIndexNameBase({\n currentColumns,\n indexName: index.name,\n legacyColumns,\n tableName,\n })\n\n return {\n columns: legacyColumns,\n from: index.name,\n legacyNameBase,\n to: buildGeneratedLegacyIndexName(legacyNameBase),\n unique,\n }\n}\n\nfunction getLegacyIndexNameBase({\n currentColumns,\n indexName,\n legacyColumns,\n tableName,\n}: {\n currentColumns: string[]\n indexName: string\n legacyColumns: string[]\n tableName: string\n}): string {\n const currentColumn = currentColumns.length === 1 ? currentColumns[0] : undefined\n const legacyColumn = legacyColumns.length === 1 ? legacyColumns[0] : undefined\n const currentFieldPath = currentColumn ? getGeneratedVariantFieldPath(currentColumn) : undefined\n const legacyFieldPath = legacyColumn ? getGeneratedVariantFieldPath(legacyColumn) : undefined\n\n if (currentColumn && currentFieldPath && legacyColumn && legacyFieldPath) {\n const currentFieldIndexNameBase = `${tableName}_${currentFieldPath}_${currentColumn}`\n\n if (isGeneratedLegacyIndexName({ indexName, legacyNameBase: currentFieldIndexNameBase })) {\n return `${tableName}_${legacyFieldPath}_${legacyColumn}`\n }\n }\n\n return legacyColumns.join('_')\n}\n\nfunction getGeneratedVariantFieldPath(columnName: string): string | undefined {\n for (const metadataFieldName of generatedVariantMetadataFieldNames) {\n const metadataColumnSuffix = `_${toSnakeCase(metadataFieldName)}`\n\n if (columnName.endsWith(metadataColumnSuffix)) {\n return columnName.slice(0, -metadataColumnSuffix.length)\n }\n }\n\n return undefined\n}\n\n/** Mirrors `buildIndexName` for an index that didn't collide, without registering the name. */\nexport function isGeneratedLegacyIndexName({\n indexName,\n legacyNameBase,\n}: {\n indexName: string\n legacyNameBase: string\n}): boolean {\n const suffixMatch = indexName.match(/(?:_(\\d+))?_idx$/)\n\n if (!suffixMatch) {\n return false\n }\n\n return indexName === buildGeneratedLegacyIndexName(legacyNameBase, Number(suffixMatch[1] ?? 0))\n}\n\nexport function buildGeneratedLegacyIndexName(name: string, number = 0): string {\n const suffix = `${number ? `_${number}` : ''}_idx`\n const indexName = `${name}${suffix}`\n\n return indexName.length > maxGeneratedIdentifierLength\n ? `${name.slice(0, maxGeneratedIdentifierLength - suffix.length)}${suffix}`\n : indexName\n}\n"],"names":["toSnakeCase","maxGeneratedIdentifierLength","findSizesToVariantsFieldCollision","columns","existingColumns","firstRename","undefined","fromField","getSizesToVariantsField","columnName","from","toField","to","hasSourceField","some","column","isSizesToVariantsFieldColumn","field","plannedDestinationColumns","Set","map","hasUnexpectedDestinationField","has","fieldPath","assertNoSizesToVariantsColumnCollisions","tableName","Error","fieldCollision","columnPrefixes","current","legacy","generatedVariantMetadataFieldNames","getSizesToVariantsRenames","adapter","direction","plan","collection","payload","config","collections","upload","generatedVariantColumnKeys","variants","flatMap","name","metadataFieldName","size","tableNames","tableNameMap","get","slug","versions","push","versionsSuffix","rawTable","rawTables","columnKey","Object","entries","prefix","find","startsWith","legacyName","slice","length","indexes","values","index","planIndexRename","rawColumns","filter","Boolean","columnPrefix","currentColumns","on","flat","key","renamedColumns","rename","every","unique","legacyColumns","i","legacyNameBase","getLegacyIndexNameBase","indexName","buildGeneratedLegacyIndexName","currentColumn","legacyColumn","currentFieldPath","getGeneratedVariantFieldPath","legacyFieldPath","currentFieldIndexNameBase","isGeneratedLegacyIndexName","join","metadataColumnSuffix","endsWith","suffixMatch","match","Number","number","suffix"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/drizzle",
|
|
3
|
-
"version": "4.0.0-canary.
|
|
3
|
+
"version": "4.0.0-canary.39",
|
|
4
4
|
"description": "A library of shared functions used by different payload database adapters",
|
|
5
5
|
"homepage": "https://payloadcms.com",
|
|
6
6
|
"repository": {
|
|
@@ -55,10 +55,10 @@
|
|
|
55
55
|
"@types/pg": "8.20.0",
|
|
56
56
|
"@types/to-snake-case": "1.0.0",
|
|
57
57
|
"@payloadcms/eslint-config": "3.28.0",
|
|
58
|
-
"payload": "4.0.0-canary.
|
|
58
|
+
"payload": "4.0.0-canary.39"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"payload": "4.0.0-canary.
|
|
61
|
+
"payload": "4.0.0-canary.39"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "pnpm build:swc && pnpm build:types",
|