@payloadcms/db-mongodb 3.10.0 → 3.11.0

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 (125) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +22 -18
  3. package/dist/count.js.map +1 -1
  4. package/dist/countGlobalVersions.d.ts.map +1 -1
  5. package/dist/countGlobalVersions.js +22 -18
  6. package/dist/countGlobalVersions.js.map +1 -1
  7. package/dist/countVersions.d.ts.map +1 -1
  8. package/dist/countVersions.js +22 -18
  9. package/dist/countVersions.js.map +1 -1
  10. package/dist/create.d.ts.map +1 -1
  11. package/dist/create.js +24 -21
  12. package/dist/create.js.map +1 -1
  13. package/dist/createGlobal.d.ts.map +1 -1
  14. package/dist/createGlobal.js +20 -20
  15. package/dist/createGlobal.js.map +1 -1
  16. package/dist/createGlobalVersion.d.ts.map +1 -1
  17. package/dist/createGlobalVersion.js +30 -33
  18. package/dist/createGlobalVersion.js.map +1 -1
  19. package/dist/createVersion.d.ts.map +1 -1
  20. package/dist/createVersion.js +31 -34
  21. package/dist/createVersion.js.map +1 -1
  22. package/dist/deleteMany.d.ts.map +1 -1
  23. package/dist/deleteMany.js +4 -5
  24. package/dist/deleteMany.js.map +1 -1
  25. package/dist/deleteOne.d.ts.map +1 -1
  26. package/dist/deleteOne.js +14 -18
  27. package/dist/deleteOne.js.map +1 -1
  28. package/dist/deleteVersions.d.ts.map +1 -1
  29. package/dist/deleteVersions.js +1 -2
  30. package/dist/deleteVersions.js.map +1 -1
  31. package/dist/find.d.ts.map +1 -1
  32. package/dist/find.js +74 -39
  33. package/dist/find.js.map +1 -1
  34. package/dist/findGlobal.d.ts.map +1 -1
  35. package/dist/findGlobal.js +17 -18
  36. package/dist/findGlobal.js.map +1 -1
  37. package/dist/findGlobalVersions.d.ts.map +1 -1
  38. package/dist/findGlobalVersions.js +62 -32
  39. package/dist/findGlobalVersions.js.map +1 -1
  40. package/dist/findOne.d.ts.map +1 -1
  41. package/dist/findOne.js +20 -29
  42. package/dist/findOne.js.map +1 -1
  43. package/dist/findVersions.d.ts.map +1 -1
  44. package/dist/findVersions.js +61 -32
  45. package/dist/findVersions.js.map +1 -1
  46. package/dist/index.d.ts +0 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +0 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/migrateFresh.d.ts.map +1 -1
  51. package/dist/migrateFresh.js.map +1 -1
  52. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  53. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +14 -18
  54. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  55. package/dist/queries/buildAndOrConditions.d.ts +1 -3
  56. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  57. package/dist/queries/buildAndOrConditions.js +1 -2
  58. package/dist/queries/buildAndOrConditions.js.map +1 -1
  59. package/dist/queries/buildQuery.d.ts +0 -2
  60. package/dist/queries/buildQuery.d.ts.map +1 -1
  61. package/dist/queries/buildQuery.js +6 -2
  62. package/dist/queries/buildQuery.js.map +1 -1
  63. package/dist/queries/buildSearchParams.d.ts +1 -3
  64. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  65. package/dist/queries/buildSearchParams.js +10 -14
  66. package/dist/queries/buildSearchParams.js.map +1 -1
  67. package/dist/queries/buildSortParam.d.ts +7 -1
  68. package/dist/queries/buildSortParam.d.ts.map +1 -1
  69. package/dist/queries/buildSortParam.js +2 -2
  70. package/dist/queries/buildSortParam.js.map +1 -1
  71. package/dist/queries/getLocalizedSortProperty.js +2 -2
  72. package/dist/queries/getLocalizedSortProperty.js.map +1 -1
  73. package/dist/queries/parseParams.d.ts +1 -3
  74. package/dist/queries/parseParams.d.ts.map +1 -1
  75. package/dist/queries/parseParams.js +1 -2
  76. package/dist/queries/parseParams.js.map +1 -1
  77. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  78. package/dist/queries/sanitizeQueryValue.js +0 -16
  79. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  80. package/dist/queryDrafts.d.ts.map +1 -1
  81. package/dist/queryDrafts.js +66 -40
  82. package/dist/queryDrafts.js.map +1 -1
  83. package/dist/updateGlobal.d.ts.map +1 -1
  84. package/dist/updateGlobal.js +21 -24
  85. package/dist/updateGlobal.js.map +1 -1
  86. package/dist/updateGlobalVersion.d.ts.map +1 -1
  87. package/dist/updateGlobalVersion.js +26 -28
  88. package/dist/updateGlobalVersion.js.map +1 -1
  89. package/dist/updateOne.d.ts.map +1 -1
  90. package/dist/updateOne.js +23 -28
  91. package/dist/updateOne.js.map +1 -1
  92. package/dist/updateVersion.d.ts.map +1 -1
  93. package/dist/updateVersion.js +24 -27
  94. package/dist/updateVersion.js.map +1 -1
  95. package/dist/utilities/buildJoinAggregation.d.ts +4 -4
  96. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  97. package/dist/utilities/buildJoinAggregation.js +28 -7
  98. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  99. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
  100. package/dist/utilities/buildProjectionFromSelect.js +1 -18
  101. package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
  102. package/dist/utilities/sanitizeInternalFields.d.ts +2 -0
  103. package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -0
  104. package/dist/utilities/sanitizeInternalFields.js +20 -0
  105. package/dist/utilities/sanitizeInternalFields.js.map +1 -0
  106. package/dist/utilities/sanitizeRelationshipIDs.d.ts +9 -0
  107. package/dist/utilities/sanitizeRelationshipIDs.d.ts.map +1 -0
  108. package/dist/utilities/sanitizeRelationshipIDs.js +125 -0
  109. package/dist/utilities/sanitizeRelationshipIDs.js.map +1 -0
  110. package/dist/utilities/{transform.spec.js → sanitizeRelationshipIDs.spec.js} +7 -23
  111. package/dist/utilities/sanitizeRelationshipIDs.spec.js.map +1 -0
  112. package/package.json +3 -3
  113. package/dist/utilities/findMany.d.ts +0 -20
  114. package/dist/utilities/findMany.d.ts.map +0 -1
  115. package/dist/utilities/findMany.js +0 -84
  116. package/dist/utilities/findMany.js.map +0 -1
  117. package/dist/utilities/getHasNearConstraint.d.ts +0 -3
  118. package/dist/utilities/getHasNearConstraint.d.ts.map +0 -1
  119. package/dist/utilities/getHasNearConstraint.js +0 -26
  120. package/dist/utilities/getHasNearConstraint.js.map +0 -1
  121. package/dist/utilities/transform.d.ts +0 -25
  122. package/dist/utilities/transform.d.ts.map +0 -1
  123. package/dist/utilities/transform.js +0 -254
  124. package/dist/utilities/transform.js.map +0 -1
  125. package/dist/utilities/transform.spec.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/sanitizeRelationshipIDs.spec.ts"],"sourcesContent":["import type { Field, SanitizedConfig } from 'payload'\n\nimport { Types } from 'mongoose'\n\nimport { sanitizeRelationshipIDs } from './sanitizeRelationshipIDs.js'\n\nconst flattenRelationshipValues = (obj: Record<string, any>, prefix = ''): Record<string, any> => {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value && typeof value === 'object' && !(value instanceof Types.ObjectId)) {\n Object.assign(acc, flattenRelationshipValues(value, fullKey))\n // skip relationTo and blockType\n } else if (!fullKey.endsWith('relationTo') && !fullKey.endsWith('blockType')) {\n acc[fullKey] = value\n }\n\n return acc\n },\n {} as Record<string, any>,\n )\n}\n\nconst relsFields: Field[] = [\n {\n name: 'rel_1',\n type: 'relationship',\n relationTo: 'rels',\n },\n {\n name: 'rel_1_l',\n type: 'relationship',\n localized: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_2',\n type: 'relationship',\n hasMany: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_2_l',\n type: 'relationship',\n hasMany: true,\n localized: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_3',\n type: 'relationship',\n relationTo: ['rels'],\n },\n {\n name: 'rel_3_l',\n type: 'relationship',\n localized: true,\n relationTo: ['rels'],\n },\n {\n name: 'rel_4',\n type: 'relationship',\n hasMany: true,\n relationTo: ['rels'],\n },\n {\n name: 'rel_4_l',\n type: 'relationship',\n hasMany: true,\n localized: true,\n relationTo: ['rels'],\n },\n]\n\nconst config = {\n collections: [\n {\n slug: 'docs',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: [\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [{ slug: 'block', fields: relsFields }],\n },\n ...relsFields,\n ],\n },\n {\n name: 'arrayLocalized',\n type: 'array',\n fields: [\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [{ slug: 'block', fields: relsFields }],\n },\n ...relsFields,\n ],\n localized: true,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [\n {\n slug: 'block',\n fields: [\n ...relsFields,\n {\n name: 'group',\n type: 'group',\n fields: relsFields,\n },\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n {\n name: 'group',\n type: 'group',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n },\n {\n name: 'groupLocalized',\n type: 'group',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n localized: true,\n },\n {\n name: 'groupAndRow',\n type: 'group',\n fields: [\n {\n type: 'row',\n fields: [\n ...relsFields,\n {\n type: 'array',\n name: 'array',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n {\n type: 'tabs',\n tabs: [\n {\n name: 'tab',\n fields: relsFields,\n },\n {\n name: 'tabLocalized',\n fields: relsFields,\n localized: true,\n },\n {\n label: 'another',\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'nestedTab',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n slug: 'rels',\n fields: [],\n },\n ],\n localization: {\n defaultLocale: 'en',\n localeCodes: ['en', 'es'],\n locales: [\n { code: 'en', label: 'EN' },\n { code: 'es', label: 'ES' },\n ],\n },\n} as SanitizedConfig\n\nconst relsData = {\n rel_1: new Types.ObjectId().toHexString(),\n rel_1_l: {\n en: new Types.ObjectId().toHexString(),\n es: new Types.ObjectId().toHexString(),\n },\n rel_2: [new Types.ObjectId().toHexString()],\n rel_2_l: {\n en: [new Types.ObjectId().toHexString()],\n es: [new Types.ObjectId().toHexString()],\n },\n rel_3: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n rel_3_l: {\n en: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n es: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n },\n rel_4: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n rel_4_l: {\n en: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n es: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n },\n}\n\ndescribe('sanitizeRelationshipIDs', () => {\n it('should sanitize relationships', () => {\n const data = {\n ...relsData,\n array: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n arrayLocalized: {\n en: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n es: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n },\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n array: [{ ...relsData }],\n group: { ...relsData },\n },\n ],\n group: {\n ...relsData,\n array: [{ ...relsData }],\n },\n groupAndRow: {\n ...relsData,\n array: [{ ...relsData }],\n },\n groupLocalized: {\n en: {\n ...relsData,\n array: [{ ...relsData }],\n },\n es: {\n ...relsData,\n array: [{ ...relsData }],\n },\n },\n tab: { ...relsData },\n tabLocalized: {\n en: { ...relsData },\n es: { ...relsData },\n },\n nestedTab: { ...relsData },\n }\n const flattenValuesBefore = Object.values(flattenRelationshipValues(data))\n\n sanitizeRelationshipIDs({ config, data, fields: config.collections[0].fields })\n const flattenValuesAfter = Object.values(flattenRelationshipValues(data))\n\n flattenValuesAfter.forEach((value, i) => {\n expect(value).toBeInstanceOf(Types.ObjectId)\n expect(flattenValuesBefore[i]).toBe(value.toHexString())\n })\n })\n})\n"],"names":["Types","sanitizeRelationshipIDs","flattenRelationshipValues","obj","prefix","Object","keys","reduce","acc","key","fullKey","value","ObjectId","assign","endsWith","relsFields","name","type","relationTo","localized","hasMany","config","collections","slug","fields","blocks","tabs","label","localization","defaultLocale","localeCodes","locales","code","relsData","rel_1","toHexString","rel_1_l","en","es","rel_2","rel_2_l","rel_3","rel_3_l","rel_4","rel_4_l","describe","it","data","array","blockType","arrayLocalized","group","groupAndRow","groupLocalized","tab","tabLocalized","nestedTab","flattenValuesBefore","values","flattenValuesAfter","forEach","i","expect","toBeInstanceOf","toBe"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/db-mongodb",
3
- "version": "3.10.0",
3
+ "version": "3.11.0",
4
4
  "description": "The officially supported MongoDB database adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -49,10 +49,10 @@
49
49
  "mongodb": "6.10.0",
50
50
  "mongodb-memory-server": "^9",
51
51
  "@payloadcms/eslint-config": "3.9.0",
52
- "payload": "3.10.0"
52
+ "payload": "3.11.0"
53
53
  },
54
54
  "peerDependencies": {
55
- "payload": "3.10.0"
55
+ "payload": "3.11.0"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "pnpm build:types && pnpm build:swc",
@@ -1,20 +0,0 @@
1
- import type { ClientSession, CollationOptions, Collection } from 'mongodb';
2
- import type { PipelineStage } from 'mongoose';
3
- import type { PaginatedDocs } from 'payload';
4
- import type { MongooseAdapter } from '../index.js';
5
- export declare const findMany: ({ adapter, collation, collection, joinAgreggation, limit, page, pagination, projection, query, session, skip, sort, useEstimatedCount, }: {
6
- adapter: MongooseAdapter;
7
- collation?: CollationOptions;
8
- collection: Collection;
9
- joinAgreggation?: PipelineStage[];
10
- limit?: number;
11
- page?: number;
12
- pagination?: boolean;
13
- projection?: Record<string, unknown>;
14
- query?: Record<string, unknown>;
15
- session?: ClientSession;
16
- skip?: number;
17
- sort?: Record<string, -1 | 1>;
18
- useEstimatedCount?: boolean;
19
- }) => Promise<PaginatedDocs>;
20
- //# sourceMappingURL=findMany.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../src/utilities/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAY,MAAM,SAAS,CAAA;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,eAAO,MAAM,QAAQ,6IAclB;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,UAAU,EAAE,UAAU,CAAA;IACtB,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,KAAG,OAAO,CAAC,aAAa,CA6FxB,CAAA"}
@@ -1,84 +0,0 @@
1
- export const findMany = async ({ adapter, collation, collection, joinAgreggation, limit, page = 1, pagination, projection, query = {}, session, skip, sort, useEstimatedCount })=>{
2
- if (!skip) {
3
- skip = (page - 1) * (limit ?? 0);
4
- }
5
- let docsPromise;
6
- let countPromise = Promise.resolve(null);
7
- if (joinAgreggation) {
8
- const aggregation = collection.aggregate([
9
- {
10
- $match: query
11
- }
12
- ], {
13
- collation,
14
- session
15
- });
16
- if (sort) {
17
- aggregation.sort(sort);
18
- }
19
- if (skip) {
20
- aggregation.skip(skip);
21
- }
22
- if (limit) {
23
- aggregation.limit(limit);
24
- }
25
- for (const stage of joinAgreggation){
26
- aggregation.addStage(stage);
27
- }
28
- if (projection) {
29
- aggregation.project(projection);
30
- }
31
- docsPromise = aggregation.toArray();
32
- } else {
33
- docsPromise = collection.find(query, {
34
- collation,
35
- limit,
36
- projection,
37
- session,
38
- skip,
39
- sort
40
- }).toArray();
41
- }
42
- if (pagination !== false && limit) {
43
- if (useEstimatedCount) {
44
- countPromise = collection.estimatedDocumentCount();
45
- } else {
46
- // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding
47
- // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,
48
- // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses
49
- // the correct indexed field
50
- const hint = adapter.disableIndexHints !== true ? {
51
- _id: 1
52
- } : undefined;
53
- countPromise = collection.countDocuments(query, {
54
- collation,
55
- hint,
56
- session
57
- });
58
- }
59
- }
60
- const [docs, countResult] = await Promise.all([
61
- docsPromise,
62
- countPromise
63
- ]);
64
- const count = countResult === null ? docs.length : countResult;
65
- const totalPages = pagination !== false && typeof limit === 'number' && limit !== 0 ? Math.ceil(count / limit) : 1;
66
- const hasPrevPage = pagination !== false && page > 1;
67
- const hasNextPage = pagination !== false && totalPages > page;
68
- const pagingCounter = pagination !== false && typeof limit === 'number' ? (page - 1) * limit + 1 : 1;
69
- const result = {
70
- docs,
71
- hasNextPage,
72
- hasPrevPage,
73
- limit,
74
- nextPage: hasNextPage ? page + 1 : null,
75
- page,
76
- pagingCounter,
77
- prevPage: hasPrevPage ? page - 1 : null,
78
- totalDocs: count,
79
- totalPages
80
- };
81
- return result;
82
- };
83
-
84
- //# sourceMappingURL=findMany.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/findMany.ts"],"sourcesContent":["import type { ClientSession, CollationOptions, Collection, Document } from 'mongodb'\nimport type { PipelineStage } from 'mongoose'\nimport type { PaginatedDocs } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nexport const findMany = async ({\n adapter,\n collation,\n collection,\n joinAgreggation,\n limit,\n page = 1,\n pagination,\n projection,\n query = {},\n session,\n skip,\n sort,\n useEstimatedCount,\n}: {\n adapter: MongooseAdapter\n collation?: CollationOptions\n collection: Collection\n joinAgreggation?: PipelineStage[]\n limit?: number\n page?: number\n pagination?: boolean\n projection?: Record<string, unknown>\n query?: Record<string, unknown>\n session?: ClientSession\n skip?: number\n sort?: Record<string, -1 | 1>\n useEstimatedCount?: boolean\n}): Promise<PaginatedDocs> => {\n if (!skip) {\n skip = (page - 1) * (limit ?? 0)\n }\n\n let docsPromise: Promise<Document[]>\n let countPromise: Promise<null | number> = Promise.resolve(null)\n\n if (joinAgreggation) {\n const aggregation = collection.aggregate(\n [\n {\n $match: query,\n },\n ],\n { collation, session },\n )\n\n if (sort) {\n aggregation.sort(sort)\n }\n\n if (skip) {\n aggregation.skip(skip)\n }\n\n if (limit) {\n aggregation.limit(limit)\n }\n\n for (const stage of joinAgreggation) {\n aggregation.addStage(stage)\n }\n\n if (projection) {\n aggregation.project(projection)\n }\n\n docsPromise = aggregation.toArray()\n } else {\n docsPromise = collection\n .find(query, {\n collation,\n limit,\n projection,\n session,\n skip,\n sort,\n })\n .toArray()\n }\n\n if (pagination !== false && limit) {\n if (useEstimatedCount) {\n countPromise = collection.estimatedDocumentCount()\n } else {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n\n const hint = adapter.disableIndexHints !== true ? { _id: 1 } : undefined\n\n countPromise = collection.countDocuments(query, { collation, hint, session })\n }\n }\n\n const [docs, countResult] = await Promise.all([docsPromise, countPromise])\n\n const count = countResult === null ? docs.length : countResult\n\n const totalPages =\n pagination !== false && typeof limit === 'number' && limit !== 0 ? Math.ceil(count / limit) : 1\n\n const hasPrevPage = pagination !== false && page > 1\n const hasNextPage = pagination !== false && totalPages > page\n const pagingCounter =\n pagination !== false && typeof limit === 'number' ? (page - 1) * limit + 1 : 1\n\n const result = {\n docs,\n hasNextPage,\n hasPrevPage,\n limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs: count,\n totalPages,\n } as PaginatedDocs<Record<string, unknown>>\n\n return result\n}\n"],"names":["findMany","adapter","collation","collection","joinAgreggation","limit","page","pagination","projection","query","session","skip","sort","useEstimatedCount","docsPromise","countPromise","Promise","resolve","aggregation","aggregate","$match","stage","addStage","project","toArray","find","estimatedDocumentCount","hint","disableIndexHints","_id","undefined","countDocuments","docs","countResult","all","count","length","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","result","nextPage","prevPage","totalDocs"],"mappings":"AAMA,OAAO,MAAMA,WAAW,OAAO,EAC7BC,OAAO,EACPC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,KAAK,EACLC,OAAO,CAAC,EACRC,UAAU,EACVC,UAAU,EACVC,QAAQ,CAAC,CAAC,EACVC,OAAO,EACPC,IAAI,EACJC,IAAI,EACJC,iBAAiB,EAelB;IACC,IAAI,CAACF,MAAM;QACTA,OAAO,AAACL,CAAAA,OAAO,CAAA,IAAMD,CAAAA,SAAS,CAAA;IAChC;IAEA,IAAIS;IACJ,IAAIC,eAAuCC,QAAQC,OAAO,CAAC;IAE3D,IAAIb,iBAAiB;QACnB,MAAMc,cAAcf,WAAWgB,SAAS,CACtC;YACE;gBACEC,QAAQX;YACV;SACD,EACD;YAAEP;YAAWQ;QAAQ;QAGvB,IAAIE,MAAM;YACRM,YAAYN,IAAI,CAACA;QACnB;QAEA,IAAID,MAAM;YACRO,YAAYP,IAAI,CAACA;QACnB;QAEA,IAAIN,OAAO;YACTa,YAAYb,KAAK,CAACA;QACpB;QAEA,KAAK,MAAMgB,SAASjB,gBAAiB;YACnCc,YAAYI,QAAQ,CAACD;QACvB;QAEA,IAAIb,YAAY;YACdU,YAAYK,OAAO,CAACf;QACtB;QAEAM,cAAcI,YAAYM,OAAO;IACnC,OAAO;QACLV,cAAcX,WACXsB,IAAI,CAAChB,OAAO;YACXP;YACAG;YACAG;YACAE;YACAC;YACAC;QACF,GACCY,OAAO;IACZ;IAEA,IAAIjB,eAAe,SAASF,OAAO;QACjC,IAAIQ,mBAAmB;YACrBE,eAAeZ,WAAWuB,sBAAsB;QAClD,OAAO;YACL,mHAAmH;YACnH,qHAAqH;YACrH,mHAAmH;YACnH,4BAA4B;YAE5B,MAAMC,OAAO1B,QAAQ2B,iBAAiB,KAAK,OAAO;gBAAEC,KAAK;YAAE,IAAIC;YAE/Df,eAAeZ,WAAW4B,cAAc,CAACtB,OAAO;gBAAEP;gBAAWyB;gBAAMjB;YAAQ;QAC7E;IACF;IAEA,MAAM,CAACsB,MAAMC,YAAY,GAAG,MAAMjB,QAAQkB,GAAG,CAAC;QAACpB;QAAaC;KAAa;IAEzE,MAAMoB,QAAQF,gBAAgB,OAAOD,KAAKI,MAAM,GAAGH;IAEnD,MAAMI,aACJ9B,eAAe,SAAS,OAAOF,UAAU,YAAYA,UAAU,IAAIiC,KAAKC,IAAI,CAACJ,QAAQ9B,SAAS;IAEhG,MAAMmC,cAAcjC,eAAe,SAASD,OAAO;IACnD,MAAMmC,cAAclC,eAAe,SAAS8B,aAAa/B;IACzD,MAAMoC,gBACJnC,eAAe,SAAS,OAAOF,UAAU,WAAW,AAACC,CAAAA,OAAO,CAAA,IAAKD,QAAQ,IAAI;IAE/E,MAAMsC,SAAS;QACbX;QACAS;QACAD;QACAnC;QACAuC,UAAUH,cAAcnC,OAAO,IAAI;QACnCA;QACAoC;QACAG,UAAUL,cAAclC,OAAO,IAAI;QACnCwC,WAAWX;QACXE;IACF;IAEA,OAAOM;AACT,EAAC"}
@@ -1,3 +0,0 @@
1
- import type { Where } from 'payload';
2
- export declare const getHasNearConstraint: (where?: Where) => boolean;
3
- //# sourceMappingURL=getHasNearConstraint.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getHasNearConstraint.d.ts","sourceRoot":"","sources":["../../src/utilities/getHasNearConstraint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,eAAO,MAAM,oBAAoB,WAAY,KAAK,KAAG,OAwBpD,CAAA"}
@@ -1,26 +0,0 @@
1
- export const getHasNearConstraint = (where)=>{
2
- if (!where) {
3
- return false;
4
- }
5
- for(const key in where){
6
- const value = where[key];
7
- if (Array.isArray(value) && [
8
- 'AND',
9
- 'OR'
10
- ].includes(key.toUpperCase())) {
11
- for (const where of value){
12
- if (getHasNearConstraint(where)) {
13
- return true;
14
- }
15
- }
16
- }
17
- for(const key in value){
18
- if (key === 'near') {
19
- return true;
20
- }
21
- }
22
- }
23
- return false;
24
- };
25
-
26
- //# sourceMappingURL=getHasNearConstraint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/getHasNearConstraint.ts"],"sourcesContent":["import type { Where } from 'payload'\n\nexport const getHasNearConstraint = (where?: Where): boolean => {\n if (!where) {\n return false\n }\n\n for (const key in where) {\n const value = where[key]\n\n if (Array.isArray(value) && ['AND', 'OR'].includes(key.toUpperCase())) {\n for (const where of value) {\n if (getHasNearConstraint(where)) {\n return true\n }\n }\n }\n\n for (const key in value) {\n if (key === 'near') {\n return true\n }\n }\n }\n\n return false\n}\n"],"names":["getHasNearConstraint","where","key","value","Array","isArray","includes","toUpperCase"],"mappings":"AAEA,OAAO,MAAMA,uBAAuB,CAACC;IACnC,IAAI,CAACA,OAAO;QACV,OAAO;IACT;IAEA,IAAK,MAAMC,OAAOD,MAAO;QACvB,MAAME,QAAQF,KAAK,CAACC,IAAI;QAExB,IAAIE,MAAMC,OAAO,CAACF,UAAU;YAAC;YAAO;SAAK,CAACG,QAAQ,CAACJ,IAAIK,WAAW,KAAK;YACrE,KAAK,MAAMN,SAASE,MAAO;gBACzB,IAAIH,qBAAqBC,QAAQ;oBAC/B,OAAO;gBACT;YACF;QACF;QAEA,IAAK,MAAMC,OAAOC,MAAO;YACvB,IAAID,QAAQ,QAAQ;gBAClB,OAAO;YACT;QACF;IACF;IAEA,OAAO;AACT,EAAC"}
@@ -1,25 +0,0 @@
1
- import type { FlattenedField } from 'payload';
2
- import type { MongooseAdapter } from '../index.js';
3
- type Args = {
4
- adapter: MongooseAdapter;
5
- data: Record<string, unknown> | Record<string, unknown>[];
6
- fields: FlattenedField[];
7
- globalSlug?: string;
8
- operation: 'create' | 'read' | 'update';
9
- /**
10
- * Set updatedAt and createdAt
11
- * @default true
12
- */
13
- timestamps?: boolean;
14
- /**
15
- * Throw errors on invalid relationships
16
- * @default true
17
- */
18
- validateRelationships?: boolean;
19
- };
20
- /**
21
- * @experimental This API can be changed without a major version bump.
22
- */
23
- export declare const transform: ({ adapter, data, fields, globalSlug, operation, timestamps, validateRelationships, }: Args) => void;
24
- export {};
25
- //# sourceMappingURL=transform.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAMf,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzD,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;IACvC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAwMD;;GAEG;AACH,eAAO,MAAM,SAAS,yFAQnB,IAAI,SA4IN,CAAA"}
@@ -1,254 +0,0 @@
1
- import { Types } from 'mongoose';
2
- import { traverseFields } from 'payload';
3
- import { fieldAffectsData, fieldIsVirtual } from 'payload/shared';
4
- function isValidRelationObject(value) {
5
- return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value;
6
- }
7
- const convertRelationshipValue = ({ operation, relatedCollection, validateRelationships, value })=>{
8
- const customIDField = relatedCollection.fields.find((field)=>fieldAffectsData(field) && field.name === 'id');
9
- if (operation === 'read') {
10
- if (value instanceof Types.ObjectId) {
11
- return value.toHexString();
12
- }
13
- return value;
14
- }
15
- if (customIDField) {
16
- return value;
17
- }
18
- if (typeof value === 'string') {
19
- try {
20
- return new Types.ObjectId(value);
21
- } catch (e) {
22
- if (validateRelationships) {
23
- throw e;
24
- }
25
- return value;
26
- }
27
- }
28
- return value;
29
- };
30
- const sanitizeRelationship = ({ config, field, locale, operation, ref, validateRelationships, value })=>{
31
- if (field.type === 'join') {
32
- if (operation === 'read' && value && typeof value === 'object' && 'docs' in value && Array.isArray(value.docs)) {
33
- for(let i = 0; i < value.docs.length; i++){
34
- const item = value.docs[i];
35
- if (item instanceof Types.ObjectId) {
36
- value.docs[i] = item.toHexString();
37
- }
38
- }
39
- }
40
- return value;
41
- }
42
- let relatedCollection;
43
- let result = value;
44
- const hasManyRelations = typeof field.relationTo !== 'string';
45
- if (!hasManyRelations) {
46
- relatedCollection = config.collections?.find(({ slug })=>slug === field.relationTo);
47
- }
48
- if (Array.isArray(value)) {
49
- result = value.map((val)=>{
50
- // Handle has many - polymorphic
51
- if (isValidRelationObject(val)) {
52
- const relatedCollectionForSingleValue = config.collections?.find(({ slug })=>slug === val.relationTo);
53
- if (relatedCollectionForSingleValue) {
54
- return {
55
- relationTo: val.relationTo,
56
- value: convertRelationshipValue({
57
- operation,
58
- relatedCollection: relatedCollectionForSingleValue,
59
- validateRelationships,
60
- value: val.value
61
- })
62
- };
63
- }
64
- }
65
- if (relatedCollection) {
66
- return convertRelationshipValue({
67
- operation,
68
- relatedCollection,
69
- validateRelationships,
70
- value: val
71
- });
72
- }
73
- return val;
74
- });
75
- } else if (isValidRelationObject(value)) {
76
- relatedCollection = config.collections?.find(({ slug })=>slug === value.relationTo);
77
- if (relatedCollection) {
78
- result = {
79
- relationTo: value.relationTo,
80
- value: convertRelationshipValue({
81
- operation,
82
- relatedCollection,
83
- validateRelationships,
84
- value: value.value
85
- })
86
- };
87
- }
88
- } else if (relatedCollection) {
89
- result = convertRelationshipValue({
90
- operation,
91
- relatedCollection,
92
- validateRelationships,
93
- value
94
- });
95
- }
96
- if (locale) {
97
- ref[locale] = result;
98
- } else {
99
- ref[field.name] = result;
100
- }
101
- };
102
- /**
103
- * When sending data to Payload - convert Date to string.
104
- * Vice versa when sending data to MongoDB so dates are stored properly.
105
- */ const sanitizeDate = ({ field, locale, operation, ref, value })=>{
106
- if (!value) {
107
- return;
108
- }
109
- if (operation === 'read') {
110
- if (value instanceof Date) {
111
- value = value.toISOString();
112
- }
113
- } else {
114
- if (typeof value === 'string') {
115
- value = new Date(value);
116
- }
117
- }
118
- if (locale) {
119
- ref[locale] = value;
120
- } else {
121
- ref[field.name] = value;
122
- }
123
- };
124
- /**
125
- * @experimental This API can be changed without a major version bump.
126
- */ export const transform = ({ adapter, data, fields, globalSlug, operation, timestamps = true, validateRelationships = true })=>{
127
- if (Array.isArray(data)) {
128
- for(let i = 0; i < data.length; i++){
129
- transform({
130
- adapter,
131
- data: data[i],
132
- fields,
133
- globalSlug,
134
- operation,
135
- validateRelationships
136
- });
137
- }
138
- return;
139
- }
140
- const { payload: { config } } = adapter;
141
- if (operation === 'read') {
142
- delete data['__v'];
143
- data.id = data._id;
144
- delete data['_id'];
145
- if (data.id instanceof Types.ObjectId) {
146
- data.id = data.id.toHexString();
147
- }
148
- }
149
- if (operation !== 'read') {
150
- if (timestamps) {
151
- if (operation === 'create' && !data.createdAt) {
152
- data.createdAt = new Date();
153
- }
154
- data.updatedAt = new Date();
155
- }
156
- if (globalSlug) {
157
- data.globalType = globalSlug;
158
- }
159
- }
160
- const sanitize = ({ field, ref })=>{
161
- if (!ref || typeof ref !== 'object') {
162
- return;
163
- }
164
- if (operation !== 'read') {
165
- if (typeof ref[field.name] === 'undefined' && typeof field.defaultValue !== 'undefined' && typeof field.defaultValue !== 'function') {
166
- if (field.type === 'point') {
167
- ref[field.name] = {
168
- type: 'Point',
169
- coordinates: field.defaultValue
170
- };
171
- } else {
172
- ref[field.name] = field.defaultValue;
173
- }
174
- }
175
- if (fieldIsVirtual(field)) {
176
- delete ref[field.name];
177
- return;
178
- }
179
- }
180
- if (field.type === 'date') {
181
- if (config.localization && field.localized) {
182
- const fieldRef = ref[field.name];
183
- if (!fieldRef || typeof fieldRef !== 'object') {
184
- return;
185
- }
186
- for (const locale of config.localization.localeCodes){
187
- sanitizeDate({
188
- field,
189
- operation,
190
- ref: fieldRef,
191
- value: fieldRef[locale]
192
- });
193
- }
194
- } else {
195
- sanitizeDate({
196
- field,
197
- operation,
198
- ref: ref,
199
- value: ref[field.name]
200
- });
201
- }
202
- }
203
- if (field.type === 'relationship' || field.type === 'upload' || operation === 'read' && field.type === 'join') {
204
- // sanitize passed undefined in objects to null
205
- if (operation !== 'read' && field.name in ref && ref[field.name] === undefined) {
206
- ref[field.name] = null;
207
- }
208
- if (!ref[field.name]) {
209
- return;
210
- }
211
- // handle localized relationships
212
- if (config.localization && field.localized) {
213
- const locales = config.localization.locales;
214
- const fieldRef = ref[field.name];
215
- if (typeof fieldRef !== 'object') {
216
- return;
217
- }
218
- for (const { code } of locales){
219
- const value = ref[field.name][code];
220
- if (value) {
221
- sanitizeRelationship({
222
- config,
223
- field,
224
- locale: code,
225
- operation,
226
- ref: fieldRef,
227
- validateRelationships,
228
- value
229
- });
230
- }
231
- }
232
- } else {
233
- // handle non-localized relationships
234
- sanitizeRelationship({
235
- config,
236
- field,
237
- locale: undefined,
238
- operation,
239
- ref: ref,
240
- validateRelationships,
241
- value: ref[field.name]
242
- });
243
- }
244
- }
245
- };
246
- traverseFields({
247
- callback: sanitize,
248
- fillEmpty: false,
249
- flattenedFields: fields,
250
- ref: data
251
- });
252
- };
253
-
254
- //# sourceMappingURL=transform.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/transform.ts"],"sourcesContent":["import type {\n CollectionConfig,\n DateField,\n FlattenedField,\n JoinField,\n RelationshipField,\n SanitizedConfig,\n TraverseFlattenedFieldsCallback,\n UploadField,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { traverseFields } from 'payload'\nimport { fieldAffectsData, fieldIsVirtual } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\ntype Args = {\n adapter: MongooseAdapter\n data: Record<string, unknown> | Record<string, unknown>[]\n fields: FlattenedField[]\n globalSlug?: string\n operation: 'create' | 'read' | 'update'\n /**\n * Set updatedAt and createdAt\n * @default true\n */\n timestamps?: boolean\n /**\n * Throw errors on invalid relationships\n * @default true\n */\n validateRelationships?: boolean\n}\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\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 if (item instanceof Types.ObjectId) {\n value.docs[i] = item.toHexString()\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\n/**\n * When sending data to Payload - convert Date to string.\n * Vice versa when sending data to MongoDB so dates are stored properly.\n */\nconst sanitizeDate = ({\n field,\n locale,\n operation,\n ref,\n value,\n}: {\n field: DateField\n locale?: string\n operation: Args['operation']\n ref: Record<string, unknown>\n value: unknown\n}) => {\n if (!value) {\n return\n }\n\n if (operation === 'read') {\n if (value instanceof Date) {\n value = value.toISOString()\n }\n } else {\n if (typeof value === 'string') {\n value = new Date(value)\n }\n }\n\n if (locale) {\n ref[locale] = value\n } else {\n ref[field.name] = value\n }\n}\n\n/**\n * @experimental This API can be changed without a major version bump.\n */\nexport const transform = ({\n adapter,\n data,\n fields,\n globalSlug,\n operation,\n timestamps = true,\n validateRelationships = true,\n}: Args) => {\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n transform({ adapter, data: data[i], fields, globalSlug, operation, validateRelationships })\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\n delete data['_id']\n\n if (data.id instanceof Types.ObjectId) {\n data.id = data.id.toHexString()\n }\n }\n\n if (operation !== 'read') {\n if (timestamps) {\n if (operation === 'create' && !data.createdAt) {\n data.createdAt = new Date()\n }\n\n data.updatedAt = new Date()\n }\n\n if (globalSlug) {\n data.globalType = globalSlug\n }\n }\n\n const sanitize: TraverseFlattenedFieldsCallback = ({ field, ref }) => {\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (operation !== 'read') {\n if (\n typeof ref[field.name] === 'undefined' &&\n typeof field.defaultValue !== 'undefined' &&\n typeof field.defaultValue !== 'function'\n ) {\n if (field.type === 'point') {\n ref[field.name] = {\n type: 'Point',\n coordinates: field.defaultValue,\n }\n } else {\n ref[field.name] = field.defaultValue\n }\n }\n\n if (fieldIsVirtual(field)) {\n delete ref[field.name]\n return\n }\n }\n\n if (field.type === 'date') {\n if (config.localization && field.localized) {\n const fieldRef = ref[field.name]\n if (!fieldRef || typeof fieldRef !== 'object') {\n return\n }\n\n for (const locale of config.localization.localeCodes) {\n sanitizeDate({\n field,\n operation,\n ref: fieldRef,\n value: fieldRef[locale],\n })\n }\n } else {\n sanitizeDate({\n field,\n operation,\n ref: ref as Record<string, unknown>,\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 // sanitize passed undefined in objects to null\n if (operation !== 'read' && field.name in ref && ref[field.name] === undefined) {\n ref[field.name] = null\n }\n\n if (!ref[field.name]) {\n return\n }\n\n // handle localized relationships\n if (config.localization && field.localized) {\n const locales = config.localization.locales\n const fieldRef = ref[field.name]\n if (typeof fieldRef !== 'object') {\n return\n }\n\n for (const { code } of locales) {\n const value = ref[field.name][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: ref as Record<string, unknown>,\n validateRelationships,\n value: ref[field.name],\n })\n }\n }\n }\n\n traverseFields({ callback: sanitize, fillEmpty: false, flattenedFields: fields, ref: data })\n}\n"],"names":["Types","traverseFields","fieldAffectsData","fieldIsVirtual","isValidRelationObject","value","convertRelationshipValue","operation","relatedCollection","validateRelationships","customIDField","fields","find","field","name","ObjectId","toHexString","e","sanitizeRelationship","config","locale","ref","type","Array","isArray","docs","i","length","item","result","hasManyRelations","relationTo","collections","slug","map","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","transform","adapter","data","globalSlug","timestamps","payload","id","_id","createdAt","updatedAt","globalType","sanitize","defaultValue","coordinates","localization","localized","fieldRef","localeCodes","undefined","locales","code","callback","fillEmpty","flattenedFields"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/transform.spec.ts"],"sourcesContent":["import { flattenAllFields, type Field, type SanitizedConfig } from 'payload'\n\nimport { Types } from 'mongoose'\n\nimport { transform } from './transform.js'\nimport { MongooseAdapter } from '..'\n\nconst flattenRelationshipValues = (obj: Record<string, any>, prefix = ''): Record<string, any> => {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value && typeof value === 'object' && !(value instanceof Types.ObjectId)) {\n Object.assign(acc, flattenRelationshipValues(value, fullKey))\n // skip relationTo and blockType\n } else if (!fullKey.endsWith('relationTo') && !fullKey.endsWith('blockType')) {\n acc[fullKey] = value\n }\n\n return acc\n },\n {} as Record<string, any>,\n )\n}\n\nconst relsFields: Field[] = [\n {\n name: 'rel_1',\n type: 'relationship',\n relationTo: 'rels',\n },\n {\n name: 'rel_1_l',\n type: 'relationship',\n localized: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_2',\n type: 'relationship',\n hasMany: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_2_l',\n type: 'relationship',\n hasMany: true,\n localized: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_3',\n type: 'relationship',\n relationTo: ['rels'],\n },\n {\n name: 'rel_3_l',\n type: 'relationship',\n localized: true,\n relationTo: ['rels'],\n },\n {\n name: 'rel_4',\n type: 'relationship',\n hasMany: true,\n relationTo: ['rels'],\n },\n {\n name: 'rel_4_l',\n type: 'relationship',\n hasMany: true,\n localized: true,\n relationTo: ['rels'],\n },\n]\n\nconst config = {\n collections: [\n {\n slug: 'docs',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: [\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [{ slug: 'block', fields: relsFields }],\n },\n ...relsFields,\n ],\n },\n {\n name: 'arrayLocalized',\n type: 'array',\n fields: [\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [{ slug: 'block', fields: relsFields }],\n },\n ...relsFields,\n ],\n localized: true,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [\n {\n slug: 'block',\n fields: [\n ...relsFields,\n {\n name: 'group',\n type: 'group',\n fields: relsFields,\n },\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n {\n name: 'group',\n type: 'group',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n },\n {\n name: 'groupLocalized',\n type: 'group',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n localized: true,\n },\n {\n name: 'groupAndRow',\n type: 'group',\n fields: [\n {\n type: 'row',\n fields: [\n ...relsFields,\n {\n type: 'array',\n name: 'array',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n {\n type: 'tabs',\n tabs: [\n {\n name: 'tab',\n fields: relsFields,\n },\n {\n name: 'tabLocalized',\n fields: relsFields,\n localized: true,\n },\n {\n label: 'another',\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'nestedTab',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n slug: 'rels',\n fields: [],\n },\n ],\n localization: {\n defaultLocale: 'en',\n localeCodes: ['en', 'es'],\n locales: [\n { code: 'en', label: 'EN' },\n { code: 'es', label: 'ES' },\n ],\n },\n} as SanitizedConfig\n\nconst relsData = {\n rel_1: new Types.ObjectId().toHexString(),\n rel_1_l: {\n en: new Types.ObjectId().toHexString(),\n es: new Types.ObjectId().toHexString(),\n },\n rel_2: [new Types.ObjectId().toHexString()],\n rel_2_l: {\n en: [new Types.ObjectId().toHexString()],\n es: [new Types.ObjectId().toHexString()],\n },\n rel_3: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n rel_3_l: {\n en: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n es: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n },\n rel_4: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n rel_4_l: {\n en: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n es: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n },\n}\n\ndescribe('transform', () => {\n it('should sanitize relationships with transform write', () => {\n const data = {\n ...relsData,\n array: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n arrayLocalized: {\n en: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n es: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n },\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n array: [{ ...relsData }],\n group: { ...relsData },\n },\n ],\n group: {\n ...relsData,\n array: [{ ...relsData }],\n },\n groupAndRow: {\n ...relsData,\n array: [{ ...relsData }],\n },\n groupLocalized: {\n en: {\n ...relsData,\n array: [{ ...relsData }],\n },\n es: {\n ...relsData,\n array: [{ ...relsData }],\n },\n },\n tab: { ...relsData },\n tabLocalized: {\n en: { ...relsData },\n es: { ...relsData },\n },\n nestedTab: { ...relsData },\n }\n const flattenValuesBefore = Object.values(flattenRelationshipValues(data))\n\n const mockAdapter = { payload: { config } } as MongooseAdapter\n\n const fields = flattenAllFields({ fields: config.collections[0].fields })\n\n transform({ type: 'write', adapter: mockAdapter, data, fields })\n\n const flattenValuesAfter = Object.values(flattenRelationshipValues(data))\n\n flattenValuesAfter.forEach((value, i) => {\n expect(value).toBeInstanceOf(Types.ObjectId)\n expect(flattenValuesBefore[i]).toBe(value.toHexString())\n })\n\n transform({ type: 'read', adapter: mockAdapter, data, fields })\n })\n})\n"],"names":["flattenAllFields","Types","transform","flattenRelationshipValues","obj","prefix","Object","keys","reduce","acc","key","fullKey","value","ObjectId","assign","endsWith","relsFields","name","type","relationTo","localized","hasMany","config","collections","slug","fields","blocks","tabs","label","localization","defaultLocale","localeCodes","locales","code","relsData","rel_1","toHexString","rel_1_l","en","es","rel_2","rel_2_l","rel_3","rel_3_l","rel_4","rel_4_l","describe","it","data","array","blockType","arrayLocalized","group","groupAndRow","groupLocalized","tab","tabLocalized","nestedTab","flattenValuesBefore","values","mockAdapter","payload","adapter","flattenValuesAfter","forEach","i","expect","toBeInstanceOf","toBe"],"mappings":"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"}