@payloadcms/db-mongodb 4.0.0-internal.293e026 → 4.0.0-internal.2f0d313
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/LICENSE.md +1 -1
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +2 -1
- package/dist/create.js.map +1 -1
- package/dist/createGlobalVersion.js +1 -1
- package/dist/createGlobalVersion.js.map +1 -1
- package/dist/createVersion.js +1 -1
- package/dist/createVersion.js.map +1 -1
- package/dist/exports/migration-utils.d.ts +1 -0
- package/dist/exports/migration-utils.d.ts.map +1 -1
- package/dist/exports/migration-utils.js +1 -0
- package/dist/exports/migration-utils.js.map +1 -1
- package/dist/find.js +1 -1
- package/dist/find.js.map +1 -1
- package/dist/findOne.js +1 -1
- package/dist/findOne.js.map +1 -1
- package/dist/models/buildCollectionSchema.d.ts.map +1 -1
- package/dist/models/buildGlobalModel.d.ts.map +1 -1
- package/dist/models/buildSchema.d.ts.map +1 -1
- package/dist/models/buildSchema.js +14 -0
- package/dist/models/buildSchema.js.map +1 -1
- package/dist/predefinedMigrations/localize-status.d.ts +4 -0
- package/dist/predefinedMigrations/localize-status.d.ts.map +1 -0
- package/dist/predefinedMigrations/localize-status.js +9 -0
- package/dist/predefinedMigrations/localize-status.js.map +1 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.d.ts +27 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.js +324 -0
- package/dist/predefinedMigrations/migrateLocalizeStatus.js.map +1 -0
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +4 -4
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
- package/dist/queries/buildQuery.d.ts.map +1 -1
- package/dist/queries/buildSearchParams.js.map +1 -1
- package/dist/queries/buildSortParam.d.ts.map +1 -1
- package/dist/queries/buildSortParam.spec.js +1 -1
- package/dist/queries/buildSortParam.spec.js.map +1 -1
- package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
- package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
- package/dist/queries/getLocalizedSortProperty.js.map +1 -1
- package/dist/queries/getLocalizedSortProperty.spec.js +1 -1
- package/dist/queries/getLocalizedSortProperty.spec.js.map +1 -1
- package/dist/queries/operatorMap.d.ts.map +1 -1
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
- package/dist/queries/sanitizeQueryValue.js.map +1 -1
- package/dist/queryDrafts.js +1 -1
- package/dist/queryDrafts.js.map +1 -1
- package/dist/testCredentials.d.ts.map +1 -1
- package/dist/transactions/beginTransaction.d.ts.map +1 -1
- package/dist/transactions/beginTransaction.js +0 -1
- package/dist/transactions/beginTransaction.js.map +1 -1
- package/dist/updateJobs.d.ts.map +1 -1
- package/dist/updateJobs.js +70 -13
- package/dist/updateJobs.js.map +1 -1
- package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
- package/dist/utilities/buildJoinAggregation.d.ts +1 -1
- package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
- package/dist/utilities/buildJoinAggregation.js +2 -2
- package/dist/utilities/buildJoinAggregation.js.map +1 -1
- package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
- package/dist/utilities/getDBName.d.ts.map +1 -1
- package/dist/utilities/getEntity.d.ts +1 -1
- package/dist/utilities/getEntity.d.ts.map +1 -1
- package/dist/utilities/handleError.d.ts.map +1 -1
- package/dist/utilities/isObjectID.d.ts.map +1 -1
- package/dist/utilities/transform.d.ts.map +1 -1
- package/dist/utilities/transform.js +15 -0
- package/dist/utilities/transform.js.map +1 -1
- package/dist/utilities/transform.spec.js +67 -0
- package/dist/utilities/transform.spec.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { calculateVersionLocaleStatuses } from 'payload/migrations';
|
|
2
|
+
import { getSession } from '../utilities/getSession.js';
|
|
3
|
+
/**
|
|
4
|
+
* Migrate all collections and globals with versions.drafts enabled to use per-locale _status.
|
|
5
|
+
*
|
|
6
|
+
* This migration:
|
|
7
|
+
* 1. Converts version._status from a scalar string to a locale-keyed object for each entity
|
|
8
|
+
* 2. Deletes all snapshot:true version documents from each versions collection
|
|
9
|
+
* 3. Unsets the `snapshot` field from remaining version documents
|
|
10
|
+
*/ export async function migrateLocalizeStatus({ payload, req }) {
|
|
11
|
+
if (!payload.config.localization) {
|
|
12
|
+
payload.logger.info({
|
|
13
|
+
msg: 'Localization not enabled, skipping localize-status migration'
|
|
14
|
+
});
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const collections = payload.config.collections.filter((c)=>c.versions?.drafts && typeof c.versions.drafts === 'object' && c.versions.drafts.localizeStatus);
|
|
18
|
+
const globals = payload.config.globals.filter((g)=>g.versions?.drafts && typeof g.versions.drafts === 'object' && g.versions.drafts.localizeStatus);
|
|
19
|
+
payload.logger.info({
|
|
20
|
+
msg: `Starting localize-status migration for ${collections.length} collection(s) and ${globals.length} global(s)`
|
|
21
|
+
});
|
|
22
|
+
const connection = payload.db.connection;
|
|
23
|
+
const session = await getSession(payload.db, req);
|
|
24
|
+
for (const collection of collections){
|
|
25
|
+
await localizeStatus({
|
|
26
|
+
collectionSlug: collection.slug,
|
|
27
|
+
payload,
|
|
28
|
+
req,
|
|
29
|
+
session
|
|
30
|
+
});
|
|
31
|
+
await cleanupSnapshotDocuments({
|
|
32
|
+
connection,
|
|
33
|
+
entitySlug: collection.slug,
|
|
34
|
+
payload,
|
|
35
|
+
session
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
for (const global of globals){
|
|
39
|
+
await localizeStatus({
|
|
40
|
+
globalSlug: global.slug,
|
|
41
|
+
payload,
|
|
42
|
+
req,
|
|
43
|
+
session
|
|
44
|
+
});
|
|
45
|
+
await cleanupSnapshotDocuments({
|
|
46
|
+
connection,
|
|
47
|
+
entitySlug: global.slug,
|
|
48
|
+
payload,
|
|
49
|
+
session
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
payload.logger.info({
|
|
53
|
+
msg: 'localize-status migration completed successfully'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Converts version._status (and the main document _status) from a scalar string to a
|
|
58
|
+
* per-locale object for a single collection or global.
|
|
59
|
+
*/ export async function localizeStatus(args) {
|
|
60
|
+
const { collectionSlug, globalSlug, payload, req, session } = args;
|
|
61
|
+
if (!collectionSlug && !globalSlug) {
|
|
62
|
+
throw new Error('Either collectionSlug or globalSlug must be provided');
|
|
63
|
+
}
|
|
64
|
+
if (collectionSlug && globalSlug) {
|
|
65
|
+
throw new Error('Cannot provide both collectionSlug and globalSlug');
|
|
66
|
+
}
|
|
67
|
+
const entitySlug = collectionSlug || globalSlug;
|
|
68
|
+
// MongoDB collection names are case-insensitive and stored as lowercase
|
|
69
|
+
const versionsCollection = `_${entitySlug}_versions`.toLowerCase();
|
|
70
|
+
if (!payload.config.localization) {
|
|
71
|
+
throw new Error('Localization is not enabled in payload config');
|
|
72
|
+
}
|
|
73
|
+
// Check if versions are enabled on this collection/global
|
|
74
|
+
let entityConfig;
|
|
75
|
+
if (collectionSlug) {
|
|
76
|
+
const collection = payload.config.collections.find((c)=>c.slug === collectionSlug);
|
|
77
|
+
if (collection) {
|
|
78
|
+
entityConfig = collection;
|
|
79
|
+
}
|
|
80
|
+
} else if (globalSlug) {
|
|
81
|
+
const global = payload.config.globals.find((g)=>g.slug === globalSlug);
|
|
82
|
+
if (global) {
|
|
83
|
+
entityConfig = global;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!entityConfig) {
|
|
87
|
+
throw new Error(`${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`);
|
|
88
|
+
}
|
|
89
|
+
payload.logger.info({
|
|
90
|
+
msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`
|
|
91
|
+
});
|
|
92
|
+
// Check if versions are enabled in config (skip if not)
|
|
93
|
+
if (!entityConfig.versions) {
|
|
94
|
+
payload.logger.info({
|
|
95
|
+
msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Get MongoDB connection
|
|
100
|
+
const connection = payload.db.connection;
|
|
101
|
+
// Get filtered locales if filterAvailableLocales is defined
|
|
102
|
+
let locales = payload.config.localization.localeCodes;
|
|
103
|
+
if (typeof payload.config.localization.filterAvailableLocales === 'function') {
|
|
104
|
+
const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({
|
|
105
|
+
locales: payload.config.localization.locales,
|
|
106
|
+
req
|
|
107
|
+
});
|
|
108
|
+
locales = filteredLocaleObjects.map((locale)=>locale.code);
|
|
109
|
+
}
|
|
110
|
+
payload.logger.info({
|
|
111
|
+
msg: `Locales: ${locales.join(', ')}`
|
|
112
|
+
});
|
|
113
|
+
// Check if version._status exists and is NOT already localized
|
|
114
|
+
const sampleDoc = await connection.collection(versionsCollection).findOne({}, {
|
|
115
|
+
session
|
|
116
|
+
});
|
|
117
|
+
if (!sampleDoc) {
|
|
118
|
+
payload.logger.info({
|
|
119
|
+
msg: 'No version documents found, nothing to migrate'
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Check if _status is already localized
|
|
124
|
+
if (sampleDoc.version?._status && typeof sampleDoc.version._status === 'object' && !Array.isArray(sampleDoc.version._status)) {
|
|
125
|
+
payload.logger.info({
|
|
126
|
+
msg: 'version._status is already localized, migration already completed'
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Validate that version._status exists and is a string
|
|
131
|
+
if (!sampleDoc.version || typeof sampleDoc.version._status !== 'string' || Array.isArray(sampleDoc.version._status)) {
|
|
132
|
+
throw new Error(`Migration aborted: version._status field not found or has unexpected format in ${versionsCollection}. ` + `This migration should only run on schemas that have NOT yet been migrated to per-locale status.`);
|
|
133
|
+
}
|
|
134
|
+
payload.logger.info({
|
|
135
|
+
msg: 'Fetching all version documents...'
|
|
136
|
+
});
|
|
137
|
+
// Get all versions, sorted chronologically
|
|
138
|
+
const allVersions = await connection.collection(versionsCollection).find({}, {
|
|
139
|
+
session
|
|
140
|
+
}).sort({
|
|
141
|
+
createdAt: 1,
|
|
142
|
+
parent: 1
|
|
143
|
+
}).toArray();
|
|
144
|
+
payload.logger.info({
|
|
145
|
+
msg: `Found ${allVersions.length} version documents`
|
|
146
|
+
});
|
|
147
|
+
// Transform MongoDB documents to VersionRecord format
|
|
148
|
+
const versionRecords = allVersions.map((doc)=>({
|
|
149
|
+
id: doc._id.toString(),
|
|
150
|
+
_status: doc.version._status,
|
|
151
|
+
createdAt: doc.createdAt,
|
|
152
|
+
parent: doc.parent?.toString(),
|
|
153
|
+
publishedLocale: doc.publishedLocale,
|
|
154
|
+
snapshot: doc.snapshot || false
|
|
155
|
+
}));
|
|
156
|
+
// Calculate status per locale using shared logic
|
|
157
|
+
const versionLocaleStatus = calculateVersionLocaleStatuses(versionRecords, locales, payload);
|
|
158
|
+
payload.logger.info({
|
|
159
|
+
msg: 'Updating version documents with per-locale status...'
|
|
160
|
+
});
|
|
161
|
+
// Update each version document
|
|
162
|
+
let updateCount = 0;
|
|
163
|
+
for (const doc of allVersions){
|
|
164
|
+
const versionId = doc._id.toString();
|
|
165
|
+
const localeStatusMap = versionLocaleStatus.get(versionId);
|
|
166
|
+
if (!localeStatusMap) {
|
|
167
|
+
payload.logger.warn({
|
|
168
|
+
msg: `No status map found for version ${versionId}, skipping`
|
|
169
|
+
});
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// Build the new _status object: { en: 'published', es: 'draft', ... }
|
|
173
|
+
const newStatus = {};
|
|
174
|
+
for (const [locale, status] of localeStatusMap.entries()){
|
|
175
|
+
newStatus[locale] = status;
|
|
176
|
+
}
|
|
177
|
+
// Update the document: change version._status from string to object
|
|
178
|
+
await connection.collection(versionsCollection).updateOne({
|
|
179
|
+
_id: doc._id
|
|
180
|
+
}, {
|
|
181
|
+
$set: {
|
|
182
|
+
'version._status': newStatus
|
|
183
|
+
}
|
|
184
|
+
}, {
|
|
185
|
+
session
|
|
186
|
+
});
|
|
187
|
+
updateCount++;
|
|
188
|
+
}
|
|
189
|
+
payload.logger.info({
|
|
190
|
+
msg: `Updated ${updateCount} version documents`
|
|
191
|
+
});
|
|
192
|
+
// Migrate main collection/global document _status to per-locale status object
|
|
193
|
+
// Only if it has a status field
|
|
194
|
+
if (collectionSlug) {
|
|
195
|
+
const mainCollection = collectionSlug;
|
|
196
|
+
const mainDoc = await connection.collection(mainCollection).findOne({}, {
|
|
197
|
+
session
|
|
198
|
+
});
|
|
199
|
+
if (mainDoc && '_status' in mainDoc) {
|
|
200
|
+
payload.logger.info({
|
|
201
|
+
msg: `Migrating main collection documents for: ${mainCollection}`
|
|
202
|
+
});
|
|
203
|
+
const allDocs = await connection.collection(mainCollection).find({}, {
|
|
204
|
+
session
|
|
205
|
+
}).toArray();
|
|
206
|
+
for (const doc of allDocs){
|
|
207
|
+
if (!doc._id) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
// Get the latest version for this document to determine status per locale
|
|
211
|
+
const latestVersions = await connection.collection(versionsCollection).find({
|
|
212
|
+
parent: doc._id
|
|
213
|
+
}, {
|
|
214
|
+
session
|
|
215
|
+
}).sort({
|
|
216
|
+
createdAt: -1
|
|
217
|
+
}).limit(1).toArray();
|
|
218
|
+
let statusObj = {};
|
|
219
|
+
if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {
|
|
220
|
+
// Use the status from the latest version
|
|
221
|
+
statusObj = latestVersions[0].version._status;
|
|
222
|
+
} else {
|
|
223
|
+
// Fallback: set all locales to draft
|
|
224
|
+
for (const locale of locales){
|
|
225
|
+
statusObj[locale] = 'draft';
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Update main document
|
|
229
|
+
await connection.collection(mainCollection).updateOne({
|
|
230
|
+
_id: doc._id
|
|
231
|
+
}, {
|
|
232
|
+
$set: {
|
|
233
|
+
_status: statusObj
|
|
234
|
+
}
|
|
235
|
+
}, {
|
|
236
|
+
session
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
payload.logger.info({
|
|
240
|
+
msg: `Migrated ${allDocs.length} collection documents`
|
|
241
|
+
});
|
|
242
|
+
} else {
|
|
243
|
+
payload.logger.info({
|
|
244
|
+
msg: 'Skipping main document status migration (no status field found)'
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
} else if (globalSlug) {
|
|
248
|
+
// Globals are stored in a single 'globals' collection with globalType discriminator
|
|
249
|
+
const globalDoc = await connection.collection('globals').findOne({
|
|
250
|
+
globalType: globalSlug
|
|
251
|
+
}, {
|
|
252
|
+
session
|
|
253
|
+
});
|
|
254
|
+
if (globalDoc && '_status' in globalDoc && globalDoc._id) {
|
|
255
|
+
payload.logger.info({
|
|
256
|
+
msg: `Migrating main global document for: ${globalSlug}`
|
|
257
|
+
});
|
|
258
|
+
// Get the latest version for the global
|
|
259
|
+
const latestVersions = await connection.collection(versionsCollection).find({}, {
|
|
260
|
+
session
|
|
261
|
+
}).sort({
|
|
262
|
+
createdAt: -1
|
|
263
|
+
}).limit(1).toArray();
|
|
264
|
+
let statusObj = {};
|
|
265
|
+
if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {
|
|
266
|
+
statusObj = latestVersions[0].version._status;
|
|
267
|
+
} else {
|
|
268
|
+
for (const locale of locales){
|
|
269
|
+
statusObj[locale] = 'draft';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Update global document
|
|
273
|
+
await connection.collection('globals').updateOne({
|
|
274
|
+
_id: globalDoc._id,
|
|
275
|
+
globalType: globalSlug
|
|
276
|
+
}, {
|
|
277
|
+
$set: {
|
|
278
|
+
_status: statusObj
|
|
279
|
+
}
|
|
280
|
+
}, {
|
|
281
|
+
session
|
|
282
|
+
});
|
|
283
|
+
payload.logger.info({
|
|
284
|
+
msg: 'Migrated global document'
|
|
285
|
+
});
|
|
286
|
+
} else {
|
|
287
|
+
payload.logger.info({
|
|
288
|
+
msg: 'Skipping main document status migration (no status field found)'
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
payload.logger.info({
|
|
293
|
+
msg: 'Migration completed successfully'
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
async function cleanupSnapshotDocuments({ connection, entitySlug, payload, session }) {
|
|
297
|
+
const versionsCollection = `_${entitySlug}_versions`.toLowerCase();
|
|
298
|
+
const col = connection.collection(versionsCollection);
|
|
299
|
+
// Delete all snapshot=true documents
|
|
300
|
+
const deleteResult = await col.deleteMany({
|
|
301
|
+
snapshot: true
|
|
302
|
+
}, {
|
|
303
|
+
session
|
|
304
|
+
});
|
|
305
|
+
if (deleteResult.deletedCount > 0) {
|
|
306
|
+
payload.logger.info({
|
|
307
|
+
msg: `Deleted ${deleteResult.deletedCount} snapshot documents from ${versionsCollection}`
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
// Unset the snapshot field from remaining documents
|
|
311
|
+
await col.updateMany({
|
|
312
|
+
snapshot: {
|
|
313
|
+
$exists: true
|
|
314
|
+
}
|
|
315
|
+
}, {
|
|
316
|
+
$unset: {
|
|
317
|
+
snapshot: ''
|
|
318
|
+
}
|
|
319
|
+
}, {
|
|
320
|
+
session
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
//# sourceMappingURL=migrateLocalizeStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/predefinedMigrations/migrateLocalizeStatus.ts"],"sourcesContent":["import type { ClientSession } from 'mongoose'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { calculateVersionLocaleStatuses, type VersionRecord } from 'payload/migrations'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { getSession } from '../utilities/getSession.js'\n\nexport type LocalizeStatusArgs = {\n collectionSlug?: string\n globalSlug?: string\n payload: Payload\n req?: any\n session?: ClientSession\n}\n\n/**\n * Migrate all collections and globals with versions.drafts enabled to use per-locale _status.\n *\n * This migration:\n * 1. Converts version._status from a scalar string to a locale-keyed object for each entity\n * 2. Deletes all snapshot:true version documents from each versions collection\n * 3. Unsets the `snapshot` field from remaining version documents\n */\nexport async function migrateLocalizeStatus({\n payload,\n req,\n}: {\n payload: Payload\n req: PayloadRequest\n}): Promise<void> {\n if (!payload.config.localization) {\n payload.logger.info({\n msg: 'Localization not enabled, skipping localize-status migration',\n })\n return\n }\n\n const collections = payload.config.collections.filter(\n (c) =>\n c.versions?.drafts &&\n typeof c.versions.drafts === 'object' &&\n c.versions.drafts.localizeStatus,\n )\n const globals = payload.config.globals.filter(\n (g) =>\n g.versions?.drafts &&\n typeof g.versions.drafts === 'object' &&\n g.versions.drafts.localizeStatus,\n )\n\n payload.logger.info({\n msg: `Starting localize-status migration for ${collections.length} collection(s) and ${globals.length} global(s)`,\n })\n\n const connection = (payload.db as any).connection\n const session = await getSession(payload.db as MongooseAdapter, req)\n\n for (const collection of collections) {\n await localizeStatus({ collectionSlug: collection.slug, payload, req, session })\n await cleanupSnapshotDocuments({ connection, entitySlug: collection.slug, payload, session })\n }\n\n for (const global of globals) {\n await localizeStatus({ globalSlug: global.slug, payload, req, session })\n await cleanupSnapshotDocuments({ connection, entitySlug: global.slug, payload, session })\n }\n\n payload.logger.info({ msg: 'localize-status migration completed successfully' })\n}\n\n/**\n * Converts version._status (and the main document _status) from a scalar string to a\n * per-locale object for a single collection or global.\n */\nexport async function localizeStatus(args: LocalizeStatusArgs): Promise<void> {\n const { collectionSlug, globalSlug, payload, req, session } = args\n\n if (!collectionSlug && !globalSlug) {\n throw new Error('Either collectionSlug or globalSlug must be provided')\n }\n\n if (collectionSlug && globalSlug) {\n throw new Error('Cannot provide both collectionSlug and globalSlug')\n }\n\n const entitySlug = collectionSlug || globalSlug\n // MongoDB collection names are case-insensitive and stored as lowercase\n const versionsCollection = `_${entitySlug}_versions`.toLowerCase()\n\n if (!payload.config.localization) {\n throw new Error('Localization is not enabled in payload config')\n }\n\n // Check if versions are enabled on this collection/global\n let entityConfig\n if (collectionSlug) {\n const collection = payload.config.collections.find((c) => c.slug === collectionSlug)\n if (collection) {\n entityConfig = collection\n }\n } else if (globalSlug) {\n const global = payload.config.globals.find((g) => g.slug === globalSlug)\n if (global) {\n entityConfig = global\n }\n }\n\n if (!entityConfig) {\n throw new Error(\n `${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`,\n )\n }\n\n payload.logger.info({\n msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`,\n })\n\n // Check if versions are enabled in config (skip if not)\n if (!entityConfig.versions) {\n payload.logger.info({\n msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`,\n })\n return\n }\n\n // Get MongoDB connection\n const connection = (payload.db as any).connection\n\n // Get filtered locales if filterAvailableLocales is defined\n let locales = payload.config.localization.localeCodes\n if (typeof payload.config.localization.filterAvailableLocales === 'function') {\n const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({\n locales: payload.config.localization.locales,\n req,\n })\n locales = filteredLocaleObjects.map((locale) => locale.code)\n }\n payload.logger.info({ msg: `Locales: ${locales.join(', ')}` })\n\n // Check if version._status exists and is NOT already localized\n const sampleDoc = await connection.collection(versionsCollection).findOne({}, { session })\n\n if (!sampleDoc) {\n payload.logger.info({ msg: 'No version documents found, nothing to migrate' })\n return\n }\n\n // Check if _status is already localized\n if (\n sampleDoc.version?._status &&\n typeof sampleDoc.version._status === 'object' &&\n !Array.isArray(sampleDoc.version._status)\n ) {\n payload.logger.info({\n msg: 'version._status is already localized, migration already completed',\n })\n return\n }\n\n // Validate that version._status exists and is a string\n if (\n !sampleDoc.version ||\n typeof sampleDoc.version._status !== 'string' ||\n Array.isArray(sampleDoc.version._status)\n ) {\n throw new Error(\n `Migration aborted: version._status field not found or has unexpected format in ${versionsCollection}. ` +\n `This migration should only run on schemas that have NOT yet been migrated to per-locale status.`,\n )\n }\n\n payload.logger.info({ msg: 'Fetching all version documents...' })\n\n // Get all versions, sorted chronologically\n const allVersions = await connection\n .collection(versionsCollection)\n .find({}, { session })\n .sort({ createdAt: 1, parent: 1 })\n .toArray()\n\n payload.logger.info({ msg: `Found ${allVersions.length} version documents` })\n\n // Transform MongoDB documents to VersionRecord format\n const versionRecords: VersionRecord[] = allVersions.map((doc: any) => ({\n id: doc._id.toString(),\n _status: doc.version._status as 'draft' | 'published',\n createdAt: doc.createdAt,\n parent: doc.parent?.toString(),\n publishedLocale: doc.publishedLocale,\n snapshot: doc.snapshot || false,\n }))\n\n // Calculate status per locale using shared logic\n const versionLocaleStatus = calculateVersionLocaleStatuses(versionRecords, locales, payload)\n\n payload.logger.info({ msg: 'Updating version documents with per-locale status...' })\n\n // Update each version document\n let updateCount = 0\n for (const doc of allVersions) {\n const versionId = doc._id.toString()\n const localeStatusMap = versionLocaleStatus.get(versionId)\n\n if (!localeStatusMap) {\n payload.logger.warn({ msg: `No status map found for version ${versionId}, skipping` })\n continue\n }\n\n // Build the new _status object: { en: 'published', es: 'draft', ... }\n const newStatus: Record<string, string> = {}\n for (const [locale, status] of localeStatusMap.entries()) {\n newStatus[locale] = status\n }\n\n // Update the document: change version._status from string to object\n await connection.collection(versionsCollection).updateOne(\n { _id: doc._id },\n {\n $set: {\n 'version._status': newStatus,\n },\n },\n { session },\n )\n\n updateCount++\n }\n\n payload.logger.info({ msg: `Updated ${updateCount} version documents` })\n\n // Migrate main collection/global document _status to per-locale status object\n // Only if it has a status field\n if (collectionSlug) {\n const mainCollection = collectionSlug\n const mainDoc = await connection.collection(mainCollection).findOne({}, { session })\n\n if (mainDoc && '_status' in mainDoc) {\n payload.logger.info({ msg: `Migrating main collection documents for: ${mainCollection}` })\n\n const allDocs = await connection.collection(mainCollection).find({}, { session }).toArray()\n\n for (const doc of allDocs) {\n if (!doc._id) {\n continue\n }\n\n // Get the latest version for this document to determine status per locale\n const latestVersions = await connection\n .collection(versionsCollection)\n .find({ parent: doc._id }, { session })\n .sort({ createdAt: -1 })\n .limit(1)\n .toArray()\n\n let statusObj: Record<string, string> = {}\n\n if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {\n // Use the status from the latest version\n statusObj = latestVersions[0].version._status\n } else {\n // Fallback: set all locales to draft\n for (const locale of locales) {\n statusObj[locale] = 'draft'\n }\n }\n\n // Update main document\n await connection.collection(mainCollection).updateOne(\n { _id: doc._id },\n {\n $set: {\n _status: statusObj,\n },\n },\n { session },\n )\n }\n\n payload.logger.info({ msg: `Migrated ${allDocs.length} collection documents` })\n } else {\n payload.logger.info({\n msg: 'Skipping main document status migration (no status field found)',\n })\n }\n } else if (globalSlug) {\n // Globals are stored in a single 'globals' collection with globalType discriminator\n const globalDoc = await connection\n .collection('globals')\n .findOne({ globalType: globalSlug }, { session })\n if (globalDoc && '_status' in globalDoc && globalDoc._id) {\n payload.logger.info({ msg: `Migrating main global document for: ${globalSlug}` })\n\n // Get the latest version for the global\n const latestVersions = await connection\n .collection(versionsCollection)\n .find({}, { session })\n .sort({ createdAt: -1 })\n .limit(1)\n .toArray()\n\n let statusObj: Record<string, string> = {}\n\n if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {\n statusObj = latestVersions[0].version._status\n } else {\n for (const locale of locales) {\n statusObj[locale] = 'draft'\n }\n }\n\n // Update global document\n await connection.collection('globals').updateOne(\n { _id: globalDoc._id, globalType: globalSlug },\n {\n $set: {\n _status: statusObj,\n },\n },\n { session },\n )\n\n payload.logger.info({ msg: 'Migrated global document' })\n } else {\n payload.logger.info({\n msg: 'Skipping main document status migration (no status field found)',\n })\n }\n }\n\n payload.logger.info({ msg: 'Migration completed successfully' })\n}\n\nasync function cleanupSnapshotDocuments({\n connection,\n entitySlug,\n payload,\n session,\n}: {\n connection: any\n entitySlug: string\n payload: Payload\n session?: ClientSession\n}): Promise<void> {\n const versionsCollection = `_${entitySlug}_versions`.toLowerCase()\n\n const col = connection.collection(versionsCollection)\n\n // Delete all snapshot=true documents\n const deleteResult = await col.deleteMany({ snapshot: true }, { session })\n\n if (deleteResult.deletedCount > 0) {\n payload.logger.info({\n msg: `Deleted ${deleteResult.deletedCount} snapshot documents from ${versionsCollection}`,\n })\n }\n\n // Unset the snapshot field from remaining documents\n await col.updateMany({ snapshot: { $exists: true } }, { $unset: { snapshot: '' } }, { session })\n}\n"],"names":["calculateVersionLocaleStatuses","getSession","migrateLocalizeStatus","payload","req","config","localization","logger","info","msg","collections","filter","c","versions","drafts","localizeStatus","globals","g","length","connection","db","session","collection","collectionSlug","slug","cleanupSnapshotDocuments","entitySlug","global","globalSlug","args","Error","versionsCollection","toLowerCase","entityConfig","find","locales","localeCodes","filterAvailableLocales","filteredLocaleObjects","map","locale","code","join","sampleDoc","findOne","version","_status","Array","isArray","allVersions","sort","createdAt","parent","toArray","versionRecords","doc","id","_id","toString","publishedLocale","snapshot","versionLocaleStatus","updateCount","versionId","localeStatusMap","get","warn","newStatus","status","entries","updateOne","$set","mainCollection","mainDoc","allDocs","latestVersions","limit","statusObj","globalDoc","globalType","col","deleteResult","deleteMany","deletedCount","updateMany","$exists","$unset"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrateRelationshipsV2_V3.d.ts","sourceRoot":"","sources":["../../src/predefinedMigrations/migrateRelationshipsV2_V3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAS,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"migrateRelationshipsV2_V3.d.ts","sourceRoot":"","sources":["../../src/predefinedMigrations/migrateRelationshipsV2_V3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAS,cAAc,EAAE,MAAM,SAAS,CAAA;AA4GpD,wBAAsB,yBAAyB,CAAC,EAC9C,SAAS,EACT,GAAG,GACJ,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGhB"}
|
|
@@ -28,8 +28,9 @@ const migrateModelWithBatching = async ({ batchSize, db, fields, Model, parentIs
|
|
|
28
28
|
parentIsLocalized
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
// Writing through the driver collection skips Mongoose timestamps entirely,
|
|
32
|
+
// which is what we want here - timestamps are added by the write transform above
|
|
33
|
+
await Model.collection.bulkWrite(docs.map((doc)=>({
|
|
33
34
|
updateOne: {
|
|
34
35
|
filter: {
|
|
35
36
|
_id: doc._id
|
|
@@ -39,8 +40,7 @@ const migrateModelWithBatching = async ({ batchSize, db, fields, Model, parentIs
|
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
})), {
|
|
42
|
-
session
|
|
43
|
-
timestamps: false
|
|
43
|
+
session
|
|
44
44
|
});
|
|
45
45
|
skip += batchSize;
|
|
46
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/predefinedMigrations/migrateRelationshipsV2_V3.ts"],"sourcesContent":["import type { ClientSession, Model } from 'mongoose'\nimport type { Field, PayloadRequest } from 'payload'\n\nimport { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { getCollection, getGlobal } from '../utilities/getEntity.js'\nimport { getSession } from '../utilities/getSession.js'\nimport { transform } from '../utilities/transform.js'\n\nconst migrateModelWithBatching = async ({\n batchSize,\n db,\n fields,\n Model,\n parentIsLocalized,\n session,\n}: {\n batchSize: number\n db: MongooseAdapter\n fields: Field[]\n Model: Model<any>\n parentIsLocalized: boolean\n session?: ClientSession\n}): Promise<void> => {\n let hasNext = true\n let skip = 0\n\n while (hasNext) {\n const docs = await Model.find(\n {},\n {},\n {\n lean: true,\n limit: batchSize + 1,\n session,\n skip,\n },\n )\n\n if (docs.length === 0) {\n break\n }\n\n hasNext = docs.length > batchSize\n\n if (hasNext) {\n docs.pop()\n }\n\n for (const doc of docs) {\n transform({ adapter: db, data: doc, fields, operation: 'write', parentIsLocalized })\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/predefinedMigrations/migrateRelationshipsV2_V3.ts"],"sourcesContent":["import type { ClientSession, Model } from 'mongoose'\nimport type { Field, PayloadRequest } from 'payload'\n\nimport { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { getCollection, getGlobal } from '../utilities/getEntity.js'\nimport { getSession } from '../utilities/getSession.js'\nimport { transform } from '../utilities/transform.js'\n\nconst migrateModelWithBatching = async ({\n batchSize,\n db,\n fields,\n Model,\n parentIsLocalized,\n session,\n}: {\n batchSize: number\n db: MongooseAdapter\n fields: Field[]\n Model: Model<any>\n parentIsLocalized: boolean\n session?: ClientSession\n}): Promise<void> => {\n let hasNext = true\n let skip = 0\n\n while (hasNext) {\n const docs = await Model.find(\n {},\n {},\n {\n lean: true,\n limit: batchSize + 1,\n session,\n skip,\n },\n )\n\n if (docs.length === 0) {\n break\n }\n\n hasNext = docs.length > batchSize\n\n if (hasNext) {\n docs.pop()\n }\n\n for (const doc of docs) {\n transform({ adapter: db, data: doc, fields, operation: 'write', parentIsLocalized })\n }\n\n // Writing through the driver collection skips Mongoose timestamps entirely,\n // which is what we want here - timestamps are added by the write transform above\n await Model.collection.bulkWrite(\n docs.map((doc) => ({\n updateOne: {\n filter: { _id: doc._id },\n update: {\n $set: doc,\n },\n },\n })),\n { session },\n )\n\n skip += batchSize\n }\n}\n\nconst hasRelationshipOrUploadField = ({ fields }: { fields: Field[] }): boolean => {\n for (const field of fields) {\n if (field.type === 'relationship' || field.type === 'upload') {\n return true\n }\n\n if ('fields' in field) {\n if (hasRelationshipOrUploadField({ fields: field.fields })) {\n return true\n }\n }\n\n if ('blocks' in field) {\n for (const block of field.blocks) {\n if (typeof block === 'string') {\n // Skip - string blocks have been added in v3 and thus don't need to be migrated\n continue\n }\n if (hasRelationshipOrUploadField({ fields: block.fields })) {\n return true\n }\n }\n }\n\n if ('tabs' in field) {\n for (const tab of field.tabs) {\n if (hasRelationshipOrUploadField({ fields: tab.fields })) {\n return true\n }\n }\n }\n }\n\n return false\n}\n\nexport async function migrateRelationshipsV2_V3({\n batchSize,\n req,\n}: {\n batchSize: number\n req: PayloadRequest\n}): Promise<void> {\n const { payload } = req\n const db = payload.db as MongooseAdapter\n const config = payload.config\n\n const session = await getSession(db, req)\n\n for (const collection of payload.config.collections) {\n if (hasRelationshipOrUploadField(collection)) {\n payload.logger.info(`Migrating collection \"${collection.slug}\"`)\n\n const { Model } = getCollection({ adapter: db, collectionSlug: collection.slug })\n\n await migrateModelWithBatching({\n batchSize,\n db,\n fields: collection.fields,\n Model,\n parentIsLocalized: false,\n session,\n })\n\n payload.logger.info(`Migrated collection \"${collection.slug}\"`)\n }\n\n if (collection.versions) {\n payload.logger.info(`Migrating collection versions \"${collection.slug}\"`)\n\n const { Model } = getCollection({\n adapter: db,\n collectionSlug: collection.slug,\n versions: true,\n })\n\n await migrateModelWithBatching({\n batchSize,\n db,\n fields: buildVersionCollectionFields(config, collection),\n Model,\n parentIsLocalized: false,\n session,\n })\n\n payload.logger.info(`Migrated collection versions \"${collection.slug}\"`)\n }\n }\n\n const { globals: GlobalsModel } = db\n\n for (const global of payload.config.globals) {\n if (hasRelationshipOrUploadField(global)) {\n payload.logger.info(`Migrating global \"${global.slug}\"`)\n\n const doc = (await GlobalsModel.findOne(\n {\n globalType: {\n $eq: global.slug,\n },\n },\n {},\n { lean: true, session },\n )) as null | Record<string, unknown>\n\n // in case if the global doesn't exist in the database yet (not saved)\n if (doc) {\n transform({\n adapter: db,\n data: doc,\n fields: global.fields,\n operation: 'write',\n })\n\n await GlobalsModel.collection.updateOne(\n {\n globalType: global.slug,\n },\n { $set: doc },\n { session },\n )\n }\n\n payload.logger.info(`Migrated global \"${global.slug}\"`)\n }\n\n if (global.versions) {\n payload.logger.info(`Migrating global versions \"${global.slug}\"`)\n\n const { Model } = getGlobal({ adapter: db, globalSlug: global.slug, versions: true })\n\n await migrateModelWithBatching({\n batchSize,\n db,\n fields: buildVersionGlobalFields(config, global),\n Model,\n parentIsLocalized: false,\n session,\n })\n\n payload.logger.info(`Migrated global versions \"${global.slug}\"`)\n }\n }\n}\n"],"names":["buildVersionCollectionFields","buildVersionGlobalFields","getCollection","getGlobal","getSession","transform","migrateModelWithBatching","batchSize","db","fields","Model","parentIsLocalized","session","hasNext","skip","docs","find","lean","limit","length","pop","doc","adapter","data","operation","collection","bulkWrite","map","updateOne","filter","_id","update","$set","hasRelationshipOrUploadField","field","type","block","blocks","tab","tabs","migrateRelationshipsV2_V3","req","payload","config","collections","logger","info","slug","collectionSlug","versions","globals","GlobalsModel","global","findOne","globalType","$eq","globalSlug"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildQuery.d.ts","sourceRoot":"","sources":["../../src/queries/buildQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"buildQuery.d.ts","sourceRoot":"","sources":["../../src/queries/buildQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,eAAO,MAAM,UAAU,oEAOpB;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,KAAK,CAAA;CACb,qCAYA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/buildSearchParams.ts"],"sourcesContent":["import type { FilterQuery } from 'mongoose'\nimport type { FlattenedField, Operator, PathToQuery, Payload } from 'payload'\n\nimport { Types } from 'mongoose'\nimport { APIError, escapeRegExp, getFieldByPath, getLocalizedPaths } from 'payload'\nimport { validOperatorSet } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { OperatorMapKey } from './operatorMap.js'\n\nimport { getCollection } from '../utilities/getEntity.js'\nimport { isObjectID } from '../utilities/isObjectID.js'\nimport { operatorMap } from './operatorMap.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype SearchParam = {\n path?: string\n rawQuery?: unknown\n value?: unknown\n}\n\nconst subQueryOptions = {\n lean: true,\n}\n\n/**\n * Convert the Payload key / value / operator into a MongoDB query\n */\nexport async function buildSearchParam({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n val,\n}: {\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n incomingPath: string\n locale?: string\n operator: Operator\n parentIsLocalized: boolean\n payload: Payload\n val: unknown\n}): Promise<SearchParam | undefined> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath = incomingPath.replace(/__/g, '.')\n if (sanitizedPath === 'id') {\n sanitizedPath = '_id'\n }\n\n let paths: PathToQuery[] = []\n\n let hasCustomID = false\n\n if (sanitizedPath === '_id') {\n const customIDFieldType = collectionSlug\n ? payload.collections[collectionSlug]?.customIDType\n : undefined\n\n let idFieldType: 'number' | 'text' = 'text'\n\n if (customIDFieldType) {\n idFieldType = customIDFieldType\n hasCustomID = true\n }\n\n paths.push({\n collectionSlug,\n complete: true,\n field: {\n name: 'id',\n type: idFieldType,\n } as FlattenedField,\n parentIsLocalized: parentIsLocalized ?? false,\n path: '_id',\n })\n } else {\n paths = getLocalizedPaths({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: sanitizedPath,\n locale,\n parentIsLocalized,\n payload,\n })\n }\n\n if (!paths[0]) {\n return undefined\n }\n\n const [{ field, path }] = paths\n if (path) {\n const sanitizedQueryValue = sanitizeQueryValue({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n })\n\n if (!sanitizedQueryValue) {\n return undefined\n }\n\n const { operator: formattedOperator, rawQuery, val: formattedValue } = sanitizedQueryValue\n\n if (rawQuery && paths.length === 1) {\n return { value: rawQuery }\n }\n\n if (!formattedOperator) {\n return undefined\n }\n\n // If there are multiple collections to search through,\n // Recursively build up a list of query constraints\n if (paths.length > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n\n let relationshipQuery: SearchParam = {\n value: {},\n }\n\n for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) {\n if (!collectionSlug) {\n throw new APIError(`Collection with the slug ${collectionSlug} was not found.`)\n }\n\n const { collectionConfig, Model: SubModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug,\n })\n\n if (i === 0) {\n const subQuery = await SubModel.buildQuery({\n locale,\n payload,\n where: {\n [subPath]: {\n [formattedOperator]: val,\n },\n },\n })\n\n const field = paths[0].field\n\n const select: Record<string, boolean> = {\n _id: true,\n }\n\n let joinPath: null | string = null\n\n if (field.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: field.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let path = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n path = path.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n select[path] = true\n\n joinPath = path\n }\n\n if (joinPath) {\n select[joinPath] = true\n }\n\n const result = await SubModel.find(subQuery).lean().select(select)\n\n const $in: unknown[] = []\n\n result.forEach((doc: any) => {\n if (joinPath) {\n let ref = doc\n\n for (const segment of joinPath.split('.')) {\n if (Array.isArray(ref)) {\n ref = ref\n .map((item) => (typeof item === 'object' && item ? item[segment] : undefined))\n .flat()\n .filter((item) => item != null)\n } else if (typeof ref === 'object' && ref) {\n ref = ref[segment]\n } else {\n ref = undefined\n break\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (isObjectID(item)) {\n $in.push(item)\n }\n }\n } else if (isObjectID(ref)) {\n $in.push(ref)\n }\n } else {\n const stringID = doc._id.toString()\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(doc._id)\n } else {\n $in.push(stringID)\n }\n }\n })\n\n if (pathsToQuery.length === 1) {\n return {\n path: joinPath ? '_id' : path,\n value: { $in },\n }\n }\n\n const nextSubPath = pathsToQuery[i + 1]?.path\n\n if (nextSubPath) {\n relationshipQuery = { value: { [nextSubPath]: $in } }\n }\n\n continue\n }\n\n const subQuery = relationshipQuery.value as FilterQuery<any>\n const result = await SubModel.find(subQuery, subQueryOptions)\n\n const $in = result.map((doc) => doc._id)\n\n // If it is the last recursion\n // then pass through the search param\n if (i + 1 === pathsToQuery.length) {\n relationshipQuery = {\n path,\n value: { $in },\n }\n } else {\n const nextSubPath = pathsToQuery[i + 1]?.path\n if (nextSubPath) {\n relationshipQuery = {\n value: {\n [nextSubPath]: { $in },\n },\n }\n }\n }\n }\n\n return relationshipQuery\n }\n\n if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) {\n const operatorKey = operatorMap[formattedOperator as OperatorMapKey]\n\n if (field.type === 'relationship' || field.type === 'upload') {\n let hasNumberIDRelation\n let multiIDCondition = '$or'\n if (operatorKey === '$ne') {\n multiIDCondition = '$and'\n }\n\n const result = {\n value: {\n [multiIDCondition]: [{ [path]: { [operatorKey]: formattedValue } }],\n },\n }\n\n if (typeof formattedValue === 'string') {\n if (Types.ObjectId.isValid(formattedValue)) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: new Types.ObjectId(formattedValue) },\n })\n } else {\n ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach(\n (relationTo) => {\n const isRelatedToCustomNumberID =\n payload.collections[relationTo]?.customIDType === 'number'\n\n if (isRelatedToCustomNumberID) {\n hasNumberIDRelation = true\n }\n },\n )\n\n if (hasNumberIDRelation) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: parseFloat(formattedValue) },\n })\n }\n }\n }\n\n const length = result.value[multiIDCondition]?.length\n\n if (typeof length === 'number' && length > 1) {\n return result\n }\n }\n\n if (formattedOperator === 'like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n })),\n },\n }\n\n return result\n }\n\n if (formattedOperator === 'not_like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $not: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n },\n })),\n },\n }\n\n return result\n }\n\n // Some operators like 'near' need to define a full query\n // so if there is no operator key, just return the value\n if (!operatorKey) {\n return {\n path,\n value: formattedValue,\n }\n }\n\n return {\n path,\n value: { [operatorKey]: formattedValue },\n }\n }\n }\n return undefined\n}\n"],"names":["Types","APIError","escapeRegExp","getFieldByPath","getLocalizedPaths","validOperatorSet","getCollection","isObjectID","operatorMap","sanitizeQueryValue","subQueryOptions","lean","buildSearchParam","collectionSlug","fields","globalSlug","incomingPath","locale","operator","parentIsLocalized","payload","val","sanitizedPath","replace","paths","hasCustomID","customIDFieldType","collections","customIDType","undefined","idFieldType","push","complete","field","name","type","path","sanitizedQueryValue","formattedOperator","rawQuery","formattedValue","length","value","pathsToQuery","slice","reverse","relationshipQuery","i","subPath","entries","collectionConfig","Model","SubModel","adapter","db","subQuery","buildQuery","where","select","_id","joinPath","relationshipField","flattenedFields","on","localizedPath","pathHasLocalized","config","localization","defaultLocale","result","find","$in","forEach","doc","ref","segment","split","Array","isArray","map","item","flat","filter","stringID","toString","ObjectId","isValid","nextSubPath","has","operatorKey","hasNumberIDRelation","multiIDCondition","relationTo","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/queries/buildSearchParams.ts"],"sourcesContent":["import type { QueryFilter } from 'mongoose'\nimport type { FlattenedField, Operator, PathToQuery, Payload } from 'payload'\n\nimport { Types } from 'mongoose'\nimport { APIError, escapeRegExp, getFieldByPath, getLocalizedPaths } from 'payload'\nimport { validOperatorSet } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { OperatorMapKey } from './operatorMap.js'\n\nimport { getCollection } from '../utilities/getEntity.js'\nimport { isObjectID } from '../utilities/isObjectID.js'\nimport { operatorMap } from './operatorMap.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype SearchParam = {\n path?: string\n rawQuery?: unknown\n value?: unknown\n}\n\nconst subQueryOptions = {\n lean: true,\n}\n\n/**\n * Convert the Payload key / value / operator into a MongoDB query\n */\nexport async function buildSearchParam({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n val,\n}: {\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n incomingPath: string\n locale?: string\n operator: Operator\n parentIsLocalized: boolean\n payload: Payload\n val: unknown\n}): Promise<SearchParam | undefined> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath = incomingPath.replace(/__/g, '.')\n if (sanitizedPath === 'id') {\n sanitizedPath = '_id'\n }\n\n let paths: PathToQuery[] = []\n\n let hasCustomID = false\n\n if (sanitizedPath === '_id') {\n const customIDFieldType = collectionSlug\n ? payload.collections[collectionSlug]?.customIDType\n : undefined\n\n let idFieldType: 'number' | 'text' = 'text'\n\n if (customIDFieldType) {\n idFieldType = customIDFieldType\n hasCustomID = true\n }\n\n paths.push({\n collectionSlug,\n complete: true,\n field: {\n name: 'id',\n type: idFieldType,\n } as FlattenedField,\n parentIsLocalized: parentIsLocalized ?? false,\n path: '_id',\n })\n } else {\n paths = getLocalizedPaths({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: sanitizedPath,\n locale,\n parentIsLocalized,\n payload,\n })\n }\n\n if (!paths[0]) {\n return undefined\n }\n\n const [{ field, path }] = paths\n if (path) {\n const sanitizedQueryValue = sanitizeQueryValue({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n })\n\n if (!sanitizedQueryValue) {\n return undefined\n }\n\n const { operator: formattedOperator, rawQuery, val: formattedValue } = sanitizedQueryValue\n\n if (rawQuery && paths.length === 1) {\n return { value: rawQuery }\n }\n\n if (!formattedOperator) {\n return undefined\n }\n\n // If there are multiple collections to search through,\n // Recursively build up a list of query constraints\n if (paths.length > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n\n let relationshipQuery: SearchParam = {\n value: {},\n }\n\n for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) {\n if (!collectionSlug) {\n throw new APIError(`Collection with the slug ${collectionSlug} was not found.`)\n }\n\n const { collectionConfig, Model: SubModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug,\n })\n\n if (i === 0) {\n const subQuery = await SubModel.buildQuery({\n locale,\n payload,\n where: {\n [subPath]: {\n [formattedOperator]: val,\n },\n },\n })\n\n const field = paths[0].field\n\n const select: Record<string, boolean> = {\n _id: true,\n }\n\n let joinPath: null | string = null\n\n if (field.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: field.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let path = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n path = path.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n select[path] = true\n\n joinPath = path\n }\n\n if (joinPath) {\n select[joinPath] = true\n }\n\n const result = await SubModel.find(subQuery).lean().select(select)\n\n const $in: unknown[] = []\n\n result.forEach((doc: any) => {\n if (joinPath) {\n let ref = doc\n\n for (const segment of joinPath.split('.')) {\n if (Array.isArray(ref)) {\n ref = ref\n .map((item) => (typeof item === 'object' && item ? item[segment] : undefined))\n .flat()\n .filter((item) => item != null)\n } else if (typeof ref === 'object' && ref) {\n ref = ref[segment]\n } else {\n ref = undefined\n break\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (isObjectID(item)) {\n $in.push(item)\n }\n }\n } else if (isObjectID(ref)) {\n $in.push(ref)\n }\n } else {\n const stringID = doc._id.toString()\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(doc._id)\n } else {\n $in.push(stringID)\n }\n }\n })\n\n if (pathsToQuery.length === 1) {\n return {\n path: joinPath ? '_id' : path,\n value: { $in },\n }\n }\n\n const nextSubPath = pathsToQuery[i + 1]?.path\n\n if (nextSubPath) {\n relationshipQuery = { value: { [nextSubPath]: $in } }\n }\n\n continue\n }\n\n const subQuery = relationshipQuery.value as QueryFilter<any>\n const result = await SubModel.find(subQuery, subQueryOptions)\n\n const $in = result.map((doc) => doc._id)\n\n // If it is the last recursion\n // then pass through the search param\n if (i + 1 === pathsToQuery.length) {\n relationshipQuery = {\n path,\n value: { $in },\n }\n } else {\n const nextSubPath = pathsToQuery[i + 1]?.path\n if (nextSubPath) {\n relationshipQuery = {\n value: {\n [nextSubPath]: { $in },\n },\n }\n }\n }\n }\n\n return relationshipQuery\n }\n\n if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) {\n const operatorKey = operatorMap[formattedOperator as OperatorMapKey]\n\n if (field.type === 'relationship' || field.type === 'upload') {\n let hasNumberIDRelation\n let multiIDCondition = '$or'\n if (operatorKey === '$ne') {\n multiIDCondition = '$and'\n }\n\n const result = {\n value: {\n [multiIDCondition]: [{ [path]: { [operatorKey]: formattedValue } }],\n },\n }\n\n if (typeof formattedValue === 'string') {\n if (Types.ObjectId.isValid(formattedValue)) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: new Types.ObjectId(formattedValue) },\n })\n } else {\n ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach(\n (relationTo) => {\n const isRelatedToCustomNumberID =\n payload.collections[relationTo]?.customIDType === 'number'\n\n if (isRelatedToCustomNumberID) {\n hasNumberIDRelation = true\n }\n },\n )\n\n if (hasNumberIDRelation) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: parseFloat(formattedValue) },\n })\n }\n }\n }\n\n const length = result.value[multiIDCondition]?.length\n\n if (typeof length === 'number' && length > 1) {\n return result\n }\n }\n\n if (formattedOperator === 'like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n })),\n },\n }\n\n return result\n }\n\n if (formattedOperator === 'not_like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $not: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n },\n })),\n },\n }\n\n return result\n }\n\n // Some operators like 'near' need to define a full query\n // so if there is no operator key, just return the value\n if (!operatorKey) {\n return {\n path,\n value: formattedValue,\n }\n }\n\n return {\n path,\n value: { [operatorKey]: formattedValue },\n }\n }\n }\n return undefined\n}\n"],"names":["Types","APIError","escapeRegExp","getFieldByPath","getLocalizedPaths","validOperatorSet","getCollection","isObjectID","operatorMap","sanitizeQueryValue","subQueryOptions","lean","buildSearchParam","collectionSlug","fields","globalSlug","incomingPath","locale","operator","parentIsLocalized","payload","val","sanitizedPath","replace","paths","hasCustomID","customIDFieldType","collections","customIDType","undefined","idFieldType","push","complete","field","name","type","path","sanitizedQueryValue","formattedOperator","rawQuery","formattedValue","length","value","pathsToQuery","slice","reverse","relationshipQuery","i","subPath","entries","collectionConfig","Model","SubModel","adapter","db","subQuery","buildQuery","where","select","_id","joinPath","relationshipField","flattenedFields","on","localizedPath","pathHasLocalized","config","localization","defaultLocale","result","find","$in","forEach","doc","ref","segment","split","Array","isArray","map","item","flat","filter","stringID","toString","ObjectId","isValid","nextSubPath","has","operatorKey","hasNumberIDRelation","multiIDCondition","relationTo","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildSortParam.d.ts","sourceRoot":"","sources":["../../src/queries/buildSortParam.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,eAAe,EACpB,KAAK,IAAI,EACV,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;IACjC,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,EAAE,aAAa,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;CACjB,EAAE,CAAA;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;AAgH1C,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"buildSortParam.d.ts","sourceRoot":"","sources":["../../src/queries/buildSortParam.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,eAAe,EACpB,KAAK,IAAI,EACV,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;IACjC,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,EAAE,aAAa,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;CACjB,EAAE,CAAA;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;AAgH1C,eAAO,MAAM,cAAc,yGAUxB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAgF9B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/buildSortParam.spec.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from 'payload'\nimport { describe, beforeAll, it, expect } from 'vitest'\n\nimport { sanitizeConfig } from 'payload'\n\nimport { buildSortParam } from './buildSortParam.js'\nimport { MongooseAdapter } from '../index.js'\n\nlet config: SanitizedConfig\n\ndescribe('builds sort params', () => {\n beforeAll(async () => {\n config =
|
|
1
|
+
{"version":3,"sources":["../../src/queries/buildSortParam.spec.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from 'payload'\nimport { describe, beforeAll, it, expect } from 'vitest'\n\nimport { sanitizeConfig } from 'payload'\n\nimport { buildSortParam } from './buildSortParam.js'\nimport { MongooseAdapter } from '../index.js'\n\nlet config: SanitizedConfig\n\ndescribe('builds sort params', () => {\n beforeAll(async () => {\n config = sanitizeConfig({\n localization: {\n defaultLocale: 'en',\n fallback: true,\n locales: ['en', 'es'],\n },\n } as Config)\n })\n it('adds a fallback on non-unique field', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc', createdAt: 'desc' })\n })\n\n it('adds a fallback when sort isnt provided', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: undefined,\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ createdAt: 'desc' })\n })\n\n it('does not add a fallback on non-unique field when disableFallbackSort is true', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: true,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc' })\n })\n\n // This test should be true even when disableFallbackSort is false\n it('does not add a fallback on unique field', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n unique: true, // Marking this field as unique\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc' })\n })\n})\n"],"names":["describe","beforeAll","it","expect","sanitizeConfig","buildSortParam","config","localization","defaultLocale","fallback","locales","result","parentIsLocalized","fields","name","type","locale","sort","timestamps","adapter","disableFallbackSort","toStrictEqual","order","createdAt","undefined","unique"],"mappings":"AACA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,EAAE,EAAEC,MAAM,QAAQ,SAAQ;AAExD,SAASC,cAAc,QAAQ,UAAS;AAExC,SAASC,cAAc,QAAQ,sBAAqB;AAGpD,IAAIC;AAEJN,SAAS,sBAAsB;IAC7BC,UAAU;QACRK,SAASF,eAAe;YACtBG,cAAc;gBACZC,eAAe;gBACfC,UAAU;gBACVC,SAAS;oBAAC;oBAAM;iBAAK;YACvB;QACF;IACF;IACAR,GAAG,uCAAuC;QACxC,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;YAAOC,WAAW;QAAO;IACjE;IAEArB,GAAG,2CAA2C;QAC5C,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAMO;YACNN,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEE,WAAW;QAAO;IACnD;IAEArB,GAAG,gFAAgF;QACjF,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;QAAM;IAC9C;IAEA,kEAAkE;IAClEpB,GAAG,2CAA2C;QAC5C,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;oBACNU,QAAQ;gBACV;aACD;YACDT,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;QAAM;IAC9C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBuildQueryPlugin.d.ts","sourceRoot":"","sources":["../../src/queries/getBuildQueryPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAM7D,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAKD,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"getBuildQueryPlugin.d.ts","sourceRoot":"","sources":["../../src/queries/getBuildQueryPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAM7D,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAKD,eAAO,MAAM,mBAAmB,yCAG7B,uBAAuB,cACiB,GAAG,SAmD7C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocalizedSortProperty.d.ts","sourceRoot":"","sources":["../../src/queries/getLocalizedSortProperty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"getLocalizedSortProperty.d.ts","sourceRoot":"","sources":["../../src/queries/getLocalizedSortProperty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,wBAAwB,uGAOlC,IAAI,KAAG,MA8FT,CAAA"}
|