@payloadcms/db-mongodb 4.0.0-internal.d1cc1d3 → 4.0.0-internal.d21c039

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/connect.d.ts.map +1 -1
  2. package/dist/connect.js +8 -2
  3. package/dist/connect.js.map +1 -1
  4. package/dist/create.d.ts.map +1 -1
  5. package/dist/create.js +2 -1
  6. package/dist/create.js.map +1 -1
  7. package/dist/createGlobalVersion.js +1 -1
  8. package/dist/createGlobalVersion.js.map +1 -1
  9. package/dist/createMigration.d.ts.map +1 -1
  10. package/dist/createMigration.js +9 -2
  11. package/dist/createMigration.js.map +1 -1
  12. package/dist/createVersion.js +1 -1
  13. package/dist/createVersion.js.map +1 -1
  14. package/dist/find.js +1 -1
  15. package/dist/find.js.map +1 -1
  16. package/dist/findDistinct.d.ts.map +1 -1
  17. package/dist/findDistinct.js +52 -8
  18. package/dist/findDistinct.js.map +1 -1
  19. package/dist/findOne.js +1 -1
  20. package/dist/findOne.js.map +1 -1
  21. package/dist/migrateFresh.d.ts +4 -2
  22. package/dist/migrateFresh.d.ts.map +1 -1
  23. package/dist/migrateFresh.js +20 -6
  24. package/dist/migrateFresh.js.map +1 -1
  25. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  26. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +4 -4
  27. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  28. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  29. package/dist/queries/buildSearchParams.js +189 -6
  30. package/dist/queries/buildSearchParams.js.map +1 -1
  31. package/dist/queries/parseParams.js.map +1 -1
  32. package/dist/queryDrafts.js +1 -1
  33. package/dist/queryDrafts.js.map +1 -1
  34. package/dist/utilities/buildJoinAggregation.d.ts +1 -1
  35. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  36. package/dist/utilities/buildJoinAggregation.js +2 -2
  37. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  38. package/dist/utilities/transform.d.ts.map +1 -1
  39. package/dist/utilities/transform.js +15 -0
  40. package/dist/utilities/transform.js.map +1 -1
  41. package/package.json +5 -5
  42. package/dist/queries/buildSortParam.spec.js +0 -123
  43. package/dist/queries/buildSortParam.spec.js.map +0 -1
  44. package/dist/queries/getLocalizedSortProperty.spec.js +0 -215
  45. package/dist/queries/getLocalizedSortProperty.spec.js.map +0 -1
  46. package/dist/utilities/transform.spec.js +0 -479
  47. package/dist/utilities/transform.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n type CollectionSlug,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SanitizedCollectionConfig,\n} from 'payload'\nimport { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n draftsEnabled?: boolean\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[] | undefined> => {\n if (!adapter.useJoinAggregations) {\n return\n }\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return\n }\n\n const joinConfig = adapter.payload.collections[collection]?.config?.joins\n\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n count = false,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n fields: aggregatedFields,\n locale,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n const basePipeline = [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ],\n },\n },\n ]\n\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n\n if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\n },\n ],\n },\n })\n }\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\n },\n })\n }\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n const projectionPath = versions ? `version.${join.joinPath}` : join.joinPath\n if (projection && !projection[projectionPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const collectionConfig = adapter.payload.collections[join.field.collection as string]?.config\n\n if (!collectionConfig) {\n throw new APIError(\n `Collection config for ${join.field.collection.toString()} was not found`,\n )\n }\n\n let JoinModel: CollectionModel | undefined\n\n const useDrafts = (draftsEnabled || versions) && hasDraftsEnabled(collectionConfig)\n\n if (useDrafts) {\n JoinModel = adapter.versions[collectionConfig.slug]\n } else {\n JoinModel = adapter.collections[collectionConfig.slug]\n }\n\n if (!JoinModel) {\n throw new APIError(`Join Model was not found for ${collectionConfig.slug}`)\n }\n\n const {\n count,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, collectionConfig, true)\n : collectionConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts ? getQueryDraftsSort({ collectionConfig, sort: sortJoin }) : sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]!\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const $match = await JoinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: useDrafts\n ? combineQueries(appendVersionToQueryKey(whereJoin), {\n latest: {\n equals: true,\n },\n })\n : whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline: [\n {\n $match,\n },\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\n )\n\n let foreignFieldPrefix = ''\n\n if (useDrafts) {\n foreignFieldPrefix = 'version.'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(\n as,\n `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n )\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${foreignField}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (count) {\n addTotalDocsAggregation(as, `${foreignFieldPrefix}${foreignField}`)\n }\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n return aggregate\n}\n"],"names":["APIError","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldShouldBeLocalized","hasDraftsEnabled","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","collection","collectionConfig","draftsEnabled","joins","locale","projection","versions","useJoinAggregations","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$ifNull","$first","$set","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","projectionPath","toString","useDrafts","Array","isArray","Error","latest","equals","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","localField","foreignFieldPrefix","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n type CollectionSlug,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SanitizedCollectionConfig,\n} from 'payload'\nimport { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n draftsEnabled?: boolean\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[]> => {\n if (!adapter.useJoinAggregations) {\n return []\n }\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return []\n }\n\n const joinConfig = adapter.payload.collections[collection]?.config?.joins\n\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n count = false,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n fields: aggregatedFields,\n locale,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n const basePipeline = [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ],\n },\n },\n ]\n\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n\n if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\n },\n ],\n },\n })\n }\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\n },\n })\n }\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n const projectionPath = versions ? `version.${join.joinPath}` : join.joinPath\n if (projection && !projection[projectionPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const collectionConfig = adapter.payload.collections[join.field.collection as string]?.config\n\n if (!collectionConfig) {\n throw new APIError(\n `Collection config for ${join.field.collection.toString()} was not found`,\n )\n }\n\n let JoinModel: CollectionModel | undefined\n\n const useDrafts = (draftsEnabled || versions) && hasDraftsEnabled(collectionConfig)\n\n if (useDrafts) {\n JoinModel = adapter.versions[collectionConfig.slug]\n } else {\n JoinModel = adapter.collections[collectionConfig.slug]\n }\n\n if (!JoinModel) {\n throw new APIError(`Join Model was not found for ${collectionConfig.slug}`)\n }\n\n const {\n count,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, collectionConfig, true)\n : collectionConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts ? getQueryDraftsSort({ collectionConfig, sort: sortJoin }) : sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]!\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const $match = await JoinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: useDrafts\n ? combineQueries(appendVersionToQueryKey(whereJoin), {\n latest: {\n equals: true,\n },\n })\n : whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline: [\n {\n $match,\n },\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\n )\n\n let foreignFieldPrefix = ''\n\n if (useDrafts) {\n foreignFieldPrefix = 'version.'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(\n as,\n `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n )\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${foreignField}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (count) {\n addTotalDocsAggregation(as, `${foreignFieldPrefix}${foreignField}`)\n }\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n return aggregate\n}\n"],"names":["APIError","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldShouldBeLocalized","hasDraftsEnabled","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","collection","collectionConfig","draftsEnabled","joins","locale","projection","versions","useJoinAggregations","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$ifNull","$first","$set","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","projectionPath","toString","useDrafts","Array","isArray","Error","latest","equals","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","localField","foreignFieldPrefix","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath"],"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;AAmQlD,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;AA2KD;;;GAGG;AACH,eAAO,MAAM,SAAS,+HAYnB,IAAI,qBA6XN,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;AAyQlD,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;AAyLD;;;GAGG;AACH,eAAO,MAAM,SAAS,+HAYnB,IAAI,qBA6XN,CAAA"}
@@ -92,6 +92,11 @@ const sanitizeRelationship = ({ adapter, config, field, locale, operation, ref,
92
92
  }
93
93
  if (Array.isArray(value)) {
94
94
  result = value.map((val)=>{
95
+ // Skip null/undefined entries so a stray null in a hasMany relationship
96
+ // array doesn't get coerced or crash downstream sanitization.
97
+ if (val === null || typeof val === 'undefined') {
98
+ return val;
99
+ }
95
100
  // Handle has many - polymorphic
96
101
  if (isValidRelationObject(val)) {
97
102
  const relatedCollectionForSingleValue = config.collections?.find(({ slug })=>slug === val.relationTo);
@@ -198,6 +203,11 @@ const stripFields = ({ config, data, fields, parentIsLocalized = false, reserved
198
203
  let hasNull = false;
199
204
  for(let i = 0; i < localeData.length; i++){
200
205
  const data = localeData[i];
206
+ if (!data || typeof data !== 'object') {
207
+ localeData[i] = null;
208
+ hasNull = true;
209
+ continue;
210
+ }
201
211
  let fields = null;
202
212
  if (field.type === 'array') {
203
213
  fields = field.flattenedFields;
@@ -248,6 +258,11 @@ const stripFields = ({ config, data, fields, parentIsLocalized = false, reserved
248
258
  let hasNull = false;
249
259
  for(let i = 0; i < fieldData.length; i++){
250
260
  const data = fieldData[i];
261
+ if (!data || typeof data !== 'object') {
262
+ fieldData[i] = null;
263
+ hasNull = true;
264
+ continue;
265
+ }
251
266
  let fields = null;
252
267
  if (field.type === 'array') {
253
268
  fields = field.flattenedFields;
@@ -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\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 adapter: MongooseAdapter,\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 adapter,\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 adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: item,\n })\n }\n }\n\n return item\n })\n}\n\nconst convertRelationshipValue = ({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\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 if (\n customIDField?.type === 'number' &&\n typeof value === 'bigint' &&\n adapter.useBigIntForNumberIDs\n ) {\n return Number(value)\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 adapter,\n config,\n field,\n locale,\n operation,\n ref,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\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 adapter,\n operation,\n relatedCollection: relatedCollectionForSingleValue,\n validateRelationships,\n value: val.value,\n }),\n }\n }\n }\n\n if (relatedCollection) {\n return convertRelationshipValue({\n adapter,\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 adapter,\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 adapter,\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 parentIsLocalized = false,\n reservedKeys = [],\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n parentIsLocalized?: boolean\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 const shouldLocalizeField = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'blocks') {\n reservedKeys.push('blockType')\n }\n\n if ('flattenedFields' in field || 'blocks' in field) {\n if (shouldLocalizeField && 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 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 const blockOrSlug = field.blocks.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n const maybeBlock: FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? config.blocks?.find((each) => each.slug === blockOrSlug)\n : blockOrSlug\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({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n fieldData[localeKey] = localeData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: localeData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\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 const blockOrSlug = field.blocks.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n const maybeBlock: FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? config.blocks?.find((each) => each.slug === blockOrSlug)\n : blockOrSlug\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({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n data[field.name] = fieldData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: fieldData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n }\n }\n}\n\n/**\n * A function that transforms Payload <-> MongoDB data.\n * @internal - this function may be removed or receive breaking changes in minor releases.\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 parentIsLocalized: false,\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 adapter,\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 adapter,\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 adapter,\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 adapter,\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 adapter,\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 adapter,\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","adapter","map","item","Array","isArray","relationTo","relatedCollection","collections","find","slug","convertRelationshipValue","customIDField","fields","name","toHexString","type","useBigIntForNumberIDs","Number","ObjectId","e","sanitizeRelationship","locale","ref","docs","i","length","collection","JSON","parse","stringify","result","hasManyRelations","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","stripFields","data","parentIsLocalized","reservedKeys","k","some","includes","fieldData","shouldLocalizeField","push","localization","localeKey","localeCodes","code","localeData","hasNull","flattenedFields","blockOrSlug","blocks","each","blockType","maybeBlock","localized","filter","Boolean","transform","$addToSet","$inc","$pull","$push","globalSlug","payload","id","_id","allowAdditionalKeys","cache","globalType","sanitize","parentPath","parentRef","incomingParentRef","incomingRef","clearEmptyContainer","Object","keys","containerKey","undefined","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 adapter: MongooseAdapter,\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 adapter,\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 adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: item,\n })\n }\n }\n\n return item\n })\n}\n\nconst convertRelationshipValue = ({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\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 if (\n customIDField?.type === 'number' &&\n typeof value === 'bigint' &&\n adapter.useBigIntForNumberIDs\n ) {\n return Number(value)\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 adapter,\n config,\n field,\n locale,\n operation,\n ref,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\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 // Skip null/undefined entries so a stray null in a hasMany relationship\n // array doesn't get coerced or crash downstream sanitization.\n if (val === null || typeof val === 'undefined') {\n return val\n }\n\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 adapter,\n operation,\n relatedCollection: relatedCollectionForSingleValue,\n validateRelationships,\n value: val.value,\n }),\n }\n }\n }\n\n if (relatedCollection) {\n return convertRelationshipValue({\n adapter,\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 adapter,\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 adapter,\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 parentIsLocalized = false,\n reservedKeys = [],\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n parentIsLocalized?: boolean\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 const shouldLocalizeField = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'blocks') {\n reservedKeys.push('blockType')\n }\n\n if ('flattenedFields' in field || 'blocks' in field) {\n if (shouldLocalizeField && 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 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\n if (!data || typeof data !== 'object') {\n localeData[i] = null\n hasNull = true\n continue\n }\n\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n const blockOrSlug = field.blocks.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n const maybeBlock: FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? config.blocks?.find((each) => each.slug === blockOrSlug)\n : blockOrSlug\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({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n fieldData[localeKey] = localeData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: localeData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\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\n if (!data || typeof data !== 'object') {\n fieldData[i] = null\n hasNull = true\n continue\n }\n\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n const blockOrSlug = field.blocks.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n const maybeBlock: FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? config.blocks?.find((each) => each.slug === blockOrSlug)\n : blockOrSlug\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({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n data[field.name] = fieldData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: fieldData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n }\n }\n}\n\n/**\n * A function that transforms Payload <-> MongoDB data.\n * @internal - this function may be removed or receive breaking changes in minor releases.\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 parentIsLocalized: false,\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 adapter,\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 adapter,\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 adapter,\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 adapter,\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 adapter,\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 adapter,\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","adapter","map","item","Array","isArray","relationTo","relatedCollection","collections","find","slug","convertRelationshipValue","customIDField","fields","name","toHexString","type","useBigIntForNumberIDs","Number","ObjectId","e","sanitizeRelationship","locale","ref","docs","i","length","collection","JSON","parse","stringify","result","hasManyRelations","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","stripFields","data","parentIsLocalized","reservedKeys","k","some","includes","fieldData","shouldLocalizeField","push","localization","localeKey","localeCodes","code","localeData","hasNull","flattenedFields","blockOrSlug","blocks","each","blockType","maybeBlock","localized","filter","Boolean","transform","$addToSet","$inc","$pull","$push","globalSlug","payload","id","_id","allowAdditionalKeys","cache","globalType","sanitize","parentPath","parentRef","incomingParentRef","incomingRef","clearEmptyContainer","Object","keys","containerKey","undefined","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": "4.0.0-internal.d1cc1d3",
3
+ "version": "4.0.0-internal.d21c039",
4
4
  "description": "The officially supported MongoDB database adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -43,7 +43,7 @@
43
43
  "predefinedMigrations"
44
44
  ],
45
45
  "dependencies": {
46
- "mongoose": "8.22.1",
46
+ "mongoose": "9.9.2",
47
47
  "mongoose-paginate-v2": "1.9.4",
48
48
  "prompts": "2.4.2",
49
49
  "uuid": "14.0.0"
@@ -51,13 +51,13 @@
51
51
  "devDependencies": {
52
52
  "@types/mongoose-aggregate-paginate-v2": "1.0.12",
53
53
  "@types/prompts": "^2.4.5",
54
- "mongodb": "6.20.0",
54
+ "mongodb": "7.5.0",
55
55
  "mongodb-memory-server": "10.1.4",
56
56
  "@payloadcms/eslint-config": "3.28.0",
57
- "payload": "4.0.0-internal.d1cc1d3"
57
+ "payload": "4.0.0-internal.d21c039"
58
58
  },
59
59
  "peerDependencies": {
60
- "payload": "4.0.0-internal.d1cc1d3"
60
+ "payload": "4.0.0-internal.d21c039"
61
61
  },
62
62
  "scripts": {
63
63
  "build": "pnpm build:types && pnpm build:swc",
@@ -1,123 +0,0 @@
1
- import { describe, beforeAll, it, expect } from 'vitest';
2
- import { sanitizeConfig } from 'payload';
3
- import { buildSortParam } from './buildSortParam.js';
4
- let config;
5
- describe('builds sort params', ()=>{
6
- beforeAll(async ()=>{
7
- config = sanitizeConfig({
8
- localization: {
9
- defaultLocale: 'en',
10
- fallback: true,
11
- locales: [
12
- 'en',
13
- 'es'
14
- ]
15
- }
16
- });
17
- });
18
- it('adds a fallback on non-unique field', ()=>{
19
- const result = buildSortParam({
20
- config,
21
- parentIsLocalized: false,
22
- fields: [
23
- {
24
- name: 'title',
25
- type: 'text'
26
- },
27
- {
28
- name: 'order',
29
- type: 'number'
30
- }
31
- ],
32
- locale: 'en',
33
- sort: 'order',
34
- timestamps: true,
35
- adapter: {
36
- disableFallbackSort: false
37
- }
38
- });
39
- expect(result).toStrictEqual({
40
- order: 'asc',
41
- createdAt: 'desc'
42
- });
43
- });
44
- it('adds a fallback when sort isnt provided', ()=>{
45
- const result = buildSortParam({
46
- config,
47
- parentIsLocalized: false,
48
- fields: [
49
- {
50
- name: 'title',
51
- type: 'text'
52
- },
53
- {
54
- name: 'order',
55
- type: 'number'
56
- }
57
- ],
58
- locale: 'en',
59
- sort: undefined,
60
- timestamps: true,
61
- adapter: {
62
- disableFallbackSort: false
63
- }
64
- });
65
- expect(result).toStrictEqual({
66
- createdAt: 'desc'
67
- });
68
- });
69
- it('does not add a fallback on non-unique field when disableFallbackSort is true', ()=>{
70
- const result = buildSortParam({
71
- config,
72
- parentIsLocalized: false,
73
- fields: [
74
- {
75
- name: 'title',
76
- type: 'text'
77
- },
78
- {
79
- name: 'order',
80
- type: 'number'
81
- }
82
- ],
83
- locale: 'en',
84
- sort: 'order',
85
- timestamps: true,
86
- adapter: {
87
- disableFallbackSort: true
88
- }
89
- });
90
- expect(result).toStrictEqual({
91
- order: 'asc'
92
- });
93
- });
94
- // This test should be true even when disableFallbackSort is false
95
- it('does not add a fallback on unique field', ()=>{
96
- const result = buildSortParam({
97
- config,
98
- parentIsLocalized: false,
99
- fields: [
100
- {
101
- name: 'title',
102
- type: 'text'
103
- },
104
- {
105
- name: 'order',
106
- type: 'number',
107
- unique: true
108
- }
109
- ],
110
- locale: 'en',
111
- sort: 'order',
112
- timestamps: true,
113
- adapter: {
114
- disableFallbackSort: false
115
- }
116
- });
117
- expect(result).toStrictEqual({
118
- order: 'asc'
119
- });
120
- });
121
- });
122
-
123
- //# sourceMappingURL=buildSortParam.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/queries/buildSortParam.spec.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from 'payload'\nimport { describe, beforeAll, it, expect } from 'vitest'\n\nimport { sanitizeConfig } from 'payload'\n\nimport { buildSortParam } from './buildSortParam.js'\nimport { MongooseAdapter } from '../index.js'\n\nlet config: SanitizedConfig\n\ndescribe('builds sort params', () => {\n beforeAll(async () => {\n config = sanitizeConfig({\n localization: {\n defaultLocale: 'en',\n fallback: true,\n locales: ['en', 'es'],\n },\n } as Config)\n })\n it('adds a fallback on non-unique field', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc', createdAt: 'desc' })\n })\n\n it('adds a fallback when sort isnt provided', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: undefined,\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ createdAt: 'desc' })\n })\n\n it('does not add a fallback on non-unique field when disableFallbackSort is true', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: true,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc' })\n })\n\n // This test should be true even when disableFallbackSort is false\n it('does not add a fallback on unique field', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n unique: true, // Marking this field as unique\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc' })\n })\n})\n"],"names":["describe","beforeAll","it","expect","sanitizeConfig","buildSortParam","config","localization","defaultLocale","fallback","locales","result","parentIsLocalized","fields","name","type","locale","sort","timestamps","adapter","disableFallbackSort","toStrictEqual","order","createdAt","undefined","unique"],"mappings":"AACA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,EAAE,EAAEC,MAAM,QAAQ,SAAQ;AAExD,SAASC,cAAc,QAAQ,UAAS;AAExC,SAASC,cAAc,QAAQ,sBAAqB;AAGpD,IAAIC;AAEJN,SAAS,sBAAsB;IAC7BC,UAAU;QACRK,SAASF,eAAe;YACtBG,cAAc;gBACZC,eAAe;gBACfC,UAAU;gBACVC,SAAS;oBAAC;oBAAM;iBAAK;YACvB;QACF;IACF;IACAR,GAAG,uCAAuC;QACxC,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;YAAOC,WAAW;QAAO;IACjE;IAEArB,GAAG,2CAA2C;QAC5C,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAMO;YACNN,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEE,WAAW;QAAO;IACnD;IAEArB,GAAG,gFAAgF;QACjF,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;QAAM;IAC9C;IAEA,kEAAkE;IAClEpB,GAAG,2CAA2C;QAC5C,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;oBACNU,QAAQ;gBACV;aACD;YACDT,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;QAAM;IAC9C;AACF"}