@payloadcms/db-mongodb 3.60.0-internal.40d58c0 → 3.60.0-internal.c130254
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/queries/buildSearchParams.d.ts.map +1 -1
- package/dist/queries/buildSearchParams.js +3 -2
- package/dist/queries/buildSearchParams.js.map +1 -1
- package/dist/utilities/isObjectID.d.ts +3 -0
- package/dist/utilities/isObjectID.d.ts.map +1 -0
- package/dist/utilities/isObjectID.js +8 -0
- package/dist/utilities/isObjectID.js.map +1 -0
- package/dist/utilities/resolveJoins.js +30 -2
- package/dist/utilities/resolveJoins.js.map +1 -1
- package/dist/utilities/transform.d.ts.map +1 -1
- package/dist/utilities/transform.js +4 -3
- package/dist/utilities/transform.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildSearchParams.d.ts","sourceRoot":"","sources":["../../src/queries/buildSearchParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAyB,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"buildSearchParams.d.ts","sourceRoot":"","sources":["../../src/queries/buildSearchParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAyB,OAAO,EAAE,MAAM,SAAS,CAAA;AAc7E,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,cAAc,EACd,MAAM,EACN,UAAU,EACV,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,iBAAiB,EACjB,OAAO,EACP,GAAG,GACJ,EAAE;IACD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;CACb,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA0TnC"}
|
|
@@ -2,6 +2,7 @@ import { Types } from 'mongoose';
|
|
|
2
2
|
import { APIError, getFieldByPath, getLocalizedPaths } from 'payload';
|
|
3
3
|
import { validOperatorSet } from 'payload/shared';
|
|
4
4
|
import { getCollection } from '../utilities/getEntity.js';
|
|
5
|
+
import { isObjectID } from '../utilities/isObjectID.js';
|
|
5
6
|
import { operatorMap } from './operatorMap.js';
|
|
6
7
|
import { sanitizeQueryValue } from './sanitizeQueryValue.js';
|
|
7
8
|
const subQueryOptions = {
|
|
@@ -134,11 +135,11 @@ const subQueryOptions = {
|
|
|
134
135
|
}
|
|
135
136
|
if (Array.isArray(ref)) {
|
|
136
137
|
for (const item of ref){
|
|
137
|
-
if (item
|
|
138
|
+
if (isObjectID(item)) {
|
|
138
139
|
$in.push(item);
|
|
139
140
|
}
|
|
140
141
|
}
|
|
141
|
-
} else if (ref
|
|
142
|
+
} else if (isObjectID(ref)) {
|
|
142
143
|
$in.push(ref);
|
|
143
144
|
}
|
|
144
145
|
} else {
|
|
@@ -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, 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 { 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: string\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) {\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 (typeof ref === 'object' && ref) {\n ref = ref[segment]\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (item instanceof Types.ObjectId) {\n $in.push(item)\n }\n }\n } else if (ref instanceof Types.ObjectId) {\n $in.push(ref)\n }\n } else {\n const stringID = doc._id.toString()\n $in.push(stringID)\n\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(doc._id)\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: word.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'),\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: word.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'),\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","getFieldByPath","getLocalizedPaths","validOperatorSet","getCollection","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","value","length","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","item","ObjectId","stringID","toString","isValid","nextSubPath","map","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 { FilterQuery } from 'mongoose'\nimport type { FlattenedField, Operator, PathToQuery, Payload } from 'payload'\n\nimport { Types } from 'mongoose'\nimport { APIError, 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: string\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) {\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 (typeof ref === 'object' && ref) {\n ref = ref[segment]\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 $in.push(stringID)\n\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(doc._id)\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: word.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'),\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: word.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'),\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","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","value","length","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","item","stringID","toString","ObjectId","isValid","nextSubPath","map","has","operatorKey","hasNumberIDRelation","multiIDCondition","relationTo","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isObjectID.d.ts","sourceRoot":"","sources":["../../src/utilities/isObjectID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAErC,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,KAAK,CAAC,QAa1D,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const isObjectID = (value)=>{
|
|
2
|
+
if (value && typeof value === 'object' && '_bsontype' in value && value._bsontype === 'ObjectId' && 'toHexString' in value && typeof value.toHexString === 'function') {
|
|
3
|
+
return true;
|
|
4
|
+
}
|
|
5
|
+
return false;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=isObjectID.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/isObjectID.ts"],"sourcesContent":["import type { Types } from 'mongoose'\n\nexport const isObjectID = (value: unknown): value is Types.ObjectId => {\n if (\n value &&\n typeof value === 'object' &&\n '_bsontype' in value &&\n value._bsontype === 'ObjectId' &&\n 'toHexString' in value &&\n typeof value.toHexString === 'function'\n ) {\n return true\n }\n\n return false\n}\n"],"names":["isObjectID","value","_bsontype","toHexString"],"mappings":"AAEA,OAAO,MAAMA,aAAa,CAACC;IACzB,IACEA,SACA,OAAOA,UAAU,YACjB,eAAeA,SACfA,MAAMC,SAAS,KAAK,cACpB,iBAAiBD,SACjB,OAAOA,MAAME,WAAW,KAAK,YAC7B;QACA,OAAO;IACT;IAEA,OAAO;AACT,EAAC"}
|
|
@@ -313,6 +313,20 @@ import { transform } from './transform.js';
|
|
|
313
313
|
}
|
|
314
314
|
/**
|
|
315
315
|
* Extracts relationTo filter values from a WHERE clause
|
|
316
|
+
*
|
|
317
|
+
* @purpose When you have a polymorphic join field that can reference multiple collection types (e.g. the documentsAndFolders join field on
|
|
318
|
+
* folders that points to all folder-enabled collections), Payload needs to decide which collections to actually query. Without filtering,
|
|
319
|
+
* it would query ALL possible collections even when the WHERE clause clearly indicates it only needs specific ones.
|
|
320
|
+
*
|
|
321
|
+
* extractRelationToFilter analyzes the WHERE clause to extract relationTo conditions and returns only the collection slugs that
|
|
322
|
+
* could possibly match, avoiding unnecessary database queries.
|
|
323
|
+
*
|
|
324
|
+
* @description The function recursively traverses a WHERE clause looking for relationTo conditions in these patterns:
|
|
325
|
+
*
|
|
326
|
+
* 1. Direct conditions: { relationTo: { equals: 'posts' } }
|
|
327
|
+
* 2. IN conditions: { relationTo: { in: ['posts', 'media'] } }
|
|
328
|
+
* 3. Nested in AND/OR: Recursively searches through logical operators
|
|
329
|
+
|
|
316
330
|
* @param where - The WHERE clause to search
|
|
317
331
|
* @returns Array of collection slugs if relationTo filter found, null otherwise
|
|
318
332
|
*/ function extractRelationToFilter(where) {
|
|
@@ -333,20 +347,34 @@ import { transform } from './transform.js';
|
|
|
333
347
|
}
|
|
334
348
|
// Check for relationTo in logical operators
|
|
335
349
|
if (where.and && Array.isArray(where.and)) {
|
|
350
|
+
const allResults = [];
|
|
336
351
|
for (const condition of where.and){
|
|
337
352
|
const result = extractRelationToFilter(condition);
|
|
338
353
|
if (result) {
|
|
339
|
-
|
|
354
|
+
allResults.push(...result);
|
|
340
355
|
}
|
|
341
356
|
}
|
|
357
|
+
if (allResults.length > 0) {
|
|
358
|
+
return [
|
|
359
|
+
...new Set(allResults)
|
|
360
|
+
] // Remove duplicates
|
|
361
|
+
;
|
|
362
|
+
}
|
|
342
363
|
}
|
|
343
364
|
if (where.or && Array.isArray(where.or)) {
|
|
365
|
+
const allResults = [];
|
|
344
366
|
for (const condition of where.or){
|
|
345
367
|
const result = extractRelationToFilter(condition);
|
|
346
368
|
if (result) {
|
|
347
|
-
|
|
369
|
+
allResults.push(...result);
|
|
348
370
|
}
|
|
349
371
|
}
|
|
372
|
+
if (allResults.length > 0) {
|
|
373
|
+
return [
|
|
374
|
+
...new Set(allResults)
|
|
375
|
+
] // Remove duplicates
|
|
376
|
+
;
|
|
377
|
+
}
|
|
350
378
|
}
|
|
351
379
|
return null;
|
|
352
380
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/resolveJoins.ts"],"sourcesContent":["import type { JoinQuery, SanitizedJoins, Where } from 'payload'\n\nimport {\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n combineQueries,\n getQueryDraftsSort,\n} from 'payload'\nimport { fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { transform } from './transform.js'\n\nexport type ResolveJoinsArgs = {\n /** The MongoDB adapter instance */\n adapter: MongooseAdapter\n /** The slug of the collection being queried */\n collectionSlug: string\n /** Array of documents to resolve joins for */\n docs: Record<string, unknown>[]\n /** Join query specifications (which joins to resolve and how) */\n joins?: JoinQuery\n /** Optional locale for localized queries */\n locale?: string\n /** Optional projection for the join query */\n projection?: Record<string, true>\n /** Whether to resolve versions instead of published documents */\n versions?: boolean\n}\n\n/**\n * Resolves join relationships for a collection of documents.\n * This function fetches related documents based on join configurations and\n * attaches them to the original documents with pagination support.\n */\nexport async function resolveJoins({\n adapter,\n collectionSlug,\n docs,\n joins,\n locale,\n projection,\n versions = false,\n}: ResolveJoinsArgs): Promise<void> {\n // Early return if no joins are specified or no documents to process\n if (!joins || docs.length === 0) {\n return\n }\n\n // Get the collection configuration from the adapter\n const collectionConfig = adapter.payload.collections[collectionSlug]?.config\n if (!collectionConfig) {\n return\n }\n\n // Build a map of join paths to their configurations for quick lookup\n // This flattens the nested join structure into a single map keyed by join path\n const joinMap: Record<string, { targetCollection: string } & SanitizedJoin> = {}\n\n // Add regular joins\n for (const [target, joinList] of Object.entries(collectionConfig.joins)) {\n for (const join of joinList) {\n joinMap[join.joinPath] = { ...join, targetCollection: target }\n }\n }\n\n // Add polymorphic joins\n for (const join of collectionConfig.polymorphicJoins || []) {\n // For polymorphic joins, we use the collections array as the target\n joinMap[join.joinPath] = { ...join, targetCollection: join.field.collection as string }\n }\n\n // Process each requested join concurrently\n const joinPromises = Object.entries(joins).map(async ([joinPath, joinQuery]) => {\n if (!joinQuery) {\n return null\n }\n\n // If a projection is provided, and the join path is not in the projection, skip it\n if (projection && !projection[joinPath]) {\n return null\n }\n\n // Get the join definition from our map\n const joinDef = joinMap[joinPath]\n if (!joinDef) {\n return null\n }\n\n // Normalize collections to always be an array for unified processing\n const allCollections = Array.isArray(joinDef.field.collection)\n ? joinDef.field.collection\n : [joinDef.field.collection]\n\n // Use the provided locale or fall back to the default locale for localized fields\n const localizationConfig = adapter.payload.config.localization\n const effectiveLocale =\n locale ||\n (typeof localizationConfig === 'object' &&\n localizationConfig &&\n localizationConfig.defaultLocale)\n\n // Extract relationTo filter from the where clause to determine which collections to query\n const relationToFilter = extractRelationToFilter(joinQuery.where || {})\n\n // Determine which collections to query based on relationTo filter\n const collections = relationToFilter\n ? allCollections.filter((col) => relationToFilter.includes(col))\n : allCollections\n\n // Check if this is a polymorphic collection join (where field.collection is an array)\n const isPolymorphicJoin = Array.isArray(joinDef.field.collection)\n\n // Apply pagination settings\n const limit = joinQuery.limit ?? joinDef.field.defaultLimit ?? 10\n const page = joinQuery.page ?? 1\n const skip = (page - 1) * limit\n\n // Process collections concurrently\n const collectionPromises = collections.map(async (joinCollectionSlug) => {\n const targetConfig = adapter.payload.collections[joinCollectionSlug]?.config\n if (!targetConfig) {\n return null\n }\n\n const useDrafts = versions && Boolean(targetConfig.versions?.drafts)\n let JoinModel\n if (useDrafts) {\n JoinModel = adapter.versions[targetConfig.slug]\n } else {\n JoinModel = adapter.collections[targetConfig.slug]\n }\n\n if (!JoinModel) {\n return null\n }\n\n // Extract all parent document IDs to use in the join query\n const parentIDs = docs.map((d) => (versions ? (d.parent ?? d._id ?? d.id) : (d._id ?? d.id)))\n\n // Build the base query\n let whereQuery: null | Record<string, unknown> = null\n whereQuery = isPolymorphicJoin\n ? filterWhereForCollection(\n joinQuery.where || {},\n targetConfig.flattenedFields,\n true, // exclude relationTo for individual collections\n )\n : joinQuery.where || {}\n\n // Skip this collection if the WHERE clause cannot be satisfied for polymorphic collection joins\n if (whereQuery === null) {\n return null\n }\n whereQuery = useDrafts\n ? await JoinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: combineQueries(appendVersionToQueryKey(whereQuery as Where), {\n latest: {\n equals: true,\n },\n }),\n })\n : await buildQuery({\n adapter,\n collectionSlug: joinCollectionSlug,\n fields: targetConfig.flattenedFields,\n locale,\n where: whereQuery as Where,\n })\n\n // Handle localized paths and version prefixes\n let dbFieldName = joinDef.field.on\n\n if (effectiveLocale && typeof localizationConfig === 'object' && localizationConfig) {\n const pathSegments = joinDef.field.on.split('.')\n const transformedSegments: string[] = []\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, targetConfig, true)\n : targetConfig.flattenedFields\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i]!\n transformedSegments.push(segment)\n\n // Check if this segment corresponds to a localized field\n const fieldAtSegment = fields.find((f) => f.name === segment)\n if (fieldAtSegment && fieldAtSegment.localized) {\n transformedSegments.push(effectiveLocale)\n }\n }\n\n dbFieldName = transformedSegments.join('.')\n }\n\n // Add version prefix for draft queries\n if (useDrafts) {\n dbFieldName = `version.${dbFieldName}`\n }\n\n // Check if the target field is a polymorphic relationship\n const isPolymorphic = joinDef.targetField\n ? Array.isArray(joinDef.targetField.relationTo)\n : false\n\n if (isPolymorphic) {\n // For polymorphic relationships, we need to match both relationTo and value\n whereQuery[`${dbFieldName}.relationTo`] = collectionSlug\n whereQuery[`${dbFieldName}.value`] = { $in: parentIDs }\n } else {\n // For regular relationships and polymorphic collection joins\n whereQuery[dbFieldName] = { $in: parentIDs }\n }\n\n // Build the sort parameters for the query\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, targetConfig, true)\n : targetConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts\n ? getQueryDraftsSort({\n collectionConfig: targetConfig,\n sort: joinQuery.sort || joinDef.field.defaultSort || targetConfig.defaultSort,\n })\n : joinQuery.sort || joinDef.field.defaultSort || targetConfig.defaultSort,\n timestamps: true,\n })\n\n const projection = buildJoinProjection(dbFieldName, useDrafts, sort)\n\n const [results, dbCount] = await Promise.all([\n JoinModel.find(whereQuery, projection, {\n sort,\n ...(isPolymorphicJoin ? {} : { limit, skip }),\n }).lean(),\n isPolymorphicJoin ? Promise.resolve(0) : JoinModel.countDocuments(whereQuery),\n ])\n\n const count = isPolymorphicJoin ? results.length : dbCount\n\n transform({\n adapter,\n data: results,\n fields: useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, targetConfig, false)\n : targetConfig.fields,\n operation: 'read',\n })\n\n // Return results with collection info for grouping\n return {\n collectionSlug: joinCollectionSlug,\n count,\n dbFieldName,\n results,\n sort,\n useDrafts,\n }\n })\n\n const collectionResults = await Promise.all(collectionPromises)\n\n // Group the results by parent ID\n const grouped: Record<\n string,\n {\n docs: Record<string, unknown>[]\n sort: Record<string, string>\n }\n > = {}\n\n let totalCount = 0\n for (const collectionResult of collectionResults) {\n if (!collectionResult) {\n continue\n }\n\n const { collectionSlug, count, dbFieldName, results, sort, useDrafts } = collectionResult\n\n totalCount += count\n\n for (const result of results) {\n if (useDrafts) {\n result.id = result.parent\n }\n\n const parentValues = getByPathWithArrays(result, dbFieldName) as (\n | { relationTo: string; value: number | string }\n | number\n | string\n )[]\n\n if (parentValues.length === 0) {\n continue\n }\n\n for (let parentValue of parentValues) {\n if (!parentValue) {\n continue\n }\n\n if (typeof parentValue === 'object') {\n parentValue = parentValue.value\n }\n\n const joinData = {\n relationTo: collectionSlug,\n value: result.id,\n }\n\n const parentKey = parentValue as string\n if (!grouped[parentKey]) {\n grouped[parentKey] = {\n docs: [],\n sort,\n }\n }\n\n // Always store the ObjectID reference in polymorphic format\n grouped[parentKey].docs.push({\n ...result,\n __joinData: joinData,\n })\n }\n }\n }\n\n for (const results of Object.values(grouped)) {\n results.docs.sort((a, b) => {\n for (const [fieldName, sortOrder] of Object.entries(results.sort)) {\n const sort = sortOrder === 'asc' ? 1 : -1\n const aValue = a[fieldName] as Date | number | string\n const bValue = b[fieldName] as Date | number | string\n if (aValue < bValue) {\n return -1 * sort\n }\n if (aValue > bValue) {\n return 1 * sort\n }\n }\n return 0\n })\n results.docs = results.docs.map(\n (doc) => (isPolymorphicJoin ? doc.__joinData : doc.id) as Record<string, unknown>,\n )\n }\n\n // Determine if the join field should be localized\n const localeSuffix =\n fieldShouldBeLocalized({\n field: joinDef.field,\n parentIsLocalized: joinDef.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n effectiveLocale\n ? `.${effectiveLocale}`\n : ''\n\n // Adjust the join path with locale suffix if needed\n const localizedJoinPath = `${joinPath}${localeSuffix}`\n\n return {\n grouped,\n isPolymorphicJoin,\n joinQuery,\n limit,\n localizedJoinPath,\n page,\n skip,\n totalCount,\n }\n })\n\n // Wait for all join operations to complete\n const joinResults = await Promise.all(joinPromises)\n\n // Process the results and attach them to documents\n for (const joinResult of joinResults) {\n if (!joinResult) {\n continue\n }\n\n const { grouped, isPolymorphicJoin, joinQuery, limit, localizedJoinPath, skip, totalCount } =\n joinResult\n\n // Attach the joined data to each parent document\n for (const doc of docs) {\n const id = (versions ? (doc.parent ?? doc._id ?? doc.id) : (doc._id ?? doc.id)) as string\n const all = grouped[id]?.docs || []\n\n // Calculate the slice for pagination\n // When limit is 0, it means unlimited - return all results\n const slice = isPolymorphicJoin\n ? limit === 0\n ? all\n : all.slice(skip, skip + limit)\n : // For non-polymorphic joins, we assume that page and limit were applied at the database level\n all\n\n // Create the join result object with pagination metadata\n const value: Record<string, unknown> = {\n docs: slice,\n hasNextPage: limit === 0 ? false : totalCount > skip + slice.length,\n }\n\n // Include total count if requested\n if (joinQuery.count) {\n value.totalDocs = totalCount\n }\n\n // Navigate to the correct nested location in the document and set the join data\n // This handles nested join paths like \"user.posts\" by creating intermediate objects\n const segments = localizedJoinPath.split('.')\n let ref: Record<string, unknown>\n if (versions) {\n if (!doc.version) {\n doc.version = {}\n }\n ref = doc.version as Record<string, unknown>\n } else {\n ref = doc\n }\n\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!\n if (!ref[seg]) {\n ref[seg] = {}\n }\n ref = ref[seg] as Record<string, unknown>\n }\n // Set the final join data at the target path\n ref[segments[segments.length - 1]!] = value\n }\n }\n}\n\n/**\n * Extracts relationTo filter values from a WHERE clause\n * @param where - The WHERE clause to search\n * @returns Array of collection slugs if relationTo filter found, null otherwise\n */\nfunction extractRelationToFilter(where: Record<string, unknown>): null | string[] {\n if (!where || typeof where !== 'object') {\n return null\n }\n\n // Check for direct relationTo conditions\n if (where.relationTo && typeof where.relationTo === 'object') {\n const relationTo = where.relationTo as Record<string, unknown>\n if (relationTo.in && Array.isArray(relationTo.in)) {\n return relationTo.in as string[]\n }\n if (relationTo.equals) {\n return [relationTo.equals as string]\n }\n }\n\n // Check for relationTo in logical operators\n if (where.and && Array.isArray(where.and)) {\n for (const condition of where.and) {\n const result = extractRelationToFilter(condition)\n if (result) {\n return result\n }\n }\n }\n\n if (where.or && Array.isArray(where.or)) {\n for (const condition of where.or) {\n const result = extractRelationToFilter(condition)\n if (result) {\n return result\n }\n }\n }\n\n return null\n}\n\n/**\n * Filters a WHERE clause to only include fields that exist in the target collection\n * This is needed for polymorphic joins where different collections have different fields\n * @param where - The original WHERE clause\n * @param availableFields - The fields available in the target collection\n * @param excludeRelationTo - Whether to exclude relationTo field (for individual collections)\n * @returns A filtered WHERE clause, or null if the query cannot match this collection\n */\nfunction filterWhereForCollection(\n where: Record<string, unknown>,\n availableFields: Array<{ name: string }>,\n excludeRelationTo: boolean = false,\n): null | Record<string, unknown> {\n if (!where || typeof where !== 'object') {\n return where\n }\n\n const fieldNames = new Set(availableFields.map((f) => f.name))\n // Add special fields that are available in polymorphic relationships\n if (!excludeRelationTo) {\n fieldNames.add('relationTo')\n }\n\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'and') {\n // Handle AND operator - all conditions must be satisfiable\n if (Array.isArray(value)) {\n const filteredConditions: Record<string, unknown>[] = []\n\n for (const condition of value) {\n const filteredCondition = filterWhereForCollection(\n condition,\n availableFields,\n excludeRelationTo,\n )\n\n // If any condition in AND cannot be satisfied, the whole AND fails\n if (filteredCondition === null) {\n return null\n }\n\n if (Object.keys(filteredCondition).length > 0) {\n filteredConditions.push(filteredCondition)\n }\n }\n\n if (filteredConditions.length > 0) {\n filtered[key] = filteredConditions\n }\n }\n } else if (key === 'or') {\n // Handle OR operator - at least one condition must be satisfiable\n if (Array.isArray(value)) {\n const filteredConditions = value\n .map((condition) =>\n filterWhereForCollection(condition, availableFields, excludeRelationTo),\n )\n .filter((condition) => condition !== null && Object.keys(condition).length > 0)\n\n if (filteredConditions.length > 0) {\n filtered[key] = filteredConditions\n }\n // If no OR conditions can be satisfied, we still continue (OR is more permissive)\n }\n } else if (key === 'relationTo' && excludeRelationTo) {\n // Skip relationTo field for non-polymorphic collections\n continue\n } else if (fieldNames.has(key)) {\n // Include the condition if the field exists in this collection\n filtered[key] = value\n } else {\n // Field doesn't exist in this collection - this makes the query unsatisfiable\n return null\n }\n }\n\n return filtered\n}\n\ntype SanitizedJoin = SanitizedJoins[string][number]\n\n/**\n * Builds projection for join queries\n */\nfunction buildJoinProjection(\n baseFieldName: string,\n useDrafts: boolean,\n sort: Record<string, string>,\n): Record<string, 1> {\n const projection: Record<string, 1> = {\n _id: 1,\n [baseFieldName]: 1,\n }\n\n if (useDrafts) {\n projection.parent = 1\n }\n\n for (const fieldName of Object.keys(sort)) {\n projection[fieldName] = 1\n }\n\n return projection\n}\n\n/**\n * Enhanced utility function to safely traverse nested object properties using dot notation\n * Handles arrays by searching through array elements for matching values\n * @param doc - The document to traverse\n * @param path - Dot-separated path (e.g., \"array.category\")\n * @returns Array of values found at the specified path (for arrays) or single value\n */\nfunction getByPathWithArrays(doc: unknown, path: string): unknown[] {\n const segments = path.split('.')\n let current = doc\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!\n\n if (current === undefined || current === null) {\n return []\n }\n\n // Get the value at the current segment\n const value = (current as Record<string, unknown>)[segment]\n\n if (value === undefined || value === null) {\n return []\n }\n\n // If this is the last segment, return the value(s)\n if (i === segments.length - 1) {\n return Array.isArray(value) ? value : [value]\n }\n\n // If the value is an array and we have more segments to traverse\n if (Array.isArray(value)) {\n const remainingPath = segments.slice(i + 1).join('.')\n const results: unknown[] = []\n\n // Search through each array element\n for (const item of value) {\n if (item && typeof item === 'object') {\n const subResults = getByPathWithArrays(item, remainingPath)\n results.push(...subResults)\n }\n }\n\n return results\n }\n\n // Continue traversing\n current = value\n }\n\n return []\n}\n"],"names":["appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldShouldBeLocalized","buildQuery","buildSortParam","transform","resolveJoins","adapter","collectionSlug","docs","joins","locale","projection","versions","length","collectionConfig","payload","collections","config","joinMap","target","joinList","Object","entries","join","joinPath","targetCollection","polymorphicJoins","field","collection","joinPromises","map","joinQuery","joinDef","allCollections","Array","isArray","localizationConfig","localization","effectiveLocale","defaultLocale","relationToFilter","extractRelationToFilter","where","filter","col","includes","isPolymorphicJoin","limit","defaultLimit","page","skip","collectionPromises","joinCollectionSlug","targetConfig","useDrafts","Boolean","drafts","JoinModel","slug","parentIDs","d","parent","_id","id","whereQuery","filterWhereForCollection","flattenedFields","latest","equals","fields","dbFieldName","on","pathSegments","split","transformedSegments","i","segment","push","fieldAtSegment","find","f","name","localized","isPolymorphic","targetField","relationTo","$in","sort","defaultSort","timestamps","buildJoinProjection","results","dbCount","Promise","all","lean","resolve","countDocuments","count","data","operation","collectionResults","grouped","totalCount","collectionResult","result","parentValues","getByPathWithArrays","parentValue","value","joinData","parentKey","__joinData","values","a","b","fieldName","sortOrder","aValue","bValue","doc","localeSuffix","parentIsLocalized","localizedJoinPath","joinResults","joinResult","slice","hasNextPage","totalDocs","segments","ref","version","seg","in","and","condition","or","availableFields","excludeRelationTo","fieldNames","Set","add","filtered","key","filteredConditions","filteredCondition","keys","has","baseFieldName","path","current","undefined","remainingPath","item","subResults"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/resolveJoins.ts"],"sourcesContent":["import type { JoinQuery, SanitizedJoins, Where } from 'payload'\n\nimport {\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n combineQueries,\n getQueryDraftsSort,\n} from 'payload'\nimport { fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { transform } from './transform.js'\n\nexport type ResolveJoinsArgs = {\n /** The MongoDB adapter instance */\n adapter: MongooseAdapter\n /** The slug of the collection being queried */\n collectionSlug: string\n /** Array of documents to resolve joins for */\n docs: Record<string, unknown>[]\n /** Join query specifications (which joins to resolve and how) */\n joins?: JoinQuery\n /** Optional locale for localized queries */\n locale?: string\n /** Optional projection for the join query */\n projection?: Record<string, true>\n /** Whether to resolve versions instead of published documents */\n versions?: boolean\n}\n\n/**\n * Resolves join relationships for a collection of documents.\n * This function fetches related documents based on join configurations and\n * attaches them to the original documents with pagination support.\n */\nexport async function resolveJoins({\n adapter,\n collectionSlug,\n docs,\n joins,\n locale,\n projection,\n versions = false,\n}: ResolveJoinsArgs): Promise<void> {\n // Early return if no joins are specified or no documents to process\n if (!joins || docs.length === 0) {\n return\n }\n\n // Get the collection configuration from the adapter\n const collectionConfig = adapter.payload.collections[collectionSlug]?.config\n if (!collectionConfig) {\n return\n }\n\n // Build a map of join paths to their configurations for quick lookup\n // This flattens the nested join structure into a single map keyed by join path\n const joinMap: Record<string, { targetCollection: string } & SanitizedJoin> = {}\n\n // Add regular joins\n for (const [target, joinList] of Object.entries(collectionConfig.joins)) {\n for (const join of joinList) {\n joinMap[join.joinPath] = { ...join, targetCollection: target }\n }\n }\n\n // Add polymorphic joins\n for (const join of collectionConfig.polymorphicJoins || []) {\n // For polymorphic joins, we use the collections array as the target\n joinMap[join.joinPath] = { ...join, targetCollection: join.field.collection as string }\n }\n\n // Process each requested join concurrently\n const joinPromises = Object.entries(joins).map(async ([joinPath, joinQuery]) => {\n if (!joinQuery) {\n return null\n }\n\n // If a projection is provided, and the join path is not in the projection, skip it\n if (projection && !projection[joinPath]) {\n return null\n }\n\n // Get the join definition from our map\n const joinDef = joinMap[joinPath]\n if (!joinDef) {\n return null\n }\n\n // Normalize collections to always be an array for unified processing\n const allCollections = Array.isArray(joinDef.field.collection)\n ? joinDef.field.collection\n : [joinDef.field.collection]\n\n // Use the provided locale or fall back to the default locale for localized fields\n const localizationConfig = adapter.payload.config.localization\n const effectiveLocale =\n locale ||\n (typeof localizationConfig === 'object' &&\n localizationConfig &&\n localizationConfig.defaultLocale)\n\n // Extract relationTo filter from the where clause to determine which collections to query\n const relationToFilter = extractRelationToFilter(joinQuery.where || {})\n\n // Determine which collections to query based on relationTo filter\n const collections = relationToFilter\n ? allCollections.filter((col) => relationToFilter.includes(col))\n : allCollections\n\n // Check if this is a polymorphic collection join (where field.collection is an array)\n const isPolymorphicJoin = Array.isArray(joinDef.field.collection)\n\n // Apply pagination settings\n const limit = joinQuery.limit ?? joinDef.field.defaultLimit ?? 10\n const page = joinQuery.page ?? 1\n const skip = (page - 1) * limit\n\n // Process collections concurrently\n const collectionPromises = collections.map(async (joinCollectionSlug) => {\n const targetConfig = adapter.payload.collections[joinCollectionSlug]?.config\n if (!targetConfig) {\n return null\n }\n\n const useDrafts = versions && Boolean(targetConfig.versions?.drafts)\n let JoinModel\n if (useDrafts) {\n JoinModel = adapter.versions[targetConfig.slug]\n } else {\n JoinModel = adapter.collections[targetConfig.slug]\n }\n\n if (!JoinModel) {\n return null\n }\n\n // Extract all parent document IDs to use in the join query\n const parentIDs = docs.map((d) => (versions ? (d.parent ?? d._id ?? d.id) : (d._id ?? d.id)))\n\n // Build the base query\n let whereQuery: null | Record<string, unknown> = null\n whereQuery = isPolymorphicJoin\n ? filterWhereForCollection(\n joinQuery.where || {},\n targetConfig.flattenedFields,\n true, // exclude relationTo for individual collections\n )\n : joinQuery.where || {}\n\n // Skip this collection if the WHERE clause cannot be satisfied for polymorphic collection joins\n if (whereQuery === null) {\n return null\n }\n whereQuery = useDrafts\n ? await JoinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: combineQueries(appendVersionToQueryKey(whereQuery as Where), {\n latest: {\n equals: true,\n },\n }),\n })\n : await buildQuery({\n adapter,\n collectionSlug: joinCollectionSlug,\n fields: targetConfig.flattenedFields,\n locale,\n where: whereQuery as Where,\n })\n\n // Handle localized paths and version prefixes\n let dbFieldName = joinDef.field.on\n\n if (effectiveLocale && typeof localizationConfig === 'object' && localizationConfig) {\n const pathSegments = joinDef.field.on.split('.')\n const transformedSegments: string[] = []\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, targetConfig, true)\n : targetConfig.flattenedFields\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i]!\n transformedSegments.push(segment)\n\n // Check if this segment corresponds to a localized field\n const fieldAtSegment = fields.find((f) => f.name === segment)\n if (fieldAtSegment && fieldAtSegment.localized) {\n transformedSegments.push(effectiveLocale)\n }\n }\n\n dbFieldName = transformedSegments.join('.')\n }\n\n // Add version prefix for draft queries\n if (useDrafts) {\n dbFieldName = `version.${dbFieldName}`\n }\n\n // Check if the target field is a polymorphic relationship\n const isPolymorphic = joinDef.targetField\n ? Array.isArray(joinDef.targetField.relationTo)\n : false\n\n if (isPolymorphic) {\n // For polymorphic relationships, we need to match both relationTo and value\n whereQuery[`${dbFieldName}.relationTo`] = collectionSlug\n whereQuery[`${dbFieldName}.value`] = { $in: parentIDs }\n } else {\n // For regular relationships and polymorphic collection joins\n whereQuery[dbFieldName] = { $in: parentIDs }\n }\n\n // Build the sort parameters for the query\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, targetConfig, true)\n : targetConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts\n ? getQueryDraftsSort({\n collectionConfig: targetConfig,\n sort: joinQuery.sort || joinDef.field.defaultSort || targetConfig.defaultSort,\n })\n : joinQuery.sort || joinDef.field.defaultSort || targetConfig.defaultSort,\n timestamps: true,\n })\n\n const projection = buildJoinProjection(dbFieldName, useDrafts, sort)\n\n const [results, dbCount] = await Promise.all([\n JoinModel.find(whereQuery, projection, {\n sort,\n ...(isPolymorphicJoin ? {} : { limit, skip }),\n }).lean(),\n isPolymorphicJoin ? Promise.resolve(0) : JoinModel.countDocuments(whereQuery),\n ])\n\n const count = isPolymorphicJoin ? results.length : dbCount\n\n transform({\n adapter,\n data: results,\n fields: useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, targetConfig, false)\n : targetConfig.fields,\n operation: 'read',\n })\n\n // Return results with collection info for grouping\n return {\n collectionSlug: joinCollectionSlug,\n count,\n dbFieldName,\n results,\n sort,\n useDrafts,\n }\n })\n\n const collectionResults = await Promise.all(collectionPromises)\n\n // Group the results by parent ID\n const grouped: Record<\n string,\n {\n docs: Record<string, unknown>[]\n sort: Record<string, string>\n }\n > = {}\n\n let totalCount = 0\n for (const collectionResult of collectionResults) {\n if (!collectionResult) {\n continue\n }\n\n const { collectionSlug, count, dbFieldName, results, sort, useDrafts } = collectionResult\n\n totalCount += count\n\n for (const result of results) {\n if (useDrafts) {\n result.id = result.parent\n }\n\n const parentValues = getByPathWithArrays(result, dbFieldName) as (\n | { relationTo: string; value: number | string }\n | number\n | string\n )[]\n\n if (parentValues.length === 0) {\n continue\n }\n\n for (let parentValue of parentValues) {\n if (!parentValue) {\n continue\n }\n\n if (typeof parentValue === 'object') {\n parentValue = parentValue.value\n }\n\n const joinData = {\n relationTo: collectionSlug,\n value: result.id,\n }\n\n const parentKey = parentValue as string\n if (!grouped[parentKey]) {\n grouped[parentKey] = {\n docs: [],\n sort,\n }\n }\n\n // Always store the ObjectID reference in polymorphic format\n grouped[parentKey].docs.push({\n ...result,\n __joinData: joinData,\n })\n }\n }\n }\n\n for (const results of Object.values(grouped)) {\n results.docs.sort((a, b) => {\n for (const [fieldName, sortOrder] of Object.entries(results.sort)) {\n const sort = sortOrder === 'asc' ? 1 : -1\n const aValue = a[fieldName] as Date | number | string\n const bValue = b[fieldName] as Date | number | string\n if (aValue < bValue) {\n return -1 * sort\n }\n if (aValue > bValue) {\n return 1 * sort\n }\n }\n return 0\n })\n results.docs = results.docs.map(\n (doc) => (isPolymorphicJoin ? doc.__joinData : doc.id) as Record<string, unknown>,\n )\n }\n\n // Determine if the join field should be localized\n const localeSuffix =\n fieldShouldBeLocalized({\n field: joinDef.field,\n parentIsLocalized: joinDef.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n effectiveLocale\n ? `.${effectiveLocale}`\n : ''\n\n // Adjust the join path with locale suffix if needed\n const localizedJoinPath = `${joinPath}${localeSuffix}`\n\n return {\n grouped,\n isPolymorphicJoin,\n joinQuery,\n limit,\n localizedJoinPath,\n page,\n skip,\n totalCount,\n }\n })\n\n // Wait for all join operations to complete\n const joinResults = await Promise.all(joinPromises)\n\n // Process the results and attach them to documents\n for (const joinResult of joinResults) {\n if (!joinResult) {\n continue\n }\n\n const { grouped, isPolymorphicJoin, joinQuery, limit, localizedJoinPath, skip, totalCount } =\n joinResult\n\n // Attach the joined data to each parent document\n for (const doc of docs) {\n const id = (versions ? (doc.parent ?? doc._id ?? doc.id) : (doc._id ?? doc.id)) as string\n const all = grouped[id]?.docs || []\n\n // Calculate the slice for pagination\n // When limit is 0, it means unlimited - return all results\n const slice = isPolymorphicJoin\n ? limit === 0\n ? all\n : all.slice(skip, skip + limit)\n : // For non-polymorphic joins, we assume that page and limit were applied at the database level\n all\n\n // Create the join result object with pagination metadata\n const value: Record<string, unknown> = {\n docs: slice,\n hasNextPage: limit === 0 ? false : totalCount > skip + slice.length,\n }\n\n // Include total count if requested\n if (joinQuery.count) {\n value.totalDocs = totalCount\n }\n\n // Navigate to the correct nested location in the document and set the join data\n // This handles nested join paths like \"user.posts\" by creating intermediate objects\n const segments = localizedJoinPath.split('.')\n let ref: Record<string, unknown>\n if (versions) {\n if (!doc.version) {\n doc.version = {}\n }\n ref = doc.version as Record<string, unknown>\n } else {\n ref = doc\n }\n\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!\n if (!ref[seg]) {\n ref[seg] = {}\n }\n ref = ref[seg] as Record<string, unknown>\n }\n // Set the final join data at the target path\n ref[segments[segments.length - 1]!] = value\n }\n }\n}\n\n/**\n * Extracts relationTo filter values from a WHERE clause\n *\n * @purpose When you have a polymorphic join field that can reference multiple collection types (e.g. the documentsAndFolders join field on\n * folders that points to all folder-enabled collections), Payload needs to decide which collections to actually query. Without filtering,\n * it would query ALL possible collections even when the WHERE clause clearly indicates it only needs specific ones.\n *\n * extractRelationToFilter analyzes the WHERE clause to extract relationTo conditions and returns only the collection slugs that\n * could possibly match, avoiding unnecessary database queries.\n *\n * @description The function recursively traverses a WHERE clause looking for relationTo conditions in these patterns:\n *\n * 1. Direct conditions: { relationTo: { equals: 'posts' } }\n * 2. IN conditions: { relationTo: { in: ['posts', 'media'] } }\n * 3. Nested in AND/OR: Recursively searches through logical operators\n\n * @param where - The WHERE clause to search\n * @returns Array of collection slugs if relationTo filter found, null otherwise\n */\nfunction extractRelationToFilter(where: Record<string, unknown>): null | string[] {\n if (!where || typeof where !== 'object') {\n return null\n }\n\n // Check for direct relationTo conditions\n if (where.relationTo && typeof where.relationTo === 'object') {\n const relationTo = where.relationTo as Record<string, unknown>\n if (relationTo.in && Array.isArray(relationTo.in)) {\n return relationTo.in as string[]\n }\n if (relationTo.equals) {\n return [relationTo.equals as string]\n }\n }\n\n // Check for relationTo in logical operators\n if (where.and && Array.isArray(where.and)) {\n const allResults: string[] = []\n for (const condition of where.and) {\n const result = extractRelationToFilter(condition)\n if (result) {\n allResults.push(...result)\n }\n }\n if (allResults.length > 0) {\n return [...new Set(allResults)] // Remove duplicates\n }\n }\n\n if (where.or && Array.isArray(where.or)) {\n const allResults: string[] = []\n for (const condition of where.or) {\n const result = extractRelationToFilter(condition)\n if (result) {\n allResults.push(...result)\n }\n }\n if (allResults.length > 0) {\n return [...new Set(allResults)] // Remove duplicates\n }\n }\n\n return null\n}\n\n/**\n * Filters a WHERE clause to only include fields that exist in the target collection\n * This is needed for polymorphic joins where different collections have different fields\n * @param where - The original WHERE clause\n * @param availableFields - The fields available in the target collection\n * @param excludeRelationTo - Whether to exclude relationTo field (for individual collections)\n * @returns A filtered WHERE clause, or null if the query cannot match this collection\n */\nfunction filterWhereForCollection(\n where: Record<string, unknown>,\n availableFields: Array<{ name: string }>,\n excludeRelationTo: boolean = false,\n): null | Record<string, unknown> {\n if (!where || typeof where !== 'object') {\n return where\n }\n\n const fieldNames = new Set(availableFields.map((f) => f.name))\n // Add special fields that are available in polymorphic relationships\n if (!excludeRelationTo) {\n fieldNames.add('relationTo')\n }\n\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'and') {\n // Handle AND operator - all conditions must be satisfiable\n if (Array.isArray(value)) {\n const filteredConditions: Record<string, unknown>[] = []\n\n for (const condition of value) {\n const filteredCondition = filterWhereForCollection(\n condition,\n availableFields,\n excludeRelationTo,\n )\n\n // If any condition in AND cannot be satisfied, the whole AND fails\n if (filteredCondition === null) {\n return null\n }\n\n if (Object.keys(filteredCondition).length > 0) {\n filteredConditions.push(filteredCondition)\n }\n }\n\n if (filteredConditions.length > 0) {\n filtered[key] = filteredConditions\n }\n }\n } else if (key === 'or') {\n // Handle OR operator - at least one condition must be satisfiable\n if (Array.isArray(value)) {\n const filteredConditions = value\n .map((condition) =>\n filterWhereForCollection(condition, availableFields, excludeRelationTo),\n )\n .filter((condition) => condition !== null && Object.keys(condition).length > 0)\n\n if (filteredConditions.length > 0) {\n filtered[key] = filteredConditions\n }\n // If no OR conditions can be satisfied, we still continue (OR is more permissive)\n }\n } else if (key === 'relationTo' && excludeRelationTo) {\n // Skip relationTo field for non-polymorphic collections\n continue\n } else if (fieldNames.has(key)) {\n // Include the condition if the field exists in this collection\n filtered[key] = value\n } else {\n // Field doesn't exist in this collection - this makes the query unsatisfiable\n return null\n }\n }\n\n return filtered\n}\n\ntype SanitizedJoin = SanitizedJoins[string][number]\n\n/**\n * Builds projection for join queries\n */\nfunction buildJoinProjection(\n baseFieldName: string,\n useDrafts: boolean,\n sort: Record<string, string>,\n): Record<string, 1> {\n const projection: Record<string, 1> = {\n _id: 1,\n [baseFieldName]: 1,\n }\n\n if (useDrafts) {\n projection.parent = 1\n }\n\n for (const fieldName of Object.keys(sort)) {\n projection[fieldName] = 1\n }\n\n return projection\n}\n\n/**\n * Enhanced utility function to safely traverse nested object properties using dot notation\n * Handles arrays by searching through array elements for matching values\n * @param doc - The document to traverse\n * @param path - Dot-separated path (e.g., \"array.category\")\n * @returns Array of values found at the specified path (for arrays) or single value\n */\nfunction getByPathWithArrays(doc: unknown, path: string): unknown[] {\n const segments = path.split('.')\n let current = doc\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!\n\n if (current === undefined || current === null) {\n return []\n }\n\n // Get the value at the current segment\n const value = (current as Record<string, unknown>)[segment]\n\n if (value === undefined || value === null) {\n return []\n }\n\n // If this is the last segment, return the value(s)\n if (i === segments.length - 1) {\n return Array.isArray(value) ? value : [value]\n }\n\n // If the value is an array and we have more segments to traverse\n if (Array.isArray(value)) {\n const remainingPath = segments.slice(i + 1).join('.')\n const results: unknown[] = []\n\n // Search through each array element\n for (const item of value) {\n if (item && typeof item === 'object') {\n const subResults = getByPathWithArrays(item, remainingPath)\n results.push(...subResults)\n }\n }\n\n return results\n }\n\n // Continue traversing\n current = value\n }\n\n return []\n}\n"],"names":["appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldShouldBeLocalized","buildQuery","buildSortParam","transform","resolveJoins","adapter","collectionSlug","docs","joins","locale","projection","versions","length","collectionConfig","payload","collections","config","joinMap","target","joinList","Object","entries","join","joinPath","targetCollection","polymorphicJoins","field","collection","joinPromises","map","joinQuery","joinDef","allCollections","Array","isArray","localizationConfig","localization","effectiveLocale","defaultLocale","relationToFilter","extractRelationToFilter","where","filter","col","includes","isPolymorphicJoin","limit","defaultLimit","page","skip","collectionPromises","joinCollectionSlug","targetConfig","useDrafts","Boolean","drafts","JoinModel","slug","parentIDs","d","parent","_id","id","whereQuery","filterWhereForCollection","flattenedFields","latest","equals","fields","dbFieldName","on","pathSegments","split","transformedSegments","i","segment","push","fieldAtSegment","find","f","name","localized","isPolymorphic","targetField","relationTo","$in","sort","defaultSort","timestamps","buildJoinProjection","results","dbCount","Promise","all","lean","resolve","countDocuments","count","data","operation","collectionResults","grouped","totalCount","collectionResult","result","parentValues","getByPathWithArrays","parentValue","value","joinData","parentKey","__joinData","values","a","b","fieldName","sortOrder","aValue","bValue","doc","localeSuffix","parentIsLocalized","localizedJoinPath","joinResults","joinResult","slice","hasNextPage","totalDocs","segments","ref","version","seg","in","and","allResults","condition","Set","or","availableFields","excludeRelationTo","fieldNames","add","filtered","key","filteredConditions","filteredCondition","keys","has","baseFieldName","path","current","undefined","remainingPath","item","subResults"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,KAAK,EAQN,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,KAAK,EAQN,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAgPlD,KAAK,IAAI,GAAG;IACV,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,8BAA8B;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzD,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AA0KD,eAAO,MAAM,SAAS,+HAYnB,IAAI,qBAsXN,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Types } from 'mongoose';
|
|
2
2
|
import { flattenAllFields, traverseFields } from 'payload';
|
|
3
3
|
import { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared';
|
|
4
|
+
import { isObjectID } from './isObjectID.js';
|
|
4
5
|
function isValidRelationObject(value) {
|
|
5
6
|
return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value;
|
|
6
7
|
}
|
|
@@ -43,7 +44,7 @@ function isValidRelationObject(value) {
|
|
|
43
44
|
const convertRelationshipValue = ({ operation, relatedCollection, validateRelationships, value })=>{
|
|
44
45
|
const customIDField = relatedCollection.fields.find((field)=>fieldAffectsData(field) && field.name === 'id');
|
|
45
46
|
if (operation === 'read') {
|
|
46
|
-
if (value
|
|
47
|
+
if (isObjectID(value)) {
|
|
47
48
|
return value.toHexString();
|
|
48
49
|
}
|
|
49
50
|
return value;
|
|
@@ -68,7 +69,7 @@ const sanitizeRelationship = ({ config, field, locale, operation, ref, validateR
|
|
|
68
69
|
if (operation === 'read' && value && typeof value === 'object' && 'docs' in value && Array.isArray(value.docs)) {
|
|
69
70
|
for(let i = 0; i < value.docs.length; i++){
|
|
70
71
|
const item = value.docs[i];
|
|
71
|
-
if (item
|
|
72
|
+
if (isObjectID(item)) {
|
|
72
73
|
value.docs[i] = item.toHexString();
|
|
73
74
|
} else if (Array.isArray(field.collection) && item) {
|
|
74
75
|
// Fields here for polymorphic joins cannot be determinted, JSON.parse needed
|
|
@@ -326,7 +327,7 @@ export const transform = ({ $addToSet, $inc, $pull, $push, adapter, data, fields
|
|
|
326
327
|
delete data['__v'];
|
|
327
328
|
data.id = data._id || data.id;
|
|
328
329
|
delete data['_id'];
|
|
329
|
-
if (data.id
|
|
330
|
+
if (isObjectID(data.id)) {
|
|
330
331
|
data.id = data.id.toHexString();
|
|
331
332
|
}
|
|
332
333
|
// Handle BigInt conversion for custom ID fields of type 'number'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/transform.ts"],"sourcesContent":["import type {\n CollectionConfig,\n DateField,\n Field,\n FlattenedBlock,\n FlattenedField,\n JoinField,\n RelationshipField,\n SanitizedConfig,\n TraverseFieldsCallback,\n UploadField,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { flattenAllFields, traverseFields } from 'payload'\nimport { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\ninterface RelationObject {\n relationTo: string\n value: number | string\n}\n\nfunction isValidRelationObject(value: unknown): value is RelationObject {\n return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value\n}\n\n/**\n * Process relationship values for polymorphic and simple relationships\n * Used by both $push and $remove operations\n */\nconst processRelationshipValues = (\n items: unknown[],\n field: RelationshipField | UploadField,\n config: SanitizedConfig,\n operation: 'read' | 'write',\n validateRelationships: boolean,\n) => {\n return items.map((item) => {\n // Handle polymorphic relationships\n if (Array.isArray(field.relationTo) && isValidRelationObject(item)) {\n const relatedCollection = config.collections?.find(({ slug }) => slug === item.relationTo)\n if (relatedCollection) {\n return {\n relationTo: item.relationTo,\n value: convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: item.value,\n }),\n }\n }\n return item\n }\n\n // Handle simple relationships\n if (typeof field.relationTo === 'string') {\n const relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n if (relatedCollection) {\n return convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: item,\n })\n }\n }\n\n return item\n })\n}\n\nconst convertRelationshipValue = ({\n operation,\n relatedCollection,\n validateRelationships,\n value,\n}: {\n operation: Args['operation']\n relatedCollection: CollectionConfig\n validateRelationships?: boolean\n value: unknown\n}) => {\n const customIDField = relatedCollection.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n if (operation === 'read') {\n if (value instanceof Types.ObjectId) {\n return value.toHexString()\n }\n\n return value\n }\n\n if (customIDField) {\n return value\n }\n\n if (typeof value === 'string') {\n try {\n return new Types.ObjectId(value)\n } catch (e) {\n if (validateRelationships) {\n throw e\n }\n return value\n }\n }\n\n return value\n}\n\nconst sanitizeRelationship = ({\n config,\n field,\n locale,\n operation,\n ref,\n validateRelationships,\n value,\n}: {\n config: SanitizedConfig\n field: JoinField | RelationshipField | UploadField\n locale?: string\n operation: Args['operation']\n ref: Record<string, unknown>\n validateRelationships?: boolean\n value?: unknown\n}) => {\n if (field.type === 'join') {\n if (\n operation === 'read' &&\n value &&\n typeof value === 'object' &&\n 'docs' in value &&\n Array.isArray(value.docs)\n ) {\n for (let i = 0; i < value.docs.length; i++) {\n const item = value.docs[i]\n\n if (item instanceof Types.ObjectId) {\n value.docs[i] = item.toHexString()\n } else if (Array.isArray(field.collection) && item) {\n // Fields here for polymorphic joins cannot be determinted, JSON.parse needed\n value.docs[i] = JSON.parse(JSON.stringify(value.docs[i]))\n }\n }\n }\n\n return value\n }\n let relatedCollection: CollectionConfig | undefined\n let result = value\n\n const hasManyRelations = typeof field.relationTo !== 'string'\n\n if (!hasManyRelations) {\n relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n }\n\n if (Array.isArray(value)) {\n result = value.map((val) => {\n // Handle has many - polymorphic\n if (isValidRelationObject(val)) {\n const relatedCollectionForSingleValue = config.collections?.find(\n ({ slug }) => slug === val.relationTo,\n )\n\n if (relatedCollectionForSingleValue) {\n return {\n relationTo: val.relationTo,\n value: convertRelationshipValue({\n operation,\n relatedCollection: relatedCollectionForSingleValue,\n validateRelationships,\n value: val.value,\n }),\n }\n }\n }\n\n if (relatedCollection) {\n return convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: val,\n })\n }\n\n return val\n })\n }\n // Handle has one - polymorphic\n else if (isValidRelationObject(value)) {\n relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo)\n\n if (relatedCollection) {\n result = {\n relationTo: value.relationTo,\n value: convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: value.value,\n }),\n }\n }\n }\n // Handle has one\n else if (relatedCollection) {\n result = convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value,\n })\n }\n\n if (locale) {\n ref[locale] = result\n } else {\n ref[field.name] = result\n }\n}\n\nconst sanitizeDate = ({\n field,\n locale,\n ref,\n value,\n}: {\n field: DateField\n locale?: string\n ref: Record<string, unknown>\n value: unknown\n}) => {\n if (!value) {\n return\n }\n\n if (value instanceof Date) {\n value = value.toISOString()\n }\n\n if (locale) {\n ref[locale] = value\n } else {\n ref[field.name] = value\n }\n}\n\ntype Args = {\n $addToSet?: Record<string, { $each: any[] } | any>\n $inc?: Record<string, number>\n $pull?: Record<string, { $in: any[] } | any>\n $push?: Record<string, { $each: any[] } | any>\n /** instance of the adapter */\n adapter: MongooseAdapter\n /** data to transform, can be an array of documents or a single document */\n data: Record<string, unknown> | Record<string, unknown>[]\n /** fields accossiated with the data */\n fields: Field[]\n /** slug of the global, pass only when the operation is `write` */\n globalSlug?: string\n /**\n * Type of the operation\n * read - sanitizes ObjectIDs, Date to strings.\n * write - sanitizes string relationships to ObjectIDs.\n */\n operation: 'read' | 'write'\n parentIsLocalized?: boolean\n /**\n * Throw errors on invalid relationships\n * @default true\n */\n validateRelationships?: boolean\n}\n\nconst stripFields = ({\n config,\n data,\n fields,\n reservedKeys = [],\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n reservedKeys?: string[]\n}) => {\n for (const k in data) {\n if (!fields.some((field) => field.name === k) && !reservedKeys.includes(k)) {\n delete data[k]\n }\n }\n\n for (const field of fields) {\n reservedKeys = []\n const fieldData = data[field.name]\n if (!fieldData || typeof fieldData !== 'object') {\n continue\n }\n\n if (field.type === 'blocks') {\n reservedKeys.push('blockType')\n }\n\n if ('flattenedFields' in field || 'blocks' in field) {\n if (field.localized && config.localization) {\n for (const localeKey in fieldData) {\n if (!config.localization.localeCodes.some((code) => code === localeKey)) {\n delete fieldData[localeKey]\n continue\n }\n\n const localeData = fieldData[localeKey]\n\n if (!localeData || typeof localeData !== 'object') {\n if (field.type === 'blocks') {\n fieldData[localeKey] = []\n }\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(localeData)) {\n continue\n }\n\n let hasNull = false\n for (let i = 0; i < localeData.length; i++) {\n const data = localeData[i]\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n let maybeBlock: FlattenedBlock | undefined = undefined\n\n if (field.blockReferences) {\n const maybeBlockReference = field.blockReferences.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n\n if (maybeBlockReference) {\n if (typeof maybeBlockReference === 'object') {\n maybeBlock = maybeBlockReference\n } else {\n maybeBlock = config.blocks?.find((each) => each.slug === maybeBlockReference)\n }\n }\n }\n\n if (!maybeBlock) {\n maybeBlock = field.blocks.find((each) => each.slug === data.blockType)\n }\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n localeData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({ config, data, fields, reservedKeys })\n }\n\n if (hasNull) {\n fieldData[localeKey] = localeData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({ config, data: localeData, fields: field.flattenedFields, reservedKeys })\n }\n }\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(fieldData)) {\n continue\n }\n\n let hasNull = false\n\n for (let i = 0; i < fieldData.length; i++) {\n const data = fieldData[i]\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n let maybeBlock: FlattenedBlock | undefined = undefined\n\n if (field.blockReferences) {\n const maybeBlockReference = field.blockReferences.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n\n if (maybeBlockReference) {\n if (typeof maybeBlockReference === 'object') {\n maybeBlock = maybeBlockReference\n } else {\n maybeBlock = config.blocks?.find((each) => each.slug === maybeBlockReference)\n }\n }\n }\n\n if (!maybeBlock) {\n maybeBlock = field.blocks.find((each) => each.slug === data.blockType)\n }\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n fieldData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({ config, data, fields, reservedKeys })\n }\n\n if (hasNull) {\n data[field.name] = fieldData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({ config, data: fieldData, fields: field.flattenedFields, reservedKeys })\n }\n }\n }\n}\n\nexport const transform = ({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data,\n fields,\n globalSlug,\n operation,\n parentIsLocalized = false,\n validateRelationships = true,\n}: Args) => {\n if (!data) {\n return null\n }\n\n if (Array.isArray(data)) {\n for (const item of data) {\n transform({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data: item,\n fields,\n globalSlug,\n operation,\n validateRelationships,\n })\n }\n return\n }\n\n const {\n payload: { config },\n } = adapter\n\n if (operation === 'read') {\n delete data['__v']\n data.id = data._id || data.id\n delete data['_id']\n\n if (data.id instanceof Types.ObjectId) {\n data.id = data.id.toHexString()\n }\n\n // Handle BigInt conversion for custom ID fields of type 'number'\n if (adapter.useBigIntForNumberIDs && typeof data.id === 'bigint') {\n data.id = Number(data.id)\n }\n\n if (!adapter.allowAdditionalKeys) {\n stripFields({\n config,\n data,\n fields: flattenAllFields({ cache: true, fields }),\n reservedKeys: ['id', 'globalType'],\n })\n }\n }\n\n if (operation === 'write' && globalSlug) {\n data.globalType = globalSlug\n }\n\n const sanitize: TraverseFieldsCallback = ({\n field,\n parentIsLocalized,\n parentPath,\n parentRef: incomingParentRef,\n ref: incomingRef,\n }) => {\n if (!incomingRef || typeof incomingRef !== 'object') {\n return\n }\n\n const ref = incomingRef as Record<string, unknown>\n const parentRef = (incomingParentRef || {}) as Record<string, unknown>\n\n // Clear empty parent containers by setting them to undefined.\n const clearEmptyContainer = () => {\n if (!parentRef || typeof parentRef !== 'object') {\n return\n }\n if (!ref || typeof ref !== 'object') {\n return\n }\n if (Object.keys(ref).length > 0) {\n return\n }\n const containerKey = Object.keys(parentRef).find((k) => parentRef[k] === ref)\n if (containerKey) {\n parentRef[containerKey] = undefined\n }\n }\n\n if (\n $inc &&\n field.type === 'number' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (value && typeof value === 'object' && '$inc' in value && typeof value.$inc === 'number') {\n $inc[`${parentPath}${field.name}`] = value.$inc\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n\n if (\n $push &&\n field.type === 'array' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue && typeof localeValue === 'object' && '$push' in localeValue,\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}.${localeKey}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}.${localeKey}`] = push\n }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const push = value.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}`] = push\n }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $push operation for relationship fields (converts to $addToSet)\n\n // Handle $push operation for relationship fields (converts to $addToSet) - unified approach\n if (\n $addToSet &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$push' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n const localeItems = Array.isArray(push) ? push : [push]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n )\n $addToSet[`${parentPath}${field.name}.${localeKey}`] = { $each: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const itemsToAppend = Array.isArray(value.$push) ? value.$push : [value.$push]\n const processedItems = processRelationshipValues(\n itemsToAppend,\n field,\n config,\n operation,\n validateRelationships,\n )\n $addToSet[`${parentPath}${field.name}`] = { $each: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $remove operation for relationship fields (converts to $pull)\n if (\n $pull &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (\n value &&\n typeof value === 'object' &&\n ('$remove' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$remove' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $remove: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$remove' in localeValue) {\n hasLocaleOperations = true\n const remove = localeValue.$remove\n const localeItems = Array.isArray(remove) ? remove : [remove]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n )\n $pull[`${parentPath}${field.name}.${localeKey}`] = { $in: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$remove' in value) {\n // Handle non-localized fields: { field: { $remove: data } }\n const itemsToRemove = Array.isArray(value.$remove) ? value.$remove : [value.$remove]\n const processedItems = processRelationshipValues(\n itemsToRemove,\n field,\n config,\n operation,\n validateRelationships,\n )\n $pull[`${parentPath}${field.name}`] = { $in: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n if (field.type === 'date' && operation === 'read' && field.name in ref && ref[field.name]) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (!fieldRef || typeof fieldRef !== 'object') {\n return\n }\n\n for (const locale of config.localization.localeCodes) {\n sanitizeDate({\n field,\n locale,\n ref: fieldRef,\n value: fieldRef[locale],\n })\n }\n } else {\n sanitizeDate({\n field,\n ref,\n value: ref[field.name],\n })\n }\n }\n\n if (\n field.type === 'relationship' ||\n field.type === 'upload' ||\n (operation === 'read' && field.type === 'join')\n ) {\n if (!ref[field.name]) {\n return\n }\n\n // handle localized relationships\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const locales = config.localization.locales\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (typeof fieldRef !== 'object') {\n return\n }\n\n for (const { code } of locales) {\n const value = fieldRef[code]\n if (value) {\n sanitizeRelationship({\n config,\n field,\n locale: code,\n operation,\n ref: fieldRef,\n validateRelationships,\n value,\n })\n }\n }\n } else {\n // handle non-localized relationships\n sanitizeRelationship({\n config,\n field,\n locale: undefined,\n operation,\n ref,\n validateRelationships,\n value: ref[field.name],\n })\n }\n }\n }\n\n traverseFields({\n callback: sanitize,\n config,\n fields,\n fillEmpty: false,\n parentIsLocalized,\n ref: data,\n })\n\n if (operation === 'write') {\n if (typeof data.updatedAt === 'undefined') {\n // If data.updatedAt is explicitly set to `null` we should not set it - this means we don't want to change the value of updatedAt.\n data.updatedAt = new Date().toISOString()\n } else if (data.updatedAt === null) {\n // `updatedAt` may be explicitly set to null to disable updating it - if that is the case, we need to delete the property. Keeping it as null will\n // cause the database to think we want to set it to null, which we don't.\n delete data.updatedAt\n }\n }\n}\n"],"names":["Types","flattenAllFields","traverseFields","fieldAffectsData","fieldShouldBeLocalized","isValidRelationObject","value","processRelationshipValues","items","field","config","operation","validateRelationships","map","item","Array","isArray","relationTo","relatedCollection","collections","find","slug","convertRelationshipValue","customIDField","fields","name","ObjectId","toHexString","e","sanitizeRelationship","locale","ref","type","docs","i","length","collection","JSON","parse","stringify","result","hasManyRelations","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","stripFields","data","reservedKeys","k","some","includes","fieldData","push","localized","localization","localeKey","localeCodes","code","localeData","hasNull","flattenedFields","maybeBlock","undefined","blockReferences","maybeBlockReference","each","blockType","blocks","filter","Boolean","transform","$addToSet","$inc","$pull","$push","adapter","globalSlug","parentIsLocalized","payload","id","_id","useBigIntForNumberIDs","Number","allowAdditionalKeys","cache","globalType","sanitize","parentPath","parentRef","incomingParentRef","incomingRef","clearEmptyContainer","Object","keys","containerKey","values","localeValue","hasLocaleOperations","entries","forEach","$each","hasMany","localeItems","processedLocaleItems","itemsToAppend","processedItems","remove","$remove","$in","itemsToRemove","fieldRef","locales","callback","fillEmpty","updatedAt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/transform.ts"],"sourcesContent":["import type {\n CollectionConfig,\n DateField,\n Field,\n FlattenedBlock,\n FlattenedField,\n JoinField,\n RelationshipField,\n SanitizedConfig,\n TraverseFieldsCallback,\n UploadField,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { flattenAllFields, traverseFields } from 'payload'\nimport { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { isObjectID } from './isObjectID.js'\n\ninterface RelationObject {\n relationTo: string\n value: number | string\n}\n\nfunction isValidRelationObject(value: unknown): value is RelationObject {\n return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value\n}\n\n/**\n * Process relationship values for polymorphic and simple relationships\n * Used by both $push and $remove operations\n */\nconst processRelationshipValues = (\n items: unknown[],\n field: RelationshipField | UploadField,\n config: SanitizedConfig,\n operation: 'read' | 'write',\n validateRelationships: boolean,\n) => {\n return items.map((item) => {\n // Handle polymorphic relationships\n if (Array.isArray(field.relationTo) && isValidRelationObject(item)) {\n const relatedCollection = config.collections?.find(({ slug }) => slug === item.relationTo)\n if (relatedCollection) {\n return {\n relationTo: item.relationTo,\n value: convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: item.value,\n }),\n }\n }\n return item\n }\n\n // Handle simple relationships\n if (typeof field.relationTo === 'string') {\n const relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n if (relatedCollection) {\n return convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: item,\n })\n }\n }\n\n return item\n })\n}\n\nconst convertRelationshipValue = ({\n operation,\n relatedCollection,\n validateRelationships,\n value,\n}: {\n operation: Args['operation']\n relatedCollection: CollectionConfig\n validateRelationships?: boolean\n value: unknown\n}) => {\n const customIDField = relatedCollection.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n if (operation === 'read') {\n if (isObjectID(value)) {\n return value.toHexString()\n }\n\n return value\n }\n\n if (customIDField) {\n return value\n }\n\n if (typeof value === 'string') {\n try {\n return new Types.ObjectId(value)\n } catch (e) {\n if (validateRelationships) {\n throw e\n }\n return value\n }\n }\n\n return value\n}\n\nconst sanitizeRelationship = ({\n config,\n field,\n locale,\n operation,\n ref,\n validateRelationships,\n value,\n}: {\n config: SanitizedConfig\n field: JoinField | RelationshipField | UploadField\n locale?: string\n operation: Args['operation']\n ref: Record<string, unknown>\n validateRelationships?: boolean\n value?: unknown\n}) => {\n if (field.type === 'join') {\n if (\n operation === 'read' &&\n value &&\n typeof value === 'object' &&\n 'docs' in value &&\n Array.isArray(value.docs)\n ) {\n for (let i = 0; i < value.docs.length; i++) {\n const item = value.docs[i]\n\n if (isObjectID(item)) {\n value.docs[i] = item.toHexString()\n } else if (Array.isArray(field.collection) && item) {\n // Fields here for polymorphic joins cannot be determinted, JSON.parse needed\n value.docs[i] = JSON.parse(JSON.stringify(value.docs[i]))\n }\n }\n }\n\n return value\n }\n let relatedCollection: CollectionConfig | undefined\n let result = value\n\n const hasManyRelations = typeof field.relationTo !== 'string'\n\n if (!hasManyRelations) {\n relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n }\n\n if (Array.isArray(value)) {\n result = value.map((val) => {\n // Handle has many - polymorphic\n if (isValidRelationObject(val)) {\n const relatedCollectionForSingleValue = config.collections?.find(\n ({ slug }) => slug === val.relationTo,\n )\n\n if (relatedCollectionForSingleValue) {\n return {\n relationTo: val.relationTo,\n value: convertRelationshipValue({\n operation,\n relatedCollection: relatedCollectionForSingleValue,\n validateRelationships,\n value: val.value,\n }),\n }\n }\n }\n\n if (relatedCollection) {\n return convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: val,\n })\n }\n\n return val\n })\n }\n // Handle has one - polymorphic\n else if (isValidRelationObject(value)) {\n relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo)\n\n if (relatedCollection) {\n result = {\n relationTo: value.relationTo,\n value: convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value: value.value,\n }),\n }\n }\n }\n // Handle has one\n else if (relatedCollection) {\n result = convertRelationshipValue({\n operation,\n relatedCollection,\n validateRelationships,\n value,\n })\n }\n\n if (locale) {\n ref[locale] = result\n } else {\n ref[field.name] = result\n }\n}\n\nconst sanitizeDate = ({\n field,\n locale,\n ref,\n value,\n}: {\n field: DateField\n locale?: string\n ref: Record<string, unknown>\n value: unknown\n}) => {\n if (!value) {\n return\n }\n\n if (value instanceof Date) {\n value = value.toISOString()\n }\n\n if (locale) {\n ref[locale] = value\n } else {\n ref[field.name] = value\n }\n}\n\ntype Args = {\n $addToSet?: Record<string, { $each: any[] } | any>\n $inc?: Record<string, number>\n $pull?: Record<string, { $in: any[] } | any>\n $push?: Record<string, { $each: any[] } | any>\n /** instance of the adapter */\n adapter: MongooseAdapter\n /** data to transform, can be an array of documents or a single document */\n data: Record<string, unknown> | Record<string, unknown>[]\n /** fields accossiated with the data */\n fields: Field[]\n /** slug of the global, pass only when the operation is `write` */\n globalSlug?: string\n /**\n * Type of the operation\n * read - sanitizes ObjectIDs, Date to strings.\n * write - sanitizes string relationships to ObjectIDs.\n */\n operation: 'read' | 'write'\n parentIsLocalized?: boolean\n /**\n * Throw errors on invalid relationships\n * @default true\n */\n validateRelationships?: boolean\n}\n\nconst stripFields = ({\n config,\n data,\n fields,\n reservedKeys = [],\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n reservedKeys?: string[]\n}) => {\n for (const k in data) {\n if (!fields.some((field) => field.name === k) && !reservedKeys.includes(k)) {\n delete data[k]\n }\n }\n\n for (const field of fields) {\n reservedKeys = []\n const fieldData = data[field.name]\n if (!fieldData || typeof fieldData !== 'object') {\n continue\n }\n\n if (field.type === 'blocks') {\n reservedKeys.push('blockType')\n }\n\n if ('flattenedFields' in field || 'blocks' in field) {\n if (field.localized && config.localization) {\n for (const localeKey in fieldData) {\n if (!config.localization.localeCodes.some((code) => code === localeKey)) {\n delete fieldData[localeKey]\n continue\n }\n\n const localeData = fieldData[localeKey]\n\n if (!localeData || typeof localeData !== 'object') {\n if (field.type === 'blocks') {\n fieldData[localeKey] = []\n }\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(localeData)) {\n continue\n }\n\n let hasNull = false\n for (let i = 0; i < localeData.length; i++) {\n const data = localeData[i]\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n let maybeBlock: FlattenedBlock | undefined = undefined\n\n if (field.blockReferences) {\n const maybeBlockReference = field.blockReferences.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n\n if (maybeBlockReference) {\n if (typeof maybeBlockReference === 'object') {\n maybeBlock = maybeBlockReference\n } else {\n maybeBlock = config.blocks?.find((each) => each.slug === maybeBlockReference)\n }\n }\n }\n\n if (!maybeBlock) {\n maybeBlock = field.blocks.find((each) => each.slug === data.blockType)\n }\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n localeData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({ config, data, fields, reservedKeys })\n }\n\n if (hasNull) {\n fieldData[localeKey] = localeData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({ config, data: localeData, fields: field.flattenedFields, reservedKeys })\n }\n }\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(fieldData)) {\n continue\n }\n\n let hasNull = false\n\n for (let i = 0; i < fieldData.length; i++) {\n const data = fieldData[i]\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n let maybeBlock: FlattenedBlock | undefined = undefined\n\n if (field.blockReferences) {\n const maybeBlockReference = field.blockReferences.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n\n if (maybeBlockReference) {\n if (typeof maybeBlockReference === 'object') {\n maybeBlock = maybeBlockReference\n } else {\n maybeBlock = config.blocks?.find((each) => each.slug === maybeBlockReference)\n }\n }\n }\n\n if (!maybeBlock) {\n maybeBlock = field.blocks.find((each) => each.slug === data.blockType)\n }\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n fieldData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({ config, data, fields, reservedKeys })\n }\n\n if (hasNull) {\n data[field.name] = fieldData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({ config, data: fieldData, fields: field.flattenedFields, reservedKeys })\n }\n }\n }\n}\n\nexport const transform = ({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data,\n fields,\n globalSlug,\n operation,\n parentIsLocalized = false,\n validateRelationships = true,\n}: Args) => {\n if (!data) {\n return null\n }\n\n if (Array.isArray(data)) {\n for (const item of data) {\n transform({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data: item,\n fields,\n globalSlug,\n operation,\n validateRelationships,\n })\n }\n return\n }\n\n const {\n payload: { config },\n } = adapter\n\n if (operation === 'read') {\n delete data['__v']\n data.id = data._id || data.id\n delete data['_id']\n\n if (isObjectID(data.id)) {\n data.id = data.id.toHexString()\n }\n\n // Handle BigInt conversion for custom ID fields of type 'number'\n if (adapter.useBigIntForNumberIDs && typeof data.id === 'bigint') {\n data.id = Number(data.id)\n }\n\n if (!adapter.allowAdditionalKeys) {\n stripFields({\n config,\n data,\n fields: flattenAllFields({ cache: true, fields }),\n reservedKeys: ['id', 'globalType'],\n })\n }\n }\n\n if (operation === 'write' && globalSlug) {\n data.globalType = globalSlug\n }\n\n const sanitize: TraverseFieldsCallback = ({\n field,\n parentIsLocalized,\n parentPath,\n parentRef: incomingParentRef,\n ref: incomingRef,\n }) => {\n if (!incomingRef || typeof incomingRef !== 'object') {\n return\n }\n\n const ref = incomingRef as Record<string, unknown>\n const parentRef = (incomingParentRef || {}) as Record<string, unknown>\n\n // Clear empty parent containers by setting them to undefined.\n const clearEmptyContainer = () => {\n if (!parentRef || typeof parentRef !== 'object') {\n return\n }\n if (!ref || typeof ref !== 'object') {\n return\n }\n if (Object.keys(ref).length > 0) {\n return\n }\n const containerKey = Object.keys(parentRef).find((k) => parentRef[k] === ref)\n if (containerKey) {\n parentRef[containerKey] = undefined\n }\n }\n\n if (\n $inc &&\n field.type === 'number' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (value && typeof value === 'object' && '$inc' in value && typeof value.$inc === 'number') {\n $inc[`${parentPath}${field.name}`] = value.$inc\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n\n if (\n $push &&\n field.type === 'array' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue && typeof localeValue === 'object' && '$push' in localeValue,\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}.${localeKey}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}.${localeKey}`] = push\n }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const push = value.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}`] = push\n }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $push operation for relationship fields (converts to $addToSet)\n\n // Handle $push operation for relationship fields (converts to $addToSet) - unified approach\n if (\n $addToSet &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$push' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n const localeItems = Array.isArray(push) ? push : [push]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n )\n $addToSet[`${parentPath}${field.name}.${localeKey}`] = { $each: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const itemsToAppend = Array.isArray(value.$push) ? value.$push : [value.$push]\n const processedItems = processRelationshipValues(\n itemsToAppend,\n field,\n config,\n operation,\n validateRelationships,\n )\n $addToSet[`${parentPath}${field.name}`] = { $each: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $remove operation for relationship fields (converts to $pull)\n if (\n $pull &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (\n value &&\n typeof value === 'object' &&\n ('$remove' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$remove' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $remove: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$remove' in localeValue) {\n hasLocaleOperations = true\n const remove = localeValue.$remove\n const localeItems = Array.isArray(remove) ? remove : [remove]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n )\n $pull[`${parentPath}${field.name}.${localeKey}`] = { $in: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$remove' in value) {\n // Handle non-localized fields: { field: { $remove: data } }\n const itemsToRemove = Array.isArray(value.$remove) ? value.$remove : [value.$remove]\n const processedItems = processRelationshipValues(\n itemsToRemove,\n field,\n config,\n operation,\n validateRelationships,\n )\n $pull[`${parentPath}${field.name}`] = { $in: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n if (field.type === 'date' && operation === 'read' && field.name in ref && ref[field.name]) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (!fieldRef || typeof fieldRef !== 'object') {\n return\n }\n\n for (const locale of config.localization.localeCodes) {\n sanitizeDate({\n field,\n locale,\n ref: fieldRef,\n value: fieldRef[locale],\n })\n }\n } else {\n sanitizeDate({\n field,\n ref,\n value: ref[field.name],\n })\n }\n }\n\n if (\n field.type === 'relationship' ||\n field.type === 'upload' ||\n (operation === 'read' && field.type === 'join')\n ) {\n if (!ref[field.name]) {\n return\n }\n\n // handle localized relationships\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const locales = config.localization.locales\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (typeof fieldRef !== 'object') {\n return\n }\n\n for (const { code } of locales) {\n const value = fieldRef[code]\n if (value) {\n sanitizeRelationship({\n config,\n field,\n locale: code,\n operation,\n ref: fieldRef,\n validateRelationships,\n value,\n })\n }\n }\n } else {\n // handle non-localized relationships\n sanitizeRelationship({\n config,\n field,\n locale: undefined,\n operation,\n ref,\n validateRelationships,\n value: ref[field.name],\n })\n }\n }\n }\n\n traverseFields({\n callback: sanitize,\n config,\n fields,\n fillEmpty: false,\n parentIsLocalized,\n ref: data,\n })\n\n if (operation === 'write') {\n if (typeof data.updatedAt === 'undefined') {\n // If data.updatedAt is explicitly set to `null` we should not set it - this means we don't want to change the value of updatedAt.\n data.updatedAt = new Date().toISOString()\n } else if (data.updatedAt === null) {\n // `updatedAt` may be explicitly set to null to disable updating it - if that is the case, we need to delete the property. Keeping it as null will\n // cause the database to think we want to set it to null, which we don't.\n delete data.updatedAt\n }\n }\n}\n"],"names":["Types","flattenAllFields","traverseFields","fieldAffectsData","fieldShouldBeLocalized","isObjectID","isValidRelationObject","value","processRelationshipValues","items","field","config","operation","validateRelationships","map","item","Array","isArray","relationTo","relatedCollection","collections","find","slug","convertRelationshipValue","customIDField","fields","name","toHexString","ObjectId","e","sanitizeRelationship","locale","ref","type","docs","i","length","collection","JSON","parse","stringify","result","hasManyRelations","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","stripFields","data","reservedKeys","k","some","includes","fieldData","push","localized","localization","localeKey","localeCodes","code","localeData","hasNull","flattenedFields","maybeBlock","undefined","blockReferences","maybeBlockReference","each","blockType","blocks","filter","Boolean","transform","$addToSet","$inc","$pull","$push","adapter","globalSlug","parentIsLocalized","payload","id","_id","useBigIntForNumberIDs","Number","allowAdditionalKeys","cache","globalType","sanitize","parentPath","parentRef","incomingParentRef","incomingRef","clearEmptyContainer","Object","keys","containerKey","values","localeValue","hasLocaleOperations","entries","forEach","$each","hasMany","localeItems","processedLocaleItems","itemsToAppend","processedItems","remove","$remove","$in","itemsToRemove","fieldRef","locales","callback","fillEmpty","updatedAt"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/db-mongodb",
|
|
3
|
-
"version": "3.60.0-internal.
|
|
3
|
+
"version": "3.60.0-internal.c130254",
|
|
4
4
|
"description": "The officially supported MongoDB database adapter for Payload",
|
|
5
5
|
"homepage": "https://payloadcms.com",
|
|
6
6
|
"repository": {
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"mongodb": "6.16.0",
|
|
51
51
|
"mongodb-memory-server": "10.1.4",
|
|
52
52
|
"@payloadcms/eslint-config": "3.28.0",
|
|
53
|
-
"payload": "3.60.0-internal.
|
|
53
|
+
"payload": "3.60.0-internal.c130254"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"payload": "3.60.0-internal.
|
|
56
|
+
"payload": "3.60.0-internal.c130254"
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
59
|
"build": "pnpm build:types && pnpm build:swc",
|