@payloadcms/db-mongodb 3.59.0-internal.ff6711a → 3.59.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/findDistinct.d.ts.map +1 -1
- package/dist/findDistinct.js +52 -39
- package/dist/findDistinct.js.map +1 -1
- package/package.json +4 -4
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../src/findDistinct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAA;AAW3D,eAAO,MAAM,YAAY,EAAE,
|
1
|
+
{"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../src/findDistinct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAA;AAW3D,eAAO,MAAM,YAAY,EAAE,YAoP1B,CAAA"}
|
package/dist/findDistinct.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { getFieldByPath } from 'payload';
|
2
2
|
import { buildQuery } from './queries/buildQuery.js';
|
3
3
|
import { buildSortParam } from './queries/buildSortParam.js';
|
4
4
|
import { getCollection } from './utilities/getEntity.js';
|
@@ -10,7 +10,7 @@ export const findDistinct = async function(args) {
|
|
10
10
|
});
|
11
11
|
const session = await getSession(this, args.req);
|
12
12
|
const { where = {} } = args;
|
13
|
-
|
13
|
+
let sortAggregation = [];
|
14
14
|
const sort = buildSortParam({
|
15
15
|
adapter: this,
|
16
16
|
config: this.payload.config,
|
@@ -28,7 +28,9 @@ export const findDistinct = async function(args) {
|
|
28
28
|
where
|
29
29
|
});
|
30
30
|
const fieldPathResult = getFieldByPath({
|
31
|
+
config: this.payload.config,
|
31
32
|
fields: collectionConfig.flattenedFields,
|
33
|
+
includeRelationships: true,
|
32
34
|
path: args.field
|
33
35
|
});
|
34
36
|
let fieldPath = args.field;
|
@@ -40,59 +42,75 @@ export const findDistinct = async function(args) {
|
|
40
42
|
;
|
41
43
|
const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
|
42
44
|
let currentFields = collectionConfig.flattenedFields;
|
43
|
-
let relationTo = null;
|
44
45
|
let foundField = null;
|
45
|
-
let
|
46
|
-
let
|
46
|
+
let rels = [];
|
47
|
+
let tempPath = '';
|
48
|
+
let insideRelation = false;
|
47
49
|
for (const segment of args.field.split('.')){
|
48
50
|
const field = currentFields.find((e)=>e.name === segment);
|
51
|
+
if (rels.length) {
|
52
|
+
insideRelation = true;
|
53
|
+
}
|
49
54
|
if (!field) {
|
50
55
|
break;
|
51
56
|
}
|
52
|
-
if (
|
53
|
-
|
57
|
+
if (tempPath) {
|
58
|
+
tempPath = `${tempPath}.${field.name}`;
|
54
59
|
} else {
|
55
|
-
|
60
|
+
tempPath = field.name;
|
56
61
|
}
|
57
62
|
if ('flattenedFields' in field) {
|
58
63
|
currentFields = field.flattenedFields;
|
59
|
-
if (relationTo) {
|
60
|
-
foundFieldPath = `${foundFieldPath}.`;
|
61
|
-
} else {
|
62
|
-
relationFieldPath = `${relationFieldPath}.`;
|
63
|
-
}
|
64
64
|
continue;
|
65
65
|
}
|
66
66
|
if ((field.type === 'relationship' || field.type === 'upload') && typeof field.relationTo === 'string') {
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
rels.push({
|
68
|
+
fieldPath: tempPath,
|
69
|
+
relationTo: field.relationTo
|
70
|
+
});
|
71
71
|
currentFields = this.payload.collections[field.relationTo]?.config.flattenedFields;
|
72
72
|
continue;
|
73
73
|
}
|
74
74
|
foundField = field;
|
75
|
-
if (sortAggregation.some((stage)=>'$lookup' in stage && stage.$lookup.localField === relationFieldPath)) {
|
76
|
-
sortProperty = sortProperty.replace('__', '');
|
77
|
-
sortAggregation.pop();
|
78
|
-
}
|
79
75
|
}
|
80
76
|
const resolvedField = foundField || fieldPathResult?.field;
|
81
77
|
const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField;
|
82
78
|
let relationLookup = null;
|
83
|
-
if (
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
from: foreignModel.collection.name,
|
93
|
-
localField: relationFieldPath
|
79
|
+
if (!insideRelation) {
|
80
|
+
rels = [];
|
81
|
+
}
|
82
|
+
if (rels.length) {
|
83
|
+
if (sortProperty.startsWith('_')) {
|
84
|
+
const sortWithoutRelationPrefix = sortProperty.replace(/^_+/, '');
|
85
|
+
const lastFieldPath = rels.at(-1)?.fieldPath;
|
86
|
+
if (sortWithoutRelationPrefix.startsWith(lastFieldPath)) {
|
87
|
+
sortProperty = sortWithoutRelationPrefix;
|
94
88
|
}
|
95
|
-
}
|
89
|
+
}
|
90
|
+
relationLookup = rels.reduce((acc, { fieldPath, relationTo })=>{
|
91
|
+
sortAggregation = sortAggregation.filter((each)=>{
|
92
|
+
if ('$lookup' in each && each.$lookup.as.replace(/^_+/, '') === fieldPath) {
|
93
|
+
return false;
|
94
|
+
}
|
95
|
+
return true;
|
96
|
+
});
|
97
|
+
const { Model: foreignModel } = getCollection({
|
98
|
+
adapter: this,
|
99
|
+
collectionSlug: relationTo
|
100
|
+
});
|
101
|
+
acc.push({
|
102
|
+
$lookup: {
|
103
|
+
as: fieldPath,
|
104
|
+
foreignField: '_id',
|
105
|
+
from: foreignModel.collection.name,
|
106
|
+
localField: fieldPath
|
107
|
+
}
|
108
|
+
});
|
109
|
+
acc.push({
|
110
|
+
$unwind: `$${fieldPath}`
|
111
|
+
});
|
112
|
+
return acc;
|
113
|
+
}, []);
|
96
114
|
}
|
97
115
|
let $unwind = '';
|
98
116
|
let $group = null;
|
@@ -128,12 +146,7 @@ export const findDistinct = async function(args) {
|
|
128
146
|
$match: query
|
129
147
|
},
|
130
148
|
...sortAggregation.length > 0 ? sortAggregation : [],
|
131
|
-
...relationLookup ? [
|
132
|
-
relationLookup,
|
133
|
-
{
|
134
|
-
$unwind: `$${relationFieldPath}`
|
135
|
-
}
|
136
|
-
] : [],
|
149
|
+
...relationLookup?.length ? relationLookup : [],
|
137
150
|
...$unwind ? [
|
138
151
|
{
|
139
152
|
$unwind
|
package/dist/findDistinct.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/findDistinct.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { FindDistinct, FlattenedField } from 'payload'\n\nimport { APIError, getFieldByPath } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nexport const findDistinct: FindDistinct = async function (this: MongooseAdapter, args) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug: args.collection,\n })\n\n const session = await getSession(this, args.req)\n\n const { where = {} } = args\n\n const sortAggregation: PipelineStage[] = []\n\n const sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n sort: args.sort ?? args.field,\n sortAggregation,\n timestamps: true,\n })\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug: args.collection,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n where,\n })\n\n const fieldPathResult = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: args.field,\n })\n let fieldPath = args.field\n if (fieldPathResult?.pathHasLocalized && args.locale) {\n fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale)\n }\n\n const page = args.page || 1\n\n let sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n let currentFields = collectionConfig.flattenedFields\n let relationTo: null | string = null\n let foundField: FlattenedField | null = null\n let foundFieldPath = ''\n let relationFieldPath = ''\n\n for (const segment of args.field.split('.')) {\n const field = currentFields.find((e) => e.name === segment)\n\n if (!field) {\n break\n }\n\n if (relationTo) {\n foundFieldPath = `${foundFieldPath}${field?.name}`\n } else {\n relationFieldPath = `${relationFieldPath}${field.name}`\n }\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n\n if (relationTo) {\n foundFieldPath = `${foundFieldPath}.`\n } else {\n relationFieldPath = `${relationFieldPath}.`\n }\n continue\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n if (relationTo) {\n throw new APIError(\n `findDistinct for fields nested to relationships supported 1 level only, errored field: ${args.field}`,\n )\n }\n relationTo = field.relationTo\n currentFields = this.payload.collections[field.relationTo]?.config\n .flattenedFields as FlattenedField[]\n continue\n }\n foundField = field\n\n if (\n sortAggregation.some(\n (stage) => '$lookup' in stage && stage.$lookup.localField === relationFieldPath,\n )\n ) {\n sortProperty = sortProperty.replace('__', '')\n sortAggregation.pop()\n }\n }\n\n const resolvedField = foundField || fieldPathResult?.field\n const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField\n\n let relationLookup: null | PipelineStage = null\n if (relationTo && foundFieldPath && relationFieldPath) {\n const { Model: foreignModel } = getCollection({ adapter: this, collectionSlug: relationTo })\n\n relationLookup = {\n $lookup: {\n as: relationFieldPath,\n foreignField: '_id',\n from: foreignModel.collection.name,\n localField: relationFieldPath,\n },\n }\n }\n\n let $unwind: any = ''\n let $group: any = null\n if (\n isHasManyValue &&\n sortAggregation.length &&\n sortAggregation[0] &&\n '$lookup' in sortAggregation[0]\n ) {\n $unwind = { path: `$${sortAggregation[0].$lookup.as}`, preserveNullAndEmptyArrays: true }\n $group = {\n _id: {\n _field: `$${sortAggregation[0].$lookup.as}._id`,\n _sort: `$${sortProperty}`,\n },\n }\n } else if (isHasManyValue) {\n $unwind = { path: `$${args.field}`, preserveNullAndEmptyArrays: true }\n }\n\n if (!$group) {\n $group = {\n _id: {\n _field: `$${fieldPath}`,\n ...(sortProperty === fieldPath\n ? {}\n : {\n _sort: `$${sortProperty}`,\n }),\n },\n }\n }\n\n const pipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup ? [relationLookup, { $unwind: `$${relationFieldPath}` }] : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n {\n $sort: {\n [sortProperty === fieldPath ? '_id._field' : '_id._sort']: sortDirection,\n },\n },\n ]\n\n const getValues = async () => {\n return Model.aggregate(pipeline, { session }).then((res) =>\n res.map((each) => ({\n [args.field]: JSON.parse(JSON.stringify(each._id._field)),\n })),\n )\n }\n\n if (args.limit) {\n pipeline.push({\n $skip: (page - 1) * args.limit,\n })\n pipeline.push({ $limit: args.limit })\n const totalDocs = await Model.aggregate(\n [\n {\n $match: query,\n },\n {\n $group: {\n _id: `$${fieldPath}`,\n },\n },\n { $count: 'count' },\n ],\n {\n session,\n },\n ).then((res) => res[0]?.count ?? 0)\n const totalPages = Math.ceil(totalDocs / args.limit)\n const hasPrevPage = page > 1\n const hasNextPage = totalPages > page\n const pagingCounter = (page - 1) * args.limit + 1\n\n return {\n hasNextPage,\n hasPrevPage,\n limit: args.limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n values: await getValues(),\n }\n }\n\n const values = await getValues()\n\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n page: 1,\n pagingCounter: 1,\n totalDocs: values.length,\n totalPages: 1,\n values,\n }\n}\n"],"names":["APIError","getFieldByPath","buildQuery","buildSortParam","getCollection","getSession","findDistinct","args","collectionConfig","Model","adapter","collectionSlug","collection","session","req","where","sortAggregation","sort","config","payload","fields","flattenedFields","locale","field","timestamps","query","fieldPathResult","path","fieldPath","pathHasLocalized","localizedPath","replace","page","sortProperty","Object","keys","sortDirection","currentFields","relationTo","foundField","foundFieldPath","relationFieldPath","segment","split","find","e","name","type","collections","some","stage","$lookup","localField","pop","resolvedField","isHasManyValue","relationLookup","foreignModel","as","foreignField","from","$unwind","$group","length","preserveNullAndEmptyArrays","_id","_field","_sort","pipeline","$match","$sort","getValues","aggregate","then","res","map","each","JSON","parse","stringify","limit","push","$skip","$limit","totalDocs","$count","count","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","nextPage","prevPage","values"],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["../src/findDistinct.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { FindDistinct, FlattenedField } from 'payload'\n\nimport { getFieldByPath } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nexport const findDistinct: FindDistinct = async function (this: MongooseAdapter, args) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug: args.collection,\n })\n\n const session = await getSession(this, args.req)\n\n const { where = {} } = args\n\n let sortAggregation: PipelineStage[] = []\n\n const sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n sort: args.sort ?? args.field,\n sortAggregation,\n timestamps: true,\n })\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug: args.collection,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n where,\n })\n\n const fieldPathResult = getFieldByPath({\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n includeRelationships: true,\n path: args.field,\n })\n let fieldPath = args.field\n if (fieldPathResult?.pathHasLocalized && args.locale) {\n fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale)\n }\n\n const page = args.page || 1\n\n let sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n let currentFields = collectionConfig.flattenedFields\n let foundField: FlattenedField | null = null\n\n let rels: {\n fieldPath: string\n relationTo: string\n }[] = []\n\n let tempPath = ''\n let insideRelation = false\n\n for (const segment of args.field.split('.')) {\n const field = currentFields.find((e) => e.name === segment)\n if (rels.length) {\n insideRelation = true\n }\n\n if (!field) {\n break\n }\n\n if (tempPath) {\n tempPath = `${tempPath}.${field.name}`\n } else {\n tempPath = field.name\n }\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n continue\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n rels.push({ fieldPath: tempPath, relationTo: field.relationTo })\n currentFields = this.payload.collections[field.relationTo]?.config\n .flattenedFields as FlattenedField[]\n continue\n }\n foundField = field\n }\n\n const resolvedField = foundField || fieldPathResult?.field\n const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField\n\n let relationLookup: null | PipelineStage[] = null\n\n if (!insideRelation) {\n rels = []\n }\n\n if (rels.length) {\n if (sortProperty.startsWith('_')) {\n const sortWithoutRelationPrefix = sortProperty.replace(/^_+/, '')\n const lastFieldPath = rels.at(-1)?.fieldPath as string\n if (sortWithoutRelationPrefix.startsWith(lastFieldPath)) {\n sortProperty = sortWithoutRelationPrefix\n }\n }\n relationLookup = rels.reduce<PipelineStage[]>((acc, { fieldPath, relationTo }) => {\n sortAggregation = sortAggregation.filter((each) => {\n if ('$lookup' in each && each.$lookup.as.replace(/^_+/, '') === fieldPath) {\n return false\n }\n\n return true\n })\n const { Model: foreignModel } = getCollection({ adapter: this, collectionSlug: relationTo })\n acc.push({\n $lookup: {\n as: fieldPath,\n foreignField: '_id',\n from: foreignModel.collection.name,\n localField: fieldPath,\n },\n })\n acc.push({ $unwind: `$${fieldPath}` })\n return acc\n }, [])\n }\n\n let $unwind: any = ''\n let $group: any = null\n if (\n isHasManyValue &&\n sortAggregation.length &&\n sortAggregation[0] &&\n '$lookup' in sortAggregation[0]\n ) {\n $unwind = { path: `$${sortAggregation[0].$lookup.as}`, preserveNullAndEmptyArrays: true }\n $group = {\n _id: {\n _field: `$${sortAggregation[0].$lookup.as}._id`,\n _sort: `$${sortProperty}`,\n },\n }\n } else if (isHasManyValue) {\n $unwind = { path: `$${args.field}`, preserveNullAndEmptyArrays: true }\n }\n\n if (!$group) {\n $group = {\n _id: {\n _field: `$${fieldPath}`,\n ...(sortProperty === fieldPath\n ? {}\n : {\n _sort: `$${sortProperty}`,\n }),\n },\n }\n }\n\n const pipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup?.length ? relationLookup : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n {\n $sort: {\n [sortProperty === fieldPath ? '_id._field' : '_id._sort']: sortDirection,\n },\n },\n ]\n\n const getValues = async () => {\n return Model.aggregate(pipeline, { session }).then((res) =>\n res.map((each) => ({\n [args.field]: JSON.parse(JSON.stringify(each._id._field)),\n })),\n )\n }\n\n if (args.limit) {\n pipeline.push({\n $skip: (page - 1) * args.limit,\n })\n pipeline.push({ $limit: args.limit })\n const totalDocs = await Model.aggregate(\n [\n {\n $match: query,\n },\n {\n $group: {\n _id: `$${fieldPath}`,\n },\n },\n { $count: 'count' },\n ],\n {\n session,\n },\n ).then((res) => res[0]?.count ?? 0)\n const totalPages = Math.ceil(totalDocs / args.limit)\n const hasPrevPage = page > 1\n const hasNextPage = totalPages > page\n const pagingCounter = (page - 1) * args.limit + 1\n\n return {\n hasNextPage,\n hasPrevPage,\n limit: args.limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n values: await getValues(),\n }\n }\n\n const values = await getValues()\n\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n page: 1,\n pagingCounter: 1,\n totalDocs: values.length,\n totalPages: 1,\n values,\n }\n}\n"],"names":["getFieldByPath","buildQuery","buildSortParam","getCollection","getSession","findDistinct","args","collectionConfig","Model","adapter","collectionSlug","collection","session","req","where","sortAggregation","sort","config","payload","fields","flattenedFields","locale","field","timestamps","query","fieldPathResult","includeRelationships","path","fieldPath","pathHasLocalized","localizedPath","replace","page","sortProperty","Object","keys","sortDirection","currentFields","foundField","rels","tempPath","insideRelation","segment","split","find","e","name","length","type","relationTo","push","collections","resolvedField","isHasManyValue","relationLookup","startsWith","sortWithoutRelationPrefix","lastFieldPath","at","reduce","acc","filter","each","$lookup","as","foreignModel","foreignField","from","localField","$unwind","$group","preserveNullAndEmptyArrays","_id","_field","_sort","pipeline","$match","$sort","getValues","aggregate","then","res","map","JSON","parse","stringify","limit","$skip","$limit","totalDocs","$count","count","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","nextPage","prevPage","values"],"mappings":"AAGA,SAASA,cAAc,QAAQ,UAAS;AAIxC,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,UAAU,QAAQ,4BAA2B;AAEtD,OAAO,MAAMC,eAA6B,eAAuCC,IAAI;IACnF,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGL,cAAc;QAChDM,SAAS,IAAI;QACbC,gBAAgBJ,KAAKK,UAAU;IACjC;IAEA,MAAMC,UAAU,MAAMR,WAAW,IAAI,EAAEE,KAAKO,GAAG;IAE/C,MAAM,EAAEC,QAAQ,CAAC,CAAC,EAAE,GAAGR;IAEvB,IAAIS,kBAAmC,EAAE;IAEzC,MAAMC,OAAOd,eAAe;QAC1BO,SAAS,IAAI;QACbQ,QAAQ,IAAI,CAACC,OAAO,CAACD,MAAM;QAC3BE,QAAQZ,iBAAiBa,eAAe;QACxCC,QAAQf,KAAKe,MAAM;QACnBL,MAAMV,KAAKU,IAAI,IAAIV,KAAKgB,KAAK;QAC7BP;QACAQ,YAAY;IACd;IAEA,MAAMC,QAAQ,MAAMvB,WAAW;QAC7BQ,SAAS,IAAI;QACbC,gBAAgBJ,KAAKK,UAAU;QAC/BQ,QAAQZ,iBAAiBa,eAAe;QACxCC,QAAQf,KAAKe,MAAM;QACnBP;IACF;IAEA,MAAMW,kBAAkBzB,eAAe;QACrCiB,QAAQ,IAAI,CAACC,OAAO,CAACD,MAAM;QAC3BE,QAAQZ,iBAAiBa,eAAe;QACxCM,sBAAsB;QACtBC,MAAMrB,KAAKgB,KAAK;IAClB;IACA,IAAIM,YAAYtB,KAAKgB,KAAK;IAC1B,IAAIG,iBAAiBI,oBAAoBvB,KAAKe,MAAM,EAAE;QACpDO,YAAYH,gBAAgBK,aAAa,CAACC,OAAO,CAAC,YAAYzB,KAAKe,MAAM;IAC3E;IAEA,MAAMW,OAAO1B,KAAK0B,IAAI,IAAI;IAE1B,IAAIC,eAAeC,OAAOC,IAAI,CAACnB,KAAK,CAAC,EAAE,AAAE,+DAA+D;;IACxG,MAAMoB,gBAAgBpB,IAAI,CAACiB,aAAa,KAAK,QAAQ,IAAI,CAAC;IAE1D,IAAII,gBAAgB9B,iBAAiBa,eAAe;IACpD,IAAIkB,aAAoC;IAExC,IAAIC,OAGE,EAAE;IAER,IAAIC,WAAW;IACf,IAAIC,iBAAiB;IAErB,KAAK,MAAMC,WAAWpC,KAAKgB,KAAK,CAACqB,KAAK,CAAC,KAAM;QAC3C,MAAMrB,QAAQe,cAAcO,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKJ;QACnD,IAAIH,KAAKQ,MAAM,EAAE;YACfN,iBAAiB;QACnB;QAEA,IAAI,CAACnB,OAAO;YACV;QACF;QAEA,IAAIkB,UAAU;YACZA,WAAW,GAAGA,SAAS,CAAC,EAAElB,MAAMwB,IAAI,EAAE;QACxC,OAAO;YACLN,WAAWlB,MAAMwB,IAAI;QACvB;QAEA,IAAI,qBAAqBxB,OAAO;YAC9Be,gBAAgBf,MAAMF,eAAe;YACrC;QACF;QAEA,IACE,AAACE,CAAAA,MAAM0B,IAAI,KAAK,kBAAkB1B,MAAM0B,IAAI,KAAK,QAAO,KACxD,OAAO1B,MAAM2B,UAAU,KAAK,UAC5B;YACAV,KAAKW,IAAI,CAAC;gBAAEtB,WAAWY;gBAAUS,YAAY3B,MAAM2B,UAAU;YAAC;YAC9DZ,gBAAgB,IAAI,CAACnB,OAAO,CAACiC,WAAW,CAAC7B,MAAM2B,UAAU,CAAC,EAAEhC,OACzDG;YACH;QACF;QACAkB,aAAahB;IACf;IAEA,MAAM8B,gBAAgBd,cAAcb,iBAAiBH;IACrD,MAAM+B,iBAAiBD,iBAAiB,aAAaA,iBAAiBA;IAEtE,IAAIE,iBAAyC;IAE7C,IAAI,CAACb,gBAAgB;QACnBF,OAAO,EAAE;IACX;IAEA,IAAIA,KAAKQ,MAAM,EAAE;QACf,IAAId,aAAasB,UAAU,CAAC,MAAM;YAChC,MAAMC,4BAA4BvB,aAAaF,OAAO,CAAC,OAAO;YAC9D,MAAM0B,gBAAgBlB,KAAKmB,EAAE,CAAC,CAAC,IAAI9B;YACnC,IAAI4B,0BAA0BD,UAAU,CAACE,gBAAgB;gBACvDxB,eAAeuB;YACjB;QACF;QACAF,iBAAiBf,KAAKoB,MAAM,CAAkB,CAACC,KAAK,EAAEhC,SAAS,EAAEqB,UAAU,EAAE;YAC3ElC,kBAAkBA,gBAAgB8C,MAAM,CAAC,CAACC;gBACxC,IAAI,aAAaA,QAAQA,KAAKC,OAAO,CAACC,EAAE,CAACjC,OAAO,CAAC,OAAO,QAAQH,WAAW;oBACzE,OAAO;gBACT;gBAEA,OAAO;YACT;YACA,MAAM,EAAEpB,OAAOyD,YAAY,EAAE,GAAG9D,cAAc;gBAAEM,SAAS,IAAI;gBAAEC,gBAAgBuC;YAAW;YAC1FW,IAAIV,IAAI,CAAC;gBACPa,SAAS;oBACPC,IAAIpC;oBACJsC,cAAc;oBACdC,MAAMF,aAAatD,UAAU,CAACmC,IAAI;oBAClCsB,YAAYxC;gBACd;YACF;YACAgC,IAAIV,IAAI,CAAC;gBAAEmB,SAAS,CAAC,CAAC,EAAEzC,WAAW;YAAC;YACpC,OAAOgC;QACT,GAAG,EAAE;IACP;IAEA,IAAIS,UAAe;IACnB,IAAIC,SAAc;IAClB,IACEjB,kBACAtC,gBAAgBgC,MAAM,IACtBhC,eAAe,CAAC,EAAE,IAClB,aAAaA,eAAe,CAAC,EAAE,EAC/B;QACAsD,UAAU;YAAE1C,MAAM,CAAC,CAAC,EAAEZ,eAAe,CAAC,EAAE,CAACgD,OAAO,CAACC,EAAE,EAAE;YAAEO,4BAA4B;QAAK;QACxFD,SAAS;YACPE,KAAK;gBACHC,QAAQ,CAAC,CAAC,EAAE1D,eAAe,CAAC,EAAE,CAACgD,OAAO,CAACC,EAAE,CAAC,IAAI,CAAC;gBAC/CU,OAAO,CAAC,CAAC,EAAEzC,cAAc;YAC3B;QACF;IACF,OAAO,IAAIoB,gBAAgB;QACzBgB,UAAU;YAAE1C,MAAM,CAAC,CAAC,EAAErB,KAAKgB,KAAK,EAAE;YAAEiD,4BAA4B;QAAK;IACvE;IAEA,IAAI,CAACD,QAAQ;QACXA,SAAS;YACPE,KAAK;gBACHC,QAAQ,CAAC,CAAC,EAAE7C,WAAW;gBACvB,GAAIK,iBAAiBL,YACjB,CAAC,IACD;oBACE8C,OAAO,CAAC,CAAC,EAAEzC,cAAc;gBAC3B,CAAC;YACP;QACF;IACF;IAEA,MAAM0C,WAA4B;QAChC;YACEC,QAAQpD;QACV;WACIT,gBAAgBgC,MAAM,GAAG,IAAIhC,kBAAkB,EAAE;WACjDuC,gBAAgBP,SAASO,iBAAiB,EAAE;WAC5Ce,UACA;YACE;gBACEA;YACF;SACD,GACD,EAAE;QACN;YACEC;QACF;QACA;YACEO,OAAO;gBACL,CAAC5C,iBAAiBL,YAAY,eAAe,YAAY,EAAEQ;YAC7D;QACF;KACD;IAED,MAAM0C,YAAY;QAChB,OAAOtE,MAAMuE,SAAS,CAACJ,UAAU;YAAE/D;QAAQ,GAAGoE,IAAI,CAAC,CAACC,MAClDA,IAAIC,GAAG,CAAC,CAACpB,OAAU,CAAA;oBACjB,CAACxD,KAAKgB,KAAK,CAAC,EAAE6D,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACvB,KAAKU,GAAG,CAACC,MAAM;gBACzD,CAAA;IAEJ;IAEA,IAAInE,KAAKgF,KAAK,EAAE;QACdX,SAASzB,IAAI,CAAC;YACZqC,OAAO,AAACvD,CAAAA,OAAO,CAAA,IAAK1B,KAAKgF,KAAK;QAChC;QACAX,SAASzB,IAAI,CAAC;YAAEsC,QAAQlF,KAAKgF,KAAK;QAAC;QACnC,MAAMG,YAAY,MAAMjF,MAAMuE,SAAS,CACrC;YACE;gBACEH,QAAQpD;YACV;YACA;gBACE8C,QAAQ;oBACNE,KAAK,CAAC,CAAC,EAAE5C,WAAW;gBACtB;YACF;YACA;gBAAE8D,QAAQ;YAAQ;SACnB,EACD;YACE9E;QACF,GACAoE,IAAI,CAAC,CAACC,MAAQA,GAAG,CAAC,EAAE,EAAEU,SAAS;QACjC,MAAMC,aAAaC,KAAKC,IAAI,CAACL,YAAYnF,KAAKgF,KAAK;QACnD,MAAMS,cAAc/D,OAAO;QAC3B,MAAMgE,cAAcJ,aAAa5D;QACjC,MAAMiE,gBAAgB,AAACjE,CAAAA,OAAO,CAAA,IAAK1B,KAAKgF,KAAK,GAAG;QAEhD,OAAO;YACLU;YACAD;YACAT,OAAOhF,KAAKgF,KAAK;YACjBY,UAAUF,cAAchE,OAAO,IAAI;YACnCA;YACAiE;YACAE,UAAUJ,cAAc/D,OAAO,IAAI;YACnCyD;YACAG;YACAQ,QAAQ,MAAMtB;QAChB;IACF;IAEA,MAAMsB,SAAS,MAAMtB;IAErB,OAAO;QACLkB,aAAa;QACbD,aAAa;QACbT,OAAO;QACPtD,MAAM;QACNiE,eAAe;QACfR,WAAWW,OAAOrD,MAAM;QACxB6C,YAAY;QACZQ;IACF;AACF,EAAC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@payloadcms/db-mongodb",
|
3
|
-
"version": "3.59.
|
3
|
+
"version": "3.59.1",
|
4
4
|
"description": "The officially supported MongoDB database adapter for Payload",
|
5
5
|
"homepage": "https://payloadcms.com",
|
6
6
|
"repository": {
|
@@ -49,11 +49,11 @@
|
|
49
49
|
"@types/uuid": "10.0.0",
|
50
50
|
"mongodb": "6.16.0",
|
51
51
|
"mongodb-memory-server": "10.1.4",
|
52
|
-
"
|
53
|
-
"
|
52
|
+
"payload": "3.59.1",
|
53
|
+
"@payloadcms/eslint-config": "3.28.0"
|
54
54
|
},
|
55
55
|
"peerDependencies": {
|
56
|
-
"payload": "3.59.
|
56
|
+
"payload": "3.59.1"
|
57
57
|
},
|
58
58
|
"scripts": {
|
59
59
|
"build": "pnpm build:types && pnpm build:swc",
|