@payloadcms/db-mongodb 3.10.0 → 3.11.1-canary.3f6217a
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/count.d.ts.map +1 -1
- package/dist/count.js +22 -18
- package/dist/count.js.map +1 -1
- package/dist/countGlobalVersions.d.ts.map +1 -1
- package/dist/countGlobalVersions.js +22 -18
- package/dist/countGlobalVersions.js.map +1 -1
- package/dist/countVersions.d.ts.map +1 -1
- package/dist/countVersions.js +22 -18
- package/dist/countVersions.js.map +1 -1
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +24 -21
- package/dist/create.js.map +1 -1
- package/dist/createGlobal.d.ts.map +1 -1
- package/dist/createGlobal.js +20 -20
- package/dist/createGlobal.js.map +1 -1
- package/dist/createGlobalVersion.d.ts.map +1 -1
- package/dist/createGlobalVersion.js +30 -33
- package/dist/createGlobalVersion.js.map +1 -1
- package/dist/createVersion.d.ts.map +1 -1
- package/dist/createVersion.js +31 -34
- package/dist/createVersion.js.map +1 -1
- package/dist/deleteMany.d.ts.map +1 -1
- package/dist/deleteMany.js +4 -5
- package/dist/deleteMany.js.map +1 -1
- package/dist/deleteOne.d.ts.map +1 -1
- package/dist/deleteOne.js +14 -18
- package/dist/deleteOne.js.map +1 -1
- package/dist/deleteVersions.d.ts.map +1 -1
- package/dist/deleteVersions.js +1 -2
- package/dist/deleteVersions.js.map +1 -1
- package/dist/find.d.ts.map +1 -1
- package/dist/find.js +74 -39
- package/dist/find.js.map +1 -1
- package/dist/findGlobal.d.ts.map +1 -1
- package/dist/findGlobal.js +17 -18
- package/dist/findGlobal.js.map +1 -1
- package/dist/findGlobalVersions.d.ts.map +1 -1
- package/dist/findGlobalVersions.js +62 -32
- package/dist/findGlobalVersions.js.map +1 -1
- package/dist/findOne.d.ts.map +1 -1
- package/dist/findOne.js +20 -29
- package/dist/findOne.js.map +1 -1
- package/dist/findVersions.d.ts.map +1 -1
- package/dist/findVersions.js +61 -32
- package/dist/findVersions.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js.map +1 -1
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +14 -18
- package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
- package/dist/queries/buildAndOrConditions.d.ts +1 -3
- package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
- package/dist/queries/buildAndOrConditions.js +1 -2
- package/dist/queries/buildAndOrConditions.js.map +1 -1
- package/dist/queries/buildQuery.d.ts +0 -2
- package/dist/queries/buildQuery.d.ts.map +1 -1
- package/dist/queries/buildQuery.js +6 -2
- package/dist/queries/buildQuery.js.map +1 -1
- package/dist/queries/buildSearchParams.d.ts +1 -3
- package/dist/queries/buildSearchParams.d.ts.map +1 -1
- package/dist/queries/buildSearchParams.js +10 -14
- package/dist/queries/buildSearchParams.js.map +1 -1
- package/dist/queries/buildSortParam.d.ts +7 -1
- package/dist/queries/buildSortParam.d.ts.map +1 -1
- package/dist/queries/buildSortParam.js +2 -2
- package/dist/queries/buildSortParam.js.map +1 -1
- package/dist/queries/getLocalizedSortProperty.js +2 -2
- package/dist/queries/getLocalizedSortProperty.js.map +1 -1
- package/dist/queries/parseParams.d.ts +1 -3
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +1 -2
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
- package/dist/queries/sanitizeQueryValue.js +0 -16
- package/dist/queries/sanitizeQueryValue.js.map +1 -1
- package/dist/queryDrafts.d.ts.map +1 -1
- package/dist/queryDrafts.js +66 -40
- package/dist/queryDrafts.js.map +1 -1
- package/dist/updateGlobal.d.ts.map +1 -1
- package/dist/updateGlobal.js +21 -24
- package/dist/updateGlobal.js.map +1 -1
- package/dist/updateGlobalVersion.d.ts.map +1 -1
- package/dist/updateGlobalVersion.js +26 -28
- package/dist/updateGlobalVersion.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +23 -28
- package/dist/updateOne.js.map +1 -1
- package/dist/updateVersion.d.ts.map +1 -1
- package/dist/updateVersion.js +24 -27
- package/dist/updateVersion.js.map +1 -1
- package/dist/utilities/buildJoinAggregation.d.ts +4 -4
- package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
- package/dist/utilities/buildJoinAggregation.js +28 -7
- package/dist/utilities/buildJoinAggregation.js.map +1 -1
- package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
- package/dist/utilities/buildProjectionFromSelect.js +1 -18
- package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
- package/dist/utilities/sanitizeInternalFields.d.ts +2 -0
- package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -0
- package/dist/utilities/sanitizeInternalFields.js +20 -0
- package/dist/utilities/sanitizeInternalFields.js.map +1 -0
- package/dist/utilities/sanitizeRelationshipIDs.d.ts +9 -0
- package/dist/utilities/sanitizeRelationshipIDs.d.ts.map +1 -0
- package/dist/utilities/sanitizeRelationshipIDs.js +125 -0
- package/dist/utilities/sanitizeRelationshipIDs.js.map +1 -0
- package/dist/utilities/{transform.spec.js → sanitizeRelationshipIDs.spec.js} +7 -23
- package/dist/utilities/sanitizeRelationshipIDs.spec.js.map +1 -0
- package/package.json +3 -3
- package/dist/utilities/findMany.d.ts +0 -20
- package/dist/utilities/findMany.d.ts.map +0 -1
- package/dist/utilities/findMany.js +0 -84
- package/dist/utilities/findMany.js.map +0 -1
- package/dist/utilities/getHasNearConstraint.d.ts +0 -3
- package/dist/utilities/getHasNearConstraint.d.ts.map +0 -1
- package/dist/utilities/getHasNearConstraint.js +0 -26
- package/dist/utilities/getHasNearConstraint.js.map +0 -1
- package/dist/utilities/transform.d.ts +0 -25
- package/dist/utilities/transform.d.ts.map +0 -1
- package/dist/utilities/transform.js +0 -254
- package/dist/utilities/transform.js.map +0 -1
- package/dist/utilities/transform.spec.js.map +0 -1
package/dist/updateVersion.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { buildVersionCollectionFields } from 'payload';
|
|
2
2
|
import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
|
|
3
3
|
import { getSession } from './utilities/getSession.js';
|
|
4
|
-
import {
|
|
4
|
+
import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js';
|
|
5
5
|
export const updateVersion = async function updateVersion({ id, collection, locale, options: optionsArgs = {}, req, select, versionData, where }) {
|
|
6
6
|
const VersionModel = this.versions[collection];
|
|
7
7
|
const whereToUse = where || {
|
|
@@ -9,40 +9,37 @@ export const updateVersion = async function updateVersion({ id, collection, loca
|
|
|
9
9
|
equals: id
|
|
10
10
|
}
|
|
11
11
|
};
|
|
12
|
-
const fields = buildVersionCollectionFields(this.payload.config, this.payload.collections[collection].config
|
|
13
|
-
const
|
|
14
|
-
const query = await VersionModel.buildQuery({
|
|
15
|
-
locale,
|
|
16
|
-
payload: this.payload,
|
|
17
|
-
session,
|
|
18
|
-
where: whereToUse
|
|
19
|
-
});
|
|
20
|
-
transform({
|
|
21
|
-
adapter: this,
|
|
22
|
-
data: versionData,
|
|
23
|
-
fields,
|
|
24
|
-
operation: 'update',
|
|
25
|
-
timestamps: optionsArgs.timestamps !== false
|
|
26
|
-
});
|
|
27
|
-
const doc = await VersionModel.collection.findOneAndUpdate(query, {
|
|
28
|
-
$set: versionData
|
|
29
|
-
}, {
|
|
12
|
+
const fields = buildVersionCollectionFields(this.payload.config, this.payload.collections[collection].config);
|
|
13
|
+
const options = {
|
|
30
14
|
...optionsArgs,
|
|
15
|
+
lean: true,
|
|
16
|
+
new: true,
|
|
31
17
|
projection: buildProjectionFromSelect({
|
|
32
18
|
adapter: this,
|
|
33
19
|
fields: buildVersionCollectionFields(this.payload.config, this.payload.collections[collection].config, true),
|
|
34
20
|
select
|
|
35
21
|
}),
|
|
36
|
-
|
|
37
|
-
|
|
22
|
+
session: await getSession(this, req)
|
|
23
|
+
};
|
|
24
|
+
const query = await VersionModel.buildQuery({
|
|
25
|
+
locale,
|
|
26
|
+
payload: this.payload,
|
|
27
|
+
where: whereToUse
|
|
38
28
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
data:
|
|
42
|
-
fields
|
|
43
|
-
operation: 'read'
|
|
29
|
+
const sanitizedData = sanitizeRelationshipIDs({
|
|
30
|
+
config: this.payload.config,
|
|
31
|
+
data: versionData,
|
|
32
|
+
fields
|
|
44
33
|
});
|
|
45
|
-
|
|
34
|
+
const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options);
|
|
35
|
+
const result = JSON.parse(JSON.stringify(doc));
|
|
36
|
+
const verificationToken = doc._verificationToken;
|
|
37
|
+
// custom id type reset
|
|
38
|
+
result.id = result._id;
|
|
39
|
+
if (verificationToken) {
|
|
40
|
+
result._verificationToken = verificationToken;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
46
43
|
};
|
|
47
44
|
|
|
48
45
|
//# sourceMappingURL=updateVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/updateVersion.ts"],"sourcesContent":["import { buildVersionCollectionFields, type UpdateVersion } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/updateVersion.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\n\nimport { buildVersionCollectionFields, type UpdateVersion } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport const updateVersion: UpdateVersion = async function updateVersion(\n this: MongooseAdapter,\n { id, collection, locale, options: optionsArgs = {}, req, select, versionData, where },\n) {\n const VersionModel = this.versions[collection]\n const whereToUse = where || { id: { equals: id } }\n const fields = buildVersionCollectionFields(\n this.payload.config,\n this.payload.collections[collection].config,\n )\n\n const options: QueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: buildVersionCollectionFields(\n this.payload.config,\n this.payload.collections[collection].config,\n true,\n ),\n select,\n }),\n session: await getSession(this, req),\n }\n\n const query = await VersionModel.buildQuery({\n locale,\n payload: this.payload,\n where: whereToUse,\n })\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data: versionData,\n fields,\n })\n\n const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options)\n\n const result = JSON.parse(JSON.stringify(doc))\n\n const verificationToken = doc._verificationToken\n\n // custom id type reset\n result.id = result._id\n if (verificationToken) {\n result._verificationToken = verificationToken\n }\n return result\n}\n"],"names":["buildVersionCollectionFields","buildProjectionFromSelect","getSession","sanitizeRelationshipIDs","updateVersion","id","collection","locale","options","optionsArgs","req","select","versionData","where","VersionModel","versions","whereToUse","equals","fields","payload","config","collections","lean","new","projection","adapter","session","query","buildQuery","sanitizedData","data","doc","findOneAndUpdate","result","JSON","parse","stringify","verificationToken","_verificationToken","_id"],"mappings":"AAEA,SAASA,4BAA4B,QAA4B,UAAS;AAI1E,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,MAAMC,gBAA+B,eAAeA,cAEzD,EAAEC,EAAE,EAAEC,UAAU,EAAEC,MAAM,EAAEC,SAASC,cAAc,CAAC,CAAC,EAAEC,GAAG,EAAEC,MAAM,EAAEC,WAAW,EAAEC,KAAK,EAAE;IAEtF,MAAMC,eAAe,IAAI,CAACC,QAAQ,CAACT,WAAW;IAC9C,MAAMU,aAAaH,SAAS;QAAER,IAAI;YAAEY,QAAQZ;QAAG;IAAE;IACjD,MAAMa,SAASlB,6BACb,IAAI,CAACmB,OAAO,CAACC,MAAM,EACnB,IAAI,CAACD,OAAO,CAACE,WAAW,CAACf,WAAW,CAACc,MAAM;IAG7C,MAAMZ,UAAwB;QAC5B,GAAGC,WAAW;QACda,MAAM;QACNC,KAAK;QACLC,YAAYvB,0BAA0B;YACpCwB,SAAS,IAAI;YACbP,QAAQlB,6BACN,IAAI,CAACmB,OAAO,CAACC,MAAM,EACnB,IAAI,CAACD,OAAO,CAACE,WAAW,CAACf,WAAW,CAACc,MAAM,EAC3C;YAEFT;QACF;QACAe,SAAS,MAAMxB,WAAW,IAAI,EAAEQ;IAClC;IAEA,MAAMiB,QAAQ,MAAMb,aAAac,UAAU,CAAC;QAC1CrB;QACAY,SAAS,IAAI,CAACA,OAAO;QACrBN,OAAOG;IACT;IAEA,MAAMa,gBAAgB1B,wBAAwB;QAC5CiB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3BU,MAAMlB;QACNM;IACF;IAEA,MAAMa,MAAM,MAAMjB,aAAakB,gBAAgB,CAACL,OAAOE,eAAerB;IAEtE,MAAMyB,SAASC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACL;IAEzC,MAAMM,oBAAoBN,IAAIO,kBAAkB;IAEhD,uBAAuB;IACvBL,OAAO5B,EAAE,GAAG4B,OAAOM,GAAG;IACtB,IAAIF,mBAAmB;QACrBJ,OAAOK,kBAAkB,GAAGD;IAC9B;IACA,OAAOJ;AACT,EAAC"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import type { ClientSession } from 'mongodb';
|
|
2
1
|
import type { PipelineStage } from 'mongoose';
|
|
3
|
-
import type { CollectionSlug, JoinQuery, SanitizedCollectionConfig } from 'payload';
|
|
2
|
+
import type { CollectionSlug, JoinQuery, SanitizedCollectionConfig, Where } from 'payload';
|
|
4
3
|
import type { MongooseAdapter } from '../index.js';
|
|
5
4
|
type BuildJoinAggregationArgs = {
|
|
6
5
|
adapter: MongooseAdapter;
|
|
7
6
|
collection: CollectionSlug;
|
|
8
7
|
collectionConfig: SanitizedCollectionConfig;
|
|
9
8
|
joins: JoinQuery;
|
|
9
|
+
limit?: number;
|
|
10
10
|
locale: string;
|
|
11
11
|
projection?: Record<string, true>;
|
|
12
|
-
|
|
12
|
+
query?: Where;
|
|
13
13
|
/** whether the query is from drafts */
|
|
14
14
|
versions?: boolean;
|
|
15
15
|
};
|
|
16
|
-
export declare const buildJoinAggregation: ({ adapter, collection, collectionConfig, joins, locale, projection,
|
|
16
|
+
export declare const buildJoinAggregation: ({ adapter, collection, collectionConfig, joins, limit, locale, projection, query, versions, }: BuildJoinAggregationArgs) => Promise<PipelineStage[] | undefined>;
|
|
17
17
|
export {};
|
|
18
18
|
//# sourceMappingURL=buildJoinAggregation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildJoinAggregation.d.ts","sourceRoot":"","sources":["../../src/utilities/buildJoinAggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"buildJoinAggregation.d.ts","sourceRoot":"","sources":["../../src/utilities/buildJoinAggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,cAAc,CAAA;IAC1B,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,KAAK,EAAE,SAAS,CAAA;IAEhB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,oBAAoB,kGAU9B,wBAAwB,KAAG,OAAO,CAAC,aAAa,EAAE,GAAG,SAAS,CAoKhE,CAAA"}
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
import { buildSortParam } from '../queries/buildSortParam.js';
|
|
2
|
-
export const buildJoinAggregation = async ({ adapter, collection, collectionConfig, joins, locale, projection,
|
|
2
|
+
export const buildJoinAggregation = async ({ adapter, collection, collectionConfig, joins, limit, locale, projection, query, versions })=>{
|
|
3
3
|
if (Object.keys(collectionConfig.joins).length === 0 || joins === false) {
|
|
4
4
|
return;
|
|
5
5
|
}
|
|
6
6
|
const joinConfig = adapter.payload.collections[collection].config.joins;
|
|
7
|
-
const aggregate = [
|
|
7
|
+
const aggregate = [
|
|
8
|
+
{
|
|
9
|
+
$sort: {
|
|
10
|
+
createdAt: -1
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
if (query) {
|
|
15
|
+
aggregate.push({
|
|
16
|
+
$match: query
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
if (limit) {
|
|
20
|
+
aggregate.push({
|
|
21
|
+
$limit: limit
|
|
22
|
+
});
|
|
23
|
+
}
|
|
8
24
|
for (const slug of Object.keys(joinConfig)){
|
|
9
25
|
for (const join of joinConfig[slug]){
|
|
10
26
|
const joinModel = adapter.collections[join.field.collection];
|
|
@@ -15,17 +31,18 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
15
31
|
continue;
|
|
16
32
|
}
|
|
17
33
|
const { limit: limitJoin = join.field.defaultLimit ?? 10, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin } = joins?.[join.joinPath] || {};
|
|
18
|
-
const
|
|
34
|
+
const sort = buildSortParam({
|
|
19
35
|
config: adapter.payload.config,
|
|
20
36
|
fields: adapter.payload.collections[slug].config.flattenedFields,
|
|
21
37
|
locale,
|
|
22
38
|
sort: sortJoin,
|
|
23
39
|
timestamps: true
|
|
24
40
|
});
|
|
41
|
+
const sortProperty = Object.keys(sort)[0];
|
|
42
|
+
const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
|
|
25
43
|
const $match = await joinModel.buildQuery({
|
|
26
44
|
locale,
|
|
27
45
|
payload: adapter.payload,
|
|
28
|
-
session,
|
|
29
46
|
where: whereJoin
|
|
30
47
|
});
|
|
31
48
|
const pipeline = [
|
|
@@ -33,7 +50,9 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
33
50
|
$match
|
|
34
51
|
},
|
|
35
52
|
{
|
|
36
|
-
$sort
|
|
53
|
+
$sort: {
|
|
54
|
+
[sortProperty]: sortDirection
|
|
55
|
+
}
|
|
37
56
|
}
|
|
38
57
|
];
|
|
39
58
|
if (limitJoin > 0) {
|
|
@@ -133,8 +152,10 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
133
152
|
}
|
|
134
153
|
}
|
|
135
154
|
}
|
|
136
|
-
if (
|
|
137
|
-
|
|
155
|
+
if (projection) {
|
|
156
|
+
aggregate.push({
|
|
157
|
+
$project: projection
|
|
158
|
+
});
|
|
138
159
|
}
|
|
139
160
|
return aggregate;
|
|
140
161
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { ClientSession } from 'mongodb'\nimport type { PipelineStage } from 'mongoose'\nimport type { CollectionSlug, JoinQuery, SanitizedCollectionConfig, Where } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { buildSortParam } from '../queries/buildSortParam.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n joins: JoinQuery\n locale: string\n projection?: Record<string, true>\n session?: ClientSession\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n joins,\n locale,\n projection,\n session,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[] | undefined> => {\n if (Object.keys(collectionConfig.joins).length === 0 || joins === false) {\n return\n }\n\n const joinConfig = adapter.payload.collections[collection].config.joins\n const aggregate: PipelineStage[] = []\n\n for (const slug of Object.keys(joinConfig)) {\n for (const join of joinConfig[slug]) {\n const joinModel = adapter.collections[join.field.collection]\n\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n limit: limitJoin = join.field.defaultLimit ?? 10,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin,\n } = joins?.[join.joinPath] || {}\n\n const $sort = buildSortParam({\n config: adapter.payload.config,\n fields: adapter.payload.collections[slug].config.flattenedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await joinModel.buildQuery({\n locale,\n payload: adapter.payload,\n session,\n where: whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort,\n },\n ]\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${join.field.on}${code}${polymorphicSuffix}`,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n })\n } else {\n const localeSuffix =\n join.field.localized && adapter.payload.config.localization && locale ? `.${locale}` : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${join.field.on}${localeSuffix}${polymorphicSuffix}`,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n if (!aggregate.length) {\n return\n }\n\n return aggregate\n}\n"],"names":["buildSortParam","buildJoinAggregation","adapter","collection","collectionConfig","joins","locale","projection","session","versions","Object","keys","length","joinConfig","payload","collections","config","aggregate","slug","join","joinModel","field","joinPath","limit","limitJoin","defaultLimit","sort","sortJoin","defaultSort","where","whereJoin","$sort","fields","flattenedFields","timestamps","$match","buildQuery","pipeline","push","$limit","polymorphicSuffix","Array","isArray","targetField","relationTo","localization","localeCodes","forEach","code","as","$lookup","foreignField","on","from","name","localField","$addFields","$map","in","input","$gt","$size","$slice","localeSuffix","localized","Number","MAX_VALUE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { CollectionSlug, JoinQuery, SanitizedCollectionConfig, Where } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { buildSortParam } from '../queries/buildSortParam.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n joins: JoinQuery\n // the number of docs to get at the top collection level\n limit?: number\n locale: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Where\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n joins,\n limit,\n locale,\n projection,\n query,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[] | undefined> => {\n if (Object.keys(collectionConfig.joins).length === 0 || joins === false) {\n return\n }\n\n const joinConfig = adapter.payload.collections[collection].config.joins\n const aggregate: PipelineStage[] = [\n {\n $sort: { createdAt: -1 },\n },\n ]\n\n if (query) {\n aggregate.push({\n $match: query,\n })\n }\n\n if (limit) {\n aggregate.push({\n $limit: limit,\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n for (const join of joinConfig[slug]) {\n const joinModel = adapter.collections[join.field.collection]\n\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n limit: limitJoin = join.field.defaultLimit ?? 10,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin,\n } = joins?.[join.joinPath] || {}\n\n const sort = buildSortParam({\n config: adapter.payload.config,\n fields: adapter.payload.collections[slug].config.flattenedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const $match = await joinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${join.field.on}${code}${polymorphicSuffix}`,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n })\n } else {\n const localeSuffix =\n join.field.localized && adapter.payload.config.localization && locale ? `.${locale}` : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${join.field.on}${localeSuffix}${polymorphicSuffix}`,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n if (projection) {\n aggregate.push({ $project: projection })\n }\n\n return aggregate\n}\n"],"names":["buildSortParam","buildJoinAggregation","adapter","collection","collectionConfig","joins","limit","locale","projection","query","versions","Object","keys","length","joinConfig","payload","collections","config","aggregate","$sort","createdAt","push","$match","$limit","slug","join","joinModel","field","joinPath","limitJoin","defaultLimit","sort","sortJoin","defaultSort","where","whereJoin","fields","flattenedFields","timestamps","sortProperty","sortDirection","buildQuery","pipeline","polymorphicSuffix","Array","isArray","targetField","relationTo","localization","localeCodes","forEach","code","as","$lookup","foreignField","on","from","name","localField","$addFields","$map","in","input","$gt","$size","$slice","localeSuffix","localized","Number","MAX_VALUE","$project"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildProjectionFromSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/buildProjectionFromSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"buildProjectionFromSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/buildProjectionFromSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,cAAc,EAAc,UAAU,EAAE,MAAM,SAAS,CAAA;AAIzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AA8KlD,eAAO,MAAM,yBAAyB,iCAInC;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,KAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAmB1B,CAAA"}
|
|
@@ -10,10 +10,6 @@ const addFieldToProjection = ({ adapter, databaseSchemaPath, field, projection,
|
|
|
10
10
|
projection[`${databaseSchemaPath}${field.name}`] = true;
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
|
-
const blockTypeField = {
|
|
14
|
-
name: 'blockType',
|
|
15
|
-
type: 'text'
|
|
16
|
-
};
|
|
17
13
|
const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection, select, selectAllOnCurrentLevel = false, selectMode, withinLocalizedField = false })=>{
|
|
18
14
|
for (const field of fields){
|
|
19
15
|
if (fieldAffectsData(field)) {
|
|
@@ -82,13 +78,6 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
|
|
|
82
78
|
const blocksSelect = select[field.name];
|
|
83
79
|
for (const block of field.blocks){
|
|
84
80
|
if (selectMode === 'include' && blocksSelect[block.slug] === true || selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined') {
|
|
85
|
-
addFieldToProjection({
|
|
86
|
-
adapter,
|
|
87
|
-
databaseSchemaPath: fieldDatabaseSchemaPath,
|
|
88
|
-
field: blockTypeField,
|
|
89
|
-
projection,
|
|
90
|
-
withinLocalizedField: fieldWithinLocalizedField
|
|
91
|
-
});
|
|
92
81
|
traverseFields({
|
|
93
82
|
adapter,
|
|
94
83
|
databaseSchemaPath: fieldDatabaseSchemaPath,
|
|
@@ -110,13 +99,7 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
|
|
|
110
99
|
}
|
|
111
100
|
if (blockSelectMode === 'include') {
|
|
112
101
|
blocksSelect[block.slug]['id'] = true;
|
|
113
|
-
|
|
114
|
-
adapter,
|
|
115
|
-
databaseSchemaPath: fieldDatabaseSchemaPath,
|
|
116
|
-
field: blockTypeField,
|
|
117
|
-
projection,
|
|
118
|
-
withinLocalizedField: fieldWithinLocalizedField
|
|
119
|
-
});
|
|
102
|
+
blocksSelect[block.slug]['blockType'] = true;
|
|
120
103
|
}
|
|
121
104
|
traverseFields({
|
|
122
105
|
adapter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type { FieldAffectingData, FlattenedField, SelectMode, SelectType } from 'payload'\n\nimport { deepCopyObjectSimple, fieldAffectsData, getSelectMode } 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: FlattenedField[]\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 'array':\n case 'group':\n case 'tab': {\n const fieldSelect = select[field.name] as SelectType\n\n if (field.type === 'array' && selectMode === 'include') {\n fieldSelect['id'] = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: field.flattenedFields,\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.flattenedFields,\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.flattenedFields,\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: FlattenedField[]\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","addFieldToProjection","adapter","databaseSchemaPath","field","projection","withinLocalizedField","config","payload","localization","locale","localeCodes","localeDatabaseSchemaPath","replace","name","traverseFields","fields","select","selectAllOnCurrentLevel","selectMode","fieldDatabaseSchemaPath","fieldWithinLocalizedField","localized","type","fieldSelect","flattenedFields","blocksSelect","block","blocks","slug","blockSelectMode","buildProjectionFromSelect","_id"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const internalFields = [
|
|
2
|
+
'__v'
|
|
3
|
+
];
|
|
4
|
+
export const sanitizeInternalFields = (incomingDoc)=>Object.entries(incomingDoc).reduce((newDoc, [key, val])=>{
|
|
5
|
+
if (key === '_id') {
|
|
6
|
+
return {
|
|
7
|
+
...newDoc,
|
|
8
|
+
id: val
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (internalFields.indexOf(key) > -1) {
|
|
12
|
+
return newDoc;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
...newDoc,
|
|
16
|
+
[key]: val
|
|
17
|
+
};
|
|
18
|
+
}, {});
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=sanitizeInternalFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;AAoGD,eAAO,MAAM,uBAAuB,8BAIjC,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAyC/B,CAAA"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Types } from 'mongoose';
|
|
2
|
+
import { 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
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
return new Types.ObjectId(value);
|
|
14
|
+
} catch {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
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 (!ref || typeof ref !== 'object') {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (field.type === 'relationship' || field.type === 'upload') {
|
|
82
|
+
if (!ref[field.name]) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// handle localized relationships
|
|
86
|
+
if (config.localization && field.localized) {
|
|
87
|
+
const locales = config.localization.locales;
|
|
88
|
+
const fieldRef = ref[field.name];
|
|
89
|
+
if (typeof fieldRef !== 'object') {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
for (const { code } of locales){
|
|
93
|
+
const value = ref[field.name][code];
|
|
94
|
+
if (value) {
|
|
95
|
+
sanitizeRelationship({
|
|
96
|
+
config,
|
|
97
|
+
field,
|
|
98
|
+
locale: code,
|
|
99
|
+
ref: fieldRef,
|
|
100
|
+
value
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
// handle non-localized relationships
|
|
106
|
+
sanitizeRelationship({
|
|
107
|
+
config,
|
|
108
|
+
field,
|
|
109
|
+
locale: undefined,
|
|
110
|
+
ref,
|
|
111
|
+
value: ref[field.name]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
traverseFields({
|
|
117
|
+
callback: sanitize,
|
|
118
|
+
fields,
|
|
119
|
+
fillEmpty: false,
|
|
120
|
+
ref: data
|
|
121
|
+
});
|
|
122
|
+
return data;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
//# 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 { Types } 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}): number | string | Types.ObjectId => {\n const customIDField = relatedCollection.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n if (customIDField) {\n return value\n }\n\n try {\n return new Types.ObjectId(value)\n } catch {\n return value\n }\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 (!ref || typeof ref !== 'object') {\n return\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\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({ 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, fillEmpty: false, ref: data })\n\n return data\n}\n"],"names":["Types","traverseFields","fieldAffectsData","isValidRelationObject","value","convertValue","relatedCollection","customIDField","fields","find","field","name","ObjectId","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","fillEmpty"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { flattenAllFields } from 'payload';
|
|
2
1
|
import { Types } from 'mongoose';
|
|
3
|
-
import {
|
|
2
|
+
import { sanitizeRelationshipIDs } from './sanitizeRelationshipIDs.js';
|
|
4
3
|
const flattenRelationshipValues = (obj, prefix = '')=>{
|
|
5
4
|
return Object.keys(obj).reduce((acc, key)=>{
|
|
6
5
|
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
@@ -292,8 +291,8 @@ const relsData = {
|
|
|
292
291
|
]
|
|
293
292
|
}
|
|
294
293
|
};
|
|
295
|
-
describe('
|
|
296
|
-
it('should sanitize relationships
|
|
294
|
+
describe('sanitizeRelationshipIDs', ()=>{
|
|
295
|
+
it('should sanitize relationships', ()=>{
|
|
297
296
|
const data = {
|
|
298
297
|
...relsData,
|
|
299
298
|
array: [
|
|
@@ -410,32 +409,17 @@ describe('transform', ()=>{
|
|
|
410
409
|
}
|
|
411
410
|
};
|
|
412
411
|
const flattenValuesBefore = Object.values(flattenRelationshipValues(data));
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
config
|
|
416
|
-
}
|
|
417
|
-
};
|
|
418
|
-
const fields = flattenAllFields({
|
|
419
|
-
fields: config.collections[0].fields
|
|
420
|
-
});
|
|
421
|
-
transform({
|
|
422
|
-
type: 'write',
|
|
423
|
-
adapter: mockAdapter,
|
|
412
|
+
sanitizeRelationshipIDs({
|
|
413
|
+
config,
|
|
424
414
|
data,
|
|
425
|
-
fields
|
|
415
|
+
fields: config.collections[0].fields
|
|
426
416
|
});
|
|
427
417
|
const flattenValuesAfter = Object.values(flattenRelationshipValues(data));
|
|
428
418
|
flattenValuesAfter.forEach((value, i)=>{
|
|
429
419
|
expect(value).toBeInstanceOf(Types.ObjectId);
|
|
430
420
|
expect(flattenValuesBefore[i]).toBe(value.toHexString());
|
|
431
421
|
});
|
|
432
|
-
transform({
|
|
433
|
-
type: 'read',
|
|
434
|
-
adapter: mockAdapter,
|
|
435
|
-
data,
|
|
436
|
-
fields
|
|
437
|
-
});
|
|
438
422
|
});
|
|
439
423
|
});
|
|
440
424
|
|
|
441
|
-
//# sourceMappingURL=
|
|
425
|
+
//# sourceMappingURL=sanitizeRelationshipIDs.spec.js.map
|