@payloadcms/drizzle 4.0.0-internal.f11981a → 4.0.0-internal.f2a04f7
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 +3 -0
- package/dist/exports/postgres.d.ts.map +1 -1
- package/dist/exports/postgres.js +3 -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/find/buildPolymorphicJoinQuery.d.ts +38 -0
- package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -0
- package/dist/find/buildPolymorphicJoinQuery.js +135 -0
- package/dist/find/buildPolymorphicJoinQuery.js.map +1 -0
- package/dist/find/buildPolymorphicJoinWhere.d.ts +20 -0
- package/dist/find/buildPolymorphicJoinWhere.d.ts.map +1 -0
- package/dist/find/buildPolymorphicJoinWhere.js +301 -0
- package/dist/find/buildPolymorphicJoinWhere.js.map +1 -0
- package/dist/find/createPolymorphicJoinWherePlan.d.ts +37 -0
- package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -0
- package/dist/find/createPolymorphicJoinWherePlan.js +191 -0
- package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -0
- package/dist/find/traverseFields.d.ts.map +1 -1
- package/dist/find/traverseFields.js +19 -191
- package/dist/find/traverseFields.js.map +1 -1
- package/dist/index.d.ts +4 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -8
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +41 -15
- package/dist/migrate.js.map +1 -1
- package/dist/migrateDown.d.ts +2 -1
- package/dist/migrateDown.d.ts.map +1 -1
- package/dist/migrateDown.js +17 -4
- package/dist/migrateDown.js.map +1 -1
- package/dist/migrateFresh.d.ts +4 -2
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +26 -9
- package/dist/migrateFresh.js.map +1 -1
- package/dist/migrateRefresh.d.ts +2 -1
- package/dist/migrateRefresh.d.ts.map +1 -1
- package/dist/migrateRefresh.js +20 -5
- package/dist/migrateRefresh.js.map +1 -1
- package/dist/migrateReset.d.ts +2 -1
- package/dist/migrateReset.d.ts.map +1 -1
- package/dist/migrateReset.js +18 -4
- package/dist/migrateReset.js.map +1 -1
- package/dist/migrateStatus.d.ts +2 -1
- package/dist/migrateStatus.d.ts.map +1 -1
- package/dist/migrateStatus.js +11 -6
- package/dist/migrateStatus.js.map +1 -1
- package/dist/postgres/createJSONQuery/index.js +3 -3
- package/dist/postgres/createJSONQuery/index.js.map +1 -1
- package/dist/postgres/init.d.ts.map +1 -1
- package/dist/postgres/init.js +6 -0
- package/dist/postgres/init.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/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js +8 -4
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts +15 -0
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts.map +1 -0
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js +25 -0
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js.map +1 -0
- package/dist/postgres/query/postgresUnaccent.d.ts +13 -0
- package/dist/postgres/query/postgresUnaccent.d.ts.map +1 -0
- package/dist/postgres/query/postgresUnaccent.js +40 -0
- package/dist/postgres/query/postgresUnaccent.js.map +1 -0
- package/dist/postgres/types.d.ts +13 -2
- package/dist/postgres/types.d.ts.map +1 -1
- package/dist/postgres/types.js.map +1 -1
- package/dist/queries/buildOperatorConstraint.d.ts +22 -0
- package/dist/queries/buildOperatorConstraint.d.ts.map +1 -0
- package/dist/queries/buildOperatorConstraint.js +63 -0
- package/dist/queries/buildOperatorConstraint.js.map +1 -0
- package/dist/queries/getTableColumnFromPath.d.ts +12 -3
- package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
- package/dist/queries/getTableColumnFromPath.js +59 -27
- package/dist/queries/getTableColumnFromPath.js.map +1 -1
- package/dist/queries/operatorMap.d.ts +7 -3
- package/dist/queries/operatorMap.d.ts.map +1 -1
- package/dist/queries/operatorMap.js.map +1 -1
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +262 -10
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queries/resolveRelationshipPath.d.ts +36 -0
- package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
- package/dist/queries/resolveRelationshipPath.js +66 -0
- package/dist/queries/resolveRelationshipPath.js.map +1 -0
- package/dist/queries/validateOperatorHandlers.d.ts +8 -0
- package/dist/queries/validateOperatorHandlers.d.ts.map +1 -0
- package/dist/queries/validateOperatorHandlers.js +30 -0
- package/dist/queries/validateOperatorHandlers.js.map +1 -0
- package/dist/schema/build.d.ts.map +1 -1
- package/dist/schema/build.js +7 -8
- package/dist/schema/build.js.map +1 -1
- package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js +3 -2
- package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js.map +1 -1
- package/dist/sqlite/createJSONQuery/index.d.ts.map +1 -1
- package/dist/sqlite/createJSONQuery/index.js +6 -5
- package/dist/sqlite/createJSONQuery/index.js.map +1 -1
- package/dist/sqlite/execute.js.map +1 -1
- package/dist/sqlite/insert.d.ts.map +1 -1
- package/dist/sqlite/insert.js +4 -1
- package/dist/sqlite/insert.js.map +1 -1
- 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/transform/write/traverseFields.d.ts.map +1 -1
- package/dist/transform/write/traverseFields.js +8 -14
- package/dist/transform/write/traverseFields.js.map +1 -1
- package/dist/types.d.ts +50 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +41 -1
- package/dist/updateOne.js.map +1 -1
- package/dist/upsertRow/index.d.ts +1 -1
- package/dist/upsertRow/index.d.ts.map +1 -1
- package/dist/upsertRow/index.js +25 -5
- package/dist/upsertRow/index.js.map +1 -1
- package/dist/utilities/blocksToJsonMigrator.d.ts.map +1 -1
- package/dist/utilities/blocksToJsonMigrator.js +6 -17
- package/dist/utilities/blocksToJsonMigrator.js.map +1 -1
- package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
- package/dist/utilities/buildCreateMigration.js +12 -8
- package/dist/utilities/buildCreateMigration.js.map +1 -1
- 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/buildForeignKeyName.d.ts.map +1 -1
- package/dist/utilities/buildForeignKeyName.js +3 -2
- package/dist/utilities/buildForeignKeyName.js.map +1 -1
- package/dist/utilities/buildIndexName.d.ts.map +1 -1
- package/dist/utilities/buildIndexName.js +3 -2
- package/dist/utilities/buildIndexName.js.map +1 -1
- package/dist/utilities/checkTruncatedIdentifiers.d.ts +13 -0
- package/dist/utilities/checkTruncatedIdentifiers.d.ts.map +1 -0
- package/dist/utilities/checkTruncatedIdentifiers.js +56 -0
- package/dist/utilities/checkTruncatedIdentifiers.js.map +1 -0
- package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
- package/dist/utilities/createSchemaGenerator.js +10 -12
- package/dist/utilities/createSchemaGenerator.js.map +1 -1
- package/dist/utilities/formatGeneratedFile.d.ts +10 -0
- package/dist/utilities/formatGeneratedFile.d.ts.map +1 -0
- package/dist/utilities/formatGeneratedFile.js +58 -0
- package/dist/utilities/formatGeneratedFile.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/dist/utilities/parseJSONPathSegment.d.ts +9 -0
- package/dist/utilities/parseJSONPathSegment.d.ts.map +1 -0
- package/dist/utilities/parseJSONPathSegment.js +17 -0
- package/dist/utilities/parseJSONPathSegment.js.map +1 -0
- package/dist/utilities/validateIdentifierLength.d.ts +5 -0
- package/dist/utilities/validateIdentifierLength.d.ts.map +1 -1
- package/dist/utilities/validateIdentifierLength.js +4 -0
- package/dist/utilities/validateIdentifierLength.js.map +1 -1
- package/package.json +15 -15
- package/dist/schema/buildRawSchema.spec.js +0 -230
- package/dist/schema/buildRawSchema.spec.js.map +0 -1
- package/dist/upsertRow/handleUpsertError.spec.js +0 -42
- package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
- package/dist/utilities/isValidStringID.spec.js +0 -15
- package/dist/utilities/isValidStringID.spec.js.map +0 -1
- package/dist/utilities/validateIdentifierLength.spec.js +0 -19
- package/dist/utilities/validateIdentifierLength.spec.js.map +0 -1
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK/C,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,mBAAmB,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,EAAE,EAAE,UAAU,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,cAAc,mHAYxB,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK/C,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,mBAAmB,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,EAAE,EAAE,UAAU,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,cAAc,mHAYxB,IAAI,kBAgNN,CAAA"}
|
|
@@ -13,7 +13,8 @@ export const fetchAndResave = async ({ adapter, collectionSlug, db, debug, docsT
|
|
|
13
13
|
fallbackLocale: null,
|
|
14
14
|
locale: 'all',
|
|
15
15
|
req,
|
|
16
|
-
showHiddenFields: true
|
|
16
|
+
showHiddenFields: true,
|
|
17
|
+
overrideAccess: true
|
|
17
18
|
});
|
|
18
19
|
if (debug) {
|
|
19
20
|
payload.logger.info(`The collection "${collectionConfig.slug}" version with ID ${id} will be migrated`);
|
|
@@ -52,7 +53,8 @@ export const fetchAndResave = async ({ adapter, collectionSlug, db, debug, docsT
|
|
|
52
53
|
fallbackLocale: null,
|
|
53
54
|
locale: 'all',
|
|
54
55
|
req,
|
|
55
|
-
showHiddenFields: true
|
|
56
|
+
showHiddenFields: true,
|
|
57
|
+
overrideAccess: true
|
|
56
58
|
});
|
|
57
59
|
if (debug) {
|
|
58
60
|
payload.logger.info(`The collection "${collectionConfig.slug}" with ID ${doc.id} will be migrated`);
|
|
@@ -97,7 +99,8 @@ export const fetchAndResave = async ({ adapter, collectionSlug, db, debug, docsT
|
|
|
97
99
|
limit: 0,
|
|
98
100
|
locale: 'all',
|
|
99
101
|
req,
|
|
100
|
-
showHiddenFields: true
|
|
102
|
+
showHiddenFields: true,
|
|
103
|
+
overrideAccess: true
|
|
101
104
|
});
|
|
102
105
|
if (debug) {
|
|
103
106
|
payload.logger.info(`${docs.length} global "${globalSlug}" versions will be migrated`);
|
|
@@ -137,7 +140,8 @@ export const fetchAndResave = async ({ adapter, collectionSlug, db, debug, docsT
|
|
|
137
140
|
fallbackLocale: null,
|
|
138
141
|
locale: 'all',
|
|
139
142
|
req,
|
|
140
|
-
showHiddenFields: true
|
|
143
|
+
showHiddenFields: true,
|
|
144
|
+
overrideAccess: true
|
|
141
145
|
});
|
|
142
146
|
traverseFields({
|
|
143
147
|
doc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.ts"],"sourcesContent":["import type { FlattenedField, Payload, PayloadRequest } from 'payload'\n\nimport type { BasePostgresAdapter, PostgresDB } from '../../../types.js'\nimport type { DocsToResave } from '../types.js'\n\nimport { upsertRow } from '../../../../upsertRow/index.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n adapter: BasePostgresAdapter\n collectionSlug?: string\n db: PostgresDB\n debug: boolean\n docsToResave: DocsToResave\n fields: FlattenedField[]\n globalSlug?: string\n isVersions: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n tableName: string\n}\n\nexport const fetchAndResave = async ({\n adapter,\n collectionSlug,\n db,\n debug,\n docsToResave,\n fields,\n globalSlug,\n isVersions,\n payload,\n req,\n tableName,\n}: Args) => {\n for (const [id, rows] of Object.entries(docsToResave)) {\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug].config\n\n if (collectionConfig) {\n if (isVersions) {\n const doc = await payload.findVersionByID({\n id,\n collection: collectionSlug,\n depth: 0,\n fallbackLocale: null,\n locale: 'all',\n req,\n showHiddenFields: true,\n })\n\n if (debug) {\n payload.logger.info(\n `The collection \"${collectionConfig.slug}\" version with ID ${id} will be migrated`,\n )\n }\n\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n id: doc.id,\n adapter,\n collectionSlug,\n data: doc,\n db,\n fields,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(\n `\"${collectionConfig.slug}\" version with ID ${doc.id} FAILED TO MIGRATE`,\n )\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(\n `\"${collectionConfig.slug}\" version with ID ${doc.id} migrated successfully!`,\n )\n }\n } else {\n const doc = await payload.findByID({\n id,\n collection: collectionSlug,\n depth: 0,\n fallbackLocale: null,\n locale: 'all',\n req,\n showHiddenFields: true,\n })\n\n if (debug) {\n payload.logger.info(\n `The collection \"${collectionConfig.slug}\" with ID ${doc.id} will be migrated`,\n )\n }\n\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n id: doc.id,\n adapter,\n collectionSlug,\n data: doc,\n db,\n fields,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(\n `The collection \"${collectionConfig.slug}\" with ID ${doc.id} has FAILED TO MIGRATE`,\n )\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(\n `The collection \"${collectionConfig.slug}\" with ID ${doc.id} has migrated successfully!`,\n )\n }\n }\n }\n }\n\n if (globalSlug) {\n const globalConfig = payload.config.globals?.find((global) => global.slug === globalSlug)\n\n if (globalConfig) {\n if (isVersions) {\n const { docs } = await payload.findGlobalVersions({\n slug: globalSlug,\n depth: 0,\n fallbackLocale: null,\n limit: 0,\n locale: 'all',\n req,\n showHiddenFields: true,\n })\n\n if (debug) {\n payload.logger.info(`${docs.length} global \"${globalSlug}\" versions will be migrated`)\n }\n\n for (const doc of docs) {\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n id: doc.id,\n adapter,\n data: doc,\n db,\n fields,\n globalSlug,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(`\"${globalSlug}\" version with ID ${doc.id} FAILED TO MIGRATE`)\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(\n `\"${globalSlug}\" version with ID ${doc.id} migrated successfully!`,\n )\n }\n }\n } else {\n const doc = await payload.findGlobal({\n slug: globalSlug,\n depth: 0,\n fallbackLocale: null,\n locale: 'all',\n req,\n showHiddenFields: true,\n })\n\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n adapter,\n data: doc,\n db,\n fields,\n globalSlug,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(`The global \"${globalSlug}\" has FAILED TO MIGRATE`)\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(`The global \"${globalSlug}\" has migrated successfully!`)\n }\n }\n }\n }\n }\n}\n"],"names":["upsertRow","traverseFields","fetchAndResave","adapter","collectionSlug","db","debug","docsToResave","fields","globalSlug","isVersions","payload","req","tableName","id","rows","Object","entries","collectionConfig","collections","config","doc","findVersionByID","collection","depth","fallbackLocale","locale","showHiddenFields","logger","info","slug","path","data","ignoreResult","operation","err","error","findByID","globalConfig","globals","find","global","docs","findGlobalVersions","limit","length","findGlobal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.ts"],"sourcesContent":["import type { FlattenedField, Payload, PayloadRequest } from 'payload'\n\nimport type { BasePostgresAdapter, PostgresDB } from '../../../types.js'\nimport type { DocsToResave } from '../types.js'\n\nimport { upsertRow } from '../../../../upsertRow/index.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n adapter: BasePostgresAdapter\n collectionSlug?: string\n db: PostgresDB\n debug: boolean\n docsToResave: DocsToResave\n fields: FlattenedField[]\n globalSlug?: string\n isVersions: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n tableName: string\n}\n\nexport const fetchAndResave = async ({\n adapter,\n collectionSlug,\n db,\n debug,\n docsToResave,\n fields,\n globalSlug,\n isVersions,\n payload,\n req,\n tableName,\n}: Args) => {\n for (const [id, rows] of Object.entries(docsToResave)) {\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug].config\n\n if (collectionConfig) {\n if (isVersions) {\n const doc = await payload.findVersionByID({\n id,\n collection: collectionSlug,\n depth: 0,\n fallbackLocale: null,\n locale: 'all',\n req,\n showHiddenFields: true,\n overrideAccess: true,\n })\n\n if (debug) {\n payload.logger.info(\n `The collection \"${collectionConfig.slug}\" version with ID ${id} will be migrated`,\n )\n }\n\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n id: doc.id,\n adapter,\n collectionSlug,\n data: doc,\n db,\n fields,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(\n `\"${collectionConfig.slug}\" version with ID ${doc.id} FAILED TO MIGRATE`,\n )\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(\n `\"${collectionConfig.slug}\" version with ID ${doc.id} migrated successfully!`,\n )\n }\n } else {\n const doc = await payload.findByID({\n id,\n collection: collectionSlug,\n depth: 0,\n fallbackLocale: null,\n locale: 'all',\n req,\n showHiddenFields: true,\n overrideAccess: true,\n })\n\n if (debug) {\n payload.logger.info(\n `The collection \"${collectionConfig.slug}\" with ID ${doc.id} will be migrated`,\n )\n }\n\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n id: doc.id,\n adapter,\n collectionSlug,\n data: doc,\n db,\n fields,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(\n `The collection \"${collectionConfig.slug}\" with ID ${doc.id} has FAILED TO MIGRATE`,\n )\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(\n `The collection \"${collectionConfig.slug}\" with ID ${doc.id} has migrated successfully!`,\n )\n }\n }\n }\n }\n\n if (globalSlug) {\n const globalConfig = payload.config.globals?.find((global) => global.slug === globalSlug)\n\n if (globalConfig) {\n if (isVersions) {\n const { docs } = await payload.findGlobalVersions({\n slug: globalSlug,\n depth: 0,\n fallbackLocale: null,\n limit: 0,\n locale: 'all',\n req,\n showHiddenFields: true,\n overrideAccess: true,\n })\n\n if (debug) {\n payload.logger.info(`${docs.length} global \"${globalSlug}\" versions will be migrated`)\n }\n\n for (const doc of docs) {\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n id: doc.id,\n adapter,\n data: doc,\n db,\n fields,\n globalSlug,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(`\"${globalSlug}\" version with ID ${doc.id} FAILED TO MIGRATE`)\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(\n `\"${globalSlug}\" version with ID ${doc.id} migrated successfully!`,\n )\n }\n }\n } else {\n const doc = await payload.findGlobal({\n slug: globalSlug,\n depth: 0,\n fallbackLocale: null,\n locale: 'all',\n req,\n showHiddenFields: true,\n overrideAccess: true,\n })\n\n traverseFields({\n doc,\n fields,\n path: '',\n rows,\n })\n\n try {\n await upsertRow({\n adapter,\n data: doc,\n db,\n fields,\n globalSlug,\n ignoreResult: true,\n operation: 'update',\n req,\n tableName,\n })\n } catch (err) {\n payload.logger.error(`The global \"${globalSlug}\" has FAILED TO MIGRATE`)\n\n throw err\n }\n\n if (debug) {\n payload.logger.info(`The global \"${globalSlug}\" has migrated successfully!`)\n }\n }\n }\n }\n }\n}\n"],"names":["upsertRow","traverseFields","fetchAndResave","adapter","collectionSlug","db","debug","docsToResave","fields","globalSlug","isVersions","payload","req","tableName","id","rows","Object","entries","collectionConfig","collections","config","doc","findVersionByID","collection","depth","fallbackLocale","locale","showHiddenFields","overrideAccess","logger","info","slug","path","data","ignoreResult","operation","err","error","findByID","globalConfig","globals","find","global","docs","findGlobalVersions","limit","length","findGlobal"],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ const runStatementGroup = async ({ adapter, db, debug, statements })=>{
|
|
|
45
45
|
const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter);
|
|
46
46
|
if (!generatedSQL.length) {
|
|
47
47
|
payload.logger.info(`No schema changes needed.`);
|
|
48
|
-
|
|
48
|
+
return;
|
|
49
49
|
}
|
|
50
50
|
const sqlUpStatements = groupUpSQLStatements(generatedSQL);
|
|
51
51
|
const db = await getTransaction(adapter, req);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/postgres/predefinedMigrations/v2-v3/index.ts"],"sourcesContent":["import type { DrizzleSnapshotJSON } from 'drizzle-kit/api'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport fs from 'fs'\nimport { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BasePostgresAdapter } from '../../types.js'\nimport type { PathsToQuery } from './types.js'\n\nimport { getTransaction } from '../../../utilities/getTransaction.js'\nimport { groupUpSQLStatements } from './groupUpSQLStatements.js'\nimport { migrateRelationships } from './migrateRelationships.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n debug?: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n}\n\nconst runStatementGroup = async ({ adapter, db, debug, statements }) => {\n const addColumnsStatement = statements.join('\\n')\n\n if (debug) {\n adapter.payload.logger.info(debug)\n adapter.payload.logger.info(addColumnsStatement)\n }\n\n await db.execute(sql.raw(addColumnsStatement))\n}\n\n/**\n * Moves upload and relationship columns from the join table and into the tables while moving data\n * This is done in the following order:\n * ADD COLUMNs\n * -- manipulate data to move relationships to new columns\n * ADD CONSTRAINTs\n * NOT NULLs\n * DROP TABLEs\n * DROP CONSTRAINTs\n * DROP COLUMNs\n * @param debug\n * @param payload\n * @param req\n */\nexport const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => {\n const adapter = payload.db as unknown as BasePostgresAdapter\n const dir = payload.db.migrationDir\n\n // get the drizzle migrateUpSQL from drizzle using the last schema\n const { generateDrizzleJson, generateMigration, upSnapshot } = adapter.requireDrizzleKit()\n const drizzleJsonAfter = generateDrizzleJson(adapter.schema) as DrizzleSnapshotJSON\n\n // Get the previous migration snapshot\n const previousSnapshot = fs\n .readdirSync(dir)\n .filter((file) => file.endsWith('.json') && !file.endsWith('relationships_v2_v3.json'))\n .sort()\n .reverse()?.[0]\n\n if (!previousSnapshot) {\n throw new Error(\n `No previous migration schema file found! A prior migration from v2 is required to migrate to v3.`,\n )\n }\n\n let drizzleJsonBefore = JSON.parse(\n fs.readFileSync(`${dir}/${previousSnapshot}`, 'utf8'),\n ) as DrizzleSnapshotJSON\n\n if (upSnapshot && drizzleJsonBefore.version < drizzleJsonAfter.version) {\n drizzleJsonBefore = upSnapshot(drizzleJsonBefore)\n }\n\n const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter)\n\n if (!generatedSQL.length) {\n payload.logger.info(`No schema changes needed.`)\n process.exit(0)\n }\n\n const sqlUpStatements = groupUpSQLStatements(generatedSQL)\n\n const db = await getTransaction(adapter, req)\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TYPES' : null,\n statements: sqlUpStatements.createType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ALTERING TYPES' : null,\n statements: sqlUpStatements.alterType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TABLES' : null,\n statements: sqlUpStatements.createTable,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'RENAMING COLUMNS' : null,\n statements: sqlUpStatements.renameColumn,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING NEW RELATIONSHIP COLUMNS' : null,\n statements: sqlUpStatements.addColumn,\n })\n\n // SET DEFAULTS\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'SETTING DEFAULTS' : null,\n statements: sqlUpStatements.setDefault,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING INDEXES' : null,\n statements: sqlUpStatements.createIndex,\n })\n\n for (const collection of payload.config.collections) {\n if (collection.slug === 'payload-locked-documents') {\n continue\n }\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug))\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: collection.flattenedFields,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: collection.flattenedFields,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (collection.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`,\n )\n const versionFields = buildVersionCollectionFields(payload.config, collection, true)\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: versionFields,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n for (const global of payload.config.globals) {\n const tableName = adapter.tableNameMap.get(toSnakeCase(global.slug))\n\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (global.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(global.slug)}${adapter.versionsSuffix}`,\n )\n\n const versionFields = buildVersionGlobalFields(payload.config, global, true)\n\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n // ADD CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ADDING CONSTRAINTS' : null,\n statements: sqlUpStatements.addConstraint,\n })\n\n // NOT NULL\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'NOT NULL CONSTRAINTS' : null,\n statements: sqlUpStatements.notNull,\n })\n\n // DROP TABLE\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TABLES' : null,\n statements: sqlUpStatements.dropTable,\n })\n\n // DROP INDEX\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING INDEXES' : null,\n statements: sqlUpStatements.dropIndex,\n })\n\n // DROP CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING CONSTRAINTS' : null,\n statements: sqlUpStatements.dropConstraint,\n })\n\n // DROP COLUMN\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING COLUMNS' : null,\n statements: sqlUpStatements.dropColumn,\n })\n\n // DROP TYPES\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TYPES' : null,\n statements: sqlUpStatements.dropType,\n })\n}\n"],"names":["sql","fs","buildVersionCollectionFields","buildVersionGlobalFields","toSnakeCase","getTransaction","groupUpSQLStatements","migrateRelationships","traverseFields","runStatementGroup","adapter","db","debug","statements","addColumnsStatement","join","payload","logger","info","execute","raw","migratePostgresV2toV3","req","dir","migrationDir","generateDrizzleJson","generateMigration","upSnapshot","requireDrizzleKit","drizzleJsonAfter","schema","previousSnapshot","readdirSync","filter","file","endsWith","sort","reverse","Error","drizzleJsonBefore","JSON","parse","readFileSync","version","generatedSQL","length","process","exit","sqlUpStatements","createType","alterType","createTable","renameColumn","addColumn","setDefault","createIndex","collection","config","collections","slug","tableName","tableNameMap","get","pathsToQuery","Set","collectionSlug","columnPrefix","disableNotNull","fields","flattenedFields","isVersions","newTableName","parentTableName","path","rootTableName","versions","versionsTableName","versionsSuffix","versionFields","versionPathsToQuery","global","globals","globalSlug","addConstraint","notNull","dropTable","dropIndex","dropConstraint","dropColumn","dropType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/postgres/predefinedMigrations/v2-v3/index.ts"],"sourcesContent":["import type { DrizzleSnapshotJSON } from 'drizzle-kit/api'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport fs from 'fs'\nimport { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BasePostgresAdapter } from '../../types.js'\nimport type { PathsToQuery } from './types.js'\n\nimport { getTransaction } from '../../../utilities/getTransaction.js'\nimport { groupUpSQLStatements } from './groupUpSQLStatements.js'\nimport { migrateRelationships } from './migrateRelationships.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n debug?: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n}\n\nconst runStatementGroup = async ({ adapter, db, debug, statements }) => {\n const addColumnsStatement = statements.join('\\n')\n\n if (debug) {\n adapter.payload.logger.info(debug)\n adapter.payload.logger.info(addColumnsStatement)\n }\n\n await db.execute(sql.raw(addColumnsStatement))\n}\n\n/**\n * Moves upload and relationship columns from the join table and into the tables while moving data\n * This is done in the following order:\n * ADD COLUMNs\n * -- manipulate data to move relationships to new columns\n * ADD CONSTRAINTs\n * NOT NULLs\n * DROP TABLEs\n * DROP CONSTRAINTs\n * DROP COLUMNs\n * @param debug\n * @param payload\n * @param req\n */\nexport const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => {\n const adapter = payload.db as unknown as BasePostgresAdapter\n const dir = payload.db.migrationDir\n\n // get the drizzle migrateUpSQL from drizzle using the last schema\n const { generateDrizzleJson, generateMigration, upSnapshot } = adapter.requireDrizzleKit()\n const drizzleJsonAfter = generateDrizzleJson(adapter.schema) as DrizzleSnapshotJSON\n\n // Get the previous migration snapshot\n const previousSnapshot = fs\n .readdirSync(dir)\n .filter((file) => file.endsWith('.json') && !file.endsWith('relationships_v2_v3.json'))\n .sort()\n .reverse()?.[0]\n\n if (!previousSnapshot) {\n throw new Error(\n `No previous migration schema file found! A prior migration from v2 is required to migrate to v3.`,\n )\n }\n\n let drizzleJsonBefore = JSON.parse(\n fs.readFileSync(`${dir}/${previousSnapshot}`, 'utf8'),\n ) as DrizzleSnapshotJSON\n\n if (upSnapshot && drizzleJsonBefore.version < drizzleJsonAfter.version) {\n drizzleJsonBefore = upSnapshot(drizzleJsonBefore)\n }\n\n const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter)\n\n if (!generatedSQL.length) {\n payload.logger.info(`No schema changes needed.`)\n return\n }\n\n const sqlUpStatements = groupUpSQLStatements(generatedSQL)\n\n const db = await getTransaction(adapter, req)\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TYPES' : null,\n statements: sqlUpStatements.createType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ALTERING TYPES' : null,\n statements: sqlUpStatements.alterType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TABLES' : null,\n statements: sqlUpStatements.createTable,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'RENAMING COLUMNS' : null,\n statements: sqlUpStatements.renameColumn,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING NEW RELATIONSHIP COLUMNS' : null,\n statements: sqlUpStatements.addColumn,\n })\n\n // SET DEFAULTS\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'SETTING DEFAULTS' : null,\n statements: sqlUpStatements.setDefault,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING INDEXES' : null,\n statements: sqlUpStatements.createIndex,\n })\n\n for (const collection of payload.config.collections) {\n if (collection.slug === 'payload-locked-documents') {\n continue\n }\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug))\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: collection.flattenedFields,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: collection.flattenedFields,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (collection.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`,\n )\n const versionFields = buildVersionCollectionFields(payload.config, collection, true)\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: versionFields,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n for (const global of payload.config.globals) {\n const tableName = adapter.tableNameMap.get(toSnakeCase(global.slug))\n\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (global.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(global.slug)}${adapter.versionsSuffix}`,\n )\n\n const versionFields = buildVersionGlobalFields(payload.config, global, true)\n\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n // ADD CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ADDING CONSTRAINTS' : null,\n statements: sqlUpStatements.addConstraint,\n })\n\n // NOT NULL\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'NOT NULL CONSTRAINTS' : null,\n statements: sqlUpStatements.notNull,\n })\n\n // DROP TABLE\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TABLES' : null,\n statements: sqlUpStatements.dropTable,\n })\n\n // DROP INDEX\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING INDEXES' : null,\n statements: sqlUpStatements.dropIndex,\n })\n\n // DROP CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING CONSTRAINTS' : null,\n statements: sqlUpStatements.dropConstraint,\n })\n\n // DROP COLUMN\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING COLUMNS' : null,\n statements: sqlUpStatements.dropColumn,\n })\n\n // DROP TYPES\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TYPES' : null,\n statements: sqlUpStatements.dropType,\n })\n}\n"],"names":["sql","fs","buildVersionCollectionFields","buildVersionGlobalFields","toSnakeCase","getTransaction","groupUpSQLStatements","migrateRelationships","traverseFields","runStatementGroup","adapter","db","debug","statements","addColumnsStatement","join","payload","logger","info","execute","raw","migratePostgresV2toV3","req","dir","migrationDir","generateDrizzleJson","generateMigration","upSnapshot","requireDrizzleKit","drizzleJsonAfter","schema","previousSnapshot","readdirSync","filter","file","endsWith","sort","reverse","Error","drizzleJsonBefore","JSON","parse","readFileSync","version","generatedSQL","length","sqlUpStatements","createType","alterType","createTable","renameColumn","addColumn","setDefault","createIndex","collection","config","collections","slug","tableName","tableNameMap","get","pathsToQuery","Set","collectionSlug","columnPrefix","disableNotNull","fields","flattenedFields","isVersions","newTableName","parentTableName","path","rootTableName","versions","versionsTableName","versionsSuffix","versionFields","versionPathsToQuery","global","globals","globalSlug","addConstraint","notNull","dropTable","dropIndex","dropConstraint","dropColumn","dropType"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { PostgresDB } from '../../types.js';
|
|
2
|
+
import type { PostgresOperatorHandler } from '../types.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
drizzle: PostgresDB;
|
|
5
|
+
operatorHandlers: PostgresOperatorHandler[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Confirms every Postgres extension named in an operator handler's `requiredExtensions` is
|
|
9
|
+
* installed in the connected database. Runs once per connect, after `createExtensions` has had a
|
|
10
|
+
* chance to install any extension declared in the adapter's `extensions` option - an extension
|
|
11
|
+
* that was installed by hand, without ever being declared there, still satisfies this check.
|
|
12
|
+
*/
|
|
13
|
+
export declare const assertOperatorHandlerExtensionsInstalled: ({ drizzle, operatorHandlers, }: Args) => Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=assertOperatorHandlerExtensionsInstalled.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertOperatorHandlerExtensionsInstalled.d.ts","sourceRoot":"","sources":["../../../src/postgres/query/assertOperatorHandlerExtensionsInstalled.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAE1D,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,UAAU,CAAA;IACnB,gBAAgB,EAAE,uBAAuB,EAAE,CAAA;CAC5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wCAAwC,mCAGlD,IAAI,KAAG,OAAO,CAAC,IAAI,CAqBrB,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import { APIError } from 'payload';
|
|
3
|
+
/**
|
|
4
|
+
* Confirms every Postgres extension named in an operator handler's `requiredExtensions` is
|
|
5
|
+
* installed in the connected database. Runs once per connect, after `createExtensions` has had a
|
|
6
|
+
* chance to install any extension declared in the adapter's `extensions` option - an extension
|
|
7
|
+
* that was installed by hand, without ever being declared there, still satisfies this check.
|
|
8
|
+
*/ export const assertOperatorHandlerExtensionsInstalled = async ({ drizzle, operatorHandlers })=>{
|
|
9
|
+
const requiredExtensionsByHandler = operatorHandlers.flatMap((handler)=>(handler.requiredExtensions ?? []).map((extensionName)=>({
|
|
10
|
+
extensionName,
|
|
11
|
+
handler
|
|
12
|
+
})));
|
|
13
|
+
if (!requiredExtensionsByHandler.length) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const { rows: installedExtensionRows } = await drizzle.execute(sql`SELECT extname FROM pg_extension`);
|
|
17
|
+
const installedExtensions = new Set(installedExtensionRows.map((row)=>row.extname));
|
|
18
|
+
for (const { extensionName, handler } of requiredExtensionsByHandler){
|
|
19
|
+
if (!installedExtensions.has(extensionName)) {
|
|
20
|
+
throw new APIError(`Operator handler "${handler.name}" requires the "${extensionName}" Postgres extension, which is not installed on this database. Add it to the adapter's "extensions" option, or install it manually with CREATE EXTENSION.`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=assertOperatorHandlerExtensionsInstalled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/postgres/query/assertOperatorHandlerExtensionsInstalled.ts"],"sourcesContent":["import { sql } from 'drizzle-orm'\nimport { APIError } from 'payload'\n\nimport type { PostgresDB } from '../../types.js'\nimport type { PostgresOperatorHandler } from '../types.js'\n\ntype Args = {\n drizzle: PostgresDB\n operatorHandlers: PostgresOperatorHandler[]\n}\n\n/**\n * Confirms every Postgres extension named in an operator handler's `requiredExtensions` is\n * installed in the connected database. Runs once per connect, after `createExtensions` has had a\n * chance to install any extension declared in the adapter's `extensions` option - an extension\n * that was installed by hand, without ever being declared there, still satisfies this check.\n */\nexport const assertOperatorHandlerExtensionsInstalled = async ({\n drizzle,\n operatorHandlers,\n}: Args): Promise<void> => {\n const requiredExtensionsByHandler = operatorHandlers.flatMap((handler) =>\n (handler.requiredExtensions ?? []).map((extensionName) => ({ extensionName, handler })),\n )\n\n if (!requiredExtensionsByHandler.length) {\n return\n }\n\n const { rows: installedExtensionRows } = await drizzle.execute<{ extname: string }>(\n sql`SELECT extname FROM pg_extension`,\n )\n const installedExtensions = new Set(installedExtensionRows.map((row) => row.extname))\n\n for (const { extensionName, handler } of requiredExtensionsByHandler) {\n if (!installedExtensions.has(extensionName)) {\n throw new APIError(\n `Operator handler \"${handler.name}\" requires the \"${extensionName}\" Postgres extension, which is not installed on this database. Add it to the adapter's \"extensions\" option, or install it manually with CREATE EXTENSION.`,\n )\n }\n }\n}\n"],"names":["sql","APIError","assertOperatorHandlerExtensionsInstalled","drizzle","operatorHandlers","requiredExtensionsByHandler","flatMap","handler","requiredExtensions","map","extensionName","length","rows","installedExtensionRows","execute","installedExtensions","Set","row","extname","has","name"],"mappings":"AAAA,SAASA,GAAG,QAAQ,cAAa;AACjC,SAASC,QAAQ,QAAQ,UAAS;AAUlC;;;;;CAKC,GACD,OAAO,MAAMC,2CAA2C,OAAO,EAC7DC,OAAO,EACPC,gBAAgB,EACX;IACL,MAAMC,8BAA8BD,iBAAiBE,OAAO,CAAC,CAACC,UAC5D,AAACA,CAAAA,QAAQC,kBAAkB,IAAI,EAAE,AAAD,EAAGC,GAAG,CAAC,CAACC,gBAAmB,CAAA;gBAAEA;gBAAeH;YAAQ,CAAA;IAGtF,IAAI,CAACF,4BAA4BM,MAAM,EAAE;QACvC;IACF;IAEA,MAAM,EAAEC,MAAMC,sBAAsB,EAAE,GAAG,MAAMV,QAAQW,OAAO,CAC5Dd,GAAG,CAAC,gCAAgC,CAAC;IAEvC,MAAMe,sBAAsB,IAAIC,IAAIH,uBAAuBJ,GAAG,CAAC,CAACQ,MAAQA,IAAIC,OAAO;IAEnF,KAAK,MAAM,EAAER,aAAa,EAAEH,OAAO,EAAE,IAAIF,4BAA6B;QACpE,IAAI,CAACU,oBAAoBI,GAAG,CAACT,gBAAgB;YAC3C,MAAM,IAAIT,SACR,CAAC,kBAAkB,EAAEM,QAAQa,IAAI,CAAC,gBAAgB,EAAEV,cAAc,yJAAyJ,CAAC;QAEhO;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PostgresOperatorHandler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Makes Postgres `contains`, `like`, and `not_like` text comparisons accent-insensitive by
|
|
4
|
+
* wrapping both operands in `unaccent(...)`. Requires the `unaccent` extension to be installed in
|
|
5
|
+
* the database - list it in the adapter's `extensions` option to have Payload install it for you.
|
|
6
|
+
*
|
|
7
|
+
* Skips native `uuid` columns: a default or custom UUID/UUIDv7 `id` field is reported as a
|
|
8
|
+
* `text`-type field by Payload even though it is stored as a `uuid` column, so `fieldTypes`
|
|
9
|
+
* alone cannot exclude it. A genuine custom `text`/`varchar` `id` column is not a `PgUUID`
|
|
10
|
+
* column and still receives accent-insensitive matching.
|
|
11
|
+
*/
|
|
12
|
+
export declare const postgresUnaccent: () => PostgresOperatorHandler;
|
|
13
|
+
//# sourceMappingURL=postgresUnaccent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresUnaccent.d.ts","sourceRoot":"","sources":["../../../src/postgres/query/postgresUnaccent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAE1D;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,QAAO,uBAelC,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import { PgUUID } from 'drizzle-orm/pg-core';
|
|
3
|
+
/**
|
|
4
|
+
* Makes Postgres `contains`, `like`, and `not_like` text comparisons accent-insensitive by
|
|
5
|
+
* wrapping both operands in `unaccent(...)`. Requires the `unaccent` extension to be installed in
|
|
6
|
+
* the database - list it in the adapter's `extensions` option to have Payload install it for you.
|
|
7
|
+
*
|
|
8
|
+
* Skips native `uuid` columns: a default or custom UUID/UUIDv7 `id` field is reported as a
|
|
9
|
+
* `text`-type field by Payload even though it is stored as a `uuid` column, so `fieldTypes`
|
|
10
|
+
* alone cannot exclude it. A genuine custom `text`/`varchar` `id` column is not a `PgUUID`
|
|
11
|
+
* column and still receives accent-insensitive matching.
|
|
12
|
+
*/ export const postgresUnaccent = ()=>({
|
|
13
|
+
name: 'postgres-unaccent',
|
|
14
|
+
fieldTypes: [
|
|
15
|
+
'text',
|
|
16
|
+
'textarea'
|
|
17
|
+
],
|
|
18
|
+
operators: [
|
|
19
|
+
'contains',
|
|
20
|
+
'like',
|
|
21
|
+
'not_like'
|
|
22
|
+
],
|
|
23
|
+
requiredExtensions: [
|
|
24
|
+
'unaccent'
|
|
25
|
+
],
|
|
26
|
+
transformOperands: ({ column, value })=>{
|
|
27
|
+
if (column instanceof PgUUID) {
|
|
28
|
+
return {
|
|
29
|
+
column,
|
|
30
|
+
value
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
column: sql`unaccent(${column})`,
|
|
35
|
+
value: sql`unaccent(${value})`
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=postgresUnaccent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/postgres/query/postgresUnaccent.ts"],"sourcesContent":["import { sql } from 'drizzle-orm'\nimport { PgUUID } from 'drizzle-orm/pg-core'\n\nimport type { PostgresOperatorHandler } from '../types.js'\n\n/**\n * Makes Postgres `contains`, `like`, and `not_like` text comparisons accent-insensitive by\n * wrapping both operands in `unaccent(...)`. Requires the `unaccent` extension to be installed in\n * the database - list it in the adapter's `extensions` option to have Payload install it for you.\n *\n * Skips native `uuid` columns: a default or custom UUID/UUIDv7 `id` field is reported as a\n * `text`-type field by Payload even though it is stored as a `uuid` column, so `fieldTypes`\n * alone cannot exclude it. A genuine custom `text`/`varchar` `id` column is not a `PgUUID`\n * column and still receives accent-insensitive matching.\n */\nexport const postgresUnaccent = (): PostgresOperatorHandler => ({\n name: 'postgres-unaccent',\n fieldTypes: ['text', 'textarea'],\n operators: ['contains', 'like', 'not_like'],\n requiredExtensions: ['unaccent'],\n transformOperands: ({ column, value }) => {\n if (column instanceof PgUUID) {\n return { column, value }\n }\n\n return {\n column: sql`unaccent(${column})`,\n value: sql`unaccent(${value})`,\n }\n },\n})\n"],"names":["sql","PgUUID","postgresUnaccent","name","fieldTypes","operators","requiredExtensions","transformOperands","column","value"],"mappings":"AAAA,SAASA,GAAG,QAAQ,cAAa;AACjC,SAASC,MAAM,QAAQ,sBAAqB;AAI5C;;;;;;;;;CASC,GACD,OAAO,MAAMC,mBAAmB,IAAgC,CAAA;QAC9DC,MAAM;QACNC,YAAY;YAAC;YAAQ;SAAW;QAChCC,WAAW;YAAC;YAAY;YAAQ;SAAW;QAC3CC,oBAAoB;YAAC;SAAW;QAChCC,mBAAmB,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAE;YACnC,IAAID,kBAAkBP,QAAQ;gBAC5B,OAAO;oBAAEO;oBAAQC;gBAAM;YACzB;YAEA,OAAO;gBACLD,QAAQR,GAAG,CAAC,SAAS,EAAEQ,OAAO,CAAC,CAAC;gBAChCC,OAAOT,GAAG,CAAC,SAAS,EAAES,MAAM,CAAC,CAAC;YAChC;QACF;IACF,CAAA,EAAE"}
|
package/dist/postgres/types.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type { SQLiteColumn } from 'drizzle-orm/sqlite-core';
|
|
|
7
7
|
import type { Payload, PayloadRequest } from 'payload';
|
|
8
8
|
import type { ClientConfig, QueryResult } from 'pg';
|
|
9
9
|
import type { extendDrizzleTable, Operators } from '../index.js';
|
|
10
|
-
import type { BuildQueryJoinAliases, DrizzleAdapter, TransactionPg } from '../types.js';
|
|
10
|
+
import type { BuildQueryJoinAliases, DrizzleAdapter, DrizzleOperatorHandler, TransactionPg } from '../types.js';
|
|
11
11
|
export type BaseExtraConfig = Record<string, (cols: GenericColumns) => ForeignKeyBuilder | IndexBuilder | UniqueConstraintBuilder>;
|
|
12
12
|
export type RelationMap = Map<string, {
|
|
13
13
|
localized: boolean;
|
|
@@ -80,6 +80,16 @@ type PostgresSchemaHookArgs = {
|
|
|
80
80
|
schema: PostgresSchema;
|
|
81
81
|
};
|
|
82
82
|
export type PostgresSchemaHook = (args: PostgresSchemaHookArgs) => PostgresSchema | Promise<PostgresSchema>;
|
|
83
|
+
export type PostgresOperatorHandler = {
|
|
84
|
+
/**
|
|
85
|
+
* Postgres extensions that must be installed in the database for this handler to be usable.
|
|
86
|
+
* Checked once, against the database, when the adapter connects.
|
|
87
|
+
*/
|
|
88
|
+
requiredExtensions?: string[];
|
|
89
|
+
} & DrizzleOperatorHandler;
|
|
90
|
+
export type PostgresQueryConfig = {
|
|
91
|
+
operatorHandlers?: PostgresOperatorHandler[];
|
|
92
|
+
};
|
|
83
93
|
export type BasePostgresAdapter = {
|
|
84
94
|
afterSchemaInit: PostgresSchemaHook[];
|
|
85
95
|
beforeSchemaInit: PostgresSchemaHook[];
|
|
@@ -104,6 +114,7 @@ export type BasePostgresAdapter = {
|
|
|
104
114
|
insert: Insert;
|
|
105
115
|
localesSuffix?: string;
|
|
106
116
|
logger: DrizzleConfig['logger'];
|
|
117
|
+
operatorHandlers: PostgresOperatorHandler[];
|
|
107
118
|
operators: Operators;
|
|
108
119
|
pgSchema: Schema;
|
|
109
120
|
poolOptions?: ClientConfig;
|
|
@@ -131,7 +142,7 @@ export type BasePostgresAdapter = {
|
|
|
131
142
|
tablesFilter?: string[];
|
|
132
143
|
versionsSuffix?: string;
|
|
133
144
|
} & PostgresDrizzleAdapter;
|
|
134
|
-
export type PostgresDrizzleAdapter = Omit<DrizzleAdapter, 'countDistinct' | 'deleteWhere' | 'drizzle' | 'dropDatabase' | 'execute' | 'insert' | 'operators' | 'relations'>;
|
|
145
|
+
export type PostgresDrizzleAdapter = Omit<DrizzleAdapter, 'countDistinct' | 'deleteWhere' | 'drizzle' | 'dropDatabase' | 'execute' | 'insert' | 'operatorHandlers' | 'operators' | 'relations'>;
|
|
135
146
|
export type IDType = 'integer' | 'numeric' | 'uuid' | 'varchar';
|
|
136
147
|
export type MigrateUpArgs = {
|
|
137
148
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/postgres/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,SAAS,EACT,GAAG,EACJ,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,MAAM,EACN,gCAAgC,EAChC,QAAQ,EACR,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AAEnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/postgres/types.ts"],"names":[],"mappings":"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"}
|