@payloadcms/db-mongodb 3.2.2-canary.d2399ed → 3.2.3-canary.2d2e7d5

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 (127) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +21 -19
  3. package/dist/count.js.map +1 -1
  4. package/dist/countGlobalVersions.d.ts.map +1 -1
  5. package/dist/countGlobalVersions.js +21 -19
  6. package/dist/countGlobalVersions.js.map +1 -1
  7. package/dist/countVersions.d.ts.map +1 -1
  8. package/dist/countVersions.js +21 -19
  9. package/dist/countVersions.js.map +1 -1
  10. package/dist/create.d.ts.map +1 -1
  11. package/dist/create.js +22 -22
  12. package/dist/create.js.map +1 -1
  13. package/dist/createGlobal.d.ts.map +1 -1
  14. package/dist/createGlobal.js +19 -21
  15. package/dist/createGlobal.js.map +1 -1
  16. package/dist/createGlobalVersion.d.ts.map +1 -1
  17. package/dist/createGlobalVersion.js +30 -35
  18. package/dist/createGlobalVersion.js.map +1 -1
  19. package/dist/createVersion.d.ts.map +1 -1
  20. package/dist/createVersion.js +30 -35
  21. package/dist/createVersion.js.map +1 -1
  22. package/dist/deleteMany.d.ts.map +1 -1
  23. package/dist/deleteMany.js +6 -6
  24. package/dist/deleteMany.js.map +1 -1
  25. package/dist/deleteOne.d.ts.map +1 -1
  26. package/dist/deleteOne.js +13 -17
  27. package/dist/deleteOne.js.map +1 -1
  28. package/dist/deleteVersions.d.ts.map +1 -1
  29. package/dist/deleteVersions.js +6 -6
  30. package/dist/deleteVersions.js.map +1 -1
  31. package/dist/find.d.ts.map +1 -1
  32. package/dist/find.js +74 -41
  33. package/dist/find.js.map +1 -1
  34. package/dist/findGlobal.d.ts.map +1 -1
  35. package/dist/findGlobal.js +18 -19
  36. package/dist/findGlobal.js.map +1 -1
  37. package/dist/findGlobalVersions.d.ts.map +1 -1
  38. package/dist/findGlobalVersions.js +62 -33
  39. package/dist/findGlobalVersions.js.map +1 -1
  40. package/dist/findOne.d.ts.map +1 -1
  41. package/dist/findOne.js +19 -32
  42. package/dist/findOne.js.map +1 -1
  43. package/dist/findVersions.d.ts.map +1 -1
  44. package/dist/findVersions.js +62 -34
  45. package/dist/findVersions.js.map +1 -1
  46. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  47. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +16 -20
  48. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  49. package/dist/predefinedMigrations/migrateVersionsV1_V2.js +2 -2
  50. package/dist/predefinedMigrations/migrateVersionsV1_V2.js.map +1 -1
  51. package/dist/queries/buildAndOrConditions.d.ts +1 -3
  52. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  53. package/dist/queries/buildAndOrConditions.js +1 -2
  54. package/dist/queries/buildAndOrConditions.js.map +1 -1
  55. package/dist/queries/buildQuery.d.ts +0 -2
  56. package/dist/queries/buildQuery.d.ts.map +1 -1
  57. package/dist/queries/buildQuery.js +6 -2
  58. package/dist/queries/buildQuery.js.map +1 -1
  59. package/dist/queries/buildSearchParams.d.ts +1 -3
  60. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  61. package/dist/queries/buildSearchParams.js +10 -14
  62. package/dist/queries/buildSearchParams.js.map +1 -1
  63. package/dist/queries/buildSortParam.d.ts +7 -1
  64. package/dist/queries/buildSortParam.d.ts.map +1 -1
  65. package/dist/queries/buildSortParam.js +2 -2
  66. package/dist/queries/buildSortParam.js.map +1 -1
  67. package/dist/queries/getLocalizedSortProperty.js +2 -2
  68. package/dist/queries/getLocalizedSortProperty.js.map +1 -1
  69. package/dist/queries/parseParams.d.ts +1 -3
  70. package/dist/queries/parseParams.d.ts.map +1 -1
  71. package/dist/queries/parseParams.js +1 -2
  72. package/dist/queries/parseParams.js.map +1 -1
  73. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  74. package/dist/queries/sanitizeQueryValue.js +0 -16
  75. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  76. package/dist/queryDrafts.d.ts.map +1 -1
  77. package/dist/queryDrafts.js +65 -41
  78. package/dist/queryDrafts.js.map +1 -1
  79. package/dist/updateGlobal.d.ts.map +1 -1
  80. package/dist/updateGlobal.js +23 -25
  81. package/dist/updateGlobal.js.map +1 -1
  82. package/dist/updateGlobalVersion.d.ts.map +1 -1
  83. package/dist/updateGlobalVersion.js +27 -28
  84. package/dist/updateGlobalVersion.js.map +1 -1
  85. package/dist/updateOne.d.ts.map +1 -1
  86. package/dist/updateOne.js +24 -28
  87. package/dist/updateOne.js.map +1 -1
  88. package/dist/updateVersion.d.ts.map +1 -1
  89. package/dist/updateVersion.js +26 -28
  90. package/dist/updateVersion.js.map +1 -1
  91. package/dist/utilities/buildJoinAggregation.d.ts +4 -4
  92. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  93. package/dist/utilities/buildJoinAggregation.js +28 -7
  94. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  95. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
  96. package/dist/utilities/buildProjectionFromSelect.js +1 -18
  97. package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
  98. package/dist/utilities/sanitizeInternalFields.d.ts +2 -0
  99. package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -0
  100. package/dist/utilities/sanitizeInternalFields.js +20 -0
  101. package/dist/utilities/sanitizeInternalFields.js.map +1 -0
  102. package/dist/utilities/sanitizeRelationshipIDs.d.ts +9 -0
  103. package/dist/utilities/sanitizeRelationshipIDs.d.ts.map +1 -0
  104. package/dist/utilities/sanitizeRelationshipIDs.js +125 -0
  105. package/dist/utilities/sanitizeRelationshipIDs.js.map +1 -0
  106. package/dist/utilities/{transform.spec.js → sanitizeRelationshipIDs.spec.js} +7 -23
  107. package/dist/utilities/sanitizeRelationshipIDs.spec.js.map +1 -0
  108. package/dist/{getSession.d.ts → withSession.d.ts} +4 -2
  109. package/dist/withSession.d.ts.map +1 -0
  110. package/dist/{getSession.js → withSession.js} +5 -3
  111. package/dist/withSession.js.map +1 -0
  112. package/package.json +3 -3
  113. package/dist/getSession.d.ts.map +0 -1
  114. package/dist/getSession.js.map +0 -1
  115. package/dist/utilities/findMany.d.ts +0 -20
  116. package/dist/utilities/findMany.d.ts.map +0 -1
  117. package/dist/utilities/findMany.js +0 -84
  118. package/dist/utilities/findMany.js.map +0 -1
  119. package/dist/utilities/getHasNearConstraint.d.ts +0 -3
  120. package/dist/utilities/getHasNearConstraint.d.ts.map +0 -1
  121. package/dist/utilities/getHasNearConstraint.js +0 -26
  122. package/dist/utilities/getHasNearConstraint.js.map +0 -1
  123. package/dist/utilities/transform.d.ts +0 -17
  124. package/dist/utilities/transform.d.ts.map +0 -1
  125. package/dist/utilities/transform.js +0 -250
  126. package/dist/utilities/transform.js.map +0 -1
  127. package/dist/utilities/transform.spec.js.map +0 -1
@@ -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 cursor = collection.aggregate([
9
- {
10
- $match: query
11
- }
12
- ], {
13
- collation,
14
- session
15
- });
16
- if (sort) {
17
- cursor.sort(sort);
18
- }
19
- if (skip) {
20
- cursor.skip(skip);
21
- }
22
- if (limit) {
23
- cursor.limit(limit);
24
- }
25
- for (const stage of joinAgreggation){
26
- cursor.addStage(stage);
27
- }
28
- if (projection) {
29
- cursor.project(projection);
30
- }
31
- docsPromise = cursor.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 cursor = collection.aggregate(\n [\n {\n $match: query,\n },\n ],\n { collation, session },\n )\n\n if (sort) {\n cursor.sort(sort)\n }\n\n if (skip) {\n cursor.skip(skip)\n }\n\n if (limit) {\n cursor.limit(limit)\n }\n\n for (const stage of joinAgreggation) {\n cursor.addStage(stage)\n }\n\n if (projection) {\n cursor.project(projection)\n }\n\n docsPromise = cursor.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","cursor","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,SAASf,WAAWgB,SAAS,CACjC;YACE;gBACEC,QAAQX;YACV;SACD,EACD;YAAEP;YAAWQ;QAAQ;QAGvB,IAAIE,MAAM;YACRM,OAAON,IAAI,CAACA;QACd;QAEA,IAAID,MAAM;YACRO,OAAOP,IAAI,CAACA;QACd;QAEA,IAAIN,OAAO;YACTa,OAAOb,KAAK,CAACA;QACf;QAEA,KAAK,MAAMgB,SAASjB,gBAAiB;YACnCc,OAAOI,QAAQ,CAACD;QAClB;QAEA,IAAIb,YAAY;YACdU,OAAOK,OAAO,CAACf;QACjB;QAEAM,cAAcI,OAAOM,OAAO;IAC9B,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,17 +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
- * Throw errors on invalid relationships
11
- * @default true
12
- */
13
- validateRelationships?: boolean;
14
- };
15
- export declare const transform: ({ adapter, data, fields, globalSlug, operation, validateRelationships, }: Args) => void;
16
- export {};
17
- //# 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,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAwMD,eAAO,MAAM,SAAS,6EAOnB,IAAI,SA0IN,CAAA"}
@@ -1,250 +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
- export const transform = ({ adapter, data, fields, globalSlug, operation, validateRelationships = true })=>{
125
- if (Array.isArray(data)) {
126
- for(let i = 0; i < data.length; i++){
127
- transform({
128
- adapter,
129
- data: data[i],
130
- fields,
131
- globalSlug,
132
- operation,
133
- validateRelationships
134
- });
135
- }
136
- return;
137
- }
138
- const { payload: { config } } = adapter;
139
- if (operation === 'read') {
140
- delete data['__v'];
141
- data.id = data._id;
142
- delete data['_id'];
143
- if (data.id instanceof Types.ObjectId) {
144
- data.id = data.id.toHexString();
145
- }
146
- }
147
- if (operation !== 'read') {
148
- if (operation === 'create' && !data.createdAt) {
149
- data.createdAt = new Date();
150
- }
151
- data.updatedAt = new Date();
152
- if (globalSlug) {
153
- data.globalType = globalSlug;
154
- }
155
- }
156
- const sanitize = ({ field, ref })=>{
157
- if (!ref || typeof ref !== 'object') {
158
- return;
159
- }
160
- if (operation !== 'read') {
161
- if (typeof ref[field.name] === 'undefined' && typeof field.defaultValue !== 'undefined' && typeof field.defaultValue !== 'function') {
162
- if (field.type === 'point') {
163
- ref[field.name] = {
164
- type: 'Point',
165
- coordinates: field.defaultValue
166
- };
167
- } else {
168
- ref[field.name] = field.defaultValue;
169
- }
170
- }
171
- if (fieldIsVirtual(field)) {
172
- delete ref[field.name];
173
- return;
174
- }
175
- }
176
- if (field.type === 'date') {
177
- if (config.localization && field.localized) {
178
- const fieldRef = ref[field.name];
179
- if (!fieldRef || typeof fieldRef !== 'object') {
180
- return;
181
- }
182
- for (const locale of config.localization.localeCodes){
183
- sanitizeDate({
184
- field,
185
- operation,
186
- ref: fieldRef,
187
- value: fieldRef[locale]
188
- });
189
- }
190
- } else {
191
- sanitizeDate({
192
- field,
193
- operation,
194
- ref: ref,
195
- value: ref[field.name]
196
- });
197
- }
198
- }
199
- if (field.type === 'relationship' || field.type === 'upload' || operation === 'read' && field.type === 'join') {
200
- // sanitize passed undefined in objects to null
201
- if (operation !== 'read' && field.name in ref && ref[field.name] === undefined) {
202
- ref[field.name] = null;
203
- }
204
- if (!ref[field.name]) {
205
- return;
206
- }
207
- // handle localized relationships
208
- if (config.localization && field.localized) {
209
- const locales = config.localization.locales;
210
- const fieldRef = ref[field.name];
211
- if (typeof fieldRef !== 'object') {
212
- return;
213
- }
214
- for (const { code } of locales){
215
- const value = ref[field.name][code];
216
- if (value) {
217
- sanitizeRelationship({
218
- config,
219
- field,
220
- locale: code,
221
- operation,
222
- ref: fieldRef,
223
- validateRelationships,
224
- value
225
- });
226
- }
227
- }
228
- } else {
229
- // handle non-localized relationships
230
- sanitizeRelationship({
231
- config,
232
- field,
233
- locale: undefined,
234
- operation,
235
- ref: ref,
236
- validateRelationships,
237
- value: ref[field.name]
238
- });
239
- }
240
- }
241
- };
242
- traverseFields({
243
- callback: sanitize,
244
- fillEmpty: false,
245
- flattenedFields: fields,
246
- ref: data
247
- });
248
- };
249
-
250
- //# 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 * 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\nexport const transform = ({\n adapter,\n data,\n fields,\n globalSlug,\n operation,\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 (operation === 'create' && !data.createdAt) {\n data.createdAt = new Date()\n }\n\n data.updatedAt = new Date()\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","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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"}