payload 3.81.0-internal.181753b → 3.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"accountLock.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/accountLock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAEzD,eAAO,MAAM,iBAAiB,EAAE,KAAK,EAYzB,CAAA"}
1
+ {"version":3,"file":"accountLock.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/accountLock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAEzD,eAAO,MAAM,iBAAiB,EAAE,KAAK,EAoBzB,CAAA"}
@@ -2,12 +2,20 @@ export const accountLockFields = [
2
2
  {
3
3
  name: 'loginAttempts',
4
4
  type: 'number',
5
+ access: {
6
+ create: ()=>false,
7
+ update: ()=>false
8
+ },
5
9
  defaultValue: 0,
6
10
  hidden: true
7
11
  },
8
12
  {
9
13
  name: 'lockUntil',
10
14
  type: 'date',
15
+ access: {
16
+ create: ()=>false,
17
+ update: ()=>false
18
+ },
11
19
  hidden: true
12
20
  }
13
21
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/baseFields/accountLock.ts"],"sourcesContent":["import type { Field } from '../../fields/config/types.js'\n\nexport const accountLockFields: Field[] = [\n {\n name: 'loginAttempts',\n type: 'number',\n defaultValue: 0,\n hidden: true,\n },\n {\n name: 'lockUntil',\n type: 'date',\n hidden: true,\n },\n] as Field[]\n"],"names":["accountLockFields","name","type","defaultValue","hidden"],"mappings":"AAEA,OAAO,MAAMA,oBAA6B;IACxC;QACEC,MAAM;QACNC,MAAM;QACNC,cAAc;QACdC,QAAQ;IACV;IACA;QACEH,MAAM;QACNC,MAAM;QACNE,QAAQ;IACV;CACD,CAAW"}
1
+ {"version":3,"sources":["../../../src/auth/baseFields/accountLock.ts"],"sourcesContent":["import type { Field } from '../../fields/config/types.js'\n\nexport const accountLockFields: Field[] = [\n {\n name: 'loginAttempts',\n type: 'number',\n access: {\n create: () => false,\n update: () => false,\n },\n defaultValue: 0,\n hidden: true,\n },\n {\n name: 'lockUntil',\n type: 'date',\n access: {\n create: () => false,\n update: () => false,\n },\n hidden: true,\n },\n] as Field[]\n"],"names":["accountLockFields","name","type","access","create","update","defaultValue","hidden"],"mappings":"AAEA,OAAO,MAAMA,oBAA6B;IACxC;QACEC,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdC,QAAQ,IAAM;QAChB;QACAC,cAAc;QACdC,QAAQ;IACV;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdC,QAAQ,IAAM;QAChB;QACAE,QAAQ;IACV;CACD,CAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAEzD,eAAO,MAAM,cAAc,EAAE,KAAK,EAqBjC,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAEzD,eAAO,MAAM,cAAc,EAAE,KAAK,EAqCjC,CAAA"}
@@ -2,21 +2,37 @@ export const baseAuthFields = [
2
2
  {
3
3
  name: 'resetPasswordToken',
4
4
  type: 'text',
5
+ access: {
6
+ create: ()=>false,
7
+ update: ()=>false
8
+ },
5
9
  hidden: true
6
10
  },
7
11
  {
8
12
  name: 'resetPasswordExpiration',
9
13
  type: 'date',
14
+ access: {
15
+ create: ()=>false,
16
+ update: ()=>false
17
+ },
10
18
  hidden: true
11
19
  },
12
20
  {
13
21
  name: 'salt',
14
22
  type: 'text',
23
+ access: {
24
+ create: ()=>false,
25
+ update: ()=>false
26
+ },
15
27
  hidden: true
16
28
  },
17
29
  {
18
30
  name: 'hash',
19
31
  type: 'text',
32
+ access: {
33
+ create: ()=>false,
34
+ update: ()=>false
35
+ },
20
36
  hidden: true
21
37
  }
22
38
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/baseFields/auth.ts"],"sourcesContent":["import type { Field } from '../../fields/config/types.js'\n\nexport const baseAuthFields: Field[] = [\n {\n name: 'resetPasswordToken',\n type: 'text',\n hidden: true,\n },\n {\n name: 'resetPasswordExpiration',\n type: 'date',\n hidden: true,\n },\n {\n name: 'salt',\n type: 'text',\n hidden: true,\n },\n {\n name: 'hash',\n type: 'text',\n hidden: true,\n },\n]\n"],"names":["baseAuthFields","name","type","hidden"],"mappings":"AAEA,OAAO,MAAMA,iBAA0B;IACrC;QACEC,MAAM;QACNC,MAAM;QACNC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,MAAM;QACNC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,MAAM;QACNC,QAAQ;IACV;IACA;QACEF,MAAM;QACNC,MAAM;QACNC,QAAQ;IACV;CACD,CAAA"}
1
+ {"version":3,"sources":["../../../src/auth/baseFields/auth.ts"],"sourcesContent":["import type { Field } from '../../fields/config/types.js'\n\nexport const baseAuthFields: Field[] = [\n {\n name: 'resetPasswordToken',\n type: 'text',\n access: {\n create: () => false,\n update: () => false,\n },\n hidden: true,\n },\n {\n name: 'resetPasswordExpiration',\n type: 'date',\n access: {\n create: () => false,\n update: () => false,\n },\n hidden: true,\n },\n {\n name: 'salt',\n type: 'text',\n access: {\n create: () => false,\n update: () => false,\n },\n hidden: true,\n },\n {\n name: 'hash',\n type: 'text',\n access: {\n create: () => false,\n update: () => false,\n },\n hidden: true,\n },\n]\n"],"names":["baseAuthFields","name","type","access","create","update","hidden"],"mappings":"AAEA,OAAO,MAAMA,iBAA0B;IACrC;QACEC,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdC,QAAQ,IAAM;QAChB;QACAC,QAAQ;IACV;IACA;QACEL,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdC,QAAQ,IAAM;QAChB;QACAC,QAAQ;IACV;IACA;QACEL,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdC,QAAQ,IAAM;QAChB;QACAC,QAAQ;IACV;IACA;QACEL,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdC,QAAQ,IAAM;QAChB;QACAC,QAAQ;IACV;CACD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/verification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,8BAA8B,CAAA;AAiBpE,eAAO,MAAM,kBAAkB,EAAE,KAAK,EAwB1B,CAAA"}
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/verification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,8BAA8B,CAAA;AAmBpE,eAAO,MAAM,kBAAkB,EAAE,KAAK,EA4B1B,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { defaultAccess } from '../defaultAccess.js';
1
2
  const autoRemoveVerificationToken = ({ data, operation, originalDoc, value })=>{
2
3
  // If a user manually sets `_verified` to true,
3
4
  // and it was `false`, set _verificationToken to `null`.
@@ -15,9 +16,9 @@ export const verificationFields = [
15
16
  name: '_verified',
16
17
  type: 'checkbox',
17
18
  access: {
18
- create: ({ req: { user } })=>Boolean(user),
19
- read: ({ req: { user } })=>Boolean(user),
20
- update: ({ req: { user } })=>Boolean(user)
19
+ create: defaultAccess,
20
+ read: defaultAccess,
21
+ update: defaultAccess
21
22
  },
22
23
  admin: {
23
24
  components: {
@@ -29,6 +30,10 @@ export const verificationFields = [
29
30
  {
30
31
  name: '_verificationToken',
31
32
  type: 'text',
33
+ access: {
34
+ create: ()=>false,
35
+ update: ()=>false
36
+ },
32
37
  hidden: true,
33
38
  hooks: {
34
39
  beforeChange: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/baseFields/verification.ts"],"sourcesContent":["import type { Field, FieldHook } from '../../fields/config/types.js'\n\nconst autoRemoveVerificationToken: FieldHook = ({ data, operation, originalDoc, value }) => {\n // If a user manually sets `_verified` to true,\n // and it was `false`, set _verificationToken to `null`.\n // This is useful because the admin panel\n // allows users to set `_verified` to true manually\n\n if (operation === 'update') {\n if (data?._verified === true && originalDoc?._verified === false) {\n return null\n }\n }\n\n return value\n}\n\nexport const verificationFields: Field[] = [\n {\n name: '_verified',\n type: 'checkbox',\n access: {\n create: ({ req: { user } }) => Boolean(user),\n read: ({ req: { user } }) => Boolean(user),\n update: ({ req: { user } }) => Boolean(user),\n },\n admin: {\n components: {\n Field: false,\n },\n },\n label: ({ t }) => t('authentication:verified'),\n },\n {\n name: '_verificationToken',\n type: 'text',\n hidden: true,\n hooks: {\n beforeChange: [autoRemoveVerificationToken],\n },\n },\n] as Field[]\n"],"names":["autoRemoveVerificationToken","data","operation","originalDoc","value","_verified","verificationFields","name","type","access","create","req","user","Boolean","read","update","admin","components","Field","label","t","hidden","hooks","beforeChange"],"mappings":"AAEA,MAAMA,8BAAyC,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,KAAK,EAAE;IACrF,+CAA+C;IAC/C,wDAAwD;IACxD,yCAAyC;IACzC,mDAAmD;IAEnD,IAAIF,cAAc,UAAU;QAC1B,IAAID,MAAMI,cAAc,QAAQF,aAAaE,cAAc,OAAO;YAChE,OAAO;QACT;IACF;IAEA,OAAOD;AACT;AAEA,OAAO,MAAME,qBAA8B;IACzC;QACEC,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,CAAC,EAAEC,KAAK,EAAEC,IAAI,EAAE,EAAE,GAAKC,QAAQD;YACvCE,MAAM,CAAC,EAAEH,KAAK,EAAEC,IAAI,EAAE,EAAE,GAAKC,QAAQD;YACrCG,QAAQ,CAAC,EAAEJ,KAAK,EAAEC,IAAI,EAAE,EAAE,GAAKC,QAAQD;QACzC;QACAI,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEb,MAAM;QACNC,MAAM;QACNa,QAAQ;QACRC,OAAO;YACLC,cAAc;gBAACvB;aAA4B;QAC7C;IACF;CACD,CAAW"}
1
+ {"version":3,"sources":["../../../src/auth/baseFields/verification.ts"],"sourcesContent":["import type { Field, FieldHook } from '../../fields/config/types.js'\n\nimport { defaultAccess } from '../defaultAccess.js'\n\nconst autoRemoveVerificationToken: FieldHook = ({ data, operation, originalDoc, value }) => {\n // If a user manually sets `_verified` to true,\n // and it was `false`, set _verificationToken to `null`.\n // This is useful because the admin panel\n // allows users to set `_verified` to true manually\n\n if (operation === 'update') {\n if (data?._verified === true && originalDoc?._verified === false) {\n return null\n }\n }\n\n return value\n}\n\nexport const verificationFields: Field[] = [\n {\n name: '_verified',\n type: 'checkbox',\n access: {\n create: defaultAccess,\n read: defaultAccess,\n update: defaultAccess,\n },\n admin: {\n components: {\n Field: false,\n },\n },\n label: ({ t }) => t('authentication:verified'),\n },\n {\n name: '_verificationToken',\n type: 'text',\n access: {\n create: () => false,\n update: () => false,\n },\n hidden: true,\n hooks: {\n beforeChange: [autoRemoveVerificationToken],\n },\n },\n] as Field[]\n"],"names":["defaultAccess","autoRemoveVerificationToken","data","operation","originalDoc","value","_verified","verificationFields","name","type","access","create","read","update","admin","components","Field","label","t","hidden","hooks","beforeChange"],"mappings":"AAEA,SAASA,aAAa,QAAQ,sBAAqB;AAEnD,MAAMC,8BAAyC,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,KAAK,EAAE;IACrF,+CAA+C;IAC/C,wDAAwD;IACxD,yCAAyC;IACzC,mDAAmD;IAEnD,IAAIF,cAAc,UAAU;QAC1B,IAAID,MAAMI,cAAc,QAAQF,aAAaE,cAAc,OAAO;YAChE,OAAO;QACT;IACF;IAEA,OAAOD;AACT;AAEA,OAAO,MAAME,qBAA8B;IACzC;QACEC,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQX;YACRY,MAAMZ;YACNa,QAAQb;QACV;QACAc,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEV,MAAM;QACNC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;YACdE,QAAQ,IAAM;QAChB;QACAM,QAAQ;QACRC,OAAO;YACLC,cAAc;gBAACpB;aAA4B;QAC7C;IACF;CACD,CAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataloader.d.ts","sourceRoot":"","sources":["../../src/collections/dataloader.ts"],"names":[],"mappings":"AAEA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AA0JnD,eAAO,MAAM,aAAa,QAAS,cAAc;;0CAgBhD,CAAA;AA4CD,KAAK,kBAAkB,GAAG;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,mBAAmB,CAAA;IACnC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAA;CAC1D,CAAA;AACD,eAAO,MAAM,wBAAwB,sJAalC,kBAAkB,KAAG,MAcpB,CAAA"}
1
+ {"version":3,"file":"dataloader.d.ts","sourceRoot":"","sources":["../../src/collections/dataloader.ts"],"names":[],"mappings":"AAEA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AA8JnD,eAAO,MAAM,aAAa,QAAS,cAAc;;0CAgBhD,CAAA;AA4CD,KAAK,kBAAkB,GAAG;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,mBAAmB,CAAA;IACnC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAA;CAC1D,CAAA;AACD,eAAO,MAAM,wBAAwB,sJAalC,kBAAkB,KAAG,MAcpB,CAAA"}
@@ -57,6 +57,11 @@ const batchAndLoadDocs = (req)=>async (keys)=>{
57
57
  for (const [batchKey, ids] of Object.entries(batchByFindArgs)){
58
58
  const [transactionID, collection, depth, currentDepth, locale, fallbackLocale, overrideAccess, showHiddenFields, draft, select, populate] = JSON.parse(batchKey);
59
59
  req.transactionID = transactionID;
60
+ const enableTrash = Boolean(payload.collections?.[collection]?.config?.trash);
61
+ const selectWithDeletedAt = enableTrash && select ? {
62
+ ...select,
63
+ deletedAt: true
64
+ } : select;
60
65
  const result = await payload.find({
61
66
  collection,
62
67
  currentDepth,
@@ -69,8 +74,11 @@ const batchAndLoadDocs = (req)=>async (keys)=>{
69
74
  pagination: false,
70
75
  populate,
71
76
  req,
72
- select,
77
+ select: selectWithDeletedAt,
73
78
  showHiddenFields: Boolean(showHiddenFields),
79
+ ...enableTrash ? {
80
+ trash: true
81
+ } : {},
74
82
  where: {
75
83
  id: {
76
84
  in: ids
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/dataloader.ts"],"sourcesContent":["import type { BatchLoadFn } from 'dataloader'\n\nimport DataLoader from 'dataloader'\n\nimport type { FindArgs } from '../database/types.js'\nimport type { Payload, TypedFallbackLocale } from '../index.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../types/index.js'\nimport type { TypeWithID } from './config/types.js'\nimport type { FindOptions } from './operations/local/find.js'\n\nimport { isValidID } from '../utilities/isValidID.js'\n\n// Payload uses `dataloader` to solve the classic GraphQL N+1 problem.\n\n// We keep a list of all documents requested to be populated for any given request\n// and then batch together documents within the same collection,\n// making only 1 find per each collection, rather than `findByID` per each requested doc.\n\n// This dramatically improves performance for REST and Local API `depth` populations,\n// and also ensures complex GraphQL queries perform lightning-fast.\n\nconst batchAndLoadDocs =\n (req: PayloadRequest): BatchLoadFn<string, TypeWithID> =>\n async (keys: readonly string[]): Promise<TypeWithID[]> => {\n const { payload } = req\n\n // Create docs array of same length as keys, using null as value\n // We will replace nulls with injected docs as they are retrieved\n const docs: (null | TypeWithID)[] = keys.map(() => null)\n\n /**\n * Batch IDs by their `find` args\n * so we can make one find query per combination of collection, depth, locale, and fallbackLocale.\n *\n * Resulting shape will be as follows:\n {\n // key is stringified set of find args\n '[null,\"pages\",2,0,\"es\",\"en\",false,false]': [\n // value is array of IDs to find with these args\n 'q34tl23462346234524',\n '435523540194324280',\n '2346245j35l3j5234532li',\n ],\n // etc\n };\n *\n **/\n\n const batchByFindArgs: Record<string, string[]> = {}\n\n for (const key of keys) {\n const [\n transactionID,\n collection,\n id,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ] = JSON.parse(key)\n\n const batchKeyArray = [\n transactionID,\n collection,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ]\n\n const batchKey = JSON.stringify(batchKeyArray)\n\n const idType = payload.collections?.[collection]?.customIDType || payload.db.defaultIDType\n const sanitizedID = idType === 'number' ? parseFloat(id) : id\n\n if (isValidID(sanitizedID, idType)) {\n batchByFindArgs[batchKey] = [...(batchByFindArgs[batchKey] || []), sanitizedID]\n }\n }\n\n // Run find requests one after another, so as to not hang transactions\n\n for (const [batchKey, ids] of Object.entries(batchByFindArgs)) {\n const [\n transactionID,\n collection,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ] = JSON.parse(batchKey)\n\n req.transactionID = transactionID\n\n const result = await payload.find({\n collection,\n currentDepth,\n depth,\n disableErrors: true,\n draft,\n fallbackLocale,\n locale,\n overrideAccess: Boolean(overrideAccess),\n pagination: false,\n populate,\n req,\n select,\n showHiddenFields: Boolean(showHiddenFields),\n where: {\n id: {\n in: ids,\n },\n },\n })\n\n // For each returned doc, find index in original keys\n // Inject doc within docs array if index exists\n for (const doc of result.docs) {\n const docKey = createDataloaderCacheKey({\n collectionSlug: collection,\n currentDepth,\n depth,\n docID: doc.id,\n draft,\n fallbackLocale,\n locale,\n overrideAccess,\n populate,\n select,\n showHiddenFields,\n transactionID: req.transactionID!,\n })\n const docsIndex = keys.findIndex((key) => key === docKey)\n\n if (docsIndex > -1) {\n docs[docsIndex] = doc\n }\n }\n }\n\n // Return docs array,\n // which has now been injected with all fetched docs\n // and should match the length of the incoming keys arg\n return docs as TypeWithID[]\n }\n\nexport const getDataLoader = (req: PayloadRequest) => {\n const findQueries = new Map()\n const dataLoader = new DataLoader(batchAndLoadDocs(req)) as PayloadRequest['payloadDataLoader']\n\n dataLoader.find = ((args: FindArgs) => {\n const key = createFindDataloaderCacheKey(args)\n const cached = findQueries.get(key)\n if (cached) {\n return cached\n }\n const request = req.payload.find(args)\n findQueries.set(key, request)\n return request\n }) as Payload['find']\n\n return dataLoader\n}\n\nconst createFindDataloaderCacheKey = ({\n collection,\n currentDepth,\n depth,\n disableErrors,\n draft,\n includeLockStatus,\n joins,\n limit,\n overrideAccess,\n page,\n pagination,\n populate,\n req,\n select,\n showHiddenFields,\n sort,\n where,\n}: FindOptions<string, SelectType>): string =>\n JSON.stringify([\n collection,\n currentDepth,\n depth,\n disableErrors,\n draft,\n includeLockStatus,\n joins,\n limit,\n overrideAccess,\n page,\n pagination,\n populate,\n req?.locale,\n req?.fallbackLocale,\n req?.user?.id,\n req?.transactionID,\n select,\n showHiddenFields,\n sort,\n where,\n ])\n\ntype CreateCacheKeyArgs = {\n collectionSlug: string\n currentDepth: number\n depth: number\n docID: number | string\n draft: boolean\n fallbackLocale: TypedFallbackLocale\n locale: string | string[]\n overrideAccess: boolean\n populate?: PopulateType\n select?: SelectType\n showHiddenFields: boolean\n transactionID: number | Promise<number | string> | string\n}\nexport const createDataloaderCacheKey = ({\n collectionSlug,\n currentDepth,\n depth,\n docID,\n draft,\n fallbackLocale,\n locale,\n overrideAccess,\n populate,\n select,\n showHiddenFields,\n transactionID,\n}: CreateCacheKeyArgs): string =>\n JSON.stringify([\n transactionID,\n collectionSlug,\n docID,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ])\n"],"names":["DataLoader","isValidID","batchAndLoadDocs","req","keys","payload","docs","map","batchByFindArgs","key","transactionID","collection","id","depth","currentDepth","locale","fallbackLocale","overrideAccess","showHiddenFields","draft","select","populate","JSON","parse","batchKeyArray","batchKey","stringify","idType","collections","customIDType","db","defaultIDType","sanitizedID","parseFloat","ids","Object","entries","result","find","disableErrors","Boolean","pagination","where","in","doc","docKey","createDataloaderCacheKey","collectionSlug","docID","docsIndex","findIndex","getDataLoader","findQueries","Map","dataLoader","args","createFindDataloaderCacheKey","cached","get","request","set","includeLockStatus","joins","limit","page","sort","user"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/collections/dataloader.ts"],"sourcesContent":["import type { BatchLoadFn } from 'dataloader'\n\nimport DataLoader from 'dataloader'\n\nimport type { FindArgs } from '../database/types.js'\nimport type { Payload, TypedFallbackLocale } from '../index.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../types/index.js'\nimport type { TypeWithID } from './config/types.js'\nimport type { FindOptions } from './operations/local/find.js'\n\nimport { isValidID } from '../utilities/isValidID.js'\n\n// Payload uses `dataloader` to solve the classic GraphQL N+1 problem.\n\n// We keep a list of all documents requested to be populated for any given request\n// and then batch together documents within the same collection,\n// making only 1 find per each collection, rather than `findByID` per each requested doc.\n\n// This dramatically improves performance for REST and Local API `depth` populations,\n// and also ensures complex GraphQL queries perform lightning-fast.\n\nconst batchAndLoadDocs =\n (req: PayloadRequest): BatchLoadFn<string, TypeWithID> =>\n async (keys: readonly string[]): Promise<TypeWithID[]> => {\n const { payload } = req\n\n // Create docs array of same length as keys, using null as value\n // We will replace nulls with injected docs as they are retrieved\n const docs: (null | TypeWithID)[] = keys.map(() => null)\n\n /**\n * Batch IDs by their `find` args\n * so we can make one find query per combination of collection, depth, locale, and fallbackLocale.\n *\n * Resulting shape will be as follows:\n {\n // key is stringified set of find args\n '[null,\"pages\",2,0,\"es\",\"en\",false,false]': [\n // value is array of IDs to find with these args\n 'q34tl23462346234524',\n '435523540194324280',\n '2346245j35l3j5234532li',\n ],\n // etc\n };\n *\n **/\n\n const batchByFindArgs: Record<string, string[]> = {}\n\n for (const key of keys) {\n const [\n transactionID,\n collection,\n id,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ] = JSON.parse(key)\n\n const batchKeyArray = [\n transactionID,\n collection,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ]\n\n const batchKey = JSON.stringify(batchKeyArray)\n\n const idType = payload.collections?.[collection]?.customIDType || payload.db.defaultIDType\n const sanitizedID = idType === 'number' ? parseFloat(id) : id\n\n if (isValidID(sanitizedID, idType)) {\n batchByFindArgs[batchKey] = [...(batchByFindArgs[batchKey] || []), sanitizedID]\n }\n }\n\n // Run find requests one after another, so as to not hang transactions\n\n for (const [batchKey, ids] of Object.entries(batchByFindArgs)) {\n const [\n transactionID,\n collection,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ] = JSON.parse(batchKey)\n\n req.transactionID = transactionID\n\n const enableTrash = Boolean(payload.collections?.[collection]?.config?.trash)\n const selectWithDeletedAt = enableTrash && select ? { ...select, deletedAt: true } : select\n\n const result = await payload.find({\n collection,\n currentDepth,\n depth,\n disableErrors: true,\n draft,\n fallbackLocale,\n locale,\n overrideAccess: Boolean(overrideAccess),\n pagination: false,\n populate,\n req,\n select: selectWithDeletedAt,\n showHiddenFields: Boolean(showHiddenFields),\n ...(enableTrash ? { trash: true } : {}),\n where: {\n id: {\n in: ids,\n },\n },\n })\n\n // For each returned doc, find index in original keys\n // Inject doc within docs array if index exists\n for (const doc of result.docs) {\n const docKey = createDataloaderCacheKey({\n collectionSlug: collection,\n currentDepth,\n depth,\n docID: doc.id,\n draft,\n fallbackLocale,\n locale,\n overrideAccess,\n populate,\n select,\n showHiddenFields,\n transactionID: req.transactionID!,\n })\n const docsIndex = keys.findIndex((key) => key === docKey)\n\n if (docsIndex > -1) {\n docs[docsIndex] = doc\n }\n }\n }\n\n // Return docs array,\n // which has now been injected with all fetched docs\n // and should match the length of the incoming keys arg\n return docs as TypeWithID[]\n }\n\nexport const getDataLoader = (req: PayloadRequest) => {\n const findQueries = new Map()\n const dataLoader = new DataLoader(batchAndLoadDocs(req)) as PayloadRequest['payloadDataLoader']\n\n dataLoader.find = ((args: FindArgs) => {\n const key = createFindDataloaderCacheKey(args)\n const cached = findQueries.get(key)\n if (cached) {\n return cached\n }\n const request = req.payload.find(args)\n findQueries.set(key, request)\n return request\n }) as Payload['find']\n\n return dataLoader\n}\n\nconst createFindDataloaderCacheKey = ({\n collection,\n currentDepth,\n depth,\n disableErrors,\n draft,\n includeLockStatus,\n joins,\n limit,\n overrideAccess,\n page,\n pagination,\n populate,\n req,\n select,\n showHiddenFields,\n sort,\n where,\n}: FindOptions<string, SelectType>): string =>\n JSON.stringify([\n collection,\n currentDepth,\n depth,\n disableErrors,\n draft,\n includeLockStatus,\n joins,\n limit,\n overrideAccess,\n page,\n pagination,\n populate,\n req?.locale,\n req?.fallbackLocale,\n req?.user?.id,\n req?.transactionID,\n select,\n showHiddenFields,\n sort,\n where,\n ])\n\ntype CreateCacheKeyArgs = {\n collectionSlug: string\n currentDepth: number\n depth: number\n docID: number | string\n draft: boolean\n fallbackLocale: TypedFallbackLocale\n locale: string | string[]\n overrideAccess: boolean\n populate?: PopulateType\n select?: SelectType\n showHiddenFields: boolean\n transactionID: number | Promise<number | string> | string\n}\nexport const createDataloaderCacheKey = ({\n collectionSlug,\n currentDepth,\n depth,\n docID,\n draft,\n fallbackLocale,\n locale,\n overrideAccess,\n populate,\n select,\n showHiddenFields,\n transactionID,\n}: CreateCacheKeyArgs): string =>\n JSON.stringify([\n transactionID,\n collectionSlug,\n docID,\n depth,\n currentDepth,\n locale,\n fallbackLocale,\n overrideAccess,\n showHiddenFields,\n draft,\n select,\n populate,\n ])\n"],"names":["DataLoader","isValidID","batchAndLoadDocs","req","keys","payload","docs","map","batchByFindArgs","key","transactionID","collection","id","depth","currentDepth","locale","fallbackLocale","overrideAccess","showHiddenFields","draft","select","populate","JSON","parse","batchKeyArray","batchKey","stringify","idType","collections","customIDType","db","defaultIDType","sanitizedID","parseFloat","ids","Object","entries","enableTrash","Boolean","config","trash","selectWithDeletedAt","deletedAt","result","find","disableErrors","pagination","where","in","doc","docKey","createDataloaderCacheKey","collectionSlug","docID","docsIndex","findIndex","getDataLoader","findQueries","Map","dataLoader","args","createFindDataloaderCacheKey","cached","get","request","set","includeLockStatus","joins","limit","page","sort","user"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relationshipPopulationPromise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/afterRead/relationshipPopulationPromise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAoItF,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,mBAAmB,CAAA;IACnC,KAAK,EAAE,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAA;IAClD,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,6BAA6B,gKAavC,WAAW,KAAG,OAAO,CAAC,IAAI,CAoH5B,CAAA"}
1
+ {"version":3,"file":"relationshipPopulationPromise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/afterRead/relationshipPopulationPromise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAwItF,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,mBAAmB,CAAA;IACnC,KAAK,EAAE,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAA;IAClD,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,6BAA6B,gKAavC,WAAW,KAAG,OAAO,CAAC,IAAI,CAyI5B,CAAA"}
@@ -40,7 +40,11 @@ const populate = async ({ currentDepth, data, dataReference, depth, draft, fallb
40
40
  transactionID: req.transactionID
41
41
  }));
42
42
  }
43
- if (!relationshipValue) {
43
+ if (relatedCollection.config.trash && relationshipValue) {
44
+ if (relationshipValue.deletedAt) {
45
+ relationshipValue = null;
46
+ }
47
+ } else if (!relationshipValue) {
44
48
  // ids are visible regardless of access controls
45
49
  relationshipValue = id;
46
50
  }
@@ -175,6 +179,21 @@ export const relationshipPopulationPromise = async ({ currentDepth, depth, draft
175
179
  });
176
180
  }
177
181
  await Promise.all(rowPromises);
182
+ if (field.type !== 'join' && fieldSupportsMany(field) && field.hasMany) {
183
+ const notNull = Array.isArray(field.relationTo) ? (v)=>v !== null && v?.value !== null : (v)=>v !== null;
184
+ if (fieldShouldBeLocalized({
185
+ field,
186
+ parentIsLocalized
187
+ }) && locale === 'all' && typeof resultingDoc[field.name] === 'object' && resultingDoc[field.name] !== null) {
188
+ for (const localeKey of Object.keys(resultingDoc[field.name])){
189
+ if (Array.isArray(resultingDoc[field.name][localeKey])) {
190
+ resultingDoc[field.name][localeKey] = resultingDoc[field.name][localeKey].filter(notNull);
191
+ }
192
+ }
193
+ } else if (Array.isArray(resultingDoc[field.name])) {
194
+ resultingDoc[field.name] = resultingDoc[field.name].filter(notNull);
195
+ }
196
+ }
178
197
  };
179
198
 
180
199
  //# sourceMappingURL=relationshipPopulationPromise.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/hooks/afterRead/relationshipPopulationPromise.ts"],"sourcesContent":["import type { TypedFallbackLocale } from '../../../index.js'\nimport type { PayloadRequest, PopulateType } from '../../../types/index.js'\nimport type { JoinField, RelationshipField, UploadField } from '../../config/types.js'\n\nimport { createDataloaderCacheKey } from '../../../collections/dataloader.js'\nimport { fieldHasMaxDepth, fieldShouldBeLocalized, fieldSupportsMany } from '../../config/types.js'\n\ntype PopulateArgs = {\n currentDepth: number\n data: Record<string, unknown>\n dataReference: Record<string, any>\n depth: number\n draft: boolean\n fallbackLocale: TypedFallbackLocale\n field: JoinField | RelationshipField | UploadField\n index?: number\n key?: string\n locale: null | string\n overrideAccess: boolean\n populateArg?: PopulateType\n req: PayloadRequest\n showHiddenFields: boolean\n}\n\n// TODO: this function is mess, refactor logic\nconst populate = async ({\n currentDepth,\n data,\n dataReference,\n depth,\n draft,\n fallbackLocale,\n field,\n index,\n key,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n}: PopulateArgs) => {\n const dataToUpdate = dataReference\n let relation\n if (field.type === 'join') {\n relation = Array.isArray(field.collection) ? data.relationTo : field.collection\n } else {\n relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo\n }\n\n const relatedCollection =\n req.payload.collections[relation as keyof typeof req.payload.collections]\n\n if (relatedCollection) {\n let id: unknown\n\n if (field.type === 'join' && Array.isArray(field.collection)) {\n id = data.value\n } else if (field.type !== 'join' && Array.isArray(field.relationTo)) {\n id = data.value\n } else {\n id = data\n }\n\n let relationshipValue\n const shouldPopulate = depth && currentDepth <= depth\n\n if (\n typeof id !== 'string' &&\n typeof id !== 'number' &&\n typeof id?.toString === 'function' &&\n typeof id !== 'object'\n ) {\n id = id.toString()\n }\n\n if (shouldPopulate) {\n relationshipValue = await req.payloadDataLoader.load(\n createDataloaderCacheKey({\n collectionSlug: relatedCollection.config.slug,\n currentDepth: currentDepth + 1,\n depth,\n docID: id as string,\n draft,\n fallbackLocale: fallbackLocale!,\n locale: locale!,\n overrideAccess,\n populate: populateArg,\n select:\n populateArg?.[relatedCollection.config.slug] ??\n relatedCollection.config.defaultPopulate,\n showHiddenFields,\n transactionID: req.transactionID!,\n }),\n )\n }\n\n if (!relationshipValue) {\n // ids are visible regardless of access controls\n relationshipValue = id\n }\n if (typeof index === 'number' && typeof key === 'string') {\n if (field.type !== 'join' && Array.isArray(field.relationTo)) {\n dataToUpdate[field.name][key][index].value = relationshipValue\n } else {\n if (field.type === 'join' && Array.isArray(field.collection)) {\n dataToUpdate[field.name][key][index].value = relationshipValue\n } else {\n dataToUpdate[field.name][key][index] = relationshipValue\n }\n }\n } else if (typeof index === 'number' || typeof key === 'string') {\n if (field.type === 'join') {\n if (!Array.isArray(field.collection)) {\n dataToUpdate[field.name].docs[index ?? key!] = relationshipValue\n } else {\n dataToUpdate[field.name].docs[index ?? key!].value = relationshipValue\n }\n } else if (Array.isArray(field.relationTo)) {\n dataToUpdate[field.name][index ?? key!].value = relationshipValue\n } else {\n dataToUpdate[field.name][index ?? key!] = relationshipValue\n }\n } else if (field.type !== 'join' && Array.isArray(field.relationTo)) {\n dataToUpdate[field.name].value = relationshipValue\n } else {\n if (field.type === 'join' && Array.isArray(field.collection)) {\n dataToUpdate[field.name].value = relationshipValue\n } else {\n dataToUpdate[field.name] = relationshipValue\n }\n }\n }\n}\n\ntype PromiseArgs = {\n currentDepth: number\n depth: number\n draft: boolean\n fallbackLocale: TypedFallbackLocale\n field: JoinField | RelationshipField | UploadField\n locale: null | string\n overrideAccess: boolean\n parentIsLocalized: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields: boolean\n siblingDoc: Record<string, any>\n}\n\nexport const relationshipPopulationPromise = async ({\n currentDepth,\n depth,\n draft,\n fallbackLocale,\n field,\n locale,\n overrideAccess,\n parentIsLocalized,\n populate: populateArg,\n req,\n showHiddenFields,\n siblingDoc,\n}: PromiseArgs): Promise<void> => {\n const resultingDoc = siblingDoc\n const populateDepth = fieldHasMaxDepth(field) && field.maxDepth! < depth ? field.maxDepth : depth\n const rowPromises: Promise<void>[] = []\n\n if (field.type === 'join' || (fieldSupportsMany(field) && field.hasMany)) {\n if (\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n locale === 'all' &&\n typeof siblingDoc[field.name] === 'object' &&\n siblingDoc[field.name] !== null\n ) {\n Object.keys(siblingDoc[field.name]).forEach((localeKey) => {\n if (Array.isArray(siblingDoc[field.name][localeKey])) {\n siblingDoc[field.name][localeKey].forEach((_relatedDoc: any, index: number) => {\n const rowPromise = async () => {\n await populate({\n currentDepth,\n data: siblingDoc[field.name][localeKey][index],\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n index,\n key: localeKey,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n rowPromises.push(rowPromise())\n })\n }\n })\n } else if (\n Array.isArray(siblingDoc[field.name]) ||\n Array.isArray(siblingDoc[field.name]?.docs)\n ) {\n ;(Array.isArray(siblingDoc[field.name])\n ? siblingDoc[field.name]\n : siblingDoc[field.name].docs\n ).forEach((relatedDoc: any, index: number) => {\n const rowPromise = async () => {\n if (relatedDoc) {\n await populate({\n currentDepth,\n data:\n !(field.type === 'join' && Array.isArray(field.collection)) && relatedDoc?.id\n ? relatedDoc.id\n : relatedDoc,\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n index,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n }\n\n rowPromises.push(rowPromise())\n })\n }\n } else if (\n field.localized &&\n locale === 'all' &&\n typeof siblingDoc[field.name] === 'object' &&\n siblingDoc[field.name] !== null\n ) {\n Object.keys(siblingDoc[field.name]).forEach((localeKey) => {\n const rowPromise = async () => {\n await populate({\n currentDepth,\n data: siblingDoc[field.name][localeKey],\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n key: localeKey,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n rowPromises.push(rowPromise())\n })\n\n await Promise.all(rowPromises)\n } else if (siblingDoc[field.name]) {\n await populate({\n currentDepth,\n data: siblingDoc[field.name],\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n await Promise.all(rowPromises)\n}\n"],"names":["createDataloaderCacheKey","fieldHasMaxDepth","fieldShouldBeLocalized","fieldSupportsMany","populate","currentDepth","data","dataReference","depth","draft","fallbackLocale","field","index","key","locale","overrideAccess","populateArg","req","showHiddenFields","dataToUpdate","relation","type","Array","isArray","collection","relationTo","relatedCollection","payload","collections","id","value","relationshipValue","shouldPopulate","toString","payloadDataLoader","load","collectionSlug","config","slug","docID","select","defaultPopulate","transactionID","name","docs","relationshipPopulationPromise","parentIsLocalized","siblingDoc","resultingDoc","populateDepth","maxDepth","rowPromises","hasMany","Object","keys","forEach","localeKey","_relatedDoc","rowPromise","push","relatedDoc","localized","Promise","all"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/fields/hooks/afterRead/relationshipPopulationPromise.ts"],"sourcesContent":["import type { TypedFallbackLocale } from '../../../index.js'\nimport type { PayloadRequest, PopulateType } from '../../../types/index.js'\nimport type { JoinField, RelationshipField, UploadField } from '../../config/types.js'\n\nimport { createDataloaderCacheKey } from '../../../collections/dataloader.js'\nimport { fieldHasMaxDepth, fieldShouldBeLocalized, fieldSupportsMany } from '../../config/types.js'\n\ntype PopulateArgs = {\n currentDepth: number\n data: Record<string, unknown>\n dataReference: Record<string, any>\n depth: number\n draft: boolean\n fallbackLocale: TypedFallbackLocale\n field: JoinField | RelationshipField | UploadField\n index?: number\n key?: string\n locale: null | string\n overrideAccess: boolean\n populateArg?: PopulateType\n req: PayloadRequest\n showHiddenFields: boolean\n}\n\n// TODO: this function is mess, refactor logic\nconst populate = async ({\n currentDepth,\n data,\n dataReference,\n depth,\n draft,\n fallbackLocale,\n field,\n index,\n key,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n}: PopulateArgs) => {\n const dataToUpdate = dataReference\n let relation\n if (field.type === 'join') {\n relation = Array.isArray(field.collection) ? data.relationTo : field.collection\n } else {\n relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo\n }\n\n const relatedCollection =\n req.payload.collections[relation as keyof typeof req.payload.collections]\n\n if (relatedCollection) {\n let id: unknown\n\n if (field.type === 'join' && Array.isArray(field.collection)) {\n id = data.value\n } else if (field.type !== 'join' && Array.isArray(field.relationTo)) {\n id = data.value\n } else {\n id = data\n }\n\n let relationshipValue\n const shouldPopulate = depth && currentDepth <= depth\n\n if (\n typeof id !== 'string' &&\n typeof id !== 'number' &&\n typeof id?.toString === 'function' &&\n typeof id !== 'object'\n ) {\n id = id.toString()\n }\n\n if (shouldPopulate) {\n relationshipValue = await req.payloadDataLoader.load(\n createDataloaderCacheKey({\n collectionSlug: relatedCollection.config.slug,\n currentDepth: currentDepth + 1,\n depth,\n docID: id as string,\n draft,\n fallbackLocale: fallbackLocale!,\n locale: locale!,\n overrideAccess,\n populate: populateArg,\n select:\n populateArg?.[relatedCollection.config.slug] ??\n relatedCollection.config.defaultPopulate,\n showHiddenFields,\n transactionID: req.transactionID!,\n }),\n )\n }\n\n if (relatedCollection.config.trash && relationshipValue) {\n if ((relationshipValue as Record<string, unknown>).deletedAt) {\n relationshipValue = null\n }\n } else if (!relationshipValue) {\n // ids are visible regardless of access controls\n relationshipValue = id\n }\n if (typeof index === 'number' && typeof key === 'string') {\n if (field.type !== 'join' && Array.isArray(field.relationTo)) {\n dataToUpdate[field.name][key][index].value = relationshipValue\n } else {\n if (field.type === 'join' && Array.isArray(field.collection)) {\n dataToUpdate[field.name][key][index].value = relationshipValue\n } else {\n dataToUpdate[field.name][key][index] = relationshipValue\n }\n }\n } else if (typeof index === 'number' || typeof key === 'string') {\n if (field.type === 'join') {\n if (!Array.isArray(field.collection)) {\n dataToUpdate[field.name].docs[index ?? key!] = relationshipValue\n } else {\n dataToUpdate[field.name].docs[index ?? key!].value = relationshipValue\n }\n } else if (Array.isArray(field.relationTo)) {\n dataToUpdate[field.name][index ?? key!].value = relationshipValue\n } else {\n dataToUpdate[field.name][index ?? key!] = relationshipValue\n }\n } else if (field.type !== 'join' && Array.isArray(field.relationTo)) {\n dataToUpdate[field.name].value = relationshipValue\n } else {\n if (field.type === 'join' && Array.isArray(field.collection)) {\n dataToUpdate[field.name].value = relationshipValue\n } else {\n dataToUpdate[field.name] = relationshipValue\n }\n }\n }\n}\n\ntype PromiseArgs = {\n currentDepth: number\n depth: number\n draft: boolean\n fallbackLocale: TypedFallbackLocale\n field: JoinField | RelationshipField | UploadField\n locale: null | string\n overrideAccess: boolean\n parentIsLocalized: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields: boolean\n siblingDoc: Record<string, any>\n}\n\nexport const relationshipPopulationPromise = async ({\n currentDepth,\n depth,\n draft,\n fallbackLocale,\n field,\n locale,\n overrideAccess,\n parentIsLocalized,\n populate: populateArg,\n req,\n showHiddenFields,\n siblingDoc,\n}: PromiseArgs): Promise<void> => {\n const resultingDoc = siblingDoc\n const populateDepth = fieldHasMaxDepth(field) && field.maxDepth! < depth ? field.maxDepth : depth\n const rowPromises: Promise<void>[] = []\n\n if (field.type === 'join' || (fieldSupportsMany(field) && field.hasMany)) {\n if (\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n locale === 'all' &&\n typeof siblingDoc[field.name] === 'object' &&\n siblingDoc[field.name] !== null\n ) {\n Object.keys(siblingDoc[field.name]).forEach((localeKey) => {\n if (Array.isArray(siblingDoc[field.name][localeKey])) {\n siblingDoc[field.name][localeKey].forEach((_relatedDoc: any, index: number) => {\n const rowPromise = async () => {\n await populate({\n currentDepth,\n data: siblingDoc[field.name][localeKey][index],\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n index,\n key: localeKey,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n rowPromises.push(rowPromise())\n })\n }\n })\n } else if (\n Array.isArray(siblingDoc[field.name]) ||\n Array.isArray(siblingDoc[field.name]?.docs)\n ) {\n ;(Array.isArray(siblingDoc[field.name])\n ? siblingDoc[field.name]\n : siblingDoc[field.name].docs\n ).forEach((relatedDoc: any, index: number) => {\n const rowPromise = async () => {\n if (relatedDoc) {\n await populate({\n currentDepth,\n data:\n !(field.type === 'join' && Array.isArray(field.collection)) && relatedDoc?.id\n ? relatedDoc.id\n : relatedDoc,\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n index,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n }\n\n rowPromises.push(rowPromise())\n })\n }\n } else if (\n field.localized &&\n locale === 'all' &&\n typeof siblingDoc[field.name] === 'object' &&\n siblingDoc[field.name] !== null\n ) {\n Object.keys(siblingDoc[field.name]).forEach((localeKey) => {\n const rowPromise = async () => {\n await populate({\n currentDepth,\n data: siblingDoc[field.name][localeKey],\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n key: localeKey,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n rowPromises.push(rowPromise())\n })\n\n await Promise.all(rowPromises)\n } else if (siblingDoc[field.name]) {\n await populate({\n currentDepth,\n data: siblingDoc[field.name],\n dataReference: resultingDoc,\n depth: populateDepth!,\n draft,\n fallbackLocale,\n field,\n locale,\n overrideAccess,\n populateArg,\n req,\n showHiddenFields,\n })\n }\n await Promise.all(rowPromises)\n\n if (field.type !== 'join' && fieldSupportsMany(field) && field.hasMany) {\n const notNull = Array.isArray(field.relationTo)\n ? (v: unknown) => v !== null && (v as Record<string, unknown>)?.value !== null\n : (v: unknown) => v !== null\n\n if (\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n locale === 'all' &&\n typeof resultingDoc[field.name] === 'object' &&\n resultingDoc[field.name] !== null\n ) {\n for (const localeKey of Object.keys(resultingDoc[field.name])) {\n if (Array.isArray(resultingDoc[field.name][localeKey])) {\n resultingDoc[field.name][localeKey] = resultingDoc[field.name][localeKey].filter(notNull)\n }\n }\n } else if (Array.isArray(resultingDoc[field.name])) {\n resultingDoc[field.name] = (resultingDoc[field.name] as unknown[]).filter(notNull)\n }\n }\n}\n"],"names":["createDataloaderCacheKey","fieldHasMaxDepth","fieldShouldBeLocalized","fieldSupportsMany","populate","currentDepth","data","dataReference","depth","draft","fallbackLocale","field","index","key","locale","overrideAccess","populateArg","req","showHiddenFields","dataToUpdate","relation","type","Array","isArray","collection","relationTo","relatedCollection","payload","collections","id","value","relationshipValue","shouldPopulate","toString","payloadDataLoader","load","collectionSlug","config","slug","docID","select","defaultPopulate","transactionID","trash","deletedAt","name","docs","relationshipPopulationPromise","parentIsLocalized","siblingDoc","resultingDoc","populateDepth","maxDepth","rowPromises","hasMany","Object","keys","forEach","localeKey","_relatedDoc","rowPromise","push","relatedDoc","localized","Promise","all","notNull","v","filter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.81.0-internal.181753b",
3
+ "version": "3.81.0",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -87,7 +87,7 @@
87
87
  "dependencies": {
88
88
  "@next/env": "^15.1.5",
89
89
  "@types/busboy": "1.5.4",
90
- "ajv": "8.17.1",
90
+ "ajv": "8.18.0",
91
91
  "bson-objectid": "2.0.4",
92
92
  "busboy": "^1.6.0",
93
93
  "ci-info": "^4.1.0",
@@ -95,19 +95,19 @@
95
95
  "croner": "9.1.0",
96
96
  "dataloader": "2.2.3",
97
97
  "deepmerge": "4.3.1",
98
- "file-type": "19.3.0",
98
+ "file-type": "21.3.4",
99
99
  "get-tsconfig": "4.8.1",
100
100
  "http-status": "2.1.0",
101
101
  "image-size": "2.0.2",
102
102
  "ipaddr.js": "2.2.0",
103
- "jose": "5.9.6",
103
+ "jose": "5.10.0",
104
104
  "json-schema-to-typescript": "15.0.3",
105
105
  "minimist": "1.2.8",
106
106
  "path-to-regexp": "6.3.0",
107
107
  "pino": "9.14.0",
108
108
  "pino-pretty": "13.1.2",
109
109
  "pluralize": "8.0.0",
110
- "qs-esm": "7.0.2",
110
+ "qs-esm": "8.0.1",
111
111
  "range-parser": "1.2.1",
112
112
  "sanitize-filename": "1.6.3",
113
113
  "ts-essentials": "10.0.3",
@@ -115,7 +115,7 @@
115
115
  "undici": "7.24.4",
116
116
  "uuid": "10.0.0",
117
117
  "ws": "^8.16.0",
118
- "@payloadcms/translations": "3.81.0-internal.181753b"
118
+ "@payloadcms/translations": "3.81.0"
119
119
  },
120
120
  "devDependencies": {
121
121
  "@hyrious/esbuild-plugin-commonjs": "0.2.6",