payload 3.46.0 → 3.47.0-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,7 +47,7 @@ export const apiKeyFields = [
47
47
  return null;
48
48
  }
49
49
  if (data?.apiKey) {
50
- return crypto.createHmac('sha1', req.payload.secret).update(data.apiKey).digest('hex');
50
+ return crypto.createHmac('sha256', req.payload.secret).update(data.apiKey).digest('hex');
51
51
  }
52
52
  return value;
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/baseFields/apiKey.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { Field, FieldHook } from '../../fields/config/types.js'\n\nconst encryptKey: FieldHook = ({ req, value }) =>\n value ? req.payload.encrypt(value as string) : null\nconst decryptKey: FieldHook = ({ req, value }) =>\n value ? req.payload.decrypt(value as string) : undefined\n\nexport const apiKeyFields = [\n {\n name: 'enableAPIKey',\n type: 'checkbox',\n admin: {\n components: {\n Field: false,\n },\n },\n label: ({ t }) => t('authentication:enableAPIKey'),\n },\n {\n name: 'apiKey',\n type: 'text',\n admin: {\n components: {\n Field: false,\n },\n },\n hooks: {\n afterRead: [decryptKey],\n beforeChange: [encryptKey],\n },\n label: ({ t }) => t('authentication:apiKey'),\n },\n {\n name: 'apiKeyIndex',\n type: 'text',\n admin: {\n disabled: true,\n },\n hidden: true,\n hooks: {\n beforeValidate: [\n ({ data, req, value }) => {\n if (data?.apiKey === false || data?.apiKey === null) {\n return null\n }\n if (data?.enableAPIKey === false || data?.enableAPIKey === null) {\n return null\n }\n if (data?.apiKey) {\n return crypto\n .createHmac('sha1', req.payload.secret)\n .update(data.apiKey as string)\n .digest('hex')\n }\n return value\n },\n ],\n },\n },\n] as Field[]\n"],"names":["crypto","encryptKey","req","value","payload","encrypt","decryptKey","decrypt","undefined","apiKeyFields","name","type","admin","components","Field","label","t","hooks","afterRead","beforeChange","disabled","hidden","beforeValidate","data","apiKey","enableAPIKey","createHmac","secret","update","digest"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAI3B,MAAMC,aAAwB,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAC3CA,QAAQD,IAAIE,OAAO,CAACC,OAAO,CAACF,SAAmB;AACjD,MAAMG,aAAwB,CAAC,EAAEJ,GAAG,EAAEC,KAAK,EAAE,GAC3CA,QAAQD,IAAIE,OAAO,CAACG,OAAO,CAACJ,SAAmBK;AAEjD,OAAO,MAAMC,eAAe;IAC1B;QACEC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAG,OAAO;YACLC,WAAW;gBAACZ;aAAW;YACvBa,cAAc;gBAAClB;aAAW;QAC5B;QACAc,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLQ,UAAU;QACZ;QACAC,QAAQ;QACRJ,OAAO;YACLK,gBAAgB;gBACd,CAAC,EAAEC,IAAI,EAAErB,GAAG,EAAEC,KAAK,EAAE;oBACnB,IAAIoB,MAAMC,WAAW,SAASD,MAAMC,WAAW,MAAM;wBACnD,OAAO;oBACT;oBACA,IAAID,MAAME,iBAAiB,SAASF,MAAME,iBAAiB,MAAM;wBAC/D,OAAO;oBACT;oBACA,IAAIF,MAAMC,QAAQ;wBAChB,OAAOxB,OACJ0B,UAAU,CAAC,QAAQxB,IAAIE,OAAO,CAACuB,MAAM,EACrCC,MAAM,CAACL,KAAKC,MAAM,EAClBK,MAAM,CAAC;oBACZ;oBACA,OAAO1B;gBACT;aACD;QACH;IACF;CACD,CAAW"}
1
+ {"version":3,"sources":["../../../src/auth/baseFields/apiKey.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { Field, FieldHook } from '../../fields/config/types.js'\n\nconst encryptKey: FieldHook = ({ req, value }) =>\n value ? req.payload.encrypt(value as string) : null\nconst decryptKey: FieldHook = ({ req, value }) =>\n value ? req.payload.decrypt(value as string) : undefined\n\nexport const apiKeyFields = [\n {\n name: 'enableAPIKey',\n type: 'checkbox',\n admin: {\n components: {\n Field: false,\n },\n },\n label: ({ t }) => t('authentication:enableAPIKey'),\n },\n {\n name: 'apiKey',\n type: 'text',\n admin: {\n components: {\n Field: false,\n },\n },\n hooks: {\n afterRead: [decryptKey],\n beforeChange: [encryptKey],\n },\n label: ({ t }) => t('authentication:apiKey'),\n },\n {\n name: 'apiKeyIndex',\n type: 'text',\n admin: {\n disabled: true,\n },\n hidden: true,\n hooks: {\n beforeValidate: [\n ({ data, req, value }) => {\n if (data?.apiKey === false || data?.apiKey === null) {\n return null\n }\n if (data?.enableAPIKey === false || data?.enableAPIKey === null) {\n return null\n }\n if (data?.apiKey) {\n return crypto\n .createHmac('sha256', req.payload.secret)\n .update(data.apiKey as string)\n .digest('hex')\n }\n return value\n },\n ],\n },\n },\n] as Field[]\n"],"names":["crypto","encryptKey","req","value","payload","encrypt","decryptKey","decrypt","undefined","apiKeyFields","name","type","admin","components","Field","label","t","hooks","afterRead","beforeChange","disabled","hidden","beforeValidate","data","apiKey","enableAPIKey","createHmac","secret","update","digest"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAI3B,MAAMC,aAAwB,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAC3CA,QAAQD,IAAIE,OAAO,CAACC,OAAO,CAACF,SAAmB;AACjD,MAAMG,aAAwB,CAAC,EAAEJ,GAAG,EAAEC,KAAK,EAAE,GAC3CA,QAAQD,IAAIE,OAAO,CAACG,OAAO,CAACJ,SAAmBK;AAEjD,OAAO,MAAMC,eAAe;IAC1B;QACEC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAG,OAAO;YACLC,WAAW;gBAACZ;aAAW;YACvBa,cAAc;gBAAClB;aAAW;QAC5B;QACAc,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLQ,UAAU;QACZ;QACAC,QAAQ;QACRJ,OAAO;YACLK,gBAAgB;gBACd,CAAC,EAAEC,IAAI,EAAErB,GAAG,EAAEC,KAAK,EAAE;oBACnB,IAAIoB,MAAMC,WAAW,SAASD,MAAMC,WAAW,MAAM;wBACnD,OAAO;oBACT;oBACA,IAAID,MAAME,iBAAiB,SAASF,MAAME,iBAAiB,MAAM;wBAC/D,OAAO;oBACT;oBACA,IAAIF,MAAMC,QAAQ;wBAChB,OAAOxB,OACJ0B,UAAU,CAAC,UAAUxB,IAAIE,OAAO,CAACuB,MAAM,EACvCC,MAAM,CAACL,KAAKC,MAAM,EAClBK,MAAM,CAAC;oBACZ;oBACA,OAAO1B;gBACT;aACD;QACH;IACF;CACD,CAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"apiKey.d.ts","sourceRoot":"","sources":["../../../src/auth/strategies/apiKey.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAGlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEvD,eAAO,MAAM,oBAAoB,qBACZ,yBAAyB,KAAG,oBAqD9C,CAAA"}
1
+ {"version":3,"file":"apiKey.d.ts","sourceRoot":"","sources":["../../../src/auth/strategies/apiKey.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAGlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEvD,eAAO,MAAM,oBAAoB,qBACZ,yBAAyB,KAAG,oBAqE9C,CAAA"}
@@ -3,15 +3,28 @@ export const APIKeyAuthentication = (collectionConfig)=>async ({ headers, payloa
3
3
  const authHeader = headers.get('Authorization');
4
4
  if (authHeader?.startsWith(`${collectionConfig.slug} API-Key `)) {
5
5
  const apiKey = authHeader.replace(`${collectionConfig.slug} API-Key `, '');
6
- const apiKeyIndex = crypto.createHmac('sha1', payload.secret).update(apiKey).digest('hex');
6
+ // TODO: V4 remove extra algorithm check
7
+ // api keys saved prior to v3.46.0 will have sha1
8
+ const sha1APIKeyIndex = crypto.createHmac('sha1', payload.secret).update(apiKey).digest('hex');
9
+ const sha256APIKeyIndex = crypto.createHmac('sha256', payload.secret).update(apiKey).digest('hex');
10
+ const apiKeyConstraints = [
11
+ {
12
+ apiKeyIndex: {
13
+ equals: sha1APIKeyIndex
14
+ }
15
+ },
16
+ {
17
+ apiKeyIndex: {
18
+ equals: sha256APIKeyIndex
19
+ }
20
+ }
21
+ ];
7
22
  try {
8
23
  const where = {};
9
24
  if (collectionConfig.auth?.verify) {
10
25
  where.and = [
11
26
  {
12
- apiKeyIndex: {
13
- equals: apiKeyIndex
14
- }
27
+ or: apiKeyConstraints
15
28
  },
16
29
  {
17
30
  _verified: {
@@ -20,9 +33,7 @@ export const APIKeyAuthentication = (collectionConfig)=>async ({ headers, payloa
20
33
  }
21
34
  ];
22
35
  } else {
23
- where.apiKeyIndex = {
24
- equals: apiKeyIndex
25
- };
36
+ where.or = apiKeyConstraints;
26
37
  }
27
38
  const userQuery = await payload.find({
28
39
  collection: collectionConfig.slug,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/strategies/apiKey.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { TypedUser } from '../../index.js'\nimport type { Where } from '../../types/index.js'\nimport type { AuthStrategyFunction } from '../index.js'\n\nexport const APIKeyAuthentication =\n (collectionConfig: SanitizedCollectionConfig): AuthStrategyFunction =>\n async ({ headers, payload }) => {\n const authHeader = headers.get('Authorization')\n\n if (authHeader?.startsWith(`${collectionConfig.slug} API-Key `)) {\n const apiKey = authHeader.replace(`${collectionConfig.slug} API-Key `, '')\n const apiKeyIndex = crypto.createHmac('sha1', payload.secret).update(apiKey).digest('hex')\n\n try {\n const where: Where = {}\n if (collectionConfig.auth?.verify) {\n where.and = [\n {\n apiKeyIndex: {\n equals: apiKeyIndex,\n },\n },\n {\n _verified: {\n not_equals: false,\n },\n },\n ]\n } else {\n where.apiKeyIndex = {\n equals: apiKeyIndex,\n }\n }\n\n const userQuery = await payload.find({\n collection: collectionConfig.slug,\n depth: collectionConfig.auth.depth,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n where,\n })\n\n if (userQuery.docs && userQuery.docs.length > 0) {\n const user = userQuery.docs[0]\n user!.collection = collectionConfig.slug\n user!._strategy = 'api-key'\n\n return {\n user: user as TypedUser,\n }\n }\n } catch (ignore) {\n return { user: null }\n }\n }\n\n return { user: null }\n }\n"],"names":["crypto","APIKeyAuthentication","collectionConfig","headers","payload","authHeader","get","startsWith","slug","apiKey","replace","apiKeyIndex","createHmac","secret","update","digest","where","auth","verify","and","equals","_verified","not_equals","userQuery","find","collection","depth","limit","overrideAccess","pagination","docs","length","user","_strategy","ignore"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAO3B,OAAO,MAAMC,uBACX,CAACC,mBACD,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAE;QACzB,MAAMC,aAAaF,QAAQG,GAAG,CAAC;QAE/B,IAAID,YAAYE,WAAW,GAAGL,iBAAiBM,IAAI,CAAC,SAAS,CAAC,GAAG;YAC/D,MAAMC,SAASJ,WAAWK,OAAO,CAAC,GAAGR,iBAAiBM,IAAI,CAAC,SAAS,CAAC,EAAE;YACvE,MAAMG,cAAcX,OAAOY,UAAU,CAAC,QAAQR,QAAQS,MAAM,EAAEC,MAAM,CAACL,QAAQM,MAAM,CAAC;YAEpF,IAAI;gBACF,MAAMC,QAAe,CAAC;gBACtB,IAAId,iBAAiBe,IAAI,EAAEC,QAAQ;oBACjCF,MAAMG,GAAG,GAAG;wBACV;4BACER,aAAa;gCACXS,QAAQT;4BACV;wBACF;wBACA;4BACEU,WAAW;gCACTC,YAAY;4BACd;wBACF;qBACD;gBACH,OAAO;oBACLN,MAAML,WAAW,GAAG;wBAClBS,QAAQT;oBACV;gBACF;gBAEA,MAAMY,YAAY,MAAMnB,QAAQoB,IAAI,CAAC;oBACnCC,YAAYvB,iBAAiBM,IAAI;oBACjCkB,OAAOxB,iBAAiBe,IAAI,CAACS,KAAK;oBAClCC,OAAO;oBACPC,gBAAgB;oBAChBC,YAAY;oBACZb;gBACF;gBAEA,IAAIO,UAAUO,IAAI,IAAIP,UAAUO,IAAI,CAACC,MAAM,GAAG,GAAG;oBAC/C,MAAMC,OAAOT,UAAUO,IAAI,CAAC,EAAE;oBAC9BE,KAAMP,UAAU,GAAGvB,iBAAiBM,IAAI;oBACxCwB,KAAMC,SAAS,GAAG;oBAElB,OAAO;wBACLD,MAAMA;oBACR;gBACF;YACF,EAAE,OAAOE,QAAQ;gBACf,OAAO;oBAAEF,MAAM;gBAAK;YACtB;QACF;QAEA,OAAO;YAAEA,MAAM;QAAK;IACtB,EAAC"}
1
+ {"version":3,"sources":["../../../src/auth/strategies/apiKey.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { TypedUser } from '../../index.js'\nimport type { Where } from '../../types/index.js'\nimport type { AuthStrategyFunction } from '../index.js'\n\nexport const APIKeyAuthentication =\n (collectionConfig: SanitizedCollectionConfig): AuthStrategyFunction =>\n async ({ headers, payload }) => {\n const authHeader = headers.get('Authorization')\n\n if (authHeader?.startsWith(`${collectionConfig.slug} API-Key `)) {\n const apiKey = authHeader.replace(`${collectionConfig.slug} API-Key `, '')\n\n // TODO: V4 remove extra algorithm check\n // api keys saved prior to v3.46.0 will have sha1\n const sha1APIKeyIndex = crypto.createHmac('sha1', payload.secret).update(apiKey).digest('hex')\n const sha256APIKeyIndex = crypto\n .createHmac('sha256', payload.secret)\n .update(apiKey)\n .digest('hex')\n\n const apiKeyConstraints = [\n {\n apiKeyIndex: {\n equals: sha1APIKeyIndex,\n },\n },\n {\n apiKeyIndex: {\n equals: sha256APIKeyIndex,\n },\n },\n ]\n\n try {\n const where: Where = {}\n if (collectionConfig.auth?.verify) {\n where.and = [\n {\n or: apiKeyConstraints,\n },\n {\n _verified: {\n not_equals: false,\n },\n },\n ]\n } else {\n where.or = apiKeyConstraints\n }\n\n const userQuery = await payload.find({\n collection: collectionConfig.slug,\n depth: collectionConfig.auth.depth,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n where,\n })\n\n if (userQuery.docs && userQuery.docs.length > 0) {\n const user = userQuery.docs[0]\n user!.collection = collectionConfig.slug\n user!._strategy = 'api-key'\n\n return {\n user: user as TypedUser,\n }\n }\n } catch (ignore) {\n return { user: null }\n }\n }\n\n return { user: null }\n }\n"],"names":["crypto","APIKeyAuthentication","collectionConfig","headers","payload","authHeader","get","startsWith","slug","apiKey","replace","sha1APIKeyIndex","createHmac","secret","update","digest","sha256APIKeyIndex","apiKeyConstraints","apiKeyIndex","equals","where","auth","verify","and","or","_verified","not_equals","userQuery","find","collection","depth","limit","overrideAccess","pagination","docs","length","user","_strategy","ignore"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAO3B,OAAO,MAAMC,uBACX,CAACC,mBACD,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAE;QACzB,MAAMC,aAAaF,QAAQG,GAAG,CAAC;QAE/B,IAAID,YAAYE,WAAW,GAAGL,iBAAiBM,IAAI,CAAC,SAAS,CAAC,GAAG;YAC/D,MAAMC,SAASJ,WAAWK,OAAO,CAAC,GAAGR,iBAAiBM,IAAI,CAAC,SAAS,CAAC,EAAE;YAEvE,wCAAwC;YACxC,iDAAiD;YACjD,MAAMG,kBAAkBX,OAAOY,UAAU,CAAC,QAAQR,QAAQS,MAAM,EAAEC,MAAM,CAACL,QAAQM,MAAM,CAAC;YACxF,MAAMC,oBAAoBhB,OACvBY,UAAU,CAAC,UAAUR,QAAQS,MAAM,EACnCC,MAAM,CAACL,QACPM,MAAM,CAAC;YAEV,MAAME,oBAAoB;gBACxB;oBACEC,aAAa;wBACXC,QAAQR;oBACV;gBACF;gBACA;oBACEO,aAAa;wBACXC,QAAQH;oBACV;gBACF;aACD;YAED,IAAI;gBACF,MAAMI,QAAe,CAAC;gBACtB,IAAIlB,iBAAiBmB,IAAI,EAAEC,QAAQ;oBACjCF,MAAMG,GAAG,GAAG;wBACV;4BACEC,IAAIP;wBACN;wBACA;4BACEQ,WAAW;gCACTC,YAAY;4BACd;wBACF;qBACD;gBACH,OAAO;oBACLN,MAAMI,EAAE,GAAGP;gBACb;gBAEA,MAAMU,YAAY,MAAMvB,QAAQwB,IAAI,CAAC;oBACnCC,YAAY3B,iBAAiBM,IAAI;oBACjCsB,OAAO5B,iBAAiBmB,IAAI,CAACS,KAAK;oBAClCC,OAAO;oBACPC,gBAAgB;oBAChBC,YAAY;oBACZb;gBACF;gBAEA,IAAIO,UAAUO,IAAI,IAAIP,UAAUO,IAAI,CAACC,MAAM,GAAG,GAAG;oBAC/C,MAAMC,OAAOT,UAAUO,IAAI,CAAC,EAAE;oBAC9BE,KAAMP,UAAU,GAAG3B,iBAAiBM,IAAI;oBACxC4B,KAAMC,SAAS,GAAG;oBAElB,OAAO;wBACLD,MAAMA;oBACR;gBACF;YACF,EAAE,OAAOE,QAAQ;gBACf,OAAO;oBAAEF,MAAM;gBAAK;YACtB;QACF;QAEA,OAAO;YAAEA,MAAM;QAAK;IACtB,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"resetLoginAttempts.d.ts","sourceRoot":"","sources":["../../../../src/auth/strategies/local/resetLoginAttempts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AACjG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE7D,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAA;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,kBAAkB,uCAK5B,IAAI,KAAG,OAAO,CAAC,IAAI,CAerB,CAAA"}
1
+ {"version":3,"file":"resetLoginAttempts.d.ts","sourceRoot":"","sources":["../../../../src/auth/strategies/local/resetLoginAttempts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AACjG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE7D,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAA;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,kBAAkB,uCAK5B,IAAI,KAAG,OAAO,CAAC,IAAI,CAkBrB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  export const resetLoginAttempts = async ({ collection, doc, payload, req })=>{
2
- if (!('lockUntil' in doc && typeof doc.lockUntil === 'string') || doc.loginAttempts === 0) {
2
+ if (!('lockUntil' in doc && typeof doc.lockUntil === 'string') && (!('loginAttempts' in doc) || doc.loginAttempts === 0)) {
3
3
  return;
4
4
  }
5
5
  await payload.update({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/auth/strategies/local/resetLoginAttempts.ts"],"sourcesContent":["import type { SanitizedCollectionConfig, TypeWithID } from '../../../collections/config/types.js'\nimport type { Payload } from '../../../index.js'\nimport type { PayloadRequest } from '../../../types/index.js'\n\ntype Args = {\n collection: SanitizedCollectionConfig\n doc: Record<string, unknown> & TypeWithID\n payload: Payload\n req: PayloadRequest\n}\n\nexport const resetLoginAttempts = async ({\n collection,\n doc,\n payload,\n req,\n}: Args): Promise<void> => {\n if (!('lockUntil' in doc && typeof doc.lockUntil === 'string') || doc.loginAttempts === 0) {\n return\n }\n await payload.update({\n id: doc.id,\n collection: collection.slug,\n data: {\n lockUntil: null,\n loginAttempts: 0,\n },\n depth: 0,\n overrideAccess: true,\n req,\n })\n}\n"],"names":["resetLoginAttempts","collection","doc","payload","req","lockUntil","loginAttempts","update","id","slug","data","depth","overrideAccess"],"mappings":"AAWA,OAAO,MAAMA,qBAAqB,OAAO,EACvCC,UAAU,EACVC,GAAG,EACHC,OAAO,EACPC,GAAG,EACE;IACL,IAAI,CAAE,CAAA,eAAeF,OAAO,OAAOA,IAAIG,SAAS,KAAK,QAAO,KAAMH,IAAII,aAAa,KAAK,GAAG;QACzF;IACF;IACA,MAAMH,QAAQI,MAAM,CAAC;QACnBC,IAAIN,IAAIM,EAAE;QACVP,YAAYA,WAAWQ,IAAI;QAC3BC,MAAM;YACJL,WAAW;YACXC,eAAe;QACjB;QACAK,OAAO;QACPC,gBAAgB;QAChBR;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/auth/strategies/local/resetLoginAttempts.ts"],"sourcesContent":["import type { SanitizedCollectionConfig, TypeWithID } from '../../../collections/config/types.js'\nimport type { Payload } from '../../../index.js'\nimport type { PayloadRequest } from '../../../types/index.js'\n\ntype Args = {\n collection: SanitizedCollectionConfig\n doc: Record<string, unknown> & TypeWithID\n payload: Payload\n req: PayloadRequest\n}\n\nexport const resetLoginAttempts = async ({\n collection,\n doc,\n payload,\n req,\n}: Args): Promise<void> => {\n if (\n !('lockUntil' in doc && typeof doc.lockUntil === 'string') &&\n (!('loginAttempts' in doc) || doc.loginAttempts === 0)\n ) {\n return\n }\n await payload.update({\n id: doc.id,\n collection: collection.slug,\n data: {\n lockUntil: null,\n loginAttempts: 0,\n },\n depth: 0,\n overrideAccess: true,\n req,\n })\n}\n"],"names":["resetLoginAttempts","collection","doc","payload","req","lockUntil","loginAttempts","update","id","slug","data","depth","overrideAccess"],"mappings":"AAWA,OAAO,MAAMA,qBAAqB,OAAO,EACvCC,UAAU,EACVC,GAAG,EACHC,OAAO,EACPC,GAAG,EACE;IACL,IACE,CAAE,CAAA,eAAeF,OAAO,OAAOA,IAAIG,SAAS,KAAK,QAAO,KACvD,CAAA,CAAE,CAAA,mBAAmBH,GAAE,KAAMA,IAAII,aAAa,KAAK,CAAA,GACpD;QACA;IACF;IACA,MAAMH,QAAQI,MAAM,CAAC;QACnBC,IAAIN,IAAIM,EAAE;QACVP,YAAYA,WAAWQ,IAAI;QAC3BC,MAAM;YACJL,WAAW;YACXC,eAAe;QACjB;QACAK,OAAO;QACPC,gBAAgB;QAChBR;IACF;AACF,EAAC"}
@@ -36,6 +36,7 @@ export { isPlainObject } from '../utilities/isPlainObject.js';
36
36
  export { isReactClientComponent, isReactComponentOrFunction, isReactServerComponentOrFunction, } from '../utilities/isReactComponent.js';
37
37
  export { hoistQueryParamsToAnd, mergeListSearchAndWhere, } from '../utilities/mergeListSearchAndWhere.js';
38
38
  export { reduceFieldsToValues } from '../utilities/reduceFieldsToValues.js';
39
+ export { sanitizeUserDataForEmail } from '../utilities/sanitizeUserDataForEmail.js';
39
40
  export { setsAreEqual } from '../utilities/setsAreEqual.js';
40
41
  export { toKebabCase } from '../utilities/toKebabCase.js';
41
42
  export { transformColumnsToPreferences, transformColumnsToSearchParams, } from '../utilities/transformColumnPreferences.js';
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/exports/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/exports/shared.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,7 @@ export { isPlainObject } from '../utilities/isPlainObject.js';
35
35
  export { isReactClientComponent, isReactComponentOrFunction, isReactServerComponentOrFunction } from '../utilities/isReactComponent.js';
36
36
  export { hoistQueryParamsToAnd, mergeListSearchAndWhere } from '../utilities/mergeListSearchAndWhere.js';
37
37
  export { reduceFieldsToValues } from '../utilities/reduceFieldsToValues.js';
38
+ export { sanitizeUserDataForEmail } from '../utilities/sanitizeUserDataForEmail.js';
38
39
  export { setsAreEqual } from '../utilities/setsAreEqual.js';
39
40
  export { toKebabCase } from '../utilities/toKebabCase.js';
40
41
  export { transformColumnsToPreferences, transformColumnsToSearchParams } from '../utilities/transformColumnPreferences.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/shared.ts"],"sourcesContent":["export {\n generateCookie,\n generateExpiredPayloadCookie,\n generatePayloadCookie,\n getCookieExpiration,\n parseCookies,\n} from '../auth/cookies.js'\nexport { getLoginOptions } from '../auth/getLoginOptions.js'\nexport { getFromImportMap } from '../bin/generateImportMap/utilities/getFromImportMap.js'\nexport { parsePayloadComponent } from '../bin/generateImportMap/utilities/parsePayloadComponent.js'\nexport { defaults as collectionDefaults } from '../collections/config/defaults.js'\n\nexport { serverProps } from '../config/types.js'\n\nexport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\n\nexport {\n fieldAffectsData,\n fieldHasMaxDepth,\n fieldHasSubFields,\n fieldIsArrayType,\n fieldIsBlockType,\n fieldIsGroupType,\n fieldIsHiddenOrDisabled,\n fieldIsID,\n fieldIsLocalized,\n fieldIsPresentationalOnly,\n fieldIsSidebar,\n fieldIsVirtual,\n fieldShouldBeLocalized,\n fieldSupportsMany,\n groupHasName,\n optionIsObject,\n optionIsValue,\n optionsAreObjects,\n tabHasName,\n valueIsValueWithRelation,\n} from '../fields/config/types.js'\n\nexport { getFieldPaths } from '../fields/getFieldPaths.js'\nexport * from '../fields/validations.js'\n\nexport type {\n FolderBreadcrumb,\n FolderDocumentItemKey,\n FolderEnabledColection,\n FolderInterface,\n FolderOrDocument,\n GetFolderDataResult,\n Subfolder,\n} from '../folders/types.js'\n\nexport { buildFolderWhereConstraints } from '../folders/utils/buildFolderWhereConstraints.js'\nexport { formatFolderOrDocumentItem } from '../folders/utils/formatFolderOrDocumentItem.js'\nexport { validOperators, validOperatorSet } from '../types/constants.js'\n\nexport { formatFilesize } from '../uploads/formatFilesize.js'\n\nexport { isImage } from '../uploads/isImage.js'\nexport { combineWhereConstraints } from '../utilities/combineWhereConstraints.js'\n\nexport {\n deepCopyObject,\n deepCopyObjectComplex,\n deepCopyObjectSimple,\n deepCopyObjectSimpleWithoutReactComponents,\n} from '../utilities/deepCopyObject.js'\nexport {\n deepMerge,\n deepMergeWithCombinedArrays,\n deepMergeWithReactComponents,\n deepMergeWithSourceArrays,\n} from '../utilities/deepMerge.js'\n\nexport { extractID } from '../utilities/extractID.js'\n\nexport { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js'\n\nexport { flattenAllFields } from '../utilities/flattenAllFields.js'\nexport { flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js'\nexport { formatAdminURL } from '../utilities/formatAdminURL.js'\n\nexport { formatLabels, toWords } from '../utilities/formatLabels.js'\nexport { getBestFitFromSizes } from '../utilities/getBestFitFromSizes.js'\nexport { getDataByPath } from '../utilities/getDataByPath.js'\nexport { getFieldPermissions } from '../utilities/getFieldPermissions.js'\n\nexport { getSafeRedirect } from '../utilities/getSafeRedirect.js'\n\nexport { getSelectMode } from '../utilities/getSelectMode.js'\n\nexport { getSiblingData } from '../utilities/getSiblingData.js'\n\nexport { getUniqueListBy } from '../utilities/getUniqueListBy.js'\n\nexport { isNextBuild } from '../utilities/isNextBuild.js'\n\nexport { isNumber } from '../utilities/isNumber.js'\n\nexport { isPlainObject } from '../utilities/isPlainObject.js'\n\nexport {\n isReactClientComponent,\n isReactComponentOrFunction,\n isReactServerComponentOrFunction,\n} from '../utilities/isReactComponent.js'\n\nexport {\n hoistQueryParamsToAnd,\n mergeListSearchAndWhere,\n} from '../utilities/mergeListSearchAndWhere.js'\n\nexport { reduceFieldsToValues } from '../utilities/reduceFieldsToValues.js'\n\nexport { setsAreEqual } from '../utilities/setsAreEqual.js'\n\nexport { toKebabCase } from '../utilities/toKebabCase.js'\n\nexport {\n transformColumnsToPreferences,\n transformColumnsToSearchParams,\n} from '../utilities/transformColumnPreferences.js'\n\nexport { transformWhereQuery } from '../utilities/transformWhereQuery.js'\n\nexport { unflatten } from '../utilities/unflatten.js'\nexport { validateMimeType } from '../utilities/validateMimeType.js'\nexport { validateWhereQuery } from '../utilities/validateWhereQuery.js'\nexport { wait } from '../utilities/wait.js'\nexport { wordBoundariesRegex } from '../utilities/wordBoundariesRegex.js'\nexport { versionDefaults } from '../versions/defaults.js'\n\nexport { deepMergeSimple } from '@payloadcms/translations/utilities'\n"],"names":["generateCookie","generateExpiredPayloadCookie","generatePayloadCookie","getCookieExpiration","parseCookies","getLoginOptions","getFromImportMap","parsePayloadComponent","defaults","collectionDefaults","serverProps","defaultTimezones","fieldAffectsData","fieldHasMaxDepth","fieldHasSubFields","fieldIsArrayType","fieldIsBlockType","fieldIsGroupType","fieldIsHiddenOrDisabled","fieldIsID","fieldIsLocalized","fieldIsPresentationalOnly","fieldIsSidebar","fieldIsVirtual","fieldShouldBeLocalized","fieldSupportsMany","groupHasName","optionIsObject","optionIsValue","optionsAreObjects","tabHasName","valueIsValueWithRelation","getFieldPaths","buildFolderWhereConstraints","formatFolderOrDocumentItem","validOperators","validOperatorSet","formatFilesize","isImage","combineWhereConstraints","deepCopyObject","deepCopyObjectComplex","deepCopyObjectSimple","deepCopyObjectSimpleWithoutReactComponents","deepMerge","deepMergeWithCombinedArrays","deepMergeWithReactComponents","deepMergeWithSourceArrays","extractID","fieldSchemaToJSON","flattenAllFields","flattenTopLevelFields","formatAdminURL","formatLabels","toWords","getBestFitFromSizes","getDataByPath","getFieldPermissions","getSafeRedirect","getSelectMode","getSiblingData","getUniqueListBy","isNextBuild","isNumber","isPlainObject","isReactClientComponent","isReactComponentOrFunction","isReactServerComponentOrFunction","hoistQueryParamsToAnd","mergeListSearchAndWhere","reduceFieldsToValues","setsAreEqual","toKebabCase","transformColumnsToPreferences","transformColumnsToSearchParams","transformWhereQuery","unflatten","validateMimeType","validateWhereQuery","wait","wordBoundariesRegex","versionDefaults","deepMergeSimple"],"mappings":"AAAA,SACEA,cAAc,EACdC,4BAA4B,EAC5BC,qBAAqB,EACrBC,mBAAmB,EACnBC,YAAY,QACP,qBAAoB;AAC3B,SAASC,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,gBAAgB,QAAQ,yDAAwD;AACzF,SAASC,qBAAqB,QAAQ,8DAA6D;AACnG,SAASC,YAAYC,kBAAkB,QAAQ,oCAAmC;AAElF,SAASC,WAAW,QAAQ,qBAAoB;AAEhD,SAASC,gBAAgB,QAAQ,oDAAmD;AAEpF,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,uBAAuB,EACvBC,SAAS,EACTC,gBAAgB,EAChBC,yBAAyB,EACzBC,cAAc,EACdC,cAAc,EACdC,sBAAsB,EACtBC,iBAAiB,EACjBC,YAAY,EACZC,cAAc,EACdC,aAAa,EACbC,iBAAiB,EACjBC,UAAU,EACVC,wBAAwB,QACnB,4BAA2B;AAElC,SAASC,aAAa,QAAQ,6BAA4B;AAC1D,cAAc,2BAA0B;AAYxC,SAASC,2BAA2B,QAAQ,kDAAiD;AAC7F,SAASC,0BAA0B,QAAQ,iDAAgD;AAC3F,SAASC,cAAc,EAAEC,gBAAgB,QAAQ,wBAAuB;AAExE,SAASC,cAAc,QAAQ,+BAA8B;AAE7D,SAASC,OAAO,QAAQ,wBAAuB;AAC/C,SAASC,uBAAuB,QAAQ,0CAAyC;AAEjF,SACEC,cAAc,EACdC,qBAAqB,EACrBC,oBAAoB,EACpBC,0CAA0C,QACrC,iCAAgC;AACvC,SACEC,SAAS,EACTC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,yBAAyB,QACpB,4BAA2B;AAElC,SAASC,SAAS,QAAQ,4BAA2B;AAErD,SAASC,iBAAiB,QAAQ,oCAAmC;AAErE,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,cAAc,QAAQ,iCAAgC;AAE/D,SAASC,YAAY,EAAEC,OAAO,QAAQ,+BAA8B;AACpE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,aAAa,QAAQ,gCAA+B;AAC7D,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,SAASC,aAAa,QAAQ,gCAA+B;AAE7D,SAASC,cAAc,QAAQ,iCAAgC;AAE/D,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,SAASC,WAAW,QAAQ,8BAA6B;AAEzD,SAASC,QAAQ,QAAQ,2BAA0B;AAEnD,SAASC,aAAa,QAAQ,gCAA+B;AAE7D,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,gCAAgC,QAC3B,mCAAkC;AAEzC,SACEC,qBAAqB,EACrBC,uBAAuB,QAClB,0CAAyC;AAEhD,SAASC,oBAAoB,QAAQ,uCAAsC;AAE3E,SAASC,YAAY,QAAQ,+BAA8B;AAE3D,SAASC,WAAW,QAAQ,8BAA6B;AAEzD,SACEC,6BAA6B,EAC7BC,8BAA8B,QACzB,6CAA4C;AAEnD,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,SAASC,SAAS,QAAQ,4BAA2B;AACrD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,IAAI,QAAQ,uBAAsB;AAC3C,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,eAAe,QAAQ,0BAAyB;AAEzD,SAASC,eAAe,QAAQ,qCAAoC"}
1
+ {"version":3,"sources":["../../src/exports/shared.ts"],"sourcesContent":["export {\n generateCookie,\n generateExpiredPayloadCookie,\n generatePayloadCookie,\n getCookieExpiration,\n parseCookies,\n} from '../auth/cookies.js'\nexport { getLoginOptions } from '../auth/getLoginOptions.js'\nexport { getFromImportMap } from '../bin/generateImportMap/utilities/getFromImportMap.js'\nexport { parsePayloadComponent } from '../bin/generateImportMap/utilities/parsePayloadComponent.js'\nexport { defaults as collectionDefaults } from '../collections/config/defaults.js'\n\nexport { serverProps } from '../config/types.js'\n\nexport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\n\nexport {\n fieldAffectsData,\n fieldHasMaxDepth,\n fieldHasSubFields,\n fieldIsArrayType,\n fieldIsBlockType,\n fieldIsGroupType,\n fieldIsHiddenOrDisabled,\n fieldIsID,\n fieldIsLocalized,\n fieldIsPresentationalOnly,\n fieldIsSidebar,\n fieldIsVirtual,\n fieldShouldBeLocalized,\n fieldSupportsMany,\n groupHasName,\n optionIsObject,\n optionIsValue,\n optionsAreObjects,\n tabHasName,\n valueIsValueWithRelation,\n} from '../fields/config/types.js'\n\nexport { getFieldPaths } from '../fields/getFieldPaths.js'\nexport * from '../fields/validations.js'\n\nexport type {\n FolderBreadcrumb,\n FolderDocumentItemKey,\n FolderEnabledColection,\n FolderInterface,\n FolderOrDocument,\n GetFolderDataResult,\n Subfolder,\n} from '../folders/types.js'\n\nexport { buildFolderWhereConstraints } from '../folders/utils/buildFolderWhereConstraints.js'\nexport { formatFolderOrDocumentItem } from '../folders/utils/formatFolderOrDocumentItem.js'\nexport { validOperators, validOperatorSet } from '../types/constants.js'\n\nexport { formatFilesize } from '../uploads/formatFilesize.js'\n\nexport { isImage } from '../uploads/isImage.js'\nexport { combineWhereConstraints } from '../utilities/combineWhereConstraints.js'\n\nexport {\n deepCopyObject,\n deepCopyObjectComplex,\n deepCopyObjectSimple,\n deepCopyObjectSimpleWithoutReactComponents,\n} from '../utilities/deepCopyObject.js'\nexport {\n deepMerge,\n deepMergeWithCombinedArrays,\n deepMergeWithReactComponents,\n deepMergeWithSourceArrays,\n} from '../utilities/deepMerge.js'\n\nexport { extractID } from '../utilities/extractID.js'\n\nexport { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js'\n\nexport { flattenAllFields } from '../utilities/flattenAllFields.js'\nexport { flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js'\nexport { formatAdminURL } from '../utilities/formatAdminURL.js'\n\nexport { formatLabels, toWords } from '../utilities/formatLabels.js'\nexport { getBestFitFromSizes } from '../utilities/getBestFitFromSizes.js'\nexport { getDataByPath } from '../utilities/getDataByPath.js'\nexport { getFieldPermissions } from '../utilities/getFieldPermissions.js'\n\nexport { getSafeRedirect } from '../utilities/getSafeRedirect.js'\n\nexport { getSelectMode } from '../utilities/getSelectMode.js'\n\nexport { getSiblingData } from '../utilities/getSiblingData.js'\n\nexport { getUniqueListBy } from '../utilities/getUniqueListBy.js'\n\nexport { isNextBuild } from '../utilities/isNextBuild.js'\n\nexport { isNumber } from '../utilities/isNumber.js'\n\nexport { isPlainObject } from '../utilities/isPlainObject.js'\n\nexport {\n isReactClientComponent,\n isReactComponentOrFunction,\n isReactServerComponentOrFunction,\n} from '../utilities/isReactComponent.js'\n\nexport {\n hoistQueryParamsToAnd,\n mergeListSearchAndWhere,\n} from '../utilities/mergeListSearchAndWhere.js'\n\nexport { reduceFieldsToValues } from '../utilities/reduceFieldsToValues.js'\n\nexport { sanitizeUserDataForEmail } from '../utilities/sanitizeUserDataForEmail.js'\n\nexport { setsAreEqual } from '../utilities/setsAreEqual.js'\n\nexport { toKebabCase } from '../utilities/toKebabCase.js'\n\nexport {\n transformColumnsToPreferences,\n transformColumnsToSearchParams,\n} from '../utilities/transformColumnPreferences.js'\n\nexport { transformWhereQuery } from '../utilities/transformWhereQuery.js'\n\nexport { unflatten } from '../utilities/unflatten.js'\nexport { validateMimeType } from '../utilities/validateMimeType.js'\nexport { validateWhereQuery } from '../utilities/validateWhereQuery.js'\nexport { wait } from '../utilities/wait.js'\nexport { wordBoundariesRegex } from '../utilities/wordBoundariesRegex.js'\nexport { versionDefaults } from '../versions/defaults.js'\n\nexport { deepMergeSimple } from '@payloadcms/translations/utilities'\n"],"names":["generateCookie","generateExpiredPayloadCookie","generatePayloadCookie","getCookieExpiration","parseCookies","getLoginOptions","getFromImportMap","parsePayloadComponent","defaults","collectionDefaults","serverProps","defaultTimezones","fieldAffectsData","fieldHasMaxDepth","fieldHasSubFields","fieldIsArrayType","fieldIsBlockType","fieldIsGroupType","fieldIsHiddenOrDisabled","fieldIsID","fieldIsLocalized","fieldIsPresentationalOnly","fieldIsSidebar","fieldIsVirtual","fieldShouldBeLocalized","fieldSupportsMany","groupHasName","optionIsObject","optionIsValue","optionsAreObjects","tabHasName","valueIsValueWithRelation","getFieldPaths","buildFolderWhereConstraints","formatFolderOrDocumentItem","validOperators","validOperatorSet","formatFilesize","isImage","combineWhereConstraints","deepCopyObject","deepCopyObjectComplex","deepCopyObjectSimple","deepCopyObjectSimpleWithoutReactComponents","deepMerge","deepMergeWithCombinedArrays","deepMergeWithReactComponents","deepMergeWithSourceArrays","extractID","fieldSchemaToJSON","flattenAllFields","flattenTopLevelFields","formatAdminURL","formatLabels","toWords","getBestFitFromSizes","getDataByPath","getFieldPermissions","getSafeRedirect","getSelectMode","getSiblingData","getUniqueListBy","isNextBuild","isNumber","isPlainObject","isReactClientComponent","isReactComponentOrFunction","isReactServerComponentOrFunction","hoistQueryParamsToAnd","mergeListSearchAndWhere","reduceFieldsToValues","sanitizeUserDataForEmail","setsAreEqual","toKebabCase","transformColumnsToPreferences","transformColumnsToSearchParams","transformWhereQuery","unflatten","validateMimeType","validateWhereQuery","wait","wordBoundariesRegex","versionDefaults","deepMergeSimple"],"mappings":"AAAA,SACEA,cAAc,EACdC,4BAA4B,EAC5BC,qBAAqB,EACrBC,mBAAmB,EACnBC,YAAY,QACP,qBAAoB;AAC3B,SAASC,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,gBAAgB,QAAQ,yDAAwD;AACzF,SAASC,qBAAqB,QAAQ,8DAA6D;AACnG,SAASC,YAAYC,kBAAkB,QAAQ,oCAAmC;AAElF,SAASC,WAAW,QAAQ,qBAAoB;AAEhD,SAASC,gBAAgB,QAAQ,oDAAmD;AAEpF,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,uBAAuB,EACvBC,SAAS,EACTC,gBAAgB,EAChBC,yBAAyB,EACzBC,cAAc,EACdC,cAAc,EACdC,sBAAsB,EACtBC,iBAAiB,EACjBC,YAAY,EACZC,cAAc,EACdC,aAAa,EACbC,iBAAiB,EACjBC,UAAU,EACVC,wBAAwB,QACnB,4BAA2B;AAElC,SAASC,aAAa,QAAQ,6BAA4B;AAC1D,cAAc,2BAA0B;AAYxC,SAASC,2BAA2B,QAAQ,kDAAiD;AAC7F,SAASC,0BAA0B,QAAQ,iDAAgD;AAC3F,SAASC,cAAc,EAAEC,gBAAgB,QAAQ,wBAAuB;AAExE,SAASC,cAAc,QAAQ,+BAA8B;AAE7D,SAASC,OAAO,QAAQ,wBAAuB;AAC/C,SAASC,uBAAuB,QAAQ,0CAAyC;AAEjF,SACEC,cAAc,EACdC,qBAAqB,EACrBC,oBAAoB,EACpBC,0CAA0C,QACrC,iCAAgC;AACvC,SACEC,SAAS,EACTC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,yBAAyB,QACpB,4BAA2B;AAElC,SAASC,SAAS,QAAQ,4BAA2B;AAErD,SAASC,iBAAiB,QAAQ,oCAAmC;AAErE,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,qBAAqB,QAAQ,wCAAuC;AAC7E,SAASC,cAAc,QAAQ,iCAAgC;AAE/D,SAASC,YAAY,EAAEC,OAAO,QAAQ,+BAA8B;AACpE,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,aAAa,QAAQ,gCAA+B;AAC7D,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,SAASC,aAAa,QAAQ,gCAA+B;AAE7D,SAASC,cAAc,QAAQ,iCAAgC;AAE/D,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,SAASC,WAAW,QAAQ,8BAA6B;AAEzD,SAASC,QAAQ,QAAQ,2BAA0B;AAEnD,SAASC,aAAa,QAAQ,gCAA+B;AAE7D,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,gCAAgC,QAC3B,mCAAkC;AAEzC,SACEC,qBAAqB,EACrBC,uBAAuB,QAClB,0CAAyC;AAEhD,SAASC,oBAAoB,QAAQ,uCAAsC;AAE3E,SAASC,wBAAwB,QAAQ,2CAA0C;AAEnF,SAASC,YAAY,QAAQ,+BAA8B;AAE3D,SAASC,WAAW,QAAQ,8BAA6B;AAEzD,SACEC,6BAA6B,EAC7BC,8BAA8B,QACzB,6CAA4C;AAEnD,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,SAASC,SAAS,QAAQ,4BAA2B;AACrD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,IAAI,QAAQ,uBAAsB;AAC3C,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,eAAe,QAAQ,0BAAyB;AAEzD,SAASC,eAAe,QAAQ,qCAAoC"}
@@ -1 +1 @@
1
- {"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/afterRead/promise.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACX,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAS,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGrE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAUvD,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,UAAU,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,IAAI,GAAG,MAAM,CAAA;IAC7B,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9B,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IACnC,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IACtC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAUD,eAAO,MAAM,OAAO,+XA+BjB,IAAI,KAAG,OAAO,CAAC,IAAI,CA2wBrB,CAAA"}
1
+ {"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/afterRead/promise.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACX,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAS,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGrE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAUvD,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,UAAU,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,IAAI,GAAG,MAAM,CAAA;IAC7B,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IAC9B,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IACnC,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IACtC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAUD,eAAO,MAAM,OAAO,+XA+BjB,IAAI,KAAG,OAAO,CAAC,IAAI,CA8wBrB,CAAA"}
@@ -25,7 +25,9 @@ export const promise = async ({ blockData, collection, context, currentDepth, de
25
25
  const pathSegments = path ? path.split('.') : [];
26
26
  const schemaPathSegments = schemaPath ? schemaPath.split('.') : [];
27
27
  const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : [];
28
+ let removedFieldValue = false;
28
29
  if (fieldAffectsData(field) && field.hidden && typeof siblingDoc[field.name] !== 'undefined' && !showHiddenFields) {
30
+ removedFieldValue = true;
29
31
  delete siblingDoc[field.name];
30
32
  }
31
33
  if (path !== 'id') {
@@ -205,7 +207,7 @@ export const promise = async ({ blockData, collection, context, currentDepth, de
205
207
  // Execute access control
206
208
  let allowDefaultValue = true;
207
209
  if (triggerAccessControl && field.access && field.access.read) {
208
- const result = overrideAccess ? true : await field.access.read({
210
+ const canReadField = overrideAccess ? true : await field.access.read({
209
211
  id: doc.id,
210
212
  blockData,
211
213
  data: doc,
@@ -213,14 +215,14 @@ export const promise = async ({ blockData, collection, context, currentDepth, de
213
215
  req,
214
216
  siblingData: siblingDoc
215
217
  });
216
- if (!result) {
218
+ if (!canReadField) {
217
219
  allowDefaultValue = false;
218
220
  delete siblingDoc[field.name];
219
221
  }
220
222
  }
221
223
  // Set defaultValue on the field for globals being returned without being first created
222
224
  // or collection documents created prior to having a default
223
- if (allowDefaultValue && typeof siblingDoc[field.name] === 'undefined' && typeof field.defaultValue !== 'undefined') {
225
+ if (!removedFieldValue && allowDefaultValue && typeof siblingDoc[field.name] === 'undefined' && typeof field.defaultValue !== 'undefined') {
224
226
  siblingDoc[field.name] = await getDefaultValue({
225
227
  defaultValue: field.defaultValue,
226
228
  locale: locale,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/hooks/afterRead/promise.ts"],"sourcesContent":["import type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type {\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectMode,\n SelectType,\n} from '../../../types/index.js'\nimport type { Block, Field, TabAsField } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { type RequestContext } from '../../../index.js'\nimport { getBlockSelect } from '../../../utilities/getBlockSelect.js'\nimport { stripUnselectedFields } from '../../../utilities/stripUnselectedFields.js'\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../../config/types.js'\nimport { getDefaultValue } from '../../getDefaultValue.js'\nimport { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js'\nimport { relationshipPopulationPromise } from './relationshipPopulationPromise.js'\nimport { traverseFields } from './traverseFields.js'\nimport { virtualFieldPopulationPromise } from './virtualFieldPopulationPromise.js'\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n currentDepth: number\n depth: number\n doc: JsonObject\n draft: boolean\n fallbackLocale: null | string\n field: Field | TabAsField\n fieldIndex: number\n /**\n * fieldPromises are used for things like field hooks. They should be awaited before awaiting populationPromises\n */\n fieldPromises: Promise<void>[]\n findMany: boolean\n flattenLocales: boolean\n global: null | SanitizedGlobalConfig\n locale: null | string\n overrideAccess: boolean\n parentIndexPath: string\n /**\n * @todo make required in v4.0\n */\n parentIsLocalized?: boolean\n parentPath: string\n parentSchemaPath: string\n populate?: PopulateType\n populationPromises: Promise<void>[]\n req: PayloadRequest\n select?: SelectType\n selectMode?: SelectMode\n showHiddenFields: boolean\n siblingDoc: JsonObject\n siblingFields?: (Field | TabAsField)[]\n triggerAccessControl?: boolean\n triggerHooks?: boolean\n}\n\n// This function is responsible for the following actions, in order:\n// - Remove hidden fields from response\n// - Flatten locales into requested locale\n// - Sanitize outgoing data (point field, etc.)\n// - Execute field hooks\n// - Execute read access control\n// - Populate relationships\n\nexport const promise = async ({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n field,\n fieldIndex,\n fieldPromises,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n siblingFields,\n triggerAccessControl = true,\n triggerHooks = true,\n}: Args): Promise<void> => {\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: fieldIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n const pathSegments = path ? path.split('.') : []\n const schemaPathSegments = schemaPath ? schemaPath.split('.') : []\n const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : []\n\n if (\n fieldAffectsData(field) &&\n field.hidden &&\n typeof siblingDoc[field.name!] !== 'undefined' &&\n !showHiddenFields\n ) {\n delete siblingDoc[field.name!]\n }\n\n if (path !== 'id') {\n const shouldContinue = stripUnselectedFields({\n field,\n select: select!,\n selectMode: selectMode!,\n siblingDoc,\n })\n\n if (!shouldContinue) {\n return\n }\n }\n\n const shouldHoistLocalizedValue =\n flattenLocales &&\n fieldAffectsData(field) &&\n typeof siblingDoc[field.name!] === 'object' &&\n siblingDoc[field.name!] !== null &&\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n locale !== 'all' &&\n req.payload.config.localization\n\n if (shouldHoistLocalizedValue) {\n // replace actual value with localized value before sanitizing\n // { [locale]: fields } -> fields\n const value = siblingDoc[field.name!][locale!]\n\n let hoistedValue = value\n\n if (fallbackLocale && fallbackLocale !== locale) {\n const fallbackValue = siblingDoc[field.name!][fallbackLocale]\n const isNullOrUndefined = typeof value === 'undefined' || value === null\n\n if (fallbackValue) {\n switch (field.type) {\n case 'text':\n case 'textarea': {\n if (value === '' || isNullOrUndefined) {\n hoistedValue = fallbackValue\n }\n break\n }\n\n default: {\n if (isNullOrUndefined) {\n hoistedValue = fallbackValue\n }\n break\n }\n }\n }\n }\n\n siblingDoc[field.name!] = hoistedValue\n }\n\n // Sanitize outgoing field value\n switch (field.type) {\n case 'group': {\n // Fill groups with empty objects so fields with hooks within groups can populate\n // themselves virtually as necessary\n if (fieldAffectsData(field) && typeof siblingDoc[field.name] === 'undefined') {\n siblingDoc[field.name] = {}\n }\n\n break\n }\n case 'point': {\n const pointDoc = siblingDoc[field.name] as Record<string, unknown>\n if (Array.isArray(pointDoc?.coordinates) && pointDoc.coordinates.length === 2) {\n siblingDoc[field.name] = pointDoc.coordinates\n } else {\n siblingDoc[field.name] = undefined\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n // Rich Text fields should use afterRead hooks to do population. The previous editor.populationPromises have been renamed to editor.graphQLPopulationPromises\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n if (\n tabHasName(tab) &&\n (typeof siblingDoc[tab.name] === 'undefined' || siblingDoc[tab.name] === null)\n ) {\n siblingDoc[tab.name] = {}\n }\n })\n\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldAffectsData(field)) {\n // Execute hooks\n if (triggerHooks && field.hooks?.afterRead) {\n for (const hook of field.hooks.afterRead) {\n const shouldRunHookOnAllLocales =\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n (locale === 'all' || !flattenLocales) &&\n typeof siblingDoc[field.name!] === 'object'\n\n if (shouldRunHookOnAllLocales) {\n const localesAndValues = Object.entries(siblingDoc[field.name!])\n await Promise.all(\n localesAndValues.map(async ([localeKey, value]) => {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n field,\n findMany,\n global,\n indexPath: indexPathSegments,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n path: pathSegments,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n siblingFields: siblingFields!,\n value,\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name!][localeKey] = hookedValue\n }\n }),\n )\n } else {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n field,\n findMany,\n global,\n indexPath: indexPathSegments,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n path: pathSegments,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n siblingFields: siblingFields!,\n value: siblingDoc[field.name!],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name!] = hookedValue\n }\n }\n }\n }\n\n if (\n 'virtual' in field &&\n typeof field.virtual === 'string' &&\n (!field.hidden || showHiddenFields)\n ) {\n populationPromises.push(\n virtualFieldPopulationPromise({\n name: field.name,\n draft,\n fallbackLocale: fallbackLocale!,\n fields: (collection || global)!.flattenedFields,\n locale: locale!,\n overrideAccess,\n ref: doc,\n req,\n segments: field.virtual.split('.'),\n showHiddenFields,\n siblingDoc,\n }),\n )\n }\n\n // Execute access control\n let allowDefaultValue = true\n if (triggerAccessControl && field.access && field.access.read) {\n const result = overrideAccess\n ? true\n : await field.access.read({\n id: doc.id as number | string,\n blockData,\n data: doc,\n doc,\n req,\n siblingData: siblingDoc,\n })\n\n if (!result) {\n allowDefaultValue = false\n delete siblingDoc[field.name!]\n }\n }\n\n // Set defaultValue on the field for globals being returned without being first created\n // or collection documents created prior to having a default\n if (\n allowDefaultValue &&\n typeof siblingDoc[field.name!] === 'undefined' &&\n typeof field.defaultValue !== 'undefined'\n ) {\n siblingDoc[field.name!] = await getDefaultValue({\n defaultValue: field.defaultValue,\n locale: locale!,\n req,\n user: req.user,\n value: siblingDoc[field.name!],\n })\n }\n\n if (field.type === 'relationship' || field.type === 'upload' || field.type === 'join') {\n populationPromises.push(\n relationshipPopulationPromise({\n currentDepth,\n depth,\n draft,\n fallbackLocale,\n field,\n locale,\n overrideAccess,\n parentIsLocalized: parentIsLocalized!,\n populate,\n req,\n showHiddenFields,\n siblingDoc,\n }),\n )\n }\n }\n\n switch (field.type) {\n case 'array': {\n const rows = siblingDoc[field.name] as JsonObject\n\n let arraySelect = select?.[field.name]\n\n if (selectMode === 'include' && typeof arraySelect === 'object') {\n arraySelect = {\n ...arraySelect,\n id: true,\n }\n }\n\n if (Array.isArray(rows)) {\n rows.forEach((row, rowIndex) => {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select: typeof arraySelect === 'object' ? arraySelect : undefined,\n selectMode,\n showHiddenFields,\n siblingDoc: row || {},\n triggerAccessControl,\n triggerHooks,\n })\n })\n } else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) {\n Object.values(rows).forEach((localeRows) => {\n if (Array.isArray(localeRows)) {\n localeRows.forEach((row, rowIndex) => {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n showHiddenFields,\n siblingDoc: (row as JsonObject) || {},\n triggerAccessControl,\n triggerHooks,\n })\n })\n }\n })\n } else if (field.hidden !== true || showHiddenFields === true) {\n siblingDoc[field.name] = []\n }\n break\n }\n\n case 'blocks': {\n const rows = siblingDoc[field.name]\n\n if (Array.isArray(rows)) {\n rows.forEach((row, rowIndex) => {\n const blockTypeToMatch = (row as JsonObject).blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n ((field.blockReferences ?? field.blocks).find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n const { blockSelect, blockSelectMode } = getBlockSelect({\n block: block!,\n // TODO: fix this\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n select: select?.[field.name]!,\n selectMode: selectMode!,\n })\n\n if (block) {\n traverseFields({\n blockData: row,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: block.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n populate,\n populationPromises,\n req,\n select: typeof blockSelect === 'object' ? blockSelect : undefined,\n selectMode: blockSelectMode,\n showHiddenFields,\n siblingDoc: (row as JsonObject) || {},\n triggerAccessControl,\n triggerHooks,\n })\n }\n })\n } else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) {\n Object.values(rows).forEach((localeRows) => {\n if (Array.isArray(localeRows)) {\n localeRows.forEach((row, rowIndex) => {\n const blockTypeToMatch = row.blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n ((field.blockReferences ?? field.blocks).find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n if (block) {\n traverseFields({\n blockData: row,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: block.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n populate,\n populationPromises,\n req,\n showHiddenFields,\n siblingDoc: (row as JsonObject) || {},\n triggerAccessControl,\n triggerHooks,\n })\n }\n })\n }\n })\n } else if (field.hidden !== true || showHiddenFields === true) {\n siblingDoc[field.name] = []\n }\n\n break\n }\n\n case 'collapsible':\n case 'row': {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n triggerAccessControl,\n triggerHooks,\n })\n\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field)) {\n let groupDoc = siblingDoc[field.name] as JsonObject\n\n if (typeof siblingDoc[field.name] !== 'object') {\n groupDoc = {}\n }\n\n const groupSelect = select?.[field.name]\n\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select: typeof groupSelect === 'object' ? groupSelect : undefined,\n selectMode,\n showHiddenFields,\n siblingDoc: groupDoc,\n triggerAccessControl,\n triggerHooks,\n })\n } else {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n triggerAccessControl,\n triggerHooks,\n })\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field?.editor\n\n if (editor?.hooks?.afterRead?.length) {\n for (const hook of editor.hooks.afterRead) {\n const shouldRunHookOnAllLocales =\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n (locale === 'all' || !flattenLocales) &&\n typeof siblingDoc[field.name] === 'object'\n\n if (shouldRunHookOnAllLocales) {\n const localesAndValues = Object.entries(siblingDoc[field.name])\n\n await Promise.all(\n localesAndValues.map(async ([locale, value]) => {\n const hookedValue = await hook({\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n fallbackLocale: fallbackLocale!,\n field,\n fieldPromises,\n findMany,\n flattenLocales,\n global,\n indexPath: indexPathSegments,\n locale,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n parentIsLocalized: parentIsLocalized!,\n path: pathSegments,\n populate,\n populationPromises,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n triggerAccessControl,\n triggerHooks,\n value,\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name][locale] = hookedValue\n }\n }),\n )\n } else {\n const hookedValue = await hook({\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n fallbackLocale: fallbackLocale!,\n field,\n fieldPromises,\n findMany,\n flattenLocales,\n global,\n indexPath: indexPathSegments,\n locale: locale!,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n parentIsLocalized: parentIsLocalized!,\n path: pathSegments,\n populate,\n populationPromises,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n triggerAccessControl,\n triggerHooks,\n value: siblingDoc[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name] = hookedValue\n }\n }\n }\n }\n break\n }\n\n case 'tab': {\n let tabDoc = siblingDoc\n let tabSelect: SelectType | undefined\n\n const isNamedTab = tabHasName(field)\n\n if (isNamedTab) {\n tabDoc = siblingDoc[field.name] as JsonObject\n\n if (typeof siblingDoc[field.name] !== 'object') {\n tabDoc = {}\n }\n\n if (typeof select?.[field.name] === 'object') {\n tabSelect = select?.[field.name] as SelectType\n }\n } else {\n tabSelect = select\n }\n\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: isNamedTab ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedTab ? path : parentPath,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select: tabSelect,\n selectMode,\n showHiddenFields,\n siblingDoc: tabDoc,\n triggerAccessControl,\n triggerHooks,\n })\n\n break\n }\n\n case 'tabs': {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n triggerAccessControl,\n triggerHooks,\n })\n\n break\n }\n default: {\n break\n }\n }\n}\n"],"names":["MissingEditorProp","getBlockSelect","stripUnselectedFields","fieldAffectsData","fieldShouldBeLocalized","tabHasName","getDefaultValue","getFieldPathsModified","getFieldPaths","relationshipPopulationPromise","traverseFields","virtualFieldPopulationPromise","promise","blockData","collection","context","currentDepth","depth","doc","draft","fallbackLocale","field","fieldIndex","fieldPromises","findMany","flattenLocales","global","locale","overrideAccess","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","populate","populationPromises","req","select","selectMode","showHiddenFields","siblingDoc","siblingFields","triggerAccessControl","triggerHooks","indexPath","path","schemaPath","index","pathSegments","split","schemaPathSegments","indexPathSegments","filter","Boolean","map","Number","hidden","name","shouldContinue","shouldHoistLocalizedValue","payload","config","localization","value","hoistedValue","fallbackValue","isNullOrUndefined","type","pointDoc","Array","isArray","coordinates","length","undefined","editor","Error","tabs","forEach","tab","hooks","afterRead","hook","shouldRunHookOnAllLocales","localesAndValues","Object","entries","Promise","all","localeKey","hookedValue","data","operation","originalDoc","siblingData","virtual","push","fields","flattenedFields","ref","segments","allowDefaultValue","access","read","result","id","defaultValue","user","rows","arraySelect","row","rowIndex","localized","values","localeRows","blockTypeToMatch","blockType","block","blocks","blockReferences","find","curBlock","slug","blockSelect","blockSelectMode","groupDoc","groupSelect","tabDoc","tabSelect","isNamedTab"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/fields/hooks/afterRead/promise.ts"],"sourcesContent":["import type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type {\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectMode,\n SelectType,\n} from '../../../types/index.js'\nimport type { Block, Field, TabAsField } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { type RequestContext } from '../../../index.js'\nimport { getBlockSelect } from '../../../utilities/getBlockSelect.js'\nimport { stripUnselectedFields } from '../../../utilities/stripUnselectedFields.js'\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../../config/types.js'\nimport { getDefaultValue } from '../../getDefaultValue.js'\nimport { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js'\nimport { relationshipPopulationPromise } from './relationshipPopulationPromise.js'\nimport { traverseFields } from './traverseFields.js'\nimport { virtualFieldPopulationPromise } from './virtualFieldPopulationPromise.js'\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n currentDepth: number\n depth: number\n doc: JsonObject\n draft: boolean\n fallbackLocale: null | string\n field: Field | TabAsField\n fieldIndex: number\n /**\n * fieldPromises are used for things like field hooks. They should be awaited before awaiting populationPromises\n */\n fieldPromises: Promise<void>[]\n findMany: boolean\n flattenLocales: boolean\n global: null | SanitizedGlobalConfig\n locale: null | string\n overrideAccess: boolean\n parentIndexPath: string\n /**\n * @todo make required in v4.0\n */\n parentIsLocalized?: boolean\n parentPath: string\n parentSchemaPath: string\n populate?: PopulateType\n populationPromises: Promise<void>[]\n req: PayloadRequest\n select?: SelectType\n selectMode?: SelectMode\n showHiddenFields: boolean\n siblingDoc: JsonObject\n siblingFields?: (Field | TabAsField)[]\n triggerAccessControl?: boolean\n triggerHooks?: boolean\n}\n\n// This function is responsible for the following actions, in order:\n// - Remove hidden fields from response\n// - Flatten locales into requested locale\n// - Sanitize outgoing data (point field, etc.)\n// - Execute field hooks\n// - Execute read access control\n// - Populate relationships\n\nexport const promise = async ({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n field,\n fieldIndex,\n fieldPromises,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n siblingFields,\n triggerAccessControl = true,\n triggerHooks = true,\n}: Args): Promise<void> => {\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: fieldIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n const pathSegments = path ? path.split('.') : []\n const schemaPathSegments = schemaPath ? schemaPath.split('.') : []\n const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : []\n let removedFieldValue = false\n\n if (\n fieldAffectsData(field) &&\n field.hidden &&\n typeof siblingDoc[field.name!] !== 'undefined' &&\n !showHiddenFields\n ) {\n removedFieldValue = true\n delete siblingDoc[field.name!]\n }\n\n if (path !== 'id') {\n const shouldContinue = stripUnselectedFields({\n field,\n select: select!,\n selectMode: selectMode!,\n siblingDoc,\n })\n\n if (!shouldContinue) {\n return\n }\n }\n\n const shouldHoistLocalizedValue =\n flattenLocales &&\n fieldAffectsData(field) &&\n typeof siblingDoc[field.name!] === 'object' &&\n siblingDoc[field.name!] !== null &&\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n locale !== 'all' &&\n req.payload.config.localization\n\n if (shouldHoistLocalizedValue) {\n // replace actual value with localized value before sanitizing\n // { [locale]: fields } -> fields\n const value = siblingDoc[field.name!][locale!]\n\n let hoistedValue = value\n\n if (fallbackLocale && fallbackLocale !== locale) {\n const fallbackValue = siblingDoc[field.name!][fallbackLocale]\n const isNullOrUndefined = typeof value === 'undefined' || value === null\n\n if (fallbackValue) {\n switch (field.type) {\n case 'text':\n case 'textarea': {\n if (value === '' || isNullOrUndefined) {\n hoistedValue = fallbackValue\n }\n break\n }\n\n default: {\n if (isNullOrUndefined) {\n hoistedValue = fallbackValue\n }\n break\n }\n }\n }\n }\n\n siblingDoc[field.name!] = hoistedValue\n }\n\n // Sanitize outgoing field value\n switch (field.type) {\n case 'group': {\n // Fill groups with empty objects so fields with hooks within groups can populate\n // themselves virtually as necessary\n if (fieldAffectsData(field) && typeof siblingDoc[field.name] === 'undefined') {\n siblingDoc[field.name] = {}\n }\n\n break\n }\n case 'point': {\n const pointDoc = siblingDoc[field.name] as Record<string, unknown>\n if (Array.isArray(pointDoc?.coordinates) && pointDoc.coordinates.length === 2) {\n siblingDoc[field.name] = pointDoc.coordinates\n } else {\n siblingDoc[field.name] = undefined\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n // Rich Text fields should use afterRead hooks to do population. The previous editor.populationPromises have been renamed to editor.graphQLPopulationPromises\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n if (\n tabHasName(tab) &&\n (typeof siblingDoc[tab.name] === 'undefined' || siblingDoc[tab.name] === null)\n ) {\n siblingDoc[tab.name] = {}\n }\n })\n\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldAffectsData(field)) {\n // Execute hooks\n if (triggerHooks && field.hooks?.afterRead) {\n for (const hook of field.hooks.afterRead) {\n const shouldRunHookOnAllLocales =\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n (locale === 'all' || !flattenLocales) &&\n typeof siblingDoc[field.name!] === 'object'\n\n if (shouldRunHookOnAllLocales) {\n const localesAndValues = Object.entries(siblingDoc[field.name!])\n await Promise.all(\n localesAndValues.map(async ([localeKey, value]) => {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n field,\n findMany,\n global,\n indexPath: indexPathSegments,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n path: pathSegments,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n siblingFields: siblingFields!,\n value,\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name!][localeKey] = hookedValue\n }\n }),\n )\n } else {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n field,\n findMany,\n global,\n indexPath: indexPathSegments,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n path: pathSegments,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n siblingFields: siblingFields!,\n value: siblingDoc[field.name!],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name!] = hookedValue\n }\n }\n }\n }\n\n if (\n 'virtual' in field &&\n typeof field.virtual === 'string' &&\n (!field.hidden || showHiddenFields)\n ) {\n populationPromises.push(\n virtualFieldPopulationPromise({\n name: field.name,\n draft,\n fallbackLocale: fallbackLocale!,\n fields: (collection || global)!.flattenedFields,\n locale: locale!,\n overrideAccess,\n ref: doc,\n req,\n segments: field.virtual.split('.'),\n showHiddenFields,\n siblingDoc,\n }),\n )\n }\n\n // Execute access control\n let allowDefaultValue = true\n if (triggerAccessControl && field.access && field.access.read) {\n const canReadField = overrideAccess\n ? true\n : await field.access.read({\n id: doc.id as number | string,\n blockData,\n data: doc,\n doc,\n req,\n siblingData: siblingDoc,\n })\n\n if (!canReadField) {\n allowDefaultValue = false\n delete siblingDoc[field.name!]\n }\n }\n\n // Set defaultValue on the field for globals being returned without being first created\n // or collection documents created prior to having a default\n if (\n !removedFieldValue &&\n allowDefaultValue &&\n typeof siblingDoc[field.name!] === 'undefined' &&\n typeof field.defaultValue !== 'undefined'\n ) {\n siblingDoc[field.name!] = await getDefaultValue({\n defaultValue: field.defaultValue,\n locale: locale!,\n req,\n user: req.user,\n value: siblingDoc[field.name!],\n })\n }\n\n if (field.type === 'relationship' || field.type === 'upload' || field.type === 'join') {\n populationPromises.push(\n relationshipPopulationPromise({\n currentDepth,\n depth,\n draft,\n fallbackLocale,\n field,\n locale,\n overrideAccess,\n parentIsLocalized: parentIsLocalized!,\n populate,\n req,\n showHiddenFields,\n siblingDoc,\n }),\n )\n }\n }\n\n switch (field.type) {\n case 'array': {\n const rows = siblingDoc[field.name] as JsonObject\n\n let arraySelect = select?.[field.name]\n\n if (selectMode === 'include' && typeof arraySelect === 'object') {\n arraySelect = {\n ...arraySelect,\n id: true,\n }\n }\n\n if (Array.isArray(rows)) {\n rows.forEach((row, rowIndex) => {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select: typeof arraySelect === 'object' ? arraySelect : undefined,\n selectMode,\n showHiddenFields,\n siblingDoc: row || {},\n triggerAccessControl,\n triggerHooks,\n })\n })\n } else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) {\n Object.values(rows).forEach((localeRows) => {\n if (Array.isArray(localeRows)) {\n localeRows.forEach((row, rowIndex) => {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n showHiddenFields,\n siblingDoc: (row as JsonObject) || {},\n triggerAccessControl,\n triggerHooks,\n })\n })\n }\n })\n } else if (field.hidden !== true || showHiddenFields === true) {\n siblingDoc[field.name] = []\n }\n break\n }\n\n case 'blocks': {\n const rows = siblingDoc[field.name]\n\n if (Array.isArray(rows)) {\n rows.forEach((row, rowIndex) => {\n const blockTypeToMatch = (row as JsonObject).blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n ((field.blockReferences ?? field.blocks).find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n const { blockSelect, blockSelectMode } = getBlockSelect({\n block: block!,\n // TODO: fix this\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n select: select?.[field.name]!,\n selectMode: selectMode!,\n })\n\n if (block) {\n traverseFields({\n blockData: row,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: block.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n populate,\n populationPromises,\n req,\n select: typeof blockSelect === 'object' ? blockSelect : undefined,\n selectMode: blockSelectMode,\n showHiddenFields,\n siblingDoc: (row as JsonObject) || {},\n triggerAccessControl,\n triggerHooks,\n })\n }\n })\n } else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) {\n Object.values(rows).forEach((localeRows) => {\n if (Array.isArray(localeRows)) {\n localeRows.forEach((row, rowIndex) => {\n const blockTypeToMatch = row.blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n ((field.blockReferences ?? field.blocks).find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n if (block) {\n traverseFields({\n blockData: row,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: block.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n populate,\n populationPromises,\n req,\n showHiddenFields,\n siblingDoc: (row as JsonObject) || {},\n triggerAccessControl,\n triggerHooks,\n })\n }\n })\n }\n })\n } else if (field.hidden !== true || showHiddenFields === true) {\n siblingDoc[field.name] = []\n }\n\n break\n }\n\n case 'collapsible':\n case 'row': {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n triggerAccessControl,\n triggerHooks,\n })\n\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field)) {\n let groupDoc = siblingDoc[field.name] as JsonObject\n\n if (typeof siblingDoc[field.name] !== 'object') {\n groupDoc = {}\n }\n\n const groupSelect = select?.[field.name]\n\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select: typeof groupSelect === 'object' ? groupSelect : undefined,\n selectMode,\n showHiddenFields,\n siblingDoc: groupDoc,\n triggerAccessControl,\n triggerHooks,\n })\n } else {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n triggerAccessControl,\n triggerHooks,\n })\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field?.editor\n\n if (editor?.hooks?.afterRead?.length) {\n for (const hook of editor.hooks.afterRead) {\n const shouldRunHookOnAllLocales =\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n (locale === 'all' || !flattenLocales) &&\n typeof siblingDoc[field.name] === 'object'\n\n if (shouldRunHookOnAllLocales) {\n const localesAndValues = Object.entries(siblingDoc[field.name])\n\n await Promise.all(\n localesAndValues.map(async ([locale, value]) => {\n const hookedValue = await hook({\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n fallbackLocale: fallbackLocale!,\n field,\n fieldPromises,\n findMany,\n flattenLocales,\n global,\n indexPath: indexPathSegments,\n locale,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n parentIsLocalized: parentIsLocalized!,\n path: pathSegments,\n populate,\n populationPromises,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n triggerAccessControl,\n triggerHooks,\n value,\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name][locale] = hookedValue\n }\n }),\n )\n } else {\n const hookedValue = await hook({\n collection,\n context,\n currentDepth,\n data: doc,\n depth,\n draft,\n fallbackLocale: fallbackLocale!,\n field,\n fieldPromises,\n findMany,\n flattenLocales,\n global,\n indexPath: indexPathSegments,\n locale: locale!,\n operation: 'read',\n originalDoc: doc,\n overrideAccess,\n parentIsLocalized: parentIsLocalized!,\n path: pathSegments,\n populate,\n populationPromises,\n req,\n schemaPath: schemaPathSegments,\n showHiddenFields,\n siblingData: siblingDoc,\n triggerAccessControl,\n triggerHooks,\n value: siblingDoc[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingDoc[field.name] = hookedValue\n }\n }\n }\n }\n break\n }\n\n case 'tab': {\n let tabDoc = siblingDoc\n let tabSelect: SelectType | undefined\n\n const isNamedTab = tabHasName(field)\n\n if (isNamedTab) {\n tabDoc = siblingDoc[field.name] as JsonObject\n\n if (typeof siblingDoc[field.name] !== 'object') {\n tabDoc = {}\n }\n\n if (typeof select?.[field.name] === 'object') {\n tabSelect = select?.[field.name] as SelectType\n }\n } else {\n tabSelect = select\n }\n\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.fields,\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: isNamedTab ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedTab ? path : parentPath,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select: tabSelect,\n selectMode,\n showHiddenFields,\n siblingDoc: tabDoc,\n triggerAccessControl,\n triggerHooks,\n })\n\n break\n }\n\n case 'tabs': {\n traverseFields({\n blockData,\n collection,\n context,\n currentDepth,\n depth,\n doc,\n draft,\n fallbackLocale,\n fieldPromises,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n findMany,\n flattenLocales,\n global,\n locale,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n populate,\n populationPromises,\n req,\n select,\n selectMode,\n showHiddenFields,\n siblingDoc,\n triggerAccessControl,\n triggerHooks,\n })\n\n break\n }\n default: {\n break\n }\n }\n}\n"],"names":["MissingEditorProp","getBlockSelect","stripUnselectedFields","fieldAffectsData","fieldShouldBeLocalized","tabHasName","getDefaultValue","getFieldPathsModified","getFieldPaths","relationshipPopulationPromise","traverseFields","virtualFieldPopulationPromise","promise","blockData","collection","context","currentDepth","depth","doc","draft","fallbackLocale","field","fieldIndex","fieldPromises","findMany","flattenLocales","global","locale","overrideAccess","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","populate","populationPromises","req","select","selectMode","showHiddenFields","siblingDoc","siblingFields","triggerAccessControl","triggerHooks","indexPath","path","schemaPath","index","pathSegments","split","schemaPathSegments","indexPathSegments","filter","Boolean","map","Number","removedFieldValue","hidden","name","shouldContinue","shouldHoistLocalizedValue","payload","config","localization","value","hoistedValue","fallbackValue","isNullOrUndefined","type","pointDoc","Array","isArray","coordinates","length","undefined","editor","Error","tabs","forEach","tab","hooks","afterRead","hook","shouldRunHookOnAllLocales","localesAndValues","Object","entries","Promise","all","localeKey","hookedValue","data","operation","originalDoc","siblingData","virtual","push","fields","flattenedFields","ref","segments","allowDefaultValue","access","read","canReadField","id","defaultValue","user","rows","arraySelect","row","rowIndex","localized","values","localeRows","blockTypeToMatch","blockType","block","blocks","blockReferences","find","curBlock","slug","blockSelect","blockSelectMode","groupDoc","groupSelect","tabDoc","tabSelect","isNamedTab"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Sanitizes user data for emails to prevent injection of HTML, executable code, or other malicious content.
3
+ * This function ensures the content is safe by:
4
+ * - Removing HTML tags
5
+ * - Removing control characters
6
+ * - Normalizing whitespace
7
+ * - Escaping special HTML characters
8
+ * - Allowing only letters, numbers, spaces, and basic punctuation
9
+ * - Limiting length (default 100 characters)
10
+ *
11
+ * @param data - data to sanitize
12
+ * @param maxLength - maximum allowed length (default is 100)
13
+ * @returns a sanitized string safe to include in email content
14
+ */
15
+ export declare function sanitizeUserDataForEmail(data: unknown, maxLength?: number): string;
16
+ //# sourceMappingURL=sanitizeUserDataForEmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeUserDataForEmail.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeUserDataForEmail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAAM,GAAG,MAAM,CA4D/E"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Sanitizes user data for emails to prevent injection of HTML, executable code, or other malicious content.
3
+ * This function ensures the content is safe by:
4
+ * - Removing HTML tags
5
+ * - Removing control characters
6
+ * - Normalizing whitespace
7
+ * - Escaping special HTML characters
8
+ * - Allowing only letters, numbers, spaces, and basic punctuation
9
+ * - Limiting length (default 100 characters)
10
+ *
11
+ * @param data - data to sanitize
12
+ * @param maxLength - maximum allowed length (default is 100)
13
+ * @returns a sanitized string safe to include in email content
14
+ */ export function sanitizeUserDataForEmail(data, maxLength = 100) {
15
+ if (typeof data !== 'string') {
16
+ return '';
17
+ }
18
+ // Decode HTML numeric entities like &#x3C; or &#60;
19
+ const decodedEntities = data.replace(/&#x([0-9a-fA-F]+);/g, (_, hex)=>String.fromCharCode(parseInt(hex, 16))).replace(/&#(\d+);/g, (_, dec)=>String.fromCharCode(parseInt(dec, 10)));
20
+ // Remove HTML tags
21
+ const noTags = decodedEntities.replace(/<[^>]+>/g, '');
22
+ const noInvisible = noTags.replace(/[\u200B-\u200F\u2028-\u202F\u2060-\u206F\uFEFF]/g, '');
23
+ // Remove control characters except common whitespace
24
+ const noControls = [
25
+ ...noInvisible
26
+ ].filter((char)=>{
27
+ const code = char.charCodeAt(0);
28
+ return code >= 32 || // printable and above
29
+ code === 9 || // tab
30
+ code === 10 || // new line
31
+ code === 13 // return
32
+ ;
33
+ }).join('');
34
+ // Remove '(?' and backticks `
35
+ let noInjectionSyntax = noControls.replace(/\(\?/g, '').replace(/`/g, '');
36
+ // {{...}} remove braces but keep inner content
37
+ noInjectionSyntax = noInjectionSyntax.replace(/\{\{(.*?)\}\}/g, '$1');
38
+ // Escape special HTML characters
39
+ const escaped = noInjectionSyntax.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
40
+ // Normalize whitespace to single space
41
+ const normalizedWhitespace = escaped.replace(/\s+/g, ' ');
42
+ // Allow:
43
+ // - Unicode letters (\p{L})
44
+ // - Unicode numbers (\p{N})
45
+ // - Unicode marks (\p{M}, e.g. accents)
46
+ // - Unicode spaces (\p{Zs})
47
+ // - Punctuation: common ascii + inverted ! and ?
48
+ const allowedPunctuation = " .,!?'" + '"¡¿、!()〆-';
49
+ // Escape regex special characters
50
+ const escapedPunct = allowedPunctuation.replace(/[[\]\\^$*+?.()|{}]/g, '\\$&');
51
+ const pattern = `[^\\p{L}\\p{N}\\p{M}\\p{Zs}${escapedPunct}]`;
52
+ const cleaned = normalizedWhitespace.replace(new RegExp(pattern, 'gu'), '');
53
+ // Trim and limit length, trim again to remove trailing spaces
54
+ return cleaned.slice(0, maxLength).trim();
55
+ }
56
+
57
+ //# sourceMappingURL=sanitizeUserDataForEmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/sanitizeUserDataForEmail.ts"],"sourcesContent":["/**\n * Sanitizes user data for emails to prevent injection of HTML, executable code, or other malicious content.\n * This function ensures the content is safe by:\n * - Removing HTML tags\n * - Removing control characters\n * - Normalizing whitespace\n * - Escaping special HTML characters\n * - Allowing only letters, numbers, spaces, and basic punctuation\n * - Limiting length (default 100 characters)\n *\n * @param data - data to sanitize\n * @param maxLength - maximum allowed length (default is 100)\n * @returns a sanitized string safe to include in email content\n */\nexport function sanitizeUserDataForEmail(data: unknown, maxLength = 100): string {\n if (typeof data !== 'string') {\n return ''\n }\n\n // Decode HTML numeric entities like &#x3C; or &#60;\n const decodedEntities = data\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCharCode(parseInt(dec, 10)))\n\n // Remove HTML tags\n const noTags = decodedEntities.replace(/<[^>]+>/g, '')\n\n const noInvisible = noTags.replace(/[\\u200B-\\u200F\\u2028-\\u202F\\u2060-\\u206F\\uFEFF]/g, '')\n\n // Remove control characters except common whitespace\n const noControls = [...noInvisible]\n .filter((char) => {\n const code = char.charCodeAt(0)\n return (\n code >= 32 || // printable and above\n code === 9 || // tab\n code === 10 || // new line\n code === 13 // return\n )\n })\n .join('')\n\n // Remove '(?' and backticks `\n let noInjectionSyntax = noControls.replace(/\\(\\?/g, '').replace(/`/g, '')\n\n // {{...}} remove braces but keep inner content\n noInjectionSyntax = noInjectionSyntax.replace(/\\{\\{(.*?)\\}\\}/g, '$1')\n\n // Escape special HTML characters\n const escaped = noInjectionSyntax\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n\n // Normalize whitespace to single space\n const normalizedWhitespace = escaped.replace(/\\s+/g, ' ')\n\n // Allow:\n // - Unicode letters (\\p{L})\n // - Unicode numbers (\\p{N})\n // - Unicode marks (\\p{M}, e.g. accents)\n // - Unicode spaces (\\p{Zs})\n // - Punctuation: common ascii + inverted ! and ?\n const allowedPunctuation = \" .,!?'\" + '\"¡¿、!()〆-'\n\n // Escape regex special characters\n const escapedPunct = allowedPunctuation.replace(/[[\\]\\\\^$*+?.()|{}]/g, '\\\\$&')\n\n const pattern = `[^\\\\p{L}\\\\p{N}\\\\p{M}\\\\p{Zs}${escapedPunct}]`\n\n const cleaned = normalizedWhitespace.replace(new RegExp(pattern, 'gu'), '')\n\n // Trim and limit length, trim again to remove trailing spaces\n return cleaned.slice(0, maxLength).trim()\n}\n"],"names":["sanitizeUserDataForEmail","data","maxLength","decodedEntities","replace","_","hex","String","fromCharCode","parseInt","dec","noTags","noInvisible","noControls","filter","char","code","charCodeAt","join","noInjectionSyntax","escaped","normalizedWhitespace","allowedPunctuation","escapedPunct","pattern","cleaned","RegExp","slice","trim"],"mappings":"AAAA;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASA,yBAAyBC,IAAa,EAAEC,YAAY,GAAG;IACrE,IAAI,OAAOD,SAAS,UAAU;QAC5B,OAAO;IACT;IAEA,oDAAoD;IACpD,MAAME,kBAAkBF,KACrBG,OAAO,CAAC,uBAAuB,CAACC,GAAGC,MAAQC,OAAOC,YAAY,CAACC,SAASH,KAAK,MAC7EF,OAAO,CAAC,aAAa,CAACC,GAAGK,MAAQH,OAAOC,YAAY,CAACC,SAASC,KAAK;IAEtE,mBAAmB;IACnB,MAAMC,SAASR,gBAAgBC,OAAO,CAAC,YAAY;IAEnD,MAAMQ,cAAcD,OAAOP,OAAO,CAAC,oDAAoD;IAEvF,qDAAqD;IACrD,MAAMS,aAAa;WAAID;KAAY,CAChCE,MAAM,CAAC,CAACC;QACP,MAAMC,OAAOD,KAAKE,UAAU,CAAC;QAC7B,OACED,QAAQ,MAAM,sBAAsB;QACpCA,SAAS,KAAK,MAAM;QACpBA,SAAS,MAAM,WAAW;QAC1BA,SAAS,GAAG,SAAS;;IAEzB,GACCE,IAAI,CAAC;IAER,8BAA8B;IAC9B,IAAIC,oBAAoBN,WAAWT,OAAO,CAAC,SAAS,IAAIA,OAAO,CAAC,MAAM;IAEtE,+CAA+C;IAC/Ce,oBAAoBA,kBAAkBf,OAAO,CAAC,kBAAkB;IAEhE,iCAAiC;IACjC,MAAMgB,UAAUD,kBACbf,OAAO,CAAC,MAAM,SACdA,OAAO,CAAC,MAAM,QACdA,OAAO,CAAC,MAAM;IAEjB,uCAAuC;IACvC,MAAMiB,uBAAuBD,QAAQhB,OAAO,CAAC,QAAQ;IAErD,SAAS;IACT,4BAA4B;IAC5B,4BAA4B;IAC5B,wCAAwC;IACxC,4BAA4B;IAC5B,iDAAiD;IACjD,MAAMkB,qBAAqB,WAAW;IAEtC,kCAAkC;IAClC,MAAMC,eAAeD,mBAAmBlB,OAAO,CAAC,uBAAuB;IAEvE,MAAMoB,UAAU,CAAC,2BAA2B,EAAED,aAAa,CAAC,CAAC;IAE7D,MAAME,UAAUJ,qBAAqBjB,OAAO,CAAC,IAAIsB,OAAOF,SAAS,OAAO;IAExE,8DAA8D;IAC9D,OAAOC,QAAQE,KAAK,CAAC,GAAGzB,WAAW0B,IAAI;AACzC"}
@@ -0,0 +1,133 @@
1
+ import { sanitizeUserDataForEmail } from './sanitizeUserDataForEmail';
2
+ describe('sanitizeUserDataForEmail', ()=>{
3
+ it('should remove anchor tags', ()=>{
4
+ const input = '<a href="https://example.com">Click me</a>';
5
+ const result = sanitizeUserDataForEmail(input);
6
+ expect(result).toBe('Click me');
7
+ });
8
+ it('should remove script tags', ()=>{
9
+ const unsanitizedData = '<script>alert</script>';
10
+ const sanitizedData = sanitizeUserDataForEmail(unsanitizedData);
11
+ expect(sanitizedData).toBe('alert');
12
+ });
13
+ it('should remove mixed-case script tags', ()=>{
14
+ const input = '<ScRipT>alert(1)</sCrIpT>';
15
+ const result = sanitizeUserDataForEmail(input);
16
+ expect(result).toBe('alert1');
17
+ });
18
+ it('should remove embedded base64-encoded scripts', ()=>{
19
+ const input = '<img src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">';
20
+ const result = sanitizeUserDataForEmail(input);
21
+ expect(result).toBe('');
22
+ });
23
+ it('should remove iframe elements', ()=>{
24
+ const input = '<iframe src="malicious.com"></iframe>Frame';
25
+ const result = sanitizeUserDataForEmail(input);
26
+ expect(result).toBe('Frame');
27
+ });
28
+ it('should remove javascript: links in attributes', ()=>{
29
+ const input = '<a href="javascript:alert(1)">click</a>';
30
+ const result = sanitizeUserDataForEmail(input);
31
+ expect(result).toBe('click');
32
+ });
33
+ it('should remove mismatched script input', ()=>{
34
+ const input = '<script>console.log("test")';
35
+ const result = sanitizeUserDataForEmail(input);
36
+ expect(result).toBe('console.log\"test\"');
37
+ });
38
+ it('should remove encoded scripts via HTML entities', ()=>{
39
+ const input = '&#x3C;script&#x3E;alert(1)&#x3C;/script&#x3E;';
40
+ const result = sanitizeUserDataForEmail(input);
41
+ expect(result).toBe('alert1');
42
+ });
43
+ it('should remove template injection syntax', ()=>{
44
+ const input = '{{7*7}}';
45
+ const result = sanitizeUserDataForEmail(input);
46
+ expect(result).toBe('77');
47
+ });
48
+ it('should remove invisible zero-width characters', ()=>{
49
+ const input = 'a\u200Bler\u200Bt("XSS")';
50
+ const result = sanitizeUserDataForEmail(input);
51
+ expect(result).toBe('alert\"XSS\"');
52
+ });
53
+ it('should remove CSS expressions within style attributes', ()=>{
54
+ const input = '<div style="width: expression(alert(\'XSS\'));">Hello</div>';
55
+ const result = sanitizeUserDataForEmail(input);
56
+ expect(result).toBe('Hello');
57
+ });
58
+ it('should not render SVG with onload event', ()=>{
59
+ const input = '<svg onload="alert(\'XSS\')">Graphic</svg>';
60
+ const result = sanitizeUserDataForEmail(input);
61
+ expect(result).toBe('Graphic');
62
+ });
63
+ it('should not allow backtick-based patterns', ()=>{
64
+ const input = '`alert("XSS")`';
65
+ const result = sanitizeUserDataForEmail(input);
66
+ expect(result).toBe('alert\"XSS\"');
67
+ });
68
+ it('should preserve allowed punctuation', ()=>{
69
+ const input = `Hello "world" - it's safe!`;
70
+ const result = sanitizeUserDataForEmail(input);
71
+ expect(result).toBe(`Hello "world" - it's safe!`);
72
+ });
73
+ it('should return empty string for non-string input', ()=>{
74
+ expect(sanitizeUserDataForEmail(null)).toBe('');
75
+ expect(sanitizeUserDataForEmail(undefined)).toBe('');
76
+ expect(sanitizeUserDataForEmail(123)).toBe('');
77
+ expect(sanitizeUserDataForEmail({})).toBe('');
78
+ });
79
+ it('should return empty string for an empty string', ()=>{
80
+ expect(sanitizeUserDataForEmail('')).toBe('');
81
+ });
82
+ it('should collapse excessive whitespace', ()=>{
83
+ const input = 'This is \n\n a test';
84
+ expect(sanitizeUserDataForEmail(input)).toBe('This is a test');
85
+ });
86
+ it('should truncate to maxLength characters', ()=>{
87
+ const input = 'a'.repeat(200);
88
+ const result = sanitizeUserDataForEmail(input, 50);
89
+ expect(result.length).toBe(50);
90
+ });
91
+ it('should remove characters outside allowed punctuation', ()=>{
92
+ const input = 'Hello @#$%^*()_+=[]{}|\\~`';
93
+ const result = sanitizeUserDataForEmail(input);
94
+ expect(result).toBe('Hello');
95
+ });
96
+ it('should sanitize syntax in regex-like input', ()=>{
97
+ const input = '(?=XSS)(?:abc)';
98
+ const result = sanitizeUserDataForEmail(input);
99
+ expect(result).toBe('XSSabc');
100
+ });
101
+ it('should handle string of only control characters', ()=>{
102
+ const input = '\x01\x02\x03\x04';
103
+ const result = sanitizeUserDataForEmail(input);
104
+ expect(result).toBe('');
105
+ });
106
+ it('should sanitize complex script attempt with mixed encoding', ()=>{
107
+ const input = '&#x3C;script&#x3E;alert(String.fromCharCode(88,83,83))&#x3C;/script&#x3E;';
108
+ const result = sanitizeUserDataForEmail(input);
109
+ expect(result).toBe('alertString.fromCharCode88,83,83');
110
+ });
111
+ it('should handle deeply nested HTML tags correctly', ()=>{
112
+ const input = `<div><section><article><p>Hello <strong>world <em>from <span>deep <a href="#">tags</a></span></em></strong></p></article></section></div>`;
113
+ const result = sanitizeUserDataForEmail(input);
114
+ expect(result).toBe('Hello world from deep tags');
115
+ });
116
+ it('should preserve accented Spanish characters', ()=>{
117
+ const input = '¡Hola! ¿Cómo estás? ÁÉÍÓÚ ÜÑ ñáéíóú ü';
118
+ const result = sanitizeUserDataForEmail(input);
119
+ expect(result).toBe('¡Hola! ¿Cómo estás? ÁÉÍÓÚ ÜÑ ñáéíóú ü');
120
+ });
121
+ it('should preserve Arabic characters with diacritics', ()=>{
122
+ const input = 'مَرْحَبًا بِكَ فِي الْمَوْقِعِ';
123
+ const result = sanitizeUserDataForEmail(input);
124
+ expect(result).toBe('مَرْحَبًا بِكَ فِي الْمَوْقِعِ');
125
+ });
126
+ it('should preserve Japanese characters', ()=>{
127
+ const input = 'こんにちゎ、世界!!〆';
128
+ const result = sanitizeUserDataForEmail(input);
129
+ expect(result).toBe('こんにちゎ、世界!!〆');
130
+ });
131
+ });
132
+
133
+ //# sourceMappingURL=sanitizeUserDataForEmail.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/sanitizeUserDataForEmail.spec.ts"],"sourcesContent":["import { sanitizeUserDataForEmail } from './sanitizeUserDataForEmail'\n\ndescribe('sanitizeUserDataForEmail', () => {\n it('should remove anchor tags', () => {\n const input = '<a href=\"https://example.com\">Click me</a>'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('Click me')\n })\n\n it('should remove script tags', () => {\n const unsanitizedData = '<script>alert</script>'\n const sanitizedData = sanitizeUserDataForEmail(unsanitizedData)\n expect(sanitizedData).toBe('alert')\n })\n\n it('should remove mixed-case script tags', () => {\n const input = '<ScRipT>alert(1)</sCrIpT>'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('alert1')\n })\n\n it('should remove embedded base64-encoded scripts', () => {\n const input = '<img src=\"data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==\">'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('')\n })\n\n it('should remove iframe elements', () => {\n const input = '<iframe src=\"malicious.com\"></iframe>Frame'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('Frame')\n })\n\n it('should remove javascript: links in attributes', () => {\n const input = '<a href=\"javascript:alert(1)\">click</a>'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('click')\n })\n\n it('should remove mismatched script input', () => {\n const input = '<script>console.log(\"test\")'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('console.log\\\"test\\\"')\n })\n\n it('should remove encoded scripts via HTML entities', () => {\n const input = '&#x3C;script&#x3E;alert(1)&#x3C;/script&#x3E;'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('alert1')\n })\n\n it('should remove template injection syntax', () => {\n const input = '{{7*7}}'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('77')\n })\n\n it('should remove invisible zero-width characters', () => {\n const input = 'a\\u200Bler\\u200Bt(\"XSS\")'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('alert\\\"XSS\\\"')\n })\n\n it('should remove CSS expressions within style attributes', () => {\n const input = '<div style=\"width: expression(alert(\\'XSS\\'));\">Hello</div>'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('Hello')\n })\n\n it('should not render SVG with onload event', () => {\n const input = '<svg onload=\"alert(\\'XSS\\')\">Graphic</svg>'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('Graphic')\n })\n\n it('should not allow backtick-based patterns', () => {\n const input = '`alert(\"XSS\")`'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('alert\\\"XSS\\\"')\n })\n\n it('should preserve allowed punctuation', () => {\n const input = `Hello \"world\" - it's safe!`\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe(`Hello \"world\" - it's safe!`)\n })\n\n it('should return empty string for non-string input', () => {\n expect(sanitizeUserDataForEmail(null)).toBe('')\n expect(sanitizeUserDataForEmail(undefined)).toBe('')\n expect(sanitizeUserDataForEmail(123)).toBe('')\n expect(sanitizeUserDataForEmail({})).toBe('')\n })\n\n it('should return empty string for an empty string', () => {\n expect(sanitizeUserDataForEmail('')).toBe('')\n })\n\n it('should collapse excessive whitespace', () => {\n const input = 'This is \\n\\n a test'\n expect(sanitizeUserDataForEmail(input)).toBe('This is a test')\n })\n\n it('should truncate to maxLength characters', () => {\n const input = 'a'.repeat(200)\n const result = sanitizeUserDataForEmail(input, 50)\n expect(result.length).toBe(50)\n })\n\n it('should remove characters outside allowed punctuation', () => {\n const input = 'Hello @#$%^*()_+=[]{}|\\\\~`'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('Hello')\n })\n it('should sanitize syntax in regex-like input', () => {\n const input = '(?=XSS)(?:abc)'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('XSSabc')\n })\n\n it('should handle string of only control characters', () => {\n const input = '\\x01\\x02\\x03\\x04'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('')\n })\n\n it('should sanitize complex script attempt with mixed encoding', () => {\n const input = '&#x3C;script&#x3E;alert(String.fromCharCode(88,83,83))&#x3C;/script&#x3E;'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('alertString.fromCharCode88,83,83')\n })\n\n it('should handle deeply nested HTML tags correctly', () => {\n const input = `<div><section><article><p>Hello <strong>world <em>from <span>deep <a href=\"#\">tags</a></span></em></strong></p></article></section></div>`\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('Hello world from deep tags')\n })\n\n it('should preserve accented Spanish characters', () => {\n const input = '¡Hola! ¿Cómo estás? ÁÉÍÓÚ ÜÑ ñáéíóú ü'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('¡Hola! ¿Cómo estás? ÁÉÍÓÚ ÜÑ ñáéíóú ü')\n })\n\n it('should preserve Arabic characters with diacritics', () => {\n const input = 'مَرْحَبًا بِكَ فِي الْمَوْقِعِ'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('مَرْحَبًا بِكَ فِي الْمَوْقِعِ')\n })\n\n it('should preserve Japanese characters', () => {\n const input = 'こんにちゎ、世界!!〆'\n const result = sanitizeUserDataForEmail(input)\n expect(result).toBe('こんにちゎ、世界!!〆')\n })\n})\n"],"names":["sanitizeUserDataForEmail","describe","it","input","result","expect","toBe","unsanitizedData","sanitizedData","undefined","repeat","length"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.46.0",
3
+ "version": "3.47.0-canary.1",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -97,11 +97,11 @@
97
97
  "sanitize-filename": "1.6.3",
98
98
  "scmp": "2.1.0",
99
99
  "ts-essentials": "10.0.3",
100
- "tsx": "4.19.2",
100
+ "tsx": "4.20.3",
101
101
  "undici": "7.10.0",
102
102
  "uuid": "10.0.0",
103
103
  "ws": "^8.16.0",
104
- "@payloadcms/translations": "3.46.0"
104
+ "@payloadcms/translations": "3.47.0-canary.1"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@hyrious/esbuild-plugin-commonjs": "0.2.6",