@payloadcms/db-mongodb 3.0.0-canary.b8dd0db → 3.0.0-canary.bda91d8

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 (138) hide show
  1. package/dist/connect.d.ts.map +1 -1
  2. package/dist/connect.js +7 -3
  3. package/dist/connect.js.map +1 -1
  4. package/dist/countGlobalVersions.d.ts +3 -0
  5. package/dist/countGlobalVersions.d.ts.map +1 -0
  6. package/dist/countGlobalVersions.js +33 -0
  7. package/dist/countGlobalVersions.js.map +1 -0
  8. package/dist/countVersions.d.ts +3 -0
  9. package/dist/countVersions.d.ts.map +1 -0
  10. package/dist/countVersions.js +33 -0
  11. package/dist/countVersions.js.map +1 -0
  12. package/dist/create.d.ts.map +1 -1
  13. package/dist/create.js +10 -1
  14. package/dist/create.js.map +1 -1
  15. package/dist/createGlobal.d.ts.map +1 -1
  16. package/dist/createGlobal.js +10 -5
  17. package/dist/createGlobal.js.map +1 -1
  18. package/dist/createGlobalVersion.d.ts +1 -1
  19. package/dist/createGlobalVersion.d.ts.map +1 -1
  20. package/dist/createGlobalVersion.js +13 -4
  21. package/dist/createGlobalVersion.js.map +1 -1
  22. package/dist/createMigration.d.ts.map +1 -1
  23. package/dist/createMigration.js +8 -6
  24. package/dist/createMigration.js.map +1 -1
  25. package/dist/createVersion.d.ts +1 -1
  26. package/dist/createVersion.d.ts.map +1 -1
  27. package/dist/createVersion.js +31 -9
  28. package/dist/createVersion.js.map +1 -1
  29. package/dist/deleteOne.d.ts.map +1 -1
  30. package/dist/deleteOne.js +11 -3
  31. package/dist/deleteOne.js.map +1 -1
  32. package/dist/find.d.ts.map +1 -1
  33. package/dist/find.js +27 -3
  34. package/dist/find.js.map +1 -1
  35. package/dist/findGlobal.d.ts.map +1 -1
  36. package/dist/findGlobal.js +9 -3
  37. package/dist/findGlobal.js.map +1 -1
  38. package/dist/findGlobalVersions.d.ts.map +1 -1
  39. package/dist/findGlobalVersions.js +9 -3
  40. package/dist/findGlobalVersions.js.map +1 -1
  41. package/dist/findOne.d.ts.map +1 -1
  42. package/dist/findOne.js +27 -3
  43. package/dist/findOne.js.map +1 -1
  44. package/dist/findVersions.d.ts.map +1 -1
  45. package/dist/findVersions.js +9 -3
  46. package/dist/findVersions.js.map +1 -1
  47. package/dist/index.d.ts +6 -3
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +14 -6
  50. package/dist/index.js.map +1 -1
  51. package/dist/init.d.ts.map +1 -1
  52. package/dist/init.js +9 -6
  53. package/dist/init.js.map +1 -1
  54. package/dist/models/buildCollectionSchema.d.ts +1 -2
  55. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  56. package/dist/models/buildCollectionSchema.js +7 -4
  57. package/dist/models/buildCollectionSchema.js.map +1 -1
  58. package/dist/models/buildGlobalModel.js +2 -2
  59. package/dist/models/buildGlobalModel.js.map +1 -1
  60. package/dist/models/buildSchema.d.ts +1 -2
  61. package/dist/models/buildSchema.d.ts.map +1 -1
  62. package/dist/models/buildSchema.js +27 -6
  63. package/dist/models/buildSchema.js.map +1 -1
  64. package/dist/queries/buildQuery.d.ts +2 -2
  65. package/dist/queries/buildQuery.d.ts.map +1 -1
  66. package/dist/queries/buildQuery.js +1 -2
  67. package/dist/queries/buildQuery.js.map +1 -1
  68. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  69. package/dist/queries/buildSearchParams.js +19 -11
  70. package/dist/queries/buildSearchParams.js.map +1 -1
  71. package/dist/queries/buildSortParam.d.ts +2 -2
  72. package/dist/queries/buildSortParam.d.ts.map +1 -1
  73. package/dist/queries/buildSortParam.js +26 -17
  74. package/dist/queries/buildSortParam.js.map +1 -1
  75. package/dist/queries/getLocalizedSortProperty.spec.js +1 -1
  76. package/dist/queries/getLocalizedSortProperty.spec.js.map +1 -1
  77. package/dist/queries/parseParams.d.ts.map +1 -1
  78. package/dist/queries/parseParams.js +3 -1
  79. package/dist/queries/parseParams.js.map +1 -1
  80. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  81. package/dist/queries/sanitizeQueryValue.js +145 -26
  82. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  83. package/dist/queryDrafts.d.ts.map +1 -1
  84. package/dist/queryDrafts.js +29 -7
  85. package/dist/queryDrafts.js.map +1 -1
  86. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  87. package/dist/transactions/beginTransaction.js +2 -0
  88. package/dist/transactions/beginTransaction.js.map +1 -1
  89. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  90. package/dist/transactions/commitTransaction.js +3 -1
  91. package/dist/transactions/commitTransaction.js.map +1 -1
  92. package/dist/types.d.ts +7 -4
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js.map +1 -1
  95. package/dist/updateGlobal.d.ts.map +1 -1
  96. package/dist/updateGlobal.js +17 -4
  97. package/dist/updateGlobal.js.map +1 -1
  98. package/dist/updateGlobalVersion.d.ts +2 -2
  99. package/dist/updateGlobalVersion.d.ts.map +1 -1
  100. package/dist/updateGlobalVersion.js +18 -4
  101. package/dist/updateGlobalVersion.js.map +1 -1
  102. package/dist/updateOne.d.ts.map +1 -1
  103. package/dist/updateOne.js +18 -4
  104. package/dist/updateOne.js.map +1 -1
  105. package/dist/updateVersion.d.ts +1 -1
  106. package/dist/updateVersion.d.ts.map +1 -1
  107. package/dist/updateVersion.js +17 -3
  108. package/dist/updateVersion.js.map +1 -1
  109. package/dist/upsert.d.ts +3 -0
  110. package/dist/upsert.d.ts.map +1 -0
  111. package/dist/upsert.js +15 -0
  112. package/dist/upsert.js.map +1 -0
  113. package/dist/utilities/buildJoinAggregation.d.ts +18 -0
  114. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -0
  115. package/dist/utilities/buildJoinAggregation.js +159 -0
  116. package/dist/utilities/buildJoinAggregation.js.map +1 -0
  117. package/dist/utilities/buildProjectionFromSelect.d.ts +8 -0
  118. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -0
  119. package/dist/utilities/buildProjectionFromSelect.js +171 -0
  120. package/dist/utilities/buildProjectionFromSelect.js.map +1 -0
  121. package/dist/utilities/getDBName.d.ts.map +1 -1
  122. package/dist/utilities/getDBName.js +3 -1
  123. package/dist/utilities/getDBName.js.map +1 -1
  124. package/dist/utilities/handleError.js +2 -2
  125. package/dist/utilities/handleError.js.map +1 -1
  126. package/dist/utilities/sanitizeInternalFields.d.ts +1 -2
  127. package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -1
  128. package/dist/utilities/sanitizeInternalFields.js +1 -2
  129. package/dist/utilities/sanitizeInternalFields.js.map +1 -1
  130. package/dist/utilities/sanitizeRelationshipIDs.d.ts +9 -0
  131. package/dist/utilities/sanitizeRelationshipIDs.d.ts.map +1 -0
  132. package/dist/utilities/sanitizeRelationshipIDs.js +115 -0
  133. package/dist/utilities/sanitizeRelationshipIDs.js.map +1 -0
  134. package/dist/withSession.d.ts +1 -1
  135. package/dist/withSession.d.ts.map +1 -1
  136. package/dist/withSession.js +5 -3
  137. package/dist/withSession.js.map +1 -1
  138. package/package.json +9 -6
@@ -0,0 +1,171 @@
1
+ import { deepCopyObjectSimple } from 'payload';
2
+ import { fieldAffectsData, getSelectMode, tabHasName } from 'payload/shared';
3
+ const addFieldToProjection = ({ adapter, databaseSchemaPath, field, projection, withinLocalizedField })=>{
4
+ const { config } = adapter.payload;
5
+ if (withinLocalizedField && config.localization) {
6
+ for (const locale of config.localization.localeCodes){
7
+ const localeDatabaseSchemaPath = databaseSchemaPath.replace('<locale>', locale);
8
+ projection[`${localeDatabaseSchemaPath}${field.name}`] = true;
9
+ }
10
+ } else {
11
+ projection[`${databaseSchemaPath}${field.name}`] = true;
12
+ }
13
+ };
14
+ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection, select, selectAllOnCurrentLevel = false, selectMode, withinLocalizedField = false })=>{
15
+ for (const field of fields){
16
+ if (fieldAffectsData(field)) {
17
+ if (selectMode === 'include') {
18
+ if (select[field.name] === true || selectAllOnCurrentLevel) {
19
+ addFieldToProjection({
20
+ adapter,
21
+ databaseSchemaPath,
22
+ field,
23
+ projection,
24
+ withinLocalizedField
25
+ });
26
+ continue;
27
+ }
28
+ if (!select[field.name]) {
29
+ continue;
30
+ }
31
+ }
32
+ if (selectMode === 'exclude') {
33
+ if (typeof select[field.name] === 'undefined') {
34
+ addFieldToProjection({
35
+ adapter,
36
+ databaseSchemaPath,
37
+ field,
38
+ projection,
39
+ withinLocalizedField
40
+ });
41
+ continue;
42
+ }
43
+ if (select[field.name] === false) {
44
+ continue;
45
+ }
46
+ }
47
+ }
48
+ let fieldDatabaseSchemaPath = databaseSchemaPath;
49
+ let fieldWithinLocalizedField = withinLocalizedField;
50
+ if (fieldAffectsData(field)) {
51
+ fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`;
52
+ if (field.localized) {
53
+ fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`;
54
+ fieldWithinLocalizedField = true;
55
+ }
56
+ }
57
+ switch(field.type){
58
+ case 'collapsible':
59
+ case 'row':
60
+ traverseFields({
61
+ adapter,
62
+ databaseSchemaPath,
63
+ fields: field.fields,
64
+ projection,
65
+ select,
66
+ selectMode,
67
+ withinLocalizedField
68
+ });
69
+ break;
70
+ case 'tabs':
71
+ traverseFields({
72
+ adapter,
73
+ databaseSchemaPath,
74
+ fields: field.tabs.map((tab)=>({
75
+ ...tab,
76
+ type: 'tab'
77
+ })),
78
+ projection,
79
+ select,
80
+ selectMode,
81
+ withinLocalizedField
82
+ });
83
+ break;
84
+ case 'group':
85
+ case 'tab':
86
+ case 'array':
87
+ {
88
+ let fieldSelect;
89
+ if (field.type === 'tab' && !tabHasName(field)) {
90
+ fieldSelect = select;
91
+ } else {
92
+ fieldSelect = select[field.name];
93
+ }
94
+ if (field.type === 'array' && selectMode === 'include') {
95
+ fieldSelect['id'] = true;
96
+ }
97
+ traverseFields({
98
+ adapter,
99
+ databaseSchemaPath: fieldDatabaseSchemaPath,
100
+ fields: field.fields,
101
+ projection,
102
+ select: fieldSelect,
103
+ selectMode,
104
+ withinLocalizedField: fieldWithinLocalizedField
105
+ });
106
+ break;
107
+ }
108
+ case 'blocks':
109
+ {
110
+ const blocksSelect = select[field.name];
111
+ for (const block of field.blocks){
112
+ if (selectMode === 'include' && blocksSelect[block.slug] === true || selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined') {
113
+ traverseFields({
114
+ adapter,
115
+ databaseSchemaPath: fieldDatabaseSchemaPath,
116
+ fields: block.fields,
117
+ projection,
118
+ select: {},
119
+ selectAllOnCurrentLevel: true,
120
+ selectMode: 'include',
121
+ withinLocalizedField: fieldWithinLocalizedField
122
+ });
123
+ continue;
124
+ }
125
+ let blockSelectMode = selectMode;
126
+ if (selectMode === 'exclude' && blocksSelect[block.slug] === false) {
127
+ blockSelectMode = 'include';
128
+ }
129
+ if (typeof blocksSelect[block.slug] !== 'object') {
130
+ blocksSelect[block.slug] = {};
131
+ }
132
+ if (blockSelectMode === 'include') {
133
+ blocksSelect[block.slug]['id'] = true;
134
+ blocksSelect[block.slug]['blockType'] = true;
135
+ }
136
+ traverseFields({
137
+ adapter,
138
+ databaseSchemaPath: fieldDatabaseSchemaPath,
139
+ fields: block.fields,
140
+ projection,
141
+ select: blocksSelect[block.slug],
142
+ selectMode: blockSelectMode,
143
+ withinLocalizedField: fieldWithinLocalizedField
144
+ });
145
+ }
146
+ break;
147
+ }
148
+ default:
149
+ break;
150
+ }
151
+ }
152
+ };
153
+ export const buildProjectionFromSelect = ({ adapter, fields, select })=>{
154
+ if (!select) {
155
+ return;
156
+ }
157
+ const projection = {
158
+ _id: true
159
+ };
160
+ traverseFields({
161
+ adapter,
162
+ fields,
163
+ projection,
164
+ // Clone to safely mutate it later
165
+ select: deepCopyObjectSimple(select),
166
+ selectMode: getSelectMode(select)
167
+ });
168
+ return projection;
169
+ };
170
+
171
+ //# sourceMappingURL=buildProjectionFromSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import {\n deepCopyObjectSimple,\n type Field,\n type FieldAffectingData,\n type SelectMode,\n type SelectType,\n type TabAsField,\n} from 'payload'\nimport { fieldAffectsData, getSelectMode, tabHasName } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nconst addFieldToProjection = ({\n adapter,\n databaseSchemaPath,\n field,\n projection,\n withinLocalizedField,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath: string\n field: FieldAffectingData\n projection: Record<string, true>\n withinLocalizedField: boolean\n}) => {\n const { config } = adapter.payload\n\n if (withinLocalizedField && config.localization) {\n for (const locale of config.localization.localeCodes) {\n const localeDatabaseSchemaPath = databaseSchemaPath.replace('<locale>', locale)\n projection[`${localeDatabaseSchemaPath}${field.name}`] = true\n }\n } else {\n projection[`${databaseSchemaPath}${field.name}`] = true\n }\n}\n\nconst traverseFields = ({\n adapter,\n databaseSchemaPath = '',\n fields,\n projection,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n withinLocalizedField = false,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath?: string\n fields: (Field | TabAsField)[]\n projection: Record<string, true>\n select: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode: SelectMode\n withinLocalizedField?: boolean\n}) => {\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n if (selectMode === 'include') {\n if (select[field.name] === true || selectAllOnCurrentLevel) {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n projection,\n withinLocalizedField,\n })\n continue\n }\n\n if (!select[field.name]) {\n continue\n }\n }\n\n if (selectMode === 'exclude') {\n if (typeof select[field.name] === 'undefined') {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n projection,\n withinLocalizedField,\n })\n continue\n }\n\n if (select[field.name] === false) {\n continue\n }\n }\n }\n\n let fieldDatabaseSchemaPath = databaseSchemaPath\n let fieldWithinLocalizedField = withinLocalizedField\n\n if (fieldAffectsData(field)) {\n fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`\n\n if (field.localized) {\n fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`\n fieldWithinLocalizedField = true\n }\n }\n\n switch (field.type) {\n case 'collapsible':\n case 'row':\n traverseFields({\n adapter,\n databaseSchemaPath,\n fields: field.fields,\n projection,\n select,\n selectMode,\n withinLocalizedField,\n })\n break\n\n case 'tabs':\n traverseFields({\n adapter,\n databaseSchemaPath,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n projection,\n select,\n selectMode,\n withinLocalizedField,\n })\n break\n\n case 'group':\n case 'tab':\n case 'array': {\n let fieldSelect: SelectType\n\n if (field.type === 'tab' && !tabHasName(field)) {\n fieldSelect = select\n } else {\n fieldSelect = select[field.name] as SelectType\n }\n\n if (field.type === 'array' && selectMode === 'include') {\n fieldSelect['id'] = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: field.fields,\n projection,\n select: fieldSelect,\n selectMode,\n withinLocalizedField: fieldWithinLocalizedField,\n })\n\n break\n }\n\n case 'blocks': {\n const blocksSelect = select[field.name] as SelectType\n\n for (const block of field.blocks) {\n if (\n (selectMode === 'include' && blocksSelect[block.slug] === true) ||\n (selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined')\n ) {\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.fields,\n projection,\n select: {},\n selectAllOnCurrentLevel: true,\n selectMode: 'include',\n withinLocalizedField: fieldWithinLocalizedField,\n })\n continue\n }\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'exclude' && blocksSelect[block.slug] === false) {\n blockSelectMode = 'include'\n }\n\n if (typeof blocksSelect[block.slug] !== 'object') {\n blocksSelect[block.slug] = {}\n }\n\n if (blockSelectMode === 'include') {\n blocksSelect[block.slug]['id'] = true\n blocksSelect[block.slug]['blockType'] = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.fields,\n projection,\n select: blocksSelect[block.slug] as SelectType,\n selectMode: blockSelectMode,\n withinLocalizedField: fieldWithinLocalizedField,\n })\n }\n\n break\n }\n\n default:\n break\n }\n }\n}\n\nexport const buildProjectionFromSelect = ({\n adapter,\n fields,\n select,\n}: {\n adapter: MongooseAdapter\n fields: Field[]\n select?: SelectType\n}): Record<string, true> | undefined => {\n if (!select) {\n return\n }\n\n const projection: Record<string, true> = {\n _id: true,\n }\n\n traverseFields({\n adapter,\n fields,\n projection,\n // Clone to safely mutate it later\n select: deepCopyObjectSimple(select),\n selectMode: getSelectMode(select),\n })\n\n return projection\n}\n"],"names":["deepCopyObjectSimple","fieldAffectsData","getSelectMode","tabHasName","addFieldToProjection","adapter","databaseSchemaPath","field","projection","withinLocalizedField","config","payload","localization","locale","localeCodes","localeDatabaseSchemaPath","replace","name","traverseFields","fields","select","selectAllOnCurrentLevel","selectMode","fieldDatabaseSchemaPath","fieldWithinLocalizedField","localized","type","tabs","map","tab","fieldSelect","blocksSelect","block","blocks","slug","blockSelectMode","buildProjectionFromSelect","_id"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getDBName.d.ts","sourceRoot":"","sources":["../../src/utilities/getDBName.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,KAAK,IAAI,GAAG;IACV,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,gBAAgB,CAAA;QACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,0DAKnB,IAAI,KAAG,MAiBT,CAAA"}
1
+ {"version":3,"file":"getDBName.d.ts","sourceRoot":"","sources":["../../src/utilities/getDBName.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,KAAK,IAAI,GAAG;IACV,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,gBAAgB,CAAA;QACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,0DAKnB,IAAI,KAAG,MAmBT,CAAA"}
@@ -12,7 +12,9 @@
12
12
  } else {
13
13
  result = name ?? slug;
14
14
  }
15
- if (versions) result = `_${result}_versions`;
15
+ if (versions) {
16
+ result = `_${result}_versions`;
17
+ }
16
18
  return result;
17
19
  };
18
20
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getDBName.ts"],"sourcesContent":["import type { DBIdentifierName } from 'payload'\n\ntype Args = {\n config: {\n dbName?: DBIdentifierName\n enumName?: DBIdentifierName\n name?: string\n slug?: string\n }\n locales?: boolean\n target?: 'dbName' | 'enumName'\n versions?: boolean\n}\n\n/**\n * Used to name database enums and collections\n * Returns the collection or enum name for a given entity\n */\nexport const getDBName = ({\n config: { name, slug },\n config,\n target = 'dbName',\n versions = false,\n}: Args): string => {\n let result: string\n let custom = config[target]\n\n if (!custom && target === 'enumName') {\n custom = config['dbName']\n }\n\n if (custom) {\n result = typeof custom === 'function' ? custom({}) : custom\n } else {\n result = name ?? slug\n }\n\n if (versions) result = `_${result}_versions`\n\n return result\n}\n"],"names":["getDBName","config","name","slug","target","versions","result","custom"],"mappings":"AAcA;;;CAGC,GACD,OAAO,MAAMA,YAAY,CAAC,EACxBC,QAAQ,EAAEC,IAAI,EAAEC,IAAI,EAAE,EACtBF,MAAM,EACNG,SAAS,QAAQ,EACjBC,WAAW,KAAK,EACX;IACL,IAAIC;IACJ,IAAIC,SAASN,MAAM,CAACG,OAAO;IAE3B,IAAI,CAACG,UAAUH,WAAW,YAAY;QACpCG,SAASN,MAAM,CAAC,SAAS;IAC3B;IAEA,IAAIM,QAAQ;QACVD,SAAS,OAAOC,WAAW,aAAaA,OAAO,CAAC,KAAKA;IACvD,OAAO;QACLD,SAASJ,QAAQC;IACnB;IAEA,IAAIE,UAAUC,SAAS,CAAC,CAAC,EAAEA,OAAO,SAAS,CAAC;IAE5C,OAAOA;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getDBName.ts"],"sourcesContent":["import type { DBIdentifierName } from 'payload'\n\ntype Args = {\n config: {\n dbName?: DBIdentifierName\n enumName?: DBIdentifierName\n name?: string\n slug?: string\n }\n locales?: boolean\n target?: 'dbName' | 'enumName'\n versions?: boolean\n}\n\n/**\n * Used to name database enums and collections\n * Returns the collection or enum name for a given entity\n */\nexport const getDBName = ({\n config: { name, slug },\n config,\n target = 'dbName',\n versions = false,\n}: Args): string => {\n let result: string\n let custom = config[target]\n\n if (!custom && target === 'enumName') {\n custom = config['dbName']\n }\n\n if (custom) {\n result = typeof custom === 'function' ? custom({}) : custom\n } else {\n result = name ?? slug\n }\n\n if (versions) {\n result = `_${result}_versions`\n }\n\n return result\n}\n"],"names":["getDBName","config","name","slug","target","versions","result","custom"],"mappings":"AAcA;;;CAGC,GACD,OAAO,MAAMA,YAAY,CAAC,EACxBC,QAAQ,EAAEC,IAAI,EAAEC,IAAI,EAAE,EACtBF,MAAM,EACNG,SAAS,QAAQ,EACjBC,WAAW,KAAK,EACX;IACL,IAAIC;IACJ,IAAIC,SAASN,MAAM,CAACG,OAAO;IAE3B,IAAI,CAACG,UAAUH,WAAW,YAAY;QACpCG,SAASN,MAAM,CAAC,SAAS;IAC3B;IAEA,IAAIM,QAAQ;QACVD,SAAS,OAAOC,WAAW,aAAaA,OAAO,CAAC,KAAKA;IACvD,OAAO;QACLD,SAASJ,QAAQC;IACnB;IAEA,IAAIE,UAAU;QACZC,SAAS,CAAC,CAAC,EAAEA,OAAO,SAAS,CAAC;IAChC;IAEA,OAAOA;AACT,EAAC"}
@@ -7,8 +7,8 @@ export const handleError = ({ collection, error, global, req })=>{
7
7
  collection,
8
8
  errors: [
9
9
  {
10
- field: Object.keys(error.keyValue)[0],
11
- message: req.t('error:valueMustBeUnique')
10
+ message: req.t('error:valueMustBeUnique'),
11
+ path: Object.keys(error.keyValue)[0]
12
12
  }
13
13
  ],
14
14
  global
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/handleError.ts"],"sourcesContent":["import httpStatus from 'http-status'\nimport { APIError, ValidationError } from 'payload'\n\nexport const handleError = ({\n collection,\n error,\n global,\n req,\n}: {\n collection?: string\n error\n global?: string\n req\n}) => {\n // Handle uniqueness error from MongoDB\n if (error.code === 11000 && error.keyValue) {\n throw new ValidationError(\n {\n collection,\n errors: [\n {\n field: Object.keys(error.keyValue)[0],\n message: req.t('error:valueMustBeUnique'),\n },\n ],\n global,\n },\n req.t,\n )\n } else if (error.code === 11000) {\n throw new APIError(req.t('error:valueMustBeUnique'), httpStatus.BAD_REQUEST)\n } else {\n throw error\n }\n}\n"],"names":["httpStatus","APIError","ValidationError","handleError","collection","error","global","req","code","keyValue","errors","field","Object","keys","message","t","BAD_REQUEST"],"mappings":"AAAA,OAAOA,gBAAgB,cAAa;AACpC,SAASC,QAAQ,EAAEC,eAAe,QAAQ,UAAS;AAEnD,OAAO,MAAMC,cAAc,CAAC,EAC1BC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,GAAG,EAMJ;IACC,uCAAuC;IACvC,IAAIF,MAAMG,IAAI,KAAK,SAASH,MAAMI,QAAQ,EAAE;QAC1C,MAAM,IAAIP,gBACR;YACEE;YACAM,QAAQ;gBACN;oBACEC,OAAOC,OAAOC,IAAI,CAACR,MAAMI,QAAQ,CAAC,CAAC,EAAE;oBACrCK,SAASP,IAAIQ,CAAC,CAAC;gBACjB;aACD;YACDT;QACF,GACAC,IAAIQ,CAAC;IAET,OAAO,IAAIV,MAAMG,IAAI,KAAK,OAAO;QAC/B,MAAM,IAAIP,SAASM,IAAIQ,CAAC,CAAC,4BAA4Bf,WAAWgB,WAAW;IAC7E,OAAO;QACL,MAAMX;IACR;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/handleError.ts"],"sourcesContent":["import httpStatus from 'http-status'\nimport { APIError, ValidationError } from 'payload'\n\nexport const handleError = ({\n collection,\n error,\n global,\n req,\n}: {\n collection?: string\n error\n global?: string\n req\n}) => {\n // Handle uniqueness error from MongoDB\n if (error.code === 11000 && error.keyValue) {\n throw new ValidationError(\n {\n collection,\n errors: [\n {\n message: req.t('error:valueMustBeUnique'),\n path: Object.keys(error.keyValue)[0],\n },\n ],\n global,\n },\n req.t,\n )\n } else if (error.code === 11000) {\n throw new APIError(req.t('error:valueMustBeUnique'), httpStatus.BAD_REQUEST)\n } else {\n throw error\n }\n}\n"],"names":["httpStatus","APIError","ValidationError","handleError","collection","error","global","req","code","keyValue","errors","message","t","path","Object","keys","BAD_REQUEST"],"mappings":"AAAA,OAAOA,gBAAgB,cAAa;AACpC,SAASC,QAAQ,EAAEC,eAAe,QAAQ,UAAS;AAEnD,OAAO,MAAMC,cAAc,CAAC,EAC1BC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,GAAG,EAMJ;IACC,uCAAuC;IACvC,IAAIF,MAAMG,IAAI,KAAK,SAASH,MAAMI,QAAQ,EAAE;QAC1C,MAAM,IAAIP,gBACR;YACEE;YACAM,QAAQ;gBACN;oBACEC,SAASJ,IAAIK,CAAC,CAAC;oBACfC,MAAMC,OAAOC,IAAI,CAACV,MAAMI,QAAQ,CAAC,CAAC,EAAE;gBACtC;aACD;YACDH;QACF,GACAC,IAAIK,CAAC;IAET,OAAO,IAAIP,MAAMG,IAAI,KAAK,OAAO;QAC/B,MAAM,IAAIP,SAASM,IAAIK,CAAC,CAAC,4BAA4BZ,WAAWgB,WAAW;IAC7E,OAAO;QACL,MAAMX;IACR;AACF,EAAC"}
@@ -1,3 +1,2 @@
1
- declare const sanitizeInternalFields: <T extends Record<string, unknown>>(incomingDoc: T) => T;
2
- export default sanitizeInternalFields;
1
+ export declare const sanitizeInternalFields: <T extends Record<string, unknown>>(incomingDoc: T) => T;
3
2
  //# sourceMappingURL=sanitizeInternalFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeInternalFields.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeInternalFields.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,KAAG,CAiBvE,CAAA;AAEb,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"sanitizeInternalFields.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeInternalFields.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,KAAG,CAiB9E,CAAA"}
@@ -1,7 +1,7 @@
1
1
  const internalFields = [
2
2
  '__v'
3
3
  ];
4
- const sanitizeInternalFields = (incomingDoc)=>Object.entries(incomingDoc).reduce((newDoc, [key, val])=>{
4
+ export const sanitizeInternalFields = (incomingDoc)=>Object.entries(incomingDoc).reduce((newDoc, [key, val])=>{
5
5
  if (key === '_id') {
6
6
  return {
7
7
  ...newDoc,
@@ -16,6 +16,5 @@ const sanitizeInternalFields = (incomingDoc)=>Object.entries(incomingDoc).reduce
16
16
  [key]: val
17
17
  };
18
18
  }, {});
19
- export default sanitizeInternalFields;
20
19
 
21
20
  //# sourceMappingURL=sanitizeInternalFields.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/sanitizeInternalFields.ts"],"sourcesContent":["const internalFields = ['__v']\n\nconst sanitizeInternalFields = <T extends Record<string, unknown>>(incomingDoc: T): T =>\n Object.entries(incomingDoc).reduce((newDoc, [key, val]): T => {\n if (key === '_id') {\n return {\n ...newDoc,\n id: val,\n }\n }\n\n if (internalFields.indexOf(key) > -1) {\n return newDoc\n }\n\n return {\n ...newDoc,\n [key]: val,\n }\n }, {} as T)\n\nexport default sanitizeInternalFields\n"],"names":["internalFields","sanitizeInternalFields","incomingDoc","Object","entries","reduce","newDoc","key","val","id","indexOf"],"mappings":"AAAA,MAAMA,iBAAiB;IAAC;CAAM;AAE9B,MAAMC,yBAAyB,CAAoCC,cACjEC,OAAOC,OAAO,CAACF,aAAaG,MAAM,CAAC,CAACC,QAAQ,CAACC,KAAKC,IAAI;QACpD,IAAID,QAAQ,OAAO;YACjB,OAAO;gBACL,GAAGD,MAAM;gBACTG,IAAID;YACN;QACF;QAEA,IAAIR,eAAeU,OAAO,CAACH,OAAO,CAAC,GAAG;YACpC,OAAOD;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACT,CAACC,IAAI,EAAEC;QACT;IACF,GAAG,CAAC;AAEN,eAAeP,uBAAsB"}
1
+ {"version":3,"sources":["../../src/utilities/sanitizeInternalFields.ts"],"sourcesContent":["const internalFields = ['__v']\n\nexport const sanitizeInternalFields = <T extends Record<string, unknown>>(incomingDoc: T): T =>\n Object.entries(incomingDoc).reduce((newDoc, [key, val]): T => {\n if (key === '_id') {\n return {\n ...newDoc,\n id: val,\n }\n }\n\n if (internalFields.indexOf(key) > -1) {\n return newDoc\n }\n\n return {\n ...newDoc,\n [key]: val,\n }\n }, {} as T)\n"],"names":["internalFields","sanitizeInternalFields","incomingDoc","Object","entries","reduce","newDoc","key","val","id","indexOf"],"mappings":"AAAA,MAAMA,iBAAiB;IAAC;CAAM;AAE9B,OAAO,MAAMC,yBAAyB,CAAoCC,cACxEC,OAAOC,OAAO,CAACF,aAAaG,MAAM,CAAC,CAACC,QAAQ,CAACC,KAAKC,IAAI;QACpD,IAAID,QAAQ,OAAO;YACjB,OAAO;gBACL,GAAGD,MAAM;gBACTG,IAAID;YACN;QACF;QAEA,IAAIR,eAAeU,OAAO,CAACH,OAAO,CAAC,GAAG;YACpC,OAAOD;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACT,CAACC,IAAI,EAAEC;QACT;IACF,GAAG,CAAC,GAAO"}
@@ -0,0 +1,9 @@
1
+ import type { Field, SanitizedConfig } from 'payload';
2
+ type Args = {
3
+ config: SanitizedConfig;
4
+ data: Record<string, unknown>;
5
+ fields: Field[];
6
+ };
7
+ export declare const sanitizeRelationshipIDs: ({ config, data, fields, }: Args) => Record<string, unknown>;
8
+ export {};
9
+ //# sourceMappingURL=sanitizeRelationshipIDs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeRelationshipIDs.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeRelationshipIDs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,KAAK,EAAE,eAAe,EAA0B,MAAM,SAAS,CAAA;AAM/F,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,CAAA;AAuGD,eAAO,MAAM,uBAAuB,8BAIjC,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA6B/B,CAAA"}
@@ -0,0 +1,115 @@
1
+ import mongoose from 'mongoose';
2
+ import { APIError, traverseFields } from 'payload';
3
+ import { fieldAffectsData } from 'payload/shared';
4
+ function isValidRelationObject(value) {
5
+ return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value;
6
+ }
7
+ const convertValue = ({ relatedCollection, value })=>{
8
+ const customIDField = relatedCollection.fields.find((field)=>fieldAffectsData(field) && field.name === 'id');
9
+ if (!customIDField) {
10
+ try {
11
+ return new mongoose.Types.ObjectId(value);
12
+ } catch (error) {
13
+ throw new APIError(`Failed to create ObjectId from value: ${value}. Error: ${error.message}`, 400);
14
+ }
15
+ }
16
+ return value;
17
+ };
18
+ const sanitizeRelationship = ({ config, field, locale, ref, value })=>{
19
+ let relatedCollection;
20
+ let result = value;
21
+ const hasManyRelations = typeof field.relationTo !== 'string';
22
+ if (!hasManyRelations) {
23
+ relatedCollection = config.collections?.find(({ slug })=>slug === field.relationTo);
24
+ }
25
+ if (Array.isArray(value)) {
26
+ result = value.map((val)=>{
27
+ // Handle has many
28
+ if (relatedCollection && val && (typeof val === 'string' || typeof val === 'number')) {
29
+ return convertValue({
30
+ relatedCollection,
31
+ value: val
32
+ });
33
+ }
34
+ // Handle has many - polymorphic
35
+ if (isValidRelationObject(val)) {
36
+ const relatedCollectionForSingleValue = config.collections?.find(({ slug })=>slug === val.relationTo);
37
+ if (relatedCollectionForSingleValue) {
38
+ return {
39
+ relationTo: val.relationTo,
40
+ value: convertValue({
41
+ relatedCollection: relatedCollectionForSingleValue,
42
+ value: val.value
43
+ })
44
+ };
45
+ }
46
+ }
47
+ return val;
48
+ });
49
+ }
50
+ // Handle has one - polymorphic
51
+ if (isValidRelationObject(value)) {
52
+ relatedCollection = config.collections?.find(({ slug })=>slug === value.relationTo);
53
+ if (relatedCollection) {
54
+ result = {
55
+ relationTo: value.relationTo,
56
+ value: convertValue({
57
+ relatedCollection,
58
+ value: value.value
59
+ })
60
+ };
61
+ }
62
+ }
63
+ // Handle has one
64
+ if (relatedCollection && value && (typeof value === 'string' || typeof value === 'number')) {
65
+ result = convertValue({
66
+ relatedCollection,
67
+ value
68
+ });
69
+ }
70
+ if (locale) {
71
+ ref[locale] = result;
72
+ } else {
73
+ ref[field.name] = result;
74
+ }
75
+ };
76
+ export const sanitizeRelationshipIDs = ({ config, data, fields })=>{
77
+ const sanitize = ({ field, ref })=>{
78
+ if (field.type === 'relationship' || field.type === 'upload') {
79
+ // handle localized relationships
80
+ if (config.localization && field.localized) {
81
+ const locales = config.localization.locales;
82
+ const fieldRef = ref[field.name];
83
+ for (const { code } of locales){
84
+ if (ref[field.name]?.[code]) {
85
+ const value = ref[field.name][code];
86
+ sanitizeRelationship({
87
+ config,
88
+ field,
89
+ locale: code,
90
+ ref: fieldRef,
91
+ value
92
+ });
93
+ }
94
+ }
95
+ } else {
96
+ // handle non-localized relationships
97
+ sanitizeRelationship({
98
+ config,
99
+ field,
100
+ locale: undefined,
101
+ ref,
102
+ value: ref[field.name]
103
+ });
104
+ }
105
+ }
106
+ };
107
+ traverseFields({
108
+ callback: sanitize,
109
+ fields,
110
+ ref: data
111
+ });
112
+ return data;
113
+ };
114
+
115
+ //# sourceMappingURL=sanitizeRelationshipIDs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/sanitizeRelationshipIDs.ts"],"sourcesContent":["import type { CollectionConfig, Field, SanitizedConfig, TraverseFieldsCallback } from 'payload'\n\nimport mongoose from 'mongoose'\nimport { APIError, traverseFields } from 'payload'\nimport { fieldAffectsData } from 'payload/shared'\n\ntype Args = {\n config: SanitizedConfig\n data: Record<string, unknown>\n fields: Field[]\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 convertValue = ({\n relatedCollection,\n value,\n}: {\n relatedCollection: CollectionConfig\n value: number | string\n}): mongoose.Types.ObjectId | number | string => {\n const customIDField = relatedCollection.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n if (!customIDField) {\n try {\n return new mongoose.Types.ObjectId(value)\n } catch (error) {\n throw new APIError(\n `Failed to create ObjectId from value: ${value}. Error: ${error.message}`,\n 400,\n )\n }\n }\n\n return value\n}\n\nconst sanitizeRelationship = ({ config, field, locale, ref, value }) => {\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\n if (relatedCollection && val && (typeof val === 'string' || typeof val === 'number')) {\n return convertValue({\n relatedCollection,\n value: val,\n })\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: convertValue({\n relatedCollection: relatedCollectionForSingleValue,\n value: val.value,\n }),\n }\n }\n }\n\n return val\n })\n }\n\n // Handle has one - polymorphic\n if (isValidRelationObject(value)) {\n relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo)\n\n if (relatedCollection) {\n result = {\n relationTo: value.relationTo,\n value: convertValue({ relatedCollection, value: value.value }),\n }\n }\n }\n\n // Handle has one\n if (relatedCollection && value && (typeof value === 'string' || typeof value === 'number')) {\n result = convertValue({\n relatedCollection,\n value,\n })\n }\n if (locale) {\n ref[locale] = result\n } else {\n ref[field.name] = result\n }\n}\n\nexport const sanitizeRelationshipIDs = ({\n config,\n data,\n fields,\n}: Args): Record<string, unknown> => {\n const sanitize: TraverseFieldsCallback = ({ field, ref }) => {\n if (field.type === 'relationship' || field.type === 'upload') {\n // handle localized relationships\n if (config.localization && field.localized) {\n const locales = config.localization.locales\n const fieldRef = ref[field.name]\n for (const { code } of locales) {\n if (ref[field.name]?.[code]) {\n const value = ref[field.name][code]\n sanitizeRelationship({ config, field, locale: code, ref: fieldRef, value })\n }\n }\n } else {\n // handle non-localized relationships\n sanitizeRelationship({\n config,\n field,\n locale: undefined,\n ref,\n value: ref[field.name],\n })\n }\n }\n }\n\n traverseFields({ callback: sanitize, fields, ref: data })\n\n return data\n}\n"],"names":["mongoose","APIError","traverseFields","fieldAffectsData","isValidRelationObject","value","convertValue","relatedCollection","customIDField","fields","find","field","name","Types","ObjectId","error","message","sanitizeRelationship","config","locale","ref","result","hasManyRelations","relationTo","collections","slug","Array","isArray","map","val","relatedCollectionForSingleValue","sanitizeRelationshipIDs","data","sanitize","type","localization","localized","locales","fieldRef","code","undefined","callback"],"mappings":"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"}
@@ -7,5 +7,5 @@ import type { MongooseAdapter } from './index.js';
7
7
  */
8
8
  export declare function withSession(db: MongooseAdapter, req: PayloadRequest): Promise<{
9
9
  session: ClientSession;
10
- } | object>;
10
+ } | Record<string, never>>;
11
11
  //# sourceMappingURL=withSession.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withSession.d.ts","sourceRoot":"","sources":["../src/withSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,eAAe,EACnB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAAG,MAAM,CAAC,CAQ9C"}
1
+ {"version":3,"file":"withSession.d.ts","sourceRoot":"","sources":["../src/withSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,eAAe,EACnB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAU7D"}
@@ -6,9 +6,11 @@
6
6
  if (transactionID instanceof Promise) {
7
7
  transactionID = await req.transactionID;
8
8
  }
9
- if (req) return db.sessions[transactionID] ? {
10
- session: db.sessions[transactionID]
11
- } : {};
9
+ if (req) {
10
+ return db.sessions[transactionID] ? {
11
+ session: db.sessions[transactionID]
12
+ } : {};
13
+ }
12
14
  }
13
15
 
14
16
  //# sourceMappingURL=withSession.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/withSession.ts"],"sourcesContent":["import type { ClientSession } from 'mongoose'\nimport type { PayloadRequest } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\n/**\n * returns the session belonging to the transaction of the req.session if exists\n * @returns ClientSession\n */\nexport async function withSession(\n db: MongooseAdapter,\n req: PayloadRequest,\n): Promise<{ session: ClientSession } | object> {\n let transactionID = req.transactionID\n\n if (transactionID instanceof Promise) {\n transactionID = await req.transactionID\n }\n\n if (req) return db.sessions[transactionID] ? { session: db.sessions[transactionID] } : {}\n}\n"],"names":["withSession","db","req","transactionID","Promise","sessions","session"],"mappings":"AAKA;;;CAGC,GACD,OAAO,eAAeA,YACpBC,EAAmB,EACnBC,GAAmB;IAEnB,IAAIC,gBAAgBD,IAAIC,aAAa;IAErC,IAAIA,yBAAyBC,SAAS;QACpCD,gBAAgB,MAAMD,IAAIC,aAAa;IACzC;IAEA,IAAID,KAAK,OAAOD,GAAGI,QAAQ,CAACF,cAAc,GAAG;QAAEG,SAASL,GAAGI,QAAQ,CAACF,cAAc;IAAC,IAAI,CAAC;AAC1F"}
1
+ {"version":3,"sources":["../src/withSession.ts"],"sourcesContent":["import type { ClientSession } from 'mongoose'\nimport type { PayloadRequest } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\n/**\n * returns the session belonging to the transaction of the req.session if exists\n * @returns ClientSession\n */\nexport async function withSession(\n db: MongooseAdapter,\n req: PayloadRequest,\n): Promise<{ session: ClientSession } | Record<string, never>> {\n let transactionID = req.transactionID\n\n if (transactionID instanceof Promise) {\n transactionID = await req.transactionID\n }\n\n if (req) {\n return db.sessions[transactionID] ? { session: db.sessions[transactionID] } : {}\n }\n}\n"],"names":["withSession","db","req","transactionID","Promise","sessions","session"],"mappings":"AAKA;;;CAGC,GACD,OAAO,eAAeA,YACpBC,EAAmB,EACnBC,GAAmB;IAEnB,IAAIC,gBAAgBD,IAAIC,aAAa;IAErC,IAAIA,yBAAyBC,SAAS;QACpCD,gBAAgB,MAAMD,IAAIC,aAAa;IACzC;IAEA,IAAID,KAAK;QACP,OAAOD,GAAGI,QAAQ,CAACF,cAAc,GAAG;YAAEG,SAASL,GAAGI,QAAQ,CAACF,cAAc;QAAC,IAAI,CAAC;IACjF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/db-mongodb",
3
- "version": "3.0.0-canary.b8dd0db",
3
+ "version": "3.0.0-canary.bda91d8",
4
4
  "description": "The officially supported MongoDB database adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -29,24 +29,27 @@
29
29
  "bson-objectid": "2.0.4",
30
30
  "http-status": "1.6.2",
31
31
  "mongoose": "6.12.3",
32
+ "mongoose-aggregate-paginate-v2": "1.0.6",
32
33
  "mongoose-paginate-v2": "1.7.22",
33
34
  "prompts": "2.4.2",
34
35
  "uuid": "10.0.0"
35
36
  },
36
37
  "devDependencies": {
37
- "@types/mongoose-aggregate-paginate-v2": "1.0.9",
38
+ "@types/mongoose-aggregate-paginate-v2": "1.0.6",
38
39
  "mongodb": "4.17.1",
39
40
  "mongodb-memory-server": "^9",
40
- "@payloadcms/eslint-config": "3.0.0-beta.59",
41
- "payload": "3.0.0-canary.b8dd0db"
41
+ "@payloadcms/eslint-config": "3.0.0-beta.112",
42
+ "payload": "3.0.0-canary.bda91d8"
42
43
  },
43
44
  "peerDependencies": {
44
- "payload": "3.0.0-canary.b8dd0db"
45
+ "payload": "3.0.0-canary.bda91d8"
45
46
  },
46
47
  "scripts": {
47
48
  "build": "pnpm build:types && pnpm build:swc",
48
49
  "build:swc": "swc ./src -d ./dist --config-file .swcrc-build --strip-leading-paths",
49
50
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
50
- "clean": "rimraf {dist,*.tsbuildinfo}"
51
+ "clean": "rimraf {dist,*.tsbuildinfo}",
52
+ "lint": "eslint .",
53
+ "lint:fix": "eslint . --fix"
51
54
  }
52
55
  }