@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.
Files changed (39) hide show
  1. package/dist/exports/postgres.d.ts +1 -0
  2. package/dist/exports/postgres.d.ts.map +1 -1
  3. package/dist/exports/postgres.js +1 -0
  4. package/dist/exports/postgres.js.map +1 -1
  5. package/dist/exports/sqlite.d.ts +1 -0
  6. package/dist/exports/sqlite.d.ts.map +1 -1
  7. package/dist/exports/sqlite.js +1 -0
  8. package/dist/exports/sqlite.js.map +1 -1
  9. package/dist/index.d.ts +1 -8
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -8
  12. package/dist/index.js.map +1 -1
  13. package/dist/migrate.js +4 -2
  14. package/dist/migrate.js.map +1 -1
  15. package/dist/migrateDown.js +4 -2
  16. package/dist/migrateDown.js.map +1 -1
  17. package/dist/migrateFresh.js +4 -2
  18. package/dist/migrateFresh.js.map +1 -1
  19. package/dist/migrateRefresh.js +4 -2
  20. package/dist/migrateRefresh.js.map +1 -1
  21. package/dist/migrateReset.js +4 -2
  22. package/dist/migrateReset.js.map +1 -1
  23. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts +35 -0
  24. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
  25. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js +185 -0
  26. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
  27. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts +15 -0
  28. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
  29. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js +114 -0
  30. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
  31. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts +15 -0
  32. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts.map +1 -0
  33. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +110 -0
  34. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -0
  35. package/dist/utilities/getSizesToVariantsRenames.d.ts +54 -0
  36. package/dist/utilities/getSizesToVariantsRenames.d.ts.map +1 -0
  37. package/dist/utilities/getSizesToVariantsRenames.js +251 -0
  38. package/dist/utilities/getSizesToVariantsRenames.js.map +1 -0
  39. package/package.json +3 -3
@@ -0,0 +1,185 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { assertNoSizesToVariantsColumnCollisions, buildGeneratedLegacyIndexName, getSizesToVariantsRenames, isGeneratedLegacyIndexName } from '../../../utilities/getSizesToVariantsRenames.js';
3
+ /**
4
+ * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and
5
+ * `variants_*` (main and versions tables), renaming each column in place so no data is copied,
6
+ * then renames the indexes on those columns to what the current schema expects. Skips columns
7
+ * that are already renamed, so it's safe to re-run.
8
+ */ export async function migratePostgresSizesToVariants({ db, direction = 'up', payload }) {
9
+ const adapter = payload.db;
10
+ const schemaName = adapter.schemaName || 'public';
11
+ const plan = getSizesToVariantsRenames({
12
+ adapter,
13
+ direction
14
+ });
15
+ const plannedTables = [];
16
+ for (const tablePlan of plan){
17
+ const existingColumns = await getColumnNames({
18
+ db,
19
+ schemaName,
20
+ tableName: tablePlan.tableName
21
+ });
22
+ assertNoSizesToVariantsColumnCollisions({
23
+ columns: tablePlan.columns,
24
+ existingColumns,
25
+ tableName: tablePlan.tableName
26
+ });
27
+ plannedTables.push({
28
+ ...tablePlan,
29
+ existingColumns
30
+ });
31
+ }
32
+ const reservedRelationNames = direction === 'down' ? await getPostgresSchemaRelationNames({
33
+ db,
34
+ schemaName
35
+ }) : undefined;
36
+ for (const { columns, existingColumns, indexes, tableName } of plannedTables){
37
+ let renamedCount = 0;
38
+ for (const { from, to } of columns){
39
+ if (!existingColumns.has(from) || existingColumns.has(to)) {
40
+ continue;
41
+ }
42
+ await db.execute(sql`
43
+ ALTER TABLE ${sql.identifier(schemaName)}.${sql.identifier(tableName)}
44
+ RENAME COLUMN ${sql.identifier(from)} TO ${sql.identifier(to)}
45
+ `);
46
+ renamedCount++;
47
+ }
48
+ const existingIndexes = await getIndexes({
49
+ db,
50
+ schemaName,
51
+ tableName
52
+ });
53
+ for (const plannedIndex of indexes){
54
+ const index = reservedRelationNames && plannedIndex.legacyNameBase ? {
55
+ ...plannedIndex,
56
+ to: reservePostgresLegacyIndexName({
57
+ existingIndexes,
58
+ index: plannedIndex,
59
+ reservedRelationNames
60
+ })
61
+ } : plannedIndex;
62
+ const existingName = resolvePostgresIndexRename({
63
+ existingIndexes,
64
+ index,
65
+ tableName
66
+ });
67
+ if (!existingName) {
68
+ continue;
69
+ }
70
+ await db.execute(sql`
71
+ ALTER INDEX ${sql.identifier(schemaName)}.${sql.identifier(existingName)}
72
+ RENAME TO ${sql.identifier(index.to)}
73
+ `);
74
+ }
75
+ payload.logger.info({
76
+ msg: `sizes-to-variants (${direction}): renamed ${renamedCount} column(s) on "${tableName}"`
77
+ });
78
+ }
79
+ }
80
+ export function reservePostgresLegacyIndexName({ existingIndexes, index, reservedRelationNames }) {
81
+ const { legacyNameBase } = index;
82
+ if (!legacyNameBase) {
83
+ reservedRelationNames.add(index.to);
84
+ return index.to;
85
+ }
86
+ const existingDestination = existingIndexes.find((existingIndex)=>isCompatiblePostgresIndex({
87
+ existingIndex,
88
+ index
89
+ }) && isGeneratedLegacyIndexName({
90
+ indexName: existingIndex.name,
91
+ legacyNameBase
92
+ }));
93
+ if (existingDestination) {
94
+ reservedRelationNames.add(existingDestination.name);
95
+ return existingDestination.name;
96
+ }
97
+ let number = 0;
98
+ let indexName = buildGeneratedLegacyIndexName(legacyNameBase);
99
+ while(reservedRelationNames.has(indexName)){
100
+ number++;
101
+ indexName = buildGeneratedLegacyIndexName(legacyNameBase, number);
102
+ }
103
+ reservedRelationNames.add(indexName);
104
+ return indexName;
105
+ }
106
+ export function resolvePostgresIndexRename({ existingIndexes, index, tableName }) {
107
+ const destinationIndex = existingIndexes.find(({ name })=>name === index.to);
108
+ if (destinationIndex) {
109
+ if (!isCompatiblePostgresIndex({
110
+ existingIndex: destinationIndex,
111
+ index
112
+ })) {
113
+ throw new Error(`Cannot run the sizes-to-variants migration because index "${index.to}" on table "${tableName}" does not match the expected columns, uniqueness, or predicate.`);
114
+ }
115
+ return undefined;
116
+ }
117
+ let sourceIndex;
118
+ const { legacyNameBase } = index;
119
+ if (index.from) {
120
+ sourceIndex = existingIndexes.find(({ name })=>name === index.from);
121
+ } else if (legacyNameBase) {
122
+ const legacyCandidates = existingIndexes.filter((existingIndex)=>isGeneratedLegacyIndexName({
123
+ indexName: existingIndex.name,
124
+ legacyNameBase
125
+ }));
126
+ sourceIndex = legacyCandidates.find((existingIndex)=>isCompatiblePostgresIndex({
127
+ existingIndex,
128
+ index
129
+ })) ?? legacyCandidates[0];
130
+ }
131
+ if (!sourceIndex) {
132
+ return undefined;
133
+ }
134
+ if (!isCompatiblePostgresIndex({
135
+ existingIndex: sourceIndex,
136
+ index
137
+ })) {
138
+ throw new Error(`Cannot run the sizes-to-variants migration because index "${sourceIndex.name}" on table "${tableName}" does not match the expected columns, uniqueness, or predicate.`);
139
+ }
140
+ return sourceIndex.name === index.to ? undefined : sourceIndex.name;
141
+ }
142
+ function isCompatiblePostgresIndex({ existingIndex, index }) {
143
+ return existingIndex.columns.join(',') === index.columns.join(',') && existingIndex.unique === index.unique && !existingIndex.isPartial;
144
+ }
145
+ async function getColumnNames({ db, schemaName, tableName }) {
146
+ const result = await db.execute(sql`
147
+ SELECT column_name FROM information_schema.columns
148
+ WHERE table_schema = ${schemaName} AND table_name = ${tableName}
149
+ `);
150
+ return new Set(result.rows.map((row)=>row.column_name));
151
+ }
152
+ async function getIndexes({ db, schemaName, tableName }) {
153
+ const result = await db.execute(sql`
154
+ SELECT
155
+ i.relname AS name,
156
+ array_agg(a.attname::text ORDER BY k.ord) AS columns,
157
+ ix.indisunique AS is_unique,
158
+ ix.indpred IS NOT NULL AS is_partial
159
+ FROM pg_index ix
160
+ JOIN pg_class t ON t.oid = ix.indrelid
161
+ JOIN pg_namespace n ON n.oid = t.relnamespace
162
+ JOIN pg_class i ON i.oid = ix.indexrelid
163
+ CROSS JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, ord)
164
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
165
+ WHERE n.nspname = ${schemaName} AND t.relname = ${tableName}
166
+ GROUP BY i.relname, ix.indisunique, (ix.indpred IS NOT NULL)
167
+ `);
168
+ return result.rows.map((row)=>({
169
+ name: row.name,
170
+ columns: row.columns,
171
+ isPartial: row.is_partial,
172
+ unique: row.is_unique
173
+ }));
174
+ }
175
+ export async function getPostgresSchemaRelationNames({ db, schemaName }) {
176
+ const result = await db.execute(sql`
177
+ SELECT c.relname AS name
178
+ FROM pg_class c
179
+ JOIN pg_namespace n ON n.oid = c.relnamespace
180
+ WHERE n.nspname = ${schemaName}
181
+ `);
182
+ return new Set(result.rows.map((row)=>row.name));
183
+ }
184
+
185
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/postgres/predefinedMigrations/sizes-to-variants/index.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport { sql } from 'drizzle-orm'\n\nimport type {\n SizesToVariantsDirection,\n SizesToVariantsIndexRename,\n} from '../../../utilities/getSizesToVariantsRenames.js'\nimport type { BasePostgresAdapter } from '../../types.js'\n\nimport {\n assertNoSizesToVariantsColumnCollisions,\n buildGeneratedLegacyIndexName,\n getSizesToVariantsRenames,\n isGeneratedLegacyIndexName,\n} from '../../../utilities/getSizesToVariantsRenames.js'\n\ntype ExistingPostgresIndex = {\n columns: string[]\n isPartial: boolean\n name: string\n unique: boolean\n}\n\n/**\n * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and\n * `variants_*` (main and versions tables), renaming each column in place so no data is copied,\n * then renames the indexes on those columns to what the current schema expects. Skips columns\n * that are already renamed, so it's safe to re-run.\n */\nexport async function migratePostgresSizesToVariants({\n db,\n direction = 'up',\n payload,\n}: {\n db: any\n direction?: SizesToVariantsDirection\n payload: Payload\n}): Promise<void> {\n const adapter = payload.db as unknown as BasePostgresAdapter\n const schemaName = adapter.schemaName || 'public'\n const plan = getSizesToVariantsRenames({ adapter, direction })\n const plannedTables: Array<\n (typeof plan)[number] & {\n existingColumns: Set<string>\n }\n > = []\n\n for (const tablePlan of plan) {\n const existingColumns = await getColumnNames({\n db,\n schemaName,\n tableName: tablePlan.tableName,\n })\n\n assertNoSizesToVariantsColumnCollisions({\n columns: tablePlan.columns,\n existingColumns,\n tableName: tablePlan.tableName,\n })\n\n plannedTables.push({ ...tablePlan, existingColumns })\n }\n\n const reservedRelationNames =\n direction === 'down' ? await getPostgresSchemaRelationNames({ db, schemaName }) : undefined\n\n for (const { columns, existingColumns, indexes, tableName } of plannedTables) {\n let renamedCount = 0\n\n for (const { from, to } of columns) {\n if (!existingColumns.has(from) || existingColumns.has(to)) {\n continue\n }\n\n await db.execute(sql`\n ALTER TABLE ${sql.identifier(schemaName)}.${sql.identifier(tableName)}\n RENAME COLUMN ${sql.identifier(from)} TO ${sql.identifier(to)}\n `)\n renamedCount++\n }\n\n const existingIndexes = await getIndexes({ db, schemaName, tableName })\n\n for (const plannedIndex of indexes) {\n const index =\n reservedRelationNames && plannedIndex.legacyNameBase\n ? {\n ...plannedIndex,\n to: reservePostgresLegacyIndexName({\n existingIndexes,\n index: plannedIndex,\n reservedRelationNames,\n }),\n }\n : plannedIndex\n const existingName = resolvePostgresIndexRename({\n existingIndexes,\n index,\n tableName,\n })\n\n if (!existingName) {\n continue\n }\n\n await db.execute(sql`\n ALTER INDEX ${sql.identifier(schemaName)}.${sql.identifier(existingName)}\n RENAME TO ${sql.identifier(index.to)}\n `)\n }\n\n payload.logger.info({\n msg: `sizes-to-variants (${direction}): renamed ${renamedCount} column(s) on \"${tableName}\"`,\n })\n }\n}\n\nexport function reservePostgresLegacyIndexName({\n existingIndexes,\n index,\n reservedRelationNames,\n}: {\n existingIndexes: ExistingPostgresIndex[]\n index: SizesToVariantsIndexRename\n reservedRelationNames: Set<string>\n}): string {\n const { legacyNameBase } = index\n\n if (!legacyNameBase) {\n reservedRelationNames.add(index.to)\n return index.to\n }\n\n const existingDestination = existingIndexes.find(\n (existingIndex) =>\n isCompatiblePostgresIndex({ existingIndex, index }) &&\n isGeneratedLegacyIndexName({\n indexName: existingIndex.name,\n legacyNameBase,\n }),\n )\n\n if (existingDestination) {\n reservedRelationNames.add(existingDestination.name)\n return existingDestination.name\n }\n\n let number = 0\n let indexName = buildGeneratedLegacyIndexName(legacyNameBase)\n\n while (reservedRelationNames.has(indexName)) {\n number++\n indexName = buildGeneratedLegacyIndexName(legacyNameBase, number)\n }\n\n reservedRelationNames.add(indexName)\n return indexName\n}\n\nexport function resolvePostgresIndexRename({\n existingIndexes,\n index,\n tableName,\n}: {\n existingIndexes: ExistingPostgresIndex[]\n index: SizesToVariantsIndexRename\n tableName: string\n}): string | undefined {\n const destinationIndex = existingIndexes.find(({ name }) => name === index.to)\n\n if (destinationIndex) {\n if (!isCompatiblePostgresIndex({ existingIndex: destinationIndex, index })) {\n throw new Error(\n `Cannot run the sizes-to-variants migration because index \"${index.to}\" on table \"${tableName}\" does not match the expected columns, uniqueness, or predicate.`,\n )\n }\n\n return undefined\n }\n\n let sourceIndex: ExistingPostgresIndex | undefined\n const { legacyNameBase } = index\n\n if (index.from) {\n sourceIndex = existingIndexes.find(({ name }) => name === index.from)\n } else if (legacyNameBase) {\n const legacyCandidates = existingIndexes.filter((existingIndex) =>\n isGeneratedLegacyIndexName({\n indexName: existingIndex.name,\n legacyNameBase,\n }),\n )\n\n sourceIndex =\n legacyCandidates.find((existingIndex) =>\n isCompatiblePostgresIndex({ existingIndex, index }),\n ) ?? legacyCandidates[0]\n }\n\n if (!sourceIndex) {\n return undefined\n }\n\n if (!isCompatiblePostgresIndex({ existingIndex: sourceIndex, index })) {\n throw new Error(\n `Cannot run the sizes-to-variants migration because index \"${sourceIndex.name}\" on table \"${tableName}\" does not match the expected columns, uniqueness, or predicate.`,\n )\n }\n\n return sourceIndex.name === index.to ? undefined : sourceIndex.name\n}\n\nfunction isCompatiblePostgresIndex({\n existingIndex,\n index,\n}: {\n existingIndex: ExistingPostgresIndex\n index: SizesToVariantsIndexRename\n}): boolean {\n return (\n existingIndex.columns.join(',') === index.columns.join(',') &&\n existingIndex.unique === index.unique &&\n !existingIndex.isPartial\n )\n}\n\nasync function getColumnNames({\n db,\n schemaName,\n tableName,\n}: {\n db: any\n schemaName: string\n tableName: string\n}): Promise<Set<string>> {\n const result = await db.execute(sql`\n SELECT column_name FROM information_schema.columns\n WHERE table_schema = ${schemaName} AND table_name = ${tableName}\n `)\n\n return new Set(result.rows.map((row: { column_name: string }) => row.column_name))\n}\n\nasync function getIndexes({\n db,\n schemaName,\n tableName,\n}: {\n db: any\n schemaName: string\n tableName: string\n}): Promise<ExistingPostgresIndex[]> {\n const result = await db.execute(sql`\n SELECT\n i.relname AS name,\n array_agg(a.attname::text ORDER BY k.ord) AS columns,\n ix.indisunique AS is_unique,\n ix.indpred IS NOT NULL AS is_partial\n FROM pg_index ix\n JOIN pg_class t ON t.oid = ix.indrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_class i ON i.oid = ix.indexrelid\n CROSS JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, ord)\n JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum\n WHERE n.nspname = ${schemaName} AND t.relname = ${tableName}\n GROUP BY i.relname, ix.indisunique, (ix.indpred IS NOT NULL)\n `)\n\n return result.rows.map(\n (row: { columns: string[]; is_partial: boolean; is_unique: boolean; name: string }) => ({\n name: row.name,\n columns: row.columns,\n isPartial: row.is_partial,\n unique: row.is_unique,\n }),\n )\n}\n\nexport async function getPostgresSchemaRelationNames({\n db,\n schemaName,\n}: {\n db: any\n schemaName: string\n}): Promise<Set<string>> {\n const result = await db.execute(sql`\n SELECT c.relname AS name\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = ${schemaName}\n `)\n\n return new Set(result.rows.map((row: { name: string }) => row.name))\n}\n"],"names":["sql","assertNoSizesToVariantsColumnCollisions","buildGeneratedLegacyIndexName","getSizesToVariantsRenames","isGeneratedLegacyIndexName","migratePostgresSizesToVariants","db","direction","payload","adapter","schemaName","plan","plannedTables","tablePlan","existingColumns","getColumnNames","tableName","columns","push","reservedRelationNames","getPostgresSchemaRelationNames","undefined","indexes","renamedCount","from","to","has","execute","identifier","existingIndexes","getIndexes","plannedIndex","index","legacyNameBase","reservePostgresLegacyIndexName","existingName","resolvePostgresIndexRename","logger","info","msg","add","existingDestination","find","existingIndex","isCompatiblePostgresIndex","indexName","name","number","destinationIndex","Error","sourceIndex","legacyCandidates","filter","join","unique","isPartial","result","Set","rows","map","row","column_name","is_partial","is_unique"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Payload } from 'payload';
2
+ import type { SizesToVariantsDirection } from '../../../utilities/getSizesToVariantsRenames.js';
3
+ /**
4
+ * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and
5
+ * `variants_*` (main and versions tables), renaming each column in place so no data is copied.
6
+ * SQLite can't rename an index, so each index on a renamed column is dropped and recreated under
7
+ * the name the current schema expects. Skips columns that are already renamed, so it's safe to
8
+ * re-run.
9
+ */
10
+ export declare function migrateSqliteSizesToVariants({ db, direction, payload, }: {
11
+ db: any;
12
+ direction?: SizesToVariantsDirection;
13
+ payload: Payload;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sqlite/predefinedMigrations/sizes-to-variants/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAA;AAQ/F;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,EAAE,EACF,SAAgB,EAChB,OAAO,GACR,EAAE;IACD,EAAE,EAAE,GAAG,CAAA;IACP,SAAS,CAAC,EAAE,wBAAwB,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FhB"}
@@ -0,0 +1,114 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { assertNoSizesToVariantsColumnCollisions, getSizesToVariantsRenames, isGeneratedLegacyIndexName } from '../../../utilities/getSizesToVariantsRenames.js';
3
+ /**
4
+ * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and
5
+ * `variants_*` (main and versions tables), renaming each column in place so no data is copied.
6
+ * SQLite can't rename an index, so each index on a renamed column is dropped and recreated under
7
+ * the name the current schema expects. Skips columns that are already renamed, so it's safe to
8
+ * re-run.
9
+ */ export async function migrateSqliteSizesToVariants({ db, direction = 'up', payload }) {
10
+ const adapter = payload.db;
11
+ const plan = getSizesToVariantsRenames({
12
+ adapter,
13
+ direction
14
+ });
15
+ const plannedTables = [];
16
+ for (const tablePlan of plan){
17
+ const existingColumns = await getColumnNames({
18
+ db,
19
+ tableName: tablePlan.tableName
20
+ });
21
+ assertNoSizesToVariantsColumnCollisions({
22
+ columns: tablePlan.columns,
23
+ existingColumns,
24
+ tableName: tablePlan.tableName
25
+ });
26
+ plannedTables.push({
27
+ ...tablePlan,
28
+ existingColumns
29
+ });
30
+ }
31
+ for (const { columns, existingColumns, indexes, tableName } of plannedTables){
32
+ const columnsAfterRename = new Set(existingColumns);
33
+ let renamedCount = 0;
34
+ for (const { from, to } of columns){
35
+ if (!existingColumns.has(from) || existingColumns.has(to)) {
36
+ continue;
37
+ }
38
+ columnsAfterRename.delete(from);
39
+ columnsAfterRename.add(to);
40
+ await db.run(sql`
41
+ ALTER TABLE ${sql.identifier(tableName)}
42
+ RENAME COLUMN ${sql.identifier(from)} TO ${sql.identifier(to)}
43
+ `);
44
+ renamedCount++;
45
+ }
46
+ const existingIndexes = await getIndexes({
47
+ db,
48
+ tableName
49
+ });
50
+ for (const index of indexes){
51
+ if (!index.columns.every((column)=>columnsAfterRename.has(column))) {
52
+ continue;
53
+ }
54
+ const destinationIndex = existingIndexes.find(({ name })=>name === index.to);
55
+ const sourceIndex = destinationIndex ? undefined : index.from ? existingIndexes.find(({ name })=>name === index.from) : index.legacyNameBase ? existingIndexes.find(({ name, columns })=>columns.join(',') === index.columns.join(',') && isGeneratedLegacyIndexName({
56
+ indexName: name,
57
+ legacyNameBase: index.legacyNameBase
58
+ })) : undefined;
59
+ if (destinationIndex) {
60
+ if (destinationIndex.columns.join(',') !== index.columns.join(',') || destinationIndex.unique !== index.unique) {
61
+ throw new Error(`Cannot run the sizes-to-variants migration because index "${index.to}" on table "${tableName}" does not match the expected columns or uniqueness.`);
62
+ }
63
+ } else {
64
+ const unique = index.unique ? sql.raw('UNIQUE ') : sql.empty();
65
+ const columnList = sql.join(index.columns.map((column)=>sql.identifier(column)), sql.raw(', '));
66
+ await db.run(sql`
67
+ CREATE ${unique}INDEX ${sql.identifier(index.to)}
68
+ ON ${sql.identifier(tableName)} (${columnList})
69
+ `);
70
+ }
71
+ if (sourceIndex && sourceIndex.name !== index.to) {
72
+ await db.run(sql`DROP INDEX ${sql.identifier(sourceIndex.name)}`);
73
+ }
74
+ }
75
+ payload.logger.info({
76
+ msg: `sizes-to-variants (${direction}): renamed ${renamedCount} column(s) on "${tableName}"`
77
+ });
78
+ }
79
+ }
80
+ async function getColumnNames({ db, tableName }) {
81
+ const rows = await db.all(sql`SELECT name FROM pragma_table_info(${tableName})`);
82
+ return new Set(rows.map(({ name })=>name));
83
+ }
84
+ async function getIndexes({ db, tableName }) {
85
+ // `origin = 'c'` keeps only `CREATE INDEX` indexes, skipping SQLite's internal autoindexes.
86
+ const rows = await db.all(sql`
87
+ SELECT
88
+ il.name AS index_name,
89
+ il."unique" AS is_unique,
90
+ ii.name AS column_name,
91
+ ii.seqno AS seqno
92
+ FROM pragma_index_list(${tableName}) AS il
93
+ JOIN pragma_index_info(il.name) AS ii
94
+ WHERE il.origin = 'c'
95
+ ORDER BY il.name, ii.seqno
96
+ `);
97
+ const indexes = new Map();
98
+ for (const { column_name, index_name, is_unique } of rows){
99
+ const index = indexes.get(index_name) ?? {
100
+ columns: [],
101
+ unique: Boolean(is_unique)
102
+ };
103
+ index.columns.push(column_name);
104
+ indexes.set(index_name, index);
105
+ }
106
+ return [
107
+ ...indexes
108
+ ].map(([name, index])=>({
109
+ name,
110
+ ...index
111
+ }));
112
+ }
113
+
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/sqlite/predefinedMigrations/sizes-to-variants/index.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport { sql } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../../../types.js'\nimport type { SizesToVariantsDirection } from '../../../utilities/getSizesToVariantsRenames.js'\n\nimport {\n assertNoSizesToVariantsColumnCollisions,\n getSizesToVariantsRenames,\n isGeneratedLegacyIndexName,\n} from '../../../utilities/getSizesToVariantsRenames.js'\n\n/**\n * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and\n * `variants_*` (main and versions tables), renaming each column in place so no data is copied.\n * SQLite can't rename an index, so each index on a renamed column is dropped and recreated under\n * the name the current schema expects. Skips columns that are already renamed, so it's safe to\n * re-run.\n */\nexport async function migrateSqliteSizesToVariants({\n db,\n direction = 'up',\n payload,\n}: {\n db: any\n direction?: SizesToVariantsDirection\n payload: Payload\n}): Promise<void> {\n const adapter = payload.db as unknown as DrizzleAdapter\n const plan = getSizesToVariantsRenames({ adapter, direction })\n const plannedTables: Array<\n (typeof plan)[number] & {\n existingColumns: Set<string>\n }\n > = []\n\n for (const tablePlan of plan) {\n const existingColumns = await getColumnNames({ db, tableName: tablePlan.tableName })\n\n assertNoSizesToVariantsColumnCollisions({\n columns: tablePlan.columns,\n existingColumns,\n tableName: tablePlan.tableName,\n })\n\n plannedTables.push({ ...tablePlan, existingColumns })\n }\n\n for (const { columns, existingColumns, indexes, tableName } of plannedTables) {\n const columnsAfterRename = new Set(existingColumns)\n let renamedCount = 0\n\n for (const { from, to } of columns) {\n if (!existingColumns.has(from) || existingColumns.has(to)) {\n continue\n }\n\n columnsAfterRename.delete(from)\n columnsAfterRename.add(to)\n\n await db.run(sql`\n ALTER TABLE ${sql.identifier(tableName)}\n RENAME COLUMN ${sql.identifier(from)} TO ${sql.identifier(to)}\n `)\n renamedCount++\n }\n\n const existingIndexes = await getIndexes({ db, tableName })\n\n for (const index of indexes) {\n if (!index.columns.every((column) => columnsAfterRename.has(column))) {\n continue\n }\n\n const destinationIndex = existingIndexes.find(({ name }) => name === index.to)\n const sourceIndex = destinationIndex\n ? undefined\n : index.from\n ? existingIndexes.find(({ name }) => name === index.from)\n : index.legacyNameBase\n ? existingIndexes.find(\n ({ name, columns }) =>\n columns.join(',') === index.columns.join(',') &&\n isGeneratedLegacyIndexName({\n indexName: name,\n legacyNameBase: index.legacyNameBase,\n }),\n )\n : undefined\n\n if (destinationIndex) {\n if (\n destinationIndex.columns.join(',') !== index.columns.join(',') ||\n destinationIndex.unique !== index.unique\n ) {\n throw new Error(\n `Cannot run the sizes-to-variants migration because index \"${index.to}\" on table \"${tableName}\" does not match the expected columns or uniqueness.`,\n )\n }\n } else {\n const unique = index.unique ? sql.raw('UNIQUE ') : sql.empty()\n const columnList = sql.join(\n index.columns.map((column) => sql.identifier(column)),\n sql.raw(', '),\n )\n\n await db.run(sql`\n CREATE ${unique}INDEX ${sql.identifier(index.to)}\n ON ${sql.identifier(tableName)} (${columnList})\n `)\n }\n\n if (sourceIndex && sourceIndex.name !== index.to) {\n await db.run(sql`DROP INDEX ${sql.identifier(sourceIndex.name)}`)\n }\n }\n\n payload.logger.info({\n msg: `sizes-to-variants (${direction}): renamed ${renamedCount} column(s) on \"${tableName}\"`,\n })\n }\n}\n\nasync function getColumnNames({\n db,\n tableName,\n}: {\n db: any\n tableName: string\n}): Promise<Set<string>> {\n const rows: { name: string }[] = await db.all(\n sql`SELECT name FROM pragma_table_info(${tableName})`,\n )\n\n return new Set(rows.map(({ name }) => name))\n}\n\nasync function getIndexes({\n db,\n tableName,\n}: {\n db: any\n tableName: string\n}): Promise<{ columns: string[]; name: string; unique: boolean }[]> {\n // `origin = 'c'` keeps only `CREATE INDEX` indexes, skipping SQLite's internal autoindexes.\n const rows: { column_name: string; index_name: string; is_unique: number; seqno: number }[] =\n await db.all(sql`\n SELECT\n il.name AS index_name,\n il.\"unique\" AS is_unique,\n ii.name AS column_name,\n ii.seqno AS seqno\n FROM pragma_index_list(${tableName}) AS il\n JOIN pragma_index_info(il.name) AS ii\n WHERE il.origin = 'c'\n ORDER BY il.name, ii.seqno\n `)\n\n const indexes = new Map<string, { columns: string[]; unique: boolean }>()\n\n for (const { column_name, index_name, is_unique } of rows) {\n const index = indexes.get(index_name) ?? { columns: [], unique: Boolean(is_unique) }\n\n index.columns.push(column_name)\n indexes.set(index_name, index)\n }\n\n return [...indexes].map(([name, index]) => ({ name, ...index }))\n}\n"],"names":["sql","assertNoSizesToVariantsColumnCollisions","getSizesToVariantsRenames","isGeneratedLegacyIndexName","migrateSqliteSizesToVariants","db","direction","payload","adapter","plan","plannedTables","tablePlan","existingColumns","getColumnNames","tableName","columns","push","indexes","columnsAfterRename","Set","renamedCount","from","to","has","delete","add","run","identifier","existingIndexes","getIndexes","index","every","column","destinationIndex","find","name","sourceIndex","undefined","legacyNameBase","join","indexName","unique","Error","raw","empty","columnList","map","logger","info","msg","rows","all","Map","column_name","index_name","is_unique","get","Boolean","set"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { DynamicMigrationTemplate } from 'payload';
2
+ /**
3
+ * Builds the `sizes-to-variants` predefined migration for a SQL adapter. The migration renames
4
+ * columns rather than letting drizzle-kit diff the schema (which would drop and re-add them,
5
+ * losing every stored image size).
6
+ *
7
+ * It also writes a schema snapshot: the project's previous snapshot with only these renames
8
+ * applied. The next generated migration then diffs from the renamed columns instead of dropping
9
+ * them, and still picks up every other schema change the upgrade brings. Without a previous
10
+ * snapshot (a project that has only ever used `push`) there's nothing to update, so none is written.
11
+ */
12
+ export declare const buildDynamicPredefinedSizesToVariantsMigration: ({ packageName, }: {
13
+ packageName: string;
14
+ }) => DynamicMigrationTemplate;
15
+ //# sourceMappingURL=buildDynamicPredefinedSizesToVariantsMigration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDynamicPredefinedSizesToVariantsMigration.d.ts","sourceRoot":"","sources":["../../src/utilities/buildDynamicPredefinedSizesToVariantsMigration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AA+BvD;;;;;;;;;GASG;AACH,eAAO,MAAM,8CAA8C,qBAExD;IACD,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,wBAoBH,CAAA"}
@@ -0,0 +1,110 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { readdirSync, readFileSync, writeFileSync } from 'fs';
3
+ import { findSizesToVariantsFieldCollision, getSizesToVariantsRenames } from './getSizesToVariantsRenames.js';
4
+ /**
5
+ * Builds the `sizes-to-variants` predefined migration for a SQL adapter. The migration renames
6
+ * columns rather than letting drizzle-kit diff the schema (which would drop and re-add them,
7
+ * losing every stored image size).
8
+ *
9
+ * It also writes a schema snapshot: the project's previous snapshot with only these renames
10
+ * applied. The next generated migration then diffs from the renamed columns instead of dropping
11
+ * them, and still picks up every other schema change the upgrade brings. Without a previous
12
+ * snapshot (a project that has only ever used `push`) there's nothing to update, so none is written.
13
+ */ export const buildDynamicPredefinedSizesToVariantsMigration = ({ packageName })=>{
14
+ return async ({ filePath, payload })=>{
15
+ const adapter = payload.db;
16
+ const previousSnapshot = await readLatestSnapshot({
17
+ adapter
18
+ });
19
+ if (previousSnapshot) {
20
+ const renamedSnapshot = applySizesToVariantsRenames({
21
+ plan: getSizesToVariantsRenames({
22
+ adapter,
23
+ direction: 'up'
24
+ }),
25
+ snapshot: previousSnapshot
26
+ });
27
+ writeFileSync(`${filePath}.json`, JSON.stringify(renamedSnapshot, null, 2));
28
+ }
29
+ return {
30
+ downSQL: ` await migrateSizesToVariants({ db, direction: 'down', payload })`,
31
+ imports: `import { migrateSizesToVariants } from '${packageName}/migration-utils'`,
32
+ upSQL: ` await migrateSizesToVariants({ db, payload })`
33
+ };
34
+ };
35
+ };
36
+ /** The latest snapshot in the migrations directory, upgraded to drizzle-kit's current format. */ async function readLatestSnapshot({ adapter }) {
37
+ const dir = adapter.migrationDir;
38
+ const latestSnapshotFile = readdirSync(dir).filter((file)=>file.endsWith('.json')).sort().reverse()[0];
39
+ if (!latestSnapshotFile) {
40
+ return undefined;
41
+ }
42
+ const { generateDrizzleJson, upSnapshot } = adapter.requireDrizzleKit();
43
+ const currentVersion = (await generateDrizzleJson(adapter.schema)).version;
44
+ const snapshot = JSON.parse(readFileSync(`${dir}/${latestSnapshotFile}`, 'utf8'));
45
+ return upSnapshot && snapshot.version < currentVersion ? upSnapshot(snapshot) : snapshot;
46
+ }
47
+ function applySizesToVariantsRenames({ plan, snapshot }) {
48
+ const renamed = structuredClone(snapshot);
49
+ for (const { columns, indexes, tableName } of plan){
50
+ const table = Object.values(renamed.tables).find(({ name })=>name === tableName);
51
+ if (!table) {
52
+ continue;
53
+ }
54
+ const existingColumns = new Set(Object.values(table.columns).map(({ name })=>name));
55
+ for (const { from, to } of columns){
56
+ if (existingColumns.has(from) && existingColumns.has(to)) {
57
+ throw new Error(`Cannot create the sizes-to-variants migration because snapshot table "${tableName}" contains both "${from}" and "${to}". Move or rename the existing destination data before creating this migration.`);
58
+ }
59
+ }
60
+ const fieldCollision = findSizesToVariantsFieldCollision({
61
+ columns,
62
+ existingColumns
63
+ });
64
+ if (fieldCollision) {
65
+ throw new Error(`Cannot create the sizes-to-variants migration because snapshot table "${tableName}" contains both the "${fieldCollision.from}" and "${fieldCollision.to}" fields. Move or rename the existing destination data before creating this migration.`);
66
+ }
67
+ for (const { from, to } of columns){
68
+ const column = table.columns[from];
69
+ if (column) {
70
+ if (table.columns[to]) {
71
+ throw new Error(`Cannot create the sizes-to-variants migration because snapshot table "${tableName}" contains both "${from}" and "${to}". Move or rename the existing destination data before creating this migration.`);
72
+ }
73
+ delete table.columns[from];
74
+ table.columns[to] = {
75
+ ...column,
76
+ name: to
77
+ };
78
+ }
79
+ }
80
+ for (const [key, index] of Object.entries(table.indexes ?? {})){
81
+ const indexColumns = index.columns.map((column)=>{
82
+ const name = typeof column === 'string' ? column : column.expression;
83
+ const renamedName = columns.find(({ from })=>from === name)?.to ?? name;
84
+ return typeof column === 'string' ? renamedName : {
85
+ ...column,
86
+ expression: renamedName
87
+ };
88
+ });
89
+ const indexColumnNames = indexColumns.map((column)=>typeof column === 'string' ? column : column.expression);
90
+ const target = indexes.find((planned)=>planned.columns.join(',') === indexColumnNames.join(','));
91
+ if (!target) {
92
+ continue;
93
+ }
94
+ if (key !== target.to && table.indexes?.[target.to]) {
95
+ throw new Error(`Cannot create the sizes-to-variants migration because snapshot table "${tableName}" contains both indexes "${key}" and "${target.to}". Move or rename the existing destination index before creating this migration.`);
96
+ }
97
+ delete table.indexes[key];
98
+ table.indexes[target.to] = {
99
+ ...index,
100
+ name: target.to,
101
+ columns: indexColumns
102
+ };
103
+ }
104
+ }
105
+ renamed.prevId = snapshot.id;
106
+ renamed.id = randomUUID();
107
+ return renamed;
108
+ }
109
+
110
+ //# sourceMappingURL=buildDynamicPredefinedSizesToVariantsMigration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/buildDynamicPredefinedSizesToVariantsMigration.ts"],"sourcesContent":["import type { DynamicMigrationTemplate } from 'payload'\n\nimport { randomUUID } from 'crypto'\nimport { readdirSync, readFileSync, writeFileSync } from 'fs'\n\nimport type { DrizzleAdapter } from '../types.js'\nimport type { SizesToVariantsTableRenames } from './getSizesToVariantsRenames.js'\n\nimport {\n findSizesToVariantsFieldCollision,\n getSizesToVariantsRenames,\n} from './getSizesToVariantsRenames.js'\n\ntype SnapshotIndex = {\n columns: ({ expression: string } | string)[]\n name: string\n}\n\ntype SnapshotTable = {\n columns: Record<string, { name: string }>\n indexes?: Record<string, SnapshotIndex>\n name: string\n}\n\ntype Snapshot = {\n id?: string\n prevId?: string\n tables: Record<string, SnapshotTable>\n version: string\n}\n\n/**\n * Builds the `sizes-to-variants` predefined migration for a SQL adapter. The migration renames\n * columns rather than letting drizzle-kit diff the schema (which would drop and re-add them,\n * losing every stored image size).\n *\n * It also writes a schema snapshot: the project's previous snapshot with only these renames\n * applied. The next generated migration then diffs from the renamed columns instead of dropping\n * them, and still picks up every other schema change the upgrade brings. Without a previous\n * snapshot (a project that has only ever used `push`) there's nothing to update, so none is written.\n */\nexport const buildDynamicPredefinedSizesToVariantsMigration = ({\n packageName,\n}: {\n packageName: string\n}): DynamicMigrationTemplate => {\n return async ({ filePath, payload }) => {\n const adapter = payload.db as unknown as DrizzleAdapter\n const previousSnapshot = await readLatestSnapshot({ adapter })\n\n if (previousSnapshot) {\n const renamedSnapshot = applySizesToVariantsRenames({\n plan: getSizesToVariantsRenames({ adapter, direction: 'up' }),\n snapshot: previousSnapshot,\n })\n\n writeFileSync(`${filePath}.json`, JSON.stringify(renamedSnapshot, null, 2))\n }\n\n return {\n downSQL: ` await migrateSizesToVariants({ db, direction: 'down', payload })`,\n imports: `import { migrateSizesToVariants } from '${packageName}/migration-utils'`,\n upSQL: ` await migrateSizesToVariants({ db, payload })`,\n }\n }\n}\n\n/** The latest snapshot in the migrations directory, upgraded to drizzle-kit's current format. */\nasync function readLatestSnapshot({\n adapter,\n}: {\n adapter: DrizzleAdapter\n}): Promise<Snapshot | undefined> {\n const dir = adapter.migrationDir\n const latestSnapshotFile = readdirSync(dir)\n .filter((file) => file.endsWith('.json'))\n .sort()\n .reverse()[0]\n\n if (!latestSnapshotFile) {\n return undefined\n }\n\n const { generateDrizzleJson, upSnapshot } = adapter.requireDrizzleKit()\n const currentVersion = (await generateDrizzleJson(adapter.schema)).version\n const snapshot = JSON.parse(readFileSync(`${dir}/${latestSnapshotFile}`, 'utf8')) as Snapshot\n\n return upSnapshot && snapshot.version < currentVersion ? upSnapshot(snapshot) : snapshot\n}\n\nfunction applySizesToVariantsRenames({\n plan,\n snapshot,\n}: {\n plan: SizesToVariantsTableRenames[]\n snapshot: Snapshot\n}): Snapshot {\n const renamed: Snapshot = structuredClone(snapshot)\n\n for (const { columns, indexes, tableName } of plan) {\n const table = Object.values(renamed.tables).find(({ name }) => name === tableName)\n\n if (!table) {\n continue\n }\n\n const existingColumns = new Set(Object.values(table.columns).map(({ name }) => name))\n\n for (const { from, to } of columns) {\n if (existingColumns.has(from) && existingColumns.has(to)) {\n throw new Error(\n `Cannot create the sizes-to-variants migration because snapshot table \"${tableName}\" contains both \"${from}\" and \"${to}\". Move or rename the existing destination data before creating this migration.`,\n )\n }\n }\n\n const fieldCollision = findSizesToVariantsFieldCollision({ columns, existingColumns })\n\n if (fieldCollision) {\n throw new Error(\n `Cannot create the sizes-to-variants migration because snapshot table \"${tableName}\" contains both the \"${fieldCollision.from}\" and \"${fieldCollision.to}\" fields. Move or rename the existing destination data before creating this migration.`,\n )\n }\n\n for (const { from, to } of columns) {\n const column = table.columns[from]\n\n if (column) {\n if (table.columns[to]) {\n throw new Error(\n `Cannot create the sizes-to-variants migration because snapshot table \"${tableName}\" contains both \"${from}\" and \"${to}\". Move or rename the existing destination data before creating this migration.`,\n )\n }\n\n delete table.columns[from]\n table.columns[to] = { ...column, name: to }\n }\n }\n\n for (const [key, index] of Object.entries(table.indexes ?? {})) {\n const indexColumns = index.columns.map((column) => {\n const name = typeof column === 'string' ? column : column.expression\n const renamedName = columns.find(({ from }) => from === name)?.to ?? name\n\n return typeof column === 'string' ? renamedName : { ...column, expression: renamedName }\n })\n const indexColumnNames = indexColumns.map((column) =>\n typeof column === 'string' ? column : column.expression,\n )\n const target = indexes.find(\n (planned) => planned.columns.join(',') === indexColumnNames.join(','),\n )\n\n if (!target) {\n continue\n }\n\n if (key !== target.to && table.indexes?.[target.to]) {\n throw new Error(\n `Cannot create the sizes-to-variants migration because snapshot table \"${tableName}\" contains both indexes \"${key}\" and \"${target.to}\". Move or rename the existing destination index before creating this migration.`,\n )\n }\n\n delete table.indexes[key]\n table.indexes[target.to] = { ...index, name: target.to, columns: indexColumns }\n }\n }\n\n renamed.prevId = snapshot.id\n renamed.id = randomUUID()\n\n return renamed\n}\n"],"names":["randomUUID","readdirSync","readFileSync","writeFileSync","findSizesToVariantsFieldCollision","getSizesToVariantsRenames","buildDynamicPredefinedSizesToVariantsMigration","packageName","filePath","payload","adapter","db","previousSnapshot","readLatestSnapshot","renamedSnapshot","applySizesToVariantsRenames","plan","direction","snapshot","JSON","stringify","downSQL","imports","upSQL","dir","migrationDir","latestSnapshotFile","filter","file","endsWith","sort","reverse","undefined","generateDrizzleJson","upSnapshot","requireDrizzleKit","currentVersion","schema","version","parse","renamed","structuredClone","columns","indexes","tableName","table","Object","values","tables","find","name","existingColumns","Set","map","from","to","has","Error","fieldCollision","column","key","index","entries","indexColumns","expression","renamedName","indexColumnNames","target","planned","join","prevId","id"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { DrizzleAdapter } from '../types.js';
2
+ export type SizesToVariantsDirection = 'down' | 'up';
3
+ export type SizesToVariantsColumnRename = {
4
+ from: string;
5
+ to: string;
6
+ };
7
+ export type SizesToVariantsIndexRename = {
8
+ /** Columns the index covers, named as they are after the column renames. */
9
+ columns: string[];
10
+ /** The index name to rename from on `down`. The generated legacy name is resolved on `up`. */
11
+ from?: string;
12
+ /** Base used to verify a generated legacy index name, including a possible numeric suffix. */
13
+ legacyNameBase?: string;
14
+ to: string;
15
+ unique: boolean;
16
+ };
17
+ export type SizesToVariantsTableRenames = {
18
+ columns: SizesToVariantsColumnRename[];
19
+ indexes: SizesToVariantsIndexRename[];
20
+ tableName: string;
21
+ };
22
+ export declare function findSizesToVariantsFieldCollision({ columns, existingColumns, }: {
23
+ columns: SizesToVariantsColumnRename[];
24
+ existingColumns: Set<string>;
25
+ }): {
26
+ from: string;
27
+ to: string;
28
+ } | undefined;
29
+ export declare function assertNoSizesToVariantsColumnCollisions({ columns, existingColumns, tableName, }: {
30
+ columns: SizesToVariantsColumnRename[];
31
+ existingColumns: Set<string>;
32
+ tableName: string;
33
+ }): void;
34
+ /**
35
+ * Plans the column and index renames that move every upload collection's stored image sizes
36
+ * between the legacy `sizes` group and `variants`. Reads the current (`variants`) schema the
37
+ * adapter built from the config, so it covers each collection's main and versions tables without
38
+ * re-deriving Payload's column naming.
39
+ *
40
+ * Index names come from the schema on `up`, and on `down` are rebuilt the way `buildIndexName`
41
+ * named them before the rename. The runner still has to locate the verified generated legacy name
42
+ * on `up`, since it may have a numeric suffix that keeps the name unique.
43
+ */
44
+ export declare function getSizesToVariantsRenames({ adapter, direction, }: {
45
+ adapter: DrizzleAdapter;
46
+ direction: SizesToVariantsDirection;
47
+ }): SizesToVariantsTableRenames[];
48
+ /** Mirrors `buildIndexName` for an index that didn't collide, without registering the name. */
49
+ export declare function isGeneratedLegacyIndexName({ indexName, legacyNameBase, }: {
50
+ indexName: string;
51
+ legacyNameBase: string;
52
+ }): boolean;
53
+ export declare function buildGeneratedLegacyIndexName(name: string, number?: number): string;
54
+ //# sourceMappingURL=getSizesToVariantsRenames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSizesToVariantsRenames.d.ts","sourceRoot":"","sources":["../../src/utilities/getSizesToVariantsRenames.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,aAAa,CAAA;AAIrE,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,IAAI,CAAA;AAEpD,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,2BAA2B,EAAE,CAAA;IACtC,OAAO,EAAE,0BAA0B,EAAE,CAAA;IACrC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAgB,iCAAiC,CAAC,EAChD,OAAO,EACP,eAAe,GAChB,EAAE;IACD,OAAO,EAAE,2BAA2B,EAAE,CAAA;IACtC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC7B,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA2B3C;AAED,wBAAgB,uCAAuC,CAAC,EACtD,OAAO,EACP,eAAe,EACf,SAAS,GACV,EAAE;IACD,OAAO,EAAE,2BAA2B,EAAE,CAAA;IACtC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,IAAI,CAgBP;AAiBD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,wBAAwB,CAAA;CACpC,GAAG,2BAA2B,EAAE,CAwEhC;AA6ID,+FAA+F;AAC/F,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,EACT,cAAc,GACf,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,OAAO,CAQV;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAO9E"}