payload 3.0.0-beta.11 → 3.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/auth/cookies.d.ts +16 -4
  2. package/dist/auth/cookies.d.ts.map +1 -1
  3. package/dist/auth/cookies.js +45 -14
  4. package/dist/auth/cookies.js.map +1 -1
  5. package/dist/auth/operations/forgotPassword.js +3 -3
  6. package/dist/auth/operations/forgotPassword.js.map +1 -1
  7. package/dist/auth/operations/login.d.ts.map +1 -1
  8. package/dist/auth/operations/login.js +17 -1
  9. package/dist/auth/operations/login.js.map +1 -1
  10. package/dist/auth/sendVerificationEmail.d.ts +5 -6
  11. package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
  12. package/dist/auth/sendVerificationEmail.js +4 -5
  13. package/dist/auth/sendVerificationEmail.js.map +1 -1
  14. package/dist/collections/config/client.d.ts +4 -1
  15. package/dist/collections/config/client.d.ts.map +1 -1
  16. package/dist/collections/config/client.js +2 -1
  17. package/dist/collections/config/client.js.map +1 -1
  18. package/dist/collections/config/defaults.d.ts +1 -0
  19. package/dist/collections/config/defaults.d.ts.map +1 -1
  20. package/dist/collections/config/defaults.js +1 -0
  21. package/dist/collections/config/defaults.js.map +1 -1
  22. package/dist/collections/config/schema.d.ts.map +1 -1
  23. package/dist/collections/config/schema.js +1 -0
  24. package/dist/collections/config/schema.js.map +1 -1
  25. package/dist/collections/config/types.d.ts +5 -2
  26. package/dist/collections/config/types.d.ts.map +1 -1
  27. package/dist/collections/config/types.js.map +1 -1
  28. package/dist/collections/operations/count.d.ts +13 -0
  29. package/dist/collections/operations/count.d.ts.map +1 -0
  30. package/dist/collections/operations/count.js +75 -0
  31. package/dist/collections/operations/count.js.map +1 -0
  32. package/dist/collections/operations/create.d.ts.map +1 -1
  33. package/dist/collections/operations/create.js +3 -4
  34. package/dist/collections/operations/create.js.map +1 -1
  35. package/dist/collections/operations/local/count.d.ts +20 -0
  36. package/dist/collections/operations/local/count.d.ts.map +1 -0
  37. package/dist/collections/operations/local/count.js +19 -0
  38. package/dist/collections/operations/local/count.js.map +1 -0
  39. package/dist/collections/operations/local/index.d.ts +2 -0
  40. package/dist/collections/operations/local/index.d.ts.map +1 -1
  41. package/dist/collections/operations/local/index.js +2 -0
  42. package/dist/collections/operations/local/index.js.map +1 -1
  43. package/dist/collections/operations/update.d.ts.map +1 -1
  44. package/dist/collections/operations/update.js +2 -2
  45. package/dist/collections/operations/update.js.map +1 -1
  46. package/dist/collections/operations/updateByID.js +1 -1
  47. package/dist/collections/operations/updateByID.js.map +1 -1
  48. package/dist/collections/operations/utils.d.ts +6 -0
  49. package/dist/collections/operations/utils.d.ts.map +1 -1
  50. package/dist/collections/operations/utils.js.map +1 -1
  51. package/dist/config/client.d.ts +2 -1
  52. package/dist/config/client.d.ts.map +1 -1
  53. package/dist/config/client.js +2 -1
  54. package/dist/config/client.js.map +1 -1
  55. package/dist/config/defaults.d.ts.map +1 -1
  56. package/dist/config/defaults.js +1 -0
  57. package/dist/config/defaults.js.map +1 -1
  58. package/dist/config/schema.d.ts.map +1 -1
  59. package/dist/config/schema.js +1 -0
  60. package/dist/config/schema.js.map +1 -1
  61. package/dist/config/types.d.ts +7 -36
  62. package/dist/config/types.d.ts.map +1 -1
  63. package/dist/config/types.js +0 -12
  64. package/dist/config/types.js.map +1 -1
  65. package/dist/database/types.d.ts +10 -0
  66. package/dist/database/types.d.ts.map +1 -1
  67. package/dist/database/types.js.map +1 -1
  68. package/dist/email/consoleEmailAdapter.d.ts +3 -0
  69. package/dist/email/consoleEmailAdapter.d.ts.map +1 -0
  70. package/dist/email/consoleEmailAdapter.js +16 -0
  71. package/dist/email/consoleEmailAdapter.js.map +1 -0
  72. package/dist/email/defaults.d.ts +2 -2
  73. package/dist/email/defaults.d.ts.map +1 -1
  74. package/dist/email/defaults.js +3 -3
  75. package/dist/email/defaults.js.map +1 -1
  76. package/dist/email/getStringifiedToAddress.d.ts +3 -0
  77. package/dist/email/getStringifiedToAddress.d.ts.map +1 -0
  78. package/dist/email/getStringifiedToAddress.js +20 -0
  79. package/dist/email/getStringifiedToAddress.js.map +1 -0
  80. package/dist/email/sendEmail.d.ts +3 -2
  81. package/dist/email/sendEmail.d.ts.map +1 -1
  82. package/dist/email/sendEmail.js +8 -4
  83. package/dist/email/sendEmail.js.map +1 -1
  84. package/dist/email/types.d.ts +25 -18
  85. package/dist/email/types.d.ts.map +1 -1
  86. package/dist/email/types.js +5 -1
  87. package/dist/email/types.js.map +1 -1
  88. package/dist/exports/database.d.ts +1 -1
  89. package/dist/exports/database.d.ts.map +1 -1
  90. package/dist/exports/database.js.map +1 -1
  91. package/dist/exports/node.d.ts +3 -0
  92. package/dist/exports/node.d.ts.map +1 -1
  93. package/dist/exports/node.js +3 -1
  94. package/dist/exports/node.js.map +1 -1
  95. package/dist/exports/operations.d.ts +1 -0
  96. package/dist/exports/operations.d.ts.map +1 -1
  97. package/dist/exports/operations.js +1 -0
  98. package/dist/exports/operations.js.map +1 -1
  99. package/dist/exports/types.d.ts +1 -0
  100. package/dist/exports/types.d.ts.map +1 -1
  101. package/dist/exports/types.js.map +1 -1
  102. package/dist/exports/utilities.d.ts +3 -0
  103. package/dist/exports/utilities.d.ts.map +1 -1
  104. package/dist/exports/utilities.js +3 -1
  105. package/dist/exports/utilities.js.map +1 -1
  106. package/dist/fields/config/client.d.ts +26 -1
  107. package/dist/fields/config/client.d.ts.map +1 -1
  108. package/dist/fields/config/client.js +2 -1
  109. package/dist/fields/config/client.js.map +1 -1
  110. package/dist/fields/config/schema.d.ts.map +1 -1
  111. package/dist/fields/config/schema.js +7 -1
  112. package/dist/fields/config/schema.js.map +1 -1
  113. package/dist/fields/config/types.d.ts +12 -3
  114. package/dist/fields/config/types.d.ts.map +1 -1
  115. package/dist/fields/config/types.js.map +1 -1
  116. package/dist/fields/validations.d.ts +2 -0
  117. package/dist/fields/validations.d.ts.map +1 -1
  118. package/dist/fields/validations.js +44 -1
  119. package/dist/fields/validations.js.map +1 -1
  120. package/dist/globals/config/client.d.ts +1 -1
  121. package/dist/globals/config/client.d.ts.map +1 -1
  122. package/dist/globals/config/client.js +2 -1
  123. package/dist/globals/config/client.js.map +1 -1
  124. package/dist/globals/config/schema.d.ts.map +1 -1
  125. package/dist/globals/config/schema.js +1 -0
  126. package/dist/globals/config/schema.js.map +1 -1
  127. package/dist/globals/config/types.d.ts +3 -1
  128. package/dist/globals/config/types.d.ts.map +1 -1
  129. package/dist/globals/config/types.js.map +1 -1
  130. package/dist/index.d.ts +13 -6
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +25 -13
  133. package/dist/index.js.map +1 -1
  134. package/dist/uploads/getExternalFile.d.ts +1 -1
  135. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  136. package/dist/uploads/getExternalFile.js +1 -1
  137. package/dist/uploads/getExternalFile.js.map +1 -1
  138. package/dist/utilities/importWithoutClientFiles.d.ts.map +1 -1
  139. package/dist/utilities/importWithoutClientFiles.js +8 -5
  140. package/dist/utilities/importWithoutClientFiles.js.map +1 -1
  141. package/dist/utilities/telemetry/index.d.ts +3 -0
  142. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  143. package/dist/utilities/telemetry/index.js +32 -6
  144. package/dist/utilities/telemetry/index.js.map +1 -1
  145. package/package.json +5 -5
  146. package/dist/email/build.d.ts +0 -5
  147. package/dist/email/build.d.ts.map +0 -1
  148. package/dist/email/build.js +0 -63
  149. package/dist/email/build.js.map +0 -1
  150. package/dist/email/mockHandler.d.ts +0 -5
  151. package/dist/email/mockHandler.d.ts.map +0 -1
  152. package/dist/email/mockHandler.js +0 -24
  153. package/dist/email/mockHandler.js.map +0 -1
  154. package/src/index.ts +0 -499
@@ -7,12 +7,23 @@ type CookieOptions = {
7
7
  maxAge?: number;
8
8
  name: string;
9
9
  path?: string;
10
+ returnCookieAsObject: boolean;
10
11
  sameSite?: 'Lax' | 'None' | 'Strict';
11
12
  secure?: boolean;
12
13
  value?: string;
13
14
  };
14
- export declare const generateCookies: (cookies: CookieOptions[]) => string;
15
- export declare const generateCookie: (args: CookieOptions) => string;
15
+ type CookieObject = {
16
+ domain?: string;
17
+ expires?: string;
18
+ httpOnly?: boolean;
19
+ maxAge?: number;
20
+ name: string;
21
+ path?: string;
22
+ sameSite?: 'Lax' | 'None' | 'Strict';
23
+ secure?: boolean;
24
+ value: string;
25
+ };
26
+ export declare const generateCookie: <ReturnCookieAsObject = boolean>(args: CookieOptions) => ReturnCookieAsObject extends true ? CookieObject : string;
16
27
  type GetCookieExpirationArgs = {
17
28
  seconds: number;
18
29
  };
@@ -20,10 +31,11 @@ export declare const getCookieExpiration: ({ seconds }: GetCookieExpirationArgs)
20
31
  type GeneratePayloadCookieArgs = {
21
32
  collectionConfig: SanitizedCollectionConfig;
22
33
  payload: Payload;
34
+ returnCookieAsObject?: boolean;
23
35
  token: string;
24
36
  };
25
- export declare const generatePayloadCookie: ({ collectionConfig, payload, token, }: GeneratePayloadCookieArgs) => string;
26
- export declare const generateExpiredPayloadCookie: ({ collectionConfig, payload, }: Omit<GeneratePayloadCookieArgs, 'token'>) => string;
37
+ export declare const generatePayloadCookie: <T extends GeneratePayloadCookieArgs>({ collectionConfig, payload, returnCookieAsObject, token, }: T) => T['returnCookieAsObject'] extends true ? CookieObject : string;
38
+ export declare const generateExpiredPayloadCookie: <T extends Omit<GeneratePayloadCookieArgs, "token">>({ collectionConfig, payload, returnCookieAsObject, }: T) => T['returnCookieAsObject'] extends true ? CookieObject : string;
27
39
  export declare const parseCookies: (headers: Request['headers']) => Map<string, string>;
28
40
  export {};
29
41
  //# sourceMappingURL=cookies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/auth/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AACjF,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACpC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,eAAe,YAAa,aAAa,EAAE,KAAG,MAE1D,CAAA;AAED,eAAO,MAAM,cAAc,SAAU,aAAa,KAAG,MAoCpD,CAAA;AAED,KAAK,uBAAuB,GAAG;IAK7B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,mBAAmB,gBAAwB,uBAAuB,SAI9E,CAAA;AAED,KAAK,yBAAyB,GAAG;IAE/B,gBAAgB,EAAE,yBAAyB,CAAA;IAE3C,OAAO,EAAE,OAAO,CAAA;IAEhB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AACD,eAAO,MAAM,qBAAqB,0CAI/B,yBAAyB,KAAG,MAkB9B,CAAA;AAED,eAAO,MAAM,4BAA4B,mCAGtC,KAAK,yBAAyB,EAAE,OAAO,CAAC,KAAG,MAmB7C,CAAA;AAED,eAAO,MAAM,YAAY,YAAa,OAAO,CAAC,SAAS,CAAC,KAAG,IAAI,MAAM,EAAE,MAAM,CAoB5E,CAAA"}
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/auth/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AAEjF,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oBAAoB,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACpC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACpC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,cAAc,yCACnB,aAAa,KAClB,oBAAoB,SAAS,IAAI,GAAG,YAAY,GAAG,MAiFrD,CAAA;AACD,KAAK,uBAAuB,GAAG;IAK7B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,mBAAmB,gBAAwB,uBAAuB,SAI9E,CAAA;AAED,KAAK,yBAAyB,GAAG;IAE/B,gBAAgB,EAAE,yBAAyB,CAAA;IAE3C,OAAO,EAAE,OAAO,CAAA;IAEhB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AACD,eAAO,MAAM,qBAAqB,qGAK/B,CAAC,KAAG,CAAC,CAAC,sBAAsB,CAAC,SAAS,IAAI,GAAG,YAAY,GAAG,MAmB9D,CAAA;AAED,eAAO,MAAM,4BAA4B,6GAItC,CAAC,KAAG,CAAC,CAAC,sBAAsB,CAAC,SAAS,IAAI,GAAG,YAAY,GAAG,MAoB9D,CAAA;AAED,eAAO,MAAM,YAAY,YAAa,OAAO,CAAC,SAAS,CAAC,KAAG,IAAI,MAAM,EAAE,MAAM,CAoB5E,CAAA"}
@@ -1,39 +1,68 @@
1
- export const generateCookies = (cookies)=>{
2
- return cookies.map((options)=>generateCookie(options)).join('; ');
3
- };
4
1
  export const generateCookie = (args)=>{
5
- const { name, domain, expires, httpOnly, maxAge, path, sameSite, secure: secureArg, value } = args;
2
+ const { name, domain, expires, httpOnly, maxAge, path, returnCookieAsObject, sameSite, secure: secureArg, value } = args;
6
3
  let cookieString = `${name}=${value || ''}`;
4
+ const cookieObject = {
5
+ name,
6
+ value
7
+ };
7
8
  const secure = secureArg || sameSite === 'None';
8
9
  if (expires) {
9
- cookieString += `; Expires=${expires.toUTCString()}`;
10
+ if (returnCookieAsObject) {
11
+ cookieObject.expires = expires.toUTCString();
12
+ } else {
13
+ cookieString += `; Expires=${expires.toUTCString()}`;
14
+ }
10
15
  }
11
16
  if (maxAge) {
12
- cookieString += `; Max-Age=${maxAge}`;
17
+ if (returnCookieAsObject) {
18
+ cookieObject.maxAge = maxAge;
19
+ } else {
20
+ cookieString += `; Max-Age=${maxAge.toString()}`;
21
+ }
13
22
  }
14
23
  if (domain) {
15
- cookieString += `; Domain=${domain}`;
24
+ if (returnCookieAsObject) {
25
+ cookieObject.domain = domain;
26
+ } else {
27
+ cookieString += `; Domain=${domain}`;
28
+ }
16
29
  }
17
30
  if (path) {
18
- cookieString += `; Path=${path}`;
31
+ if (returnCookieAsObject) {
32
+ cookieObject.path = path;
33
+ } else {
34
+ cookieString += `; Path=${path}`;
35
+ }
19
36
  }
20
37
  if (secure) {
21
- cookieString += '; Secure';
38
+ if (returnCookieAsObject) {
39
+ cookieObject.secure = secure;
40
+ } else {
41
+ cookieString += `; Secure=${secure}`;
42
+ }
22
43
  }
23
44
  if (httpOnly) {
24
- cookieString += '; HttpOnly';
45
+ if (returnCookieAsObject) {
46
+ cookieObject.httpOnly = httpOnly;
47
+ } else {
48
+ cookieString += `; HttpOnly=${httpOnly}`;
49
+ }
25
50
  }
26
51
  if (sameSite) {
27
- cookieString += `; SameSite=${sameSite}`;
52
+ if (returnCookieAsObject) {
53
+ cookieObject.sameSite = sameSite;
54
+ } else {
55
+ cookieString += `; SameSite=${sameSite}`;
56
+ }
28
57
  }
29
- return cookieString;
58
+ return returnCookieAsObject ? cookieObject : cookieString;
30
59
  };
31
60
  export const getCookieExpiration = ({ seconds = 7200 })=>{
32
61
  const currentTime = new Date();
33
62
  currentTime.setSeconds(currentTime.getSeconds() + seconds);
34
63
  return currentTime;
35
64
  };
36
- export const generatePayloadCookie = ({ collectionConfig, payload, token })=>{
65
+ export const generatePayloadCookie = ({ collectionConfig, payload, returnCookieAsObject = false, token })=>{
37
66
  const sameSite = typeof collectionConfig.auth.cookies.sameSite === 'string' ? collectionConfig.auth.cookies.sameSite : collectionConfig.auth.cookies.sameSite ? 'Strict' : undefined;
38
67
  return generateCookie({
39
68
  name: `${payload.config.cookiePrefix}-token`,
@@ -43,12 +72,13 @@ export const generatePayloadCookie = ({ collectionConfig, payload, token })=>{
43
72
  }),
44
73
  httpOnly: true,
45
74
  path: '/',
75
+ returnCookieAsObject,
46
76
  sameSite,
47
77
  secure: collectionConfig.auth.cookies.secure,
48
78
  value: token
49
79
  });
50
80
  };
51
- export const generateExpiredPayloadCookie = ({ collectionConfig, payload })=>{
81
+ export const generateExpiredPayloadCookie = ({ collectionConfig, payload, returnCookieAsObject = false })=>{
52
82
  const sameSite = typeof collectionConfig.auth.cookies.sameSite === 'string' ? collectionConfig.auth.cookies.sameSite : collectionConfig.auth.cookies.sameSite ? 'Strict' : undefined;
53
83
  const expires = new Date(Date.now() - 1000);
54
84
  return generateCookie({
@@ -57,6 +87,7 @@ export const generateExpiredPayloadCookie = ({ collectionConfig, payload })=>{
57
87
  expires,
58
88
  httpOnly: true,
59
89
  path: '/',
90
+ returnCookieAsObject,
60
91
  sameSite,
61
92
  secure: collectionConfig.auth.cookies.secure
62
93
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/auth/cookies.ts"],"sourcesContent":["import type { Payload } from '../index.js'\nimport type { SanitizedCollectionConfig } from './../collections/config/types.js'\ntype CookieOptions = {\n domain?: string\n expires?: Date\n httpOnly?: boolean\n maxAge?: number\n name: string\n path?: string\n sameSite?: 'Lax' | 'None' | 'Strict'\n secure?: boolean\n value?: string\n}\n\nexport const generateCookies = (cookies: CookieOptions[]): string => {\n return cookies.map((options) => generateCookie(options)).join('; ')\n}\n\nexport const generateCookie = (args: CookieOptions): string => {\n const { name, domain, expires, httpOnly, maxAge, path, sameSite, secure: secureArg, value } = args\n\n let cookieString = `${name}=${value || ''}`\n\n const secure = secureArg || sameSite === 'None'\n\n if (expires) {\n cookieString += `; Expires=${expires.toUTCString()}`\n }\n\n if (maxAge) {\n cookieString += `; Max-Age=${maxAge}`\n }\n\n if (domain) {\n cookieString += `; Domain=${domain}`\n }\n\n if (path) {\n cookieString += `; Path=${path}`\n }\n\n if (secure) {\n cookieString += '; Secure'\n }\n\n if (httpOnly) {\n cookieString += '; HttpOnly'\n }\n\n if (sameSite) {\n cookieString += `; SameSite=${sameSite}`\n }\n\n return cookieString\n}\n\ntype GetCookieExpirationArgs = {\n /*\n The number of seconds until the cookie expires\n @default 7200 seconds (2 hours)\n */\n seconds: number\n}\nexport const getCookieExpiration = ({ seconds = 7200 }: GetCookieExpirationArgs) => {\n const currentTime = new Date()\n currentTime.setSeconds(currentTime.getSeconds() + seconds)\n return currentTime\n}\n\ntype GeneratePayloadCookieArgs = {\n /* The auth collection config */\n collectionConfig: SanitizedCollectionConfig\n /* An instance of payload */\n payload: Payload\n /* The token to be stored in the cookie */\n token: string\n}\nexport const generatePayloadCookie = ({\n collectionConfig,\n payload,\n token,\n}: GeneratePayloadCookieArgs): string => {\n const sameSite =\n typeof collectionConfig.auth.cookies.sameSite === 'string'\n ? collectionConfig.auth.cookies.sameSite\n : collectionConfig.auth.cookies.sameSite\n ? 'Strict'\n : undefined\n\n return generateCookie({\n name: `${payload.config.cookiePrefix}-token`,\n domain: collectionConfig.auth.cookies.domain ?? undefined,\n expires: getCookieExpiration({ seconds: collectionConfig.auth.tokenExpiration }),\n httpOnly: true,\n path: '/',\n sameSite,\n secure: collectionConfig.auth.cookies.secure,\n value: token,\n })\n}\n\nexport const generateExpiredPayloadCookie = ({\n collectionConfig,\n payload,\n}: Omit<GeneratePayloadCookieArgs, 'token'>): string => {\n const sameSite =\n typeof collectionConfig.auth.cookies.sameSite === 'string'\n ? collectionConfig.auth.cookies.sameSite\n : collectionConfig.auth.cookies.sameSite\n ? 'Strict'\n : undefined\n\n const expires = new Date(Date.now() - 1000)\n\n return generateCookie({\n name: `${payload.config.cookiePrefix}-token`,\n domain: collectionConfig.auth.cookies.domain ?? undefined,\n expires,\n httpOnly: true,\n path: '/',\n sameSite,\n secure: collectionConfig.auth.cookies.secure,\n })\n}\n\nexport const parseCookies = (headers: Request['headers']): Map<string, string> => {\n const cookieMap = new Map<string, string>()\n const cookie = headers.get('Cookie')\n\n if (cookie) {\n cookie.split(';').forEach((cookie) => {\n const parts = cookie.split('=')\n const key = parts.shift().trim()\n const encodedValue = parts.join('=')\n\n try {\n const decodedValue = decodeURI(encodedValue)\n cookieMap.set(key, decodedValue)\n } catch (e) {\n return null\n }\n })\n }\n\n return cookieMap\n}\n"],"names":["generateCookies","cookies","map","options","generateCookie","join","args","name","domain","expires","httpOnly","maxAge","path","sameSite","secure","secureArg","value","cookieString","toUTCString","getCookieExpiration","seconds","currentTime","Date","setSeconds","getSeconds","generatePayloadCookie","collectionConfig","payload","token","auth","undefined","config","cookiePrefix","tokenExpiration","generateExpiredPayloadCookie","now","parseCookies","headers","cookieMap","Map","cookie","get","split","forEach","parts","key","shift","trim","encodedValue","decodedValue","decodeURI","set","e"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAcA,OAAO,MAAMA,kBAAkB,CAACC;IAC9B,OAAOA,QAAQC,GAAG,CAAC,CAACC,UAAYC,eAAeD,UAAUE,IAAI,CAAC;AAChE,EAAC;AAED,OAAO,MAAMD,iBAAiB,CAACE;IAC7B,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,QAAQC,SAAS,EAAEC,KAAK,EAAE,GAAGV;IAE9F,IAAIW,eAAe,CAAC,EAAEV,KAAK,CAAC,EAAES,SAAS,GAAG,CAAC;IAE3C,MAAMF,SAASC,aAAaF,aAAa;IAEzC,IAAIJ,SAAS;QACXQ,gBAAgB,CAAC,UAAU,EAAER,QAAQS,WAAW,GAAG,CAAC;IACtD;IAEA,IAAIP,QAAQ;QACVM,gBAAgB,CAAC,UAAU,EAAEN,OAAO,CAAC;IACvC;IAEA,IAAIH,QAAQ;QACVS,gBAAgB,CAAC,SAAS,EAAET,OAAO,CAAC;IACtC;IAEA,IAAII,MAAM;QACRK,gBAAgB,CAAC,OAAO,EAAEL,KAAK,CAAC;IAClC;IAEA,IAAIE,QAAQ;QACVG,gBAAgB;IAClB;IAEA,IAAIP,UAAU;QACZO,gBAAgB;IAClB;IAEA,IAAIJ,UAAU;QACZI,gBAAgB,CAAC,WAAW,EAAEJ,SAAS,CAAC;IAC1C;IAEA,OAAOI;AACT,EAAC;AASD,OAAO,MAAME,sBAAsB,CAAC,EAAEC,UAAU,IAAI,EAA2B;IAC7E,MAAMC,cAAc,IAAIC;IACxBD,YAAYE,UAAU,CAACF,YAAYG,UAAU,KAAKJ;IAClD,OAAOC;AACT,EAAC;AAUD,OAAO,MAAMI,wBAAwB,CAAC,EACpCC,gBAAgB,EAChBC,OAAO,EACPC,KAAK,EACqB;IAC1B,MAAMf,WACJ,OAAOa,iBAAiBG,IAAI,CAAC5B,OAAO,CAACY,QAAQ,KAAK,WAC9Ca,iBAAiBG,IAAI,CAAC5B,OAAO,CAACY,QAAQ,GACtCa,iBAAiBG,IAAI,CAAC5B,OAAO,CAACY,QAAQ,GACpC,WACAiB;IAER,OAAO1B,eAAe;QACpBG,MAAM,CAAC,EAAEoB,QAAQI,MAAM,CAACC,YAAY,CAAC,MAAM,CAAC;QAC5CxB,QAAQkB,iBAAiBG,IAAI,CAAC5B,OAAO,CAACO,MAAM,IAAIsB;QAChDrB,SAASU,oBAAoB;YAAEC,SAASM,iBAAiBG,IAAI,CAACI,eAAe;QAAC;QAC9EvB,UAAU;QACVE,MAAM;QACNC;QACAC,QAAQY,iBAAiBG,IAAI,CAAC5B,OAAO,CAACa,MAAM;QAC5CE,OAAOY;IACT;AACF,EAAC;AAED,OAAO,MAAMM,+BAA+B,CAAC,EAC3CR,gBAAgB,EAChBC,OAAO,EACkC;IACzC,MAAMd,WACJ,OAAOa,iBAAiBG,IAAI,CAAC5B,OAAO,CAACY,QAAQ,KAAK,WAC9Ca,iBAAiBG,IAAI,CAAC5B,OAAO,CAACY,QAAQ,GACtCa,iBAAiBG,IAAI,CAAC5B,OAAO,CAACY,QAAQ,GACpC,WACAiB;IAER,MAAMrB,UAAU,IAAIa,KAAKA,KAAKa,GAAG,KAAK;IAEtC,OAAO/B,eAAe;QACpBG,MAAM,CAAC,EAAEoB,QAAQI,MAAM,CAACC,YAAY,CAAC,MAAM,CAAC;QAC5CxB,QAAQkB,iBAAiBG,IAAI,CAAC5B,OAAO,CAACO,MAAM,IAAIsB;QAChDrB;QACAC,UAAU;QACVE,MAAM;QACNC;QACAC,QAAQY,iBAAiBG,IAAI,CAAC5B,OAAO,CAACa,MAAM;IAC9C;AACF,EAAC;AAED,OAAO,MAAMsB,eAAe,CAACC;IAC3B,MAAMC,YAAY,IAAIC;IACtB,MAAMC,SAASH,QAAQI,GAAG,CAAC;IAE3B,IAAID,QAAQ;QACVA,OAAOE,KAAK,CAAC,KAAKC,OAAO,CAAC,CAACH;YACzB,MAAMI,QAAQJ,OAAOE,KAAK,CAAC;YAC3B,MAAMG,MAAMD,MAAME,KAAK,GAAGC,IAAI;YAC9B,MAAMC,eAAeJ,MAAMvC,IAAI,CAAC;YAEhC,IAAI;gBACF,MAAM4C,eAAeC,UAAUF;gBAC/BV,UAAUa,GAAG,CAACN,KAAKI;YACrB,EAAE,OAAOG,GAAG;gBACV,OAAO;YACT;QACF;IACF;IAEA,OAAOd;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/auth/cookies.ts"],"sourcesContent":["import type { Payload } from '../index.js'\nimport type { SanitizedCollectionConfig } from './../collections/config/types.js'\n\ntype CookieOptions = {\n domain?: string\n expires?: Date\n httpOnly?: boolean\n maxAge?: number\n name: string\n path?: string\n returnCookieAsObject: boolean\n sameSite?: 'Lax' | 'None' | 'Strict'\n secure?: boolean\n value?: string\n}\n\ntype CookieObject = {\n domain?: string\n expires?: string\n httpOnly?: boolean\n maxAge?: number\n name: string\n path?: string\n sameSite?: 'Lax' | 'None' | 'Strict'\n secure?: boolean\n value: string\n}\n\nexport const generateCookie = <ReturnCookieAsObject = boolean>(\n args: CookieOptions,\n): ReturnCookieAsObject extends true ? CookieObject : string => {\n const {\n name,\n domain,\n expires,\n httpOnly,\n maxAge,\n path,\n returnCookieAsObject,\n sameSite,\n secure: secureArg,\n value,\n } = args\n\n let cookieString = `${name}=${value || ''}`\n const cookieObject: CookieObject = {\n name,\n value,\n }\n\n const secure = secureArg || sameSite === 'None'\n\n if (expires) {\n if (returnCookieAsObject) {\n cookieObject.expires = expires.toUTCString()\n } else {\n cookieString += `; Expires=${expires.toUTCString()}`\n }\n }\n\n if (maxAge) {\n if (returnCookieAsObject) {\n cookieObject.maxAge = maxAge\n } else {\n cookieString += `; Max-Age=${maxAge.toString()}`\n }\n }\n\n if (domain) {\n if (returnCookieAsObject) {\n cookieObject.domain = domain\n } else {\n cookieString += `; Domain=${domain}`\n }\n }\n\n if (path) {\n if (returnCookieAsObject) {\n cookieObject.path = path\n } else {\n cookieString += `; Path=${path}`\n }\n }\n\n if (secure) {\n if (returnCookieAsObject) {\n cookieObject.secure = secure\n } else {\n cookieString += `; Secure=${secure}`\n }\n }\n\n if (httpOnly) {\n if (returnCookieAsObject) {\n cookieObject.httpOnly = httpOnly\n } else {\n cookieString += `; HttpOnly=${httpOnly}`\n }\n }\n\n if (sameSite) {\n if (returnCookieAsObject) {\n cookieObject.sameSite = sameSite\n } else {\n cookieString += `; SameSite=${sameSite}`\n }\n }\n\n return (returnCookieAsObject ? cookieObject : cookieString) as ReturnCookieAsObject extends true\n ? CookieObject\n : string\n}\ntype GetCookieExpirationArgs = {\n /*\n The number of seconds until the cookie expires\n @default 7200 seconds (2 hours)\n */\n seconds: number\n}\nexport const getCookieExpiration = ({ seconds = 7200 }: GetCookieExpirationArgs) => {\n const currentTime = new Date()\n currentTime.setSeconds(currentTime.getSeconds() + seconds)\n return currentTime\n}\n\ntype GeneratePayloadCookieArgs = {\n /* The auth collection config */\n collectionConfig: SanitizedCollectionConfig\n /* An instance of payload */\n payload: Payload\n /* The returnAs value */\n returnCookieAsObject?: boolean\n /* The token to be stored in the cookie */\n token: string\n}\nexport const generatePayloadCookie = <T extends GeneratePayloadCookieArgs>({\n collectionConfig,\n payload,\n returnCookieAsObject = false,\n token,\n}: T): T['returnCookieAsObject'] extends true ? CookieObject : string => {\n const sameSite =\n typeof collectionConfig.auth.cookies.sameSite === 'string'\n ? collectionConfig.auth.cookies.sameSite\n : collectionConfig.auth.cookies.sameSite\n ? 'Strict'\n : undefined\n\n return generateCookie<T['returnCookieAsObject']>({\n name: `${payload.config.cookiePrefix}-token`,\n domain: collectionConfig.auth.cookies.domain ?? undefined,\n expires: getCookieExpiration({ seconds: collectionConfig.auth.tokenExpiration }),\n httpOnly: true,\n path: '/',\n returnCookieAsObject,\n sameSite,\n secure: collectionConfig.auth.cookies.secure,\n value: token,\n })\n}\n\nexport const generateExpiredPayloadCookie = <T extends Omit<GeneratePayloadCookieArgs, 'token'>>({\n collectionConfig,\n payload,\n returnCookieAsObject = false,\n}: T): T['returnCookieAsObject'] extends true ? CookieObject : string => {\n const sameSite =\n typeof collectionConfig.auth.cookies.sameSite === 'string'\n ? collectionConfig.auth.cookies.sameSite\n : collectionConfig.auth.cookies.sameSite\n ? 'Strict'\n : undefined\n\n const expires = new Date(Date.now() - 1000)\n\n return generateCookie<T['returnCookieAsObject']>({\n name: `${payload.config.cookiePrefix}-token`,\n domain: collectionConfig.auth.cookies.domain ?? undefined,\n expires,\n httpOnly: true,\n path: '/',\n returnCookieAsObject,\n sameSite,\n secure: collectionConfig.auth.cookies.secure,\n })\n}\n\nexport const parseCookies = (headers: Request['headers']): Map<string, string> => {\n const cookieMap = new Map<string, string>()\n const cookie = headers.get('Cookie')\n\n if (cookie) {\n cookie.split(';').forEach((cookie) => {\n const parts = cookie.split('=')\n const key = parts.shift().trim()\n const encodedValue = parts.join('=')\n\n try {\n const decodedValue = decodeURI(encodedValue)\n cookieMap.set(key, decodedValue)\n } catch (e) {\n return null\n }\n })\n }\n\n return cookieMap\n}\n"],"names":["generateCookie","args","name","domain","expires","httpOnly","maxAge","path","returnCookieAsObject","sameSite","secure","secureArg","value","cookieString","cookieObject","toUTCString","toString","getCookieExpiration","seconds","currentTime","Date","setSeconds","getSeconds","generatePayloadCookie","collectionConfig","payload","token","auth","cookies","undefined","config","cookiePrefix","tokenExpiration","generateExpiredPayloadCookie","now","parseCookies","headers","cookieMap","Map","cookie","get","split","forEach","parts","key","shift","trim","encodedValue","join","decodedValue","decodeURI","set","e"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -26,7 +26,7 @@ export const forgotPasswordOperation = async (incomingArgs)=>{
26
26
  req: args.req
27
27
  }) || args;
28
28
  }, Promise.resolve());
29
- const { collection: { config: collectionConfig }, data, disableEmail, expiration, req: { payload: { config, emailOptions, sendEmail: email }, payload }, req } = args;
29
+ const { collection: { config: collectionConfig }, data, disableEmail, expiration, req: { payload: { config, email }, payload }, req } = args;
30
30
  // /////////////////////////////////////
31
31
  // Forget password
32
32
  // /////////////////////////////////////
@@ -80,8 +80,8 @@ export const forgotPasswordOperation = async (incomingArgs)=>{
80
80
  });
81
81
  }
82
82
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
83
- email({
84
- from: `"${emailOptions.fromName}" <${emailOptions.fromAddress}>`,
83
+ email.sendEmail({
84
+ from: `"${email.defaultFromName}" <${email.defaultFromAddress}>`,
85
85
  html,
86
86
  subject,
87
87
  to: data.email
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/operations/forgotPassword.ts"],"sourcesContent":["import crypto from 'crypto'\nimport httpStatus from 'http-status'\nimport { URL } from 'url'\n\nimport type { Collection } from '../../collections/config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { APIError } from '../../errors/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\n\nexport type Arguments = {\n collection: Collection\n data: {\n [key: string]: unknown\n email: string\n }\n disableEmail?: boolean\n expiration?: number\n req: PayloadRequest\n}\n\nexport type Result = string\n\nexport const forgotPasswordOperation = async (incomingArgs: Arguments): Promise<null | string> => {\n if (!Object.prototype.hasOwnProperty.call(incomingArgs.data, 'email')) {\n throw new APIError('Missing email.', httpStatus.BAD_REQUEST)\n }\n\n let args = incomingArgs\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'forgotPassword',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n data,\n disableEmail,\n expiration,\n req: {\n payload: { config, emailOptions, sendEmail: email },\n payload,\n },\n req,\n } = args\n\n // /////////////////////////////////////\n // Forget password\n // /////////////////////////////////////\n\n let token: string = crypto.randomBytes(20).toString('hex')\n\n type UserDoc = {\n id: number | string\n resetPasswordExpiration?: string\n resetPasswordToken?: string\n }\n\n if (!data.email) {\n throw new APIError('Missing email.', httpStatus.BAD_REQUEST)\n }\n\n let user = await payload.db.findOne<UserDoc>({\n collection: collectionConfig.slug,\n req,\n where: { email: { equals: data.email.toLowerCase() } },\n })\n\n // We don't want to indicate specifically that an email was not found,\n // as doing so could lead to the exposure of registered emails.\n // Therefore, we prefer to fail silently.\n if (!user) return null\n\n user.resetPasswordToken = token\n user.resetPasswordExpiration = new Date(expiration || Date.now() + 3600000).toISOString() // 1 hour\n\n user = await payload.update({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n if (!disableEmail) {\n const protocol = new URL(req.url).protocol\n const serverURL =\n config.serverURL !== null && config.serverURL !== ''\n ? config.serverURL\n : `${protocol}://${req.headers.get('host')}`\n\n let html = `${req.t('authentication:youAreReceivingResetPassword')}\n <a href=\"${serverURL}${config.routes.admin}/reset/${token}\">\n ${serverURL}${config.routes.admin}/reset/${token}\n </a>\n ${req.t('authentication:youDidNotRequestPassword')}`\n\n if (typeof collectionConfig.auth.forgotPassword.generateEmailHTML === 'function') {\n html = await collectionConfig.auth.forgotPassword.generateEmailHTML({\n req,\n token,\n user,\n })\n }\n\n let subject = req.t('authentication:resetYourPassword')\n\n if (typeof collectionConfig.auth.forgotPassword.generateEmailSubject === 'function') {\n subject = await collectionConfig.auth.forgotPassword.generateEmailSubject({\n req,\n token,\n user,\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n email({\n from: `\"${emailOptions.fromName}\" <${emailOptions.fromAddress}>`,\n html,\n subject,\n to: data.email,\n })\n }\n\n // /////////////////////////////////////\n // afterForgotPassword - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterForgotPassword.reduce(async (priorHook, hook) => {\n await priorHook\n await hook({ args, collection: args.collection?.config, context: req.context })\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n token = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'forgotPassword',\n result: token,\n })\n\n if (shouldCommit) await commitTransaction(req)\n\n return token\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","httpStatus","URL","buildAfterOperation","APIError","commitTransaction","initTransaction","killTransaction","forgotPasswordOperation","incomingArgs","Object","prototype","hasOwnProperty","call","data","BAD_REQUEST","args","shouldCommit","req","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","disableEmail","expiration","payload","emailOptions","sendEmail","email","token","randomBytes","toString","user","db","findOne","slug","where","equals","toLowerCase","resetPasswordToken","resetPasswordExpiration","Date","now","toISOString","update","id","protocol","url","serverURL","headers","get","html","t","routes","admin","auth","forgotPassword","generateEmailHTML","subject","generateEmailSubject","from","fromName","fromAddress","to","afterForgotPassword","result","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/auth/operations/forgotPassword.ts"],"sourcesContent":["import crypto from 'crypto'\nimport httpStatus from 'http-status'\nimport { URL } from 'url'\n\nimport type { Collection } from '../../collections/config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { APIError } from '../../errors/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\n\nexport type Arguments = {\n collection: Collection\n data: {\n [key: string]: unknown\n email: string\n }\n disableEmail?: boolean\n expiration?: number\n req: PayloadRequest\n}\n\nexport type Result = string\n\nexport const forgotPasswordOperation = async (incomingArgs: Arguments): Promise<null | string> => {\n if (!Object.prototype.hasOwnProperty.call(incomingArgs.data, 'email')) {\n throw new APIError('Missing email.', httpStatus.BAD_REQUEST)\n }\n\n let args = incomingArgs\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'forgotPassword',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n data,\n disableEmail,\n expiration,\n req: {\n payload: { config, email },\n payload,\n },\n req,\n } = args\n\n // /////////////////////////////////////\n // Forget password\n // /////////////////////////////////////\n\n let token: string = crypto.randomBytes(20).toString('hex')\n\n type UserDoc = {\n id: number | string\n resetPasswordExpiration?: string\n resetPasswordToken?: string\n }\n\n if (!data.email) {\n throw new APIError('Missing email.', httpStatus.BAD_REQUEST)\n }\n\n let user = await payload.db.findOne<UserDoc>({\n collection: collectionConfig.slug,\n req,\n where: { email: { equals: data.email.toLowerCase() } },\n })\n\n // We don't want to indicate specifically that an email was not found,\n // as doing so could lead to the exposure of registered emails.\n // Therefore, we prefer to fail silently.\n if (!user) return null\n\n user.resetPasswordToken = token\n user.resetPasswordExpiration = new Date(expiration || Date.now() + 3600000).toISOString() // 1 hour\n\n user = await payload.update({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n if (!disableEmail) {\n const protocol = new URL(req.url).protocol\n const serverURL =\n config.serverURL !== null && config.serverURL !== ''\n ? config.serverURL\n : `${protocol}://${req.headers.get('host')}`\n\n let html = `${req.t('authentication:youAreReceivingResetPassword')}\n <a href=\"${serverURL}${config.routes.admin}/reset/${token}\">\n ${serverURL}${config.routes.admin}/reset/${token}\n </a>\n ${req.t('authentication:youDidNotRequestPassword')}`\n\n if (typeof collectionConfig.auth.forgotPassword.generateEmailHTML === 'function') {\n html = await collectionConfig.auth.forgotPassword.generateEmailHTML({\n req,\n token,\n user,\n })\n }\n\n let subject = req.t('authentication:resetYourPassword')\n\n if (typeof collectionConfig.auth.forgotPassword.generateEmailSubject === 'function') {\n subject = await collectionConfig.auth.forgotPassword.generateEmailSubject({\n req,\n token,\n user,\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n email.sendEmail({\n from: `\"${email.defaultFromName}\" <${email.defaultFromAddress}>`,\n html,\n subject,\n to: data.email,\n })\n }\n\n // /////////////////////////////////////\n // afterForgotPassword - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterForgotPassword.reduce(async (priorHook, hook) => {\n await priorHook\n await hook({ args, collection: args.collection?.config, context: req.context })\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n token = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'forgotPassword',\n result: token,\n })\n\n if (shouldCommit) await commitTransaction(req)\n\n return token\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","httpStatus","URL","buildAfterOperation","APIError","commitTransaction","initTransaction","killTransaction","forgotPasswordOperation","incomingArgs","Object","prototype","hasOwnProperty","call","data","BAD_REQUEST","args","shouldCommit","req","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","disableEmail","expiration","payload","email","token","randomBytes","toString","user","db","findOne","slug","where","equals","toLowerCase","resetPasswordToken","resetPasswordExpiration","Date","now","toISOString","update","id","protocol","url","serverURL","headers","get","html","t","routes","admin","auth","forgotPassword","generateEmailHTML","subject","generateEmailSubject","sendEmail","from","defaultFromName","defaultFromAddress","to","afterForgotPassword","result","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAevC,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,cAAc,yDACX,SAAS,KACtB,QAAQ,MAAM,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAA;CAAE,CAgNjE,CAAA"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAevC,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,cAAc,yDACX,SAAS,KACtB,QAAQ,MAAM,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAA;CAAE,CAuNjE,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import jwt from 'jsonwebtoken';
2
2
  import { buildAfterOperation } from '../../collections/operations/utils.js';
3
- import { AuthenticationError, LockedAuth } from '../../errors/index.js';
3
+ import { AuthenticationError, LockedAuth, ValidationError } from '../../errors/index.js';
4
4
  import { afterRead } from '../../fields/hooks/afterRead/index.js';
5
5
  import { commitTransaction } from '../../utilities/commitTransaction.js';
6
6
  import { initTransaction } from '../../utilities/initTransaction.js';
@@ -33,6 +33,22 @@ export const loginOperation = async (incomingArgs)=>{
33
33
  // Login
34
34
  // /////////////////////////////////////
35
35
  const { email: unsanitizedEmail, password } = data;
36
+ if (typeof unsanitizedEmail !== 'string' || unsanitizedEmail.trim() === '') {
37
+ throw new ValidationError([
38
+ {
39
+ field: 'email',
40
+ message: req.i18n.t('validation:required')
41
+ }
42
+ ]);
43
+ }
44
+ if (typeof password !== 'string' || password.trim() === '') {
45
+ throw new ValidationError([
46
+ {
47
+ field: 'password',
48
+ message: req.i18n.t('validation:required')
49
+ }
50
+ ]);
51
+ }
36
52
  const email = unsanitizedEmail ? unsanitizedEmail.toLowerCase().trim() : null;
37
53
  let user = await payload.db.findOne({
38
54
  collection: collectionConfig.slug,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/operations/login.ts"],"sourcesContent":["import jwt from 'jsonwebtoken'\n\nimport type { Collection } from '../../collections/config/types.js'\nimport type { GeneratedTypes } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { User } from '../types.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { AuthenticationError, LockedAuth } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport isLocked from '../isLocked.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js'\nimport { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js'\n\nexport type Result = {\n exp?: number\n token?: string\n user?: User\n}\n\nexport type Arguments = {\n collection: Collection\n data: {\n email: string\n password: string\n }\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n}\n\nexport const loginOperation = async <TSlug extends keyof GeneratedTypes['collections']>(\n incomingArgs: Arguments,\n): Promise<Result & { user: GeneratedTypes['collections'][TSlug] }> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'login',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess,\n req,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { secret },\n },\n showHiddenFields,\n } = args\n\n // /////////////////////////////////////\n // Login\n // /////////////////////////////////////\n\n const { email: unsanitizedEmail, password } = data\n\n const email = unsanitizedEmail ? unsanitizedEmail.toLowerCase().trim() : null\n\n let user = await payload.db.findOne<any>({\n collection: collectionConfig.slug,\n req,\n where: { email: { equals: email.toLowerCase() } },\n })\n\n if (!user || (args.collection.config.auth.verify && user._verified === false)) {\n throw new AuthenticationError(req.t)\n }\n\n if (user && isLocked(user.lockUntil)) {\n throw new LockedAuth(req.t)\n }\n\n const authResult = await authenticateLocalStrategy({ doc: user, password })\n\n user = sanitizeInternalFields(user)\n\n const maxLoginAttemptsEnabled = args.collection.config.auth.maxLoginAttempts > 0\n\n if (!authResult) {\n if (maxLoginAttemptsEnabled) {\n await incrementLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n if (shouldCommit) await commitTransaction(req)\n\n throw new AuthenticationError(req.t)\n }\n\n if (maxLoginAttemptsEnabled) {\n await resetLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email,\n user,\n })\n\n await collectionConfig.hooks.beforeLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }, Promise.resolve())\n\n const token = jwt.sign(fieldsToSign, secret, {\n expiresIn: collectionConfig.auth.tokenExpiration,\n })\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n user = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: user,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n req,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n let result: Result & { user: GeneratedTypes['collections'][TSlug] } = {\n exp: (jwt.decode(token) as jwt.JwtPayload).exp,\n token,\n user,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation<GeneratedTypes['collections'][TSlug]>({\n args,\n collection: args.collection?.config,\n operation: 'login',\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) await commitTransaction(req)\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["jwt","buildAfterOperation","AuthenticationError","LockedAuth","afterRead","commitTransaction","initTransaction","killTransaction","sanitizeInternalFields","getFieldsToSign","isLocked","authenticateLocalStrategy","incrementLoginAttempts","resetLoginAttempts","loginOperation","incomingArgs","args","shouldCommit","req","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","data","depth","overrideAccess","fallbackLocale","locale","payload","secret","showHiddenFields","email","unsanitizedEmail","password","toLowerCase","trim","user","db","findOne","slug","where","equals","auth","verify","_verified","t","lockUntil","authResult","doc","maxLoginAttemptsEnabled","maxLoginAttempts","fieldsToSign","beforeLogin","token","sign","expiresIn","tokenExpiration","afterLogin","global","result","exp","decode","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/auth/operations/login.ts"],"sourcesContent":["import jwt from 'jsonwebtoken'\n\nimport type { Collection } from '../../collections/config/types.js'\nimport type { GeneratedTypes } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { User } from '../types.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { AuthenticationError, LockedAuth, ValidationError } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport isLocked from '../isLocked.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js'\nimport { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js'\n\nexport type Result = {\n exp?: number\n token?: string\n user?: User\n}\n\nexport type Arguments = {\n collection: Collection\n data: {\n email: string\n password: string\n }\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n}\n\nexport const loginOperation = async <TSlug extends keyof GeneratedTypes['collections']>(\n incomingArgs: Arguments,\n): Promise<Result & { user: GeneratedTypes['collections'][TSlug] }> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'login',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess,\n req,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { secret },\n },\n showHiddenFields,\n } = args\n\n // /////////////////////////////////////\n // Login\n // /////////////////////////////////////\n\n const { email: unsanitizedEmail, password } = data\n\n if (typeof unsanitizedEmail !== 'string' || unsanitizedEmail.trim() === '') {\n throw new ValidationError([{ field: 'email', message: req.i18n.t('validation:required') }])\n }\n if (typeof password !== 'string' || password.trim() === '') {\n throw new ValidationError([{ field: 'password', message: req.i18n.t('validation:required') }])\n }\n\n const email = unsanitizedEmail ? unsanitizedEmail.toLowerCase().trim() : null\n\n let user = await payload.db.findOne<any>({\n collection: collectionConfig.slug,\n req,\n where: { email: { equals: email.toLowerCase() } },\n })\n\n if (!user || (args.collection.config.auth.verify && user._verified === false)) {\n throw new AuthenticationError(req.t)\n }\n\n if (user && isLocked(user.lockUntil)) {\n throw new LockedAuth(req.t)\n }\n\n const authResult = await authenticateLocalStrategy({ doc: user, password })\n\n user = sanitizeInternalFields(user)\n\n const maxLoginAttemptsEnabled = args.collection.config.auth.maxLoginAttempts > 0\n\n if (!authResult) {\n if (maxLoginAttemptsEnabled) {\n await incrementLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n if (shouldCommit) await commitTransaction(req)\n\n throw new AuthenticationError(req.t)\n }\n\n if (maxLoginAttemptsEnabled) {\n await resetLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email,\n user,\n })\n\n await collectionConfig.hooks.beforeLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }, Promise.resolve())\n\n const token = jwt.sign(fieldsToSign, secret, {\n expiresIn: collectionConfig.auth.tokenExpiration,\n })\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n user = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: user,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n req,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n let result: Result & { user: GeneratedTypes['collections'][TSlug] } = {\n exp: (jwt.decode(token) as jwt.JwtPayload).exp,\n token,\n user,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation<GeneratedTypes['collections'][TSlug]>({\n args,\n collection: args.collection?.config,\n operation: 'login',\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) await commitTransaction(req)\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["jwt","buildAfterOperation","AuthenticationError","LockedAuth","ValidationError","afterRead","commitTransaction","initTransaction","killTransaction","sanitizeInternalFields","getFieldsToSign","isLocked","authenticateLocalStrategy","incrementLoginAttempts","resetLoginAttempts","loginOperation","incomingArgs","args","shouldCommit","req","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","data","depth","overrideAccess","fallbackLocale","locale","payload","secret","showHiddenFields","email","unsanitizedEmail","password","trim","field","message","i18n","t","toLowerCase","user","db","findOne","slug","where","equals","auth","verify","_verified","lockUntil","authResult","doc","maxLoginAttemptsEnabled","maxLoginAttempts","fieldsToSign","beforeLogin","token","sign","expiresIn","tokenExpiration","afterLogin","global","result","exp","decode","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,18 +1,17 @@
1
1
  import type { Collection } from '../collections/config/types.js';
2
- import type { EmailOptions, SanitizedConfig } from '../config/types.js';
3
- import type { Payload } from '../index.js';
2
+ import type { SanitizedConfig } from '../config/types.js';
3
+ import type { InitializedEmailAdapter } from '../email/types.js';
4
4
  import type { PayloadRequest } from '../types/index.js';
5
5
  import type { User } from './types.js';
6
6
  type Args = {
7
7
  collection: Collection;
8
8
  config: SanitizedConfig;
9
9
  disableEmail: boolean;
10
- emailOptions: EmailOptions;
10
+ email: InitializedEmailAdapter;
11
11
  req: PayloadRequest;
12
- sendEmail: Payload['sendEmail'];
13
12
  token: string;
14
13
  user: User;
15
14
  };
16
- declare function sendVerificationEmail(args: Args): Promise<void>;
17
- export default sendVerificationEmail;
15
+ export declare function sendVerificationEmail(args: Args): Promise<void>;
16
+ export {};
18
17
  //# sourceMappingURL=sendVerificationEmail.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sendVerificationEmail.d.ts","sourceRoot":"","sources":["../../src/auth/sendVerificationEmail.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,YAAY,CAAA;AAEpD,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;IACrB,YAAY,EAAE,YAAY,CAAA;IAC1B,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AAED,iBAAe,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD9D;AAED,eAAe,qBAAqB,CAAA"}
1
+ {"version":3,"file":"sendVerificationEmail.d.ts","sourceRoot":"","sources":["../../src/auth/sendVerificationEmail.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,YAAY,CAAA;AAEpD,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;IACrB,KAAK,EAAE,uBAAuB,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDrE"}
@@ -1,7 +1,7 @@
1
1
  import { URL } from 'url';
2
- async function sendVerificationEmail(args) {
2
+ export async function sendVerificationEmail(args) {
3
3
  // Verify token from e-mail
4
- const { collection: { config: collectionConfig }, config, disableEmail, emailOptions, req, sendEmail, token, user } = args;
4
+ const { collection: { config: collectionConfig }, config, disableEmail, email, req, token, user } = args;
5
5
  if (!disableEmail) {
6
6
  const protocol = new URL(req.url).protocol;
7
7
  const serverURL = config.serverURL !== null && config.serverURL !== '' ? config.serverURL : `${protocol}://${req.headers.get('host')}`;
@@ -29,14 +29,13 @@ async function sendVerificationEmail(args) {
29
29
  });
30
30
  }
31
31
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
32
- sendEmail({
33
- from: `"${emailOptions.fromName}" <${emailOptions.fromAddress}>`,
32
+ email.sendEmail({
33
+ from: `"${email.defaultFromName}" <${email.defaultFromName}>`,
34
34
  html,
35
35
  subject,
36
36
  to: user.email
37
37
  });
38
38
  }
39
39
  }
40
- export default sendVerificationEmail;
41
40
 
42
41
  //# sourceMappingURL=sendVerificationEmail.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/auth/sendVerificationEmail.ts"],"sourcesContent":["import { URL } from 'url'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { EmailOptions, SanitizedConfig } from '../config/types.js'\nimport type { Payload } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { User, VerifyConfig } from './types.js'\n\ntype Args = {\n collection: Collection\n config: SanitizedConfig\n disableEmail: boolean\n emailOptions: EmailOptions\n req: PayloadRequest\n sendEmail: Payload['sendEmail']\n token: string\n user: User\n}\n\nasync function sendVerificationEmail(args: Args): Promise<void> {\n // Verify token from e-mail\n const {\n collection: { config: collectionConfig },\n config,\n disableEmail,\n emailOptions,\n req,\n sendEmail,\n token,\n user,\n } = args\n\n if (!disableEmail) {\n const protocol = new URL(req.url).protocol\n const serverURL =\n config.serverURL !== null && config.serverURL !== ''\n ? config.serverURL\n : `${protocol}://${req.headers.get('host')}`\n\n const verificationURL = `${serverURL}${config.routes.admin}/${collectionConfig.slug}/verify/${token}`\n\n let html = `${req.t('authentication:newAccountCreated', {\n serverURL: config.serverURL,\n verificationURL,\n })}`\n\n const verify = collectionConfig.auth.verify as VerifyConfig\n\n // Allow config to override email content\n if (typeof verify.generateEmailHTML === 'function') {\n html = await verify.generateEmailHTML({\n req,\n token,\n user,\n })\n }\n\n let subject = req.t('authentication:verifyYourEmail')\n\n // Allow config to override email subject\n if (typeof verify.generateEmailSubject === 'function') {\n subject = await verify.generateEmailSubject({\n req,\n token,\n user,\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendEmail({\n from: `\"${emailOptions.fromName}\" <${emailOptions.fromAddress}>`,\n html,\n subject,\n to: user.email,\n })\n }\n}\n\nexport default sendVerificationEmail\n"],"names":["URL","sendVerificationEmail","args","collection","config","collectionConfig","disableEmail","emailOptions","req","sendEmail","token","user","protocol","url","serverURL","headers","get","verificationURL","routes","admin","slug","html","t","verify","auth","generateEmailHTML","subject","generateEmailSubject","from","fromName","fromAddress","to","email"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,GAAG,QAAQ,MAAK;AAmBzB,eAAeC,sBAAsBC,IAAU;IAC7C,2BAA2B;IAC3B,MAAM,EACJC,YAAY,EAAEC,QAAQC,gBAAgB,EAAE,EACxCD,MAAM,EACNE,YAAY,EACZC,YAAY,EACZC,GAAG,EACHC,SAAS,EACTC,KAAK,EACLC,IAAI,EACL,GAAGT;IAEJ,IAAI,CAACI,cAAc;QACjB,MAAMM,WAAW,IAAIZ,IAAIQ,IAAIK,GAAG,EAAED,QAAQ;QAC1C,MAAME,YACJV,OAAOU,SAAS,KAAK,QAAQV,OAAOU,SAAS,KAAK,KAC9CV,OAAOU,SAAS,GAChB,CAAC,EAAEF,SAAS,GAAG,EAAEJ,IAAIO,OAAO,CAACC,GAAG,CAAC,QAAQ,CAAC;QAEhD,MAAMC,kBAAkB,CAAC,EAAEH,UAAU,EAAEV,OAAOc,MAAM,CAACC,KAAK,CAAC,CAAC,EAAEd,iBAAiBe,IAAI,CAAC,QAAQ,EAAEV,MAAM,CAAC;QAErG,IAAIW,OAAO,CAAC,EAAEb,IAAIc,CAAC,CAAC,oCAAoC;YACtDR,WAAWV,OAAOU,SAAS;YAC3BG;QACF,GAAG,CAAC;QAEJ,MAAMM,SAASlB,iBAAiBmB,IAAI,CAACD,MAAM;QAE3C,yCAAyC;QACzC,IAAI,OAAOA,OAAOE,iBAAiB,KAAK,YAAY;YAClDJ,OAAO,MAAME,OAAOE,iBAAiB,CAAC;gBACpCjB;gBACAE;gBACAC;YACF;QACF;QAEA,IAAIe,UAAUlB,IAAIc,CAAC,CAAC;QAEpB,yCAAyC;QACzC,IAAI,OAAOC,OAAOI,oBAAoB,KAAK,YAAY;YACrDD,UAAU,MAAMH,OAAOI,oBAAoB,CAAC;gBAC1CnB;gBACAE;gBACAC;YACF;QACF;QAEA,mEAAmE;QACnEF,UAAU;YACRmB,MAAM,CAAC,CAAC,EAAErB,aAAasB,QAAQ,CAAC,GAAG,EAAEtB,aAAauB,WAAW,CAAC,CAAC,CAAC;YAChET;YACAK;YACAK,IAAIpB,KAAKqB,KAAK;QAChB;IACF;AACF;AAEA,eAAe/B,sBAAqB"}
1
+ {"version":3,"sources":["../../src/auth/sendVerificationEmail.ts"],"sourcesContent":["import { URL } from 'url'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { InitializedEmailAdapter } from '../email/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { User, VerifyConfig } from './types.js'\n\ntype Args = {\n collection: Collection\n config: SanitizedConfig\n disableEmail: boolean\n email: InitializedEmailAdapter\n req: PayloadRequest\n token: string\n user: User\n}\n\nexport async function sendVerificationEmail(args: Args): Promise<void> {\n // Verify token from e-mail\n const {\n collection: { config: collectionConfig },\n config,\n disableEmail,\n email,\n req,\n token,\n user,\n } = args\n\n if (!disableEmail) {\n const protocol = new URL(req.url).protocol\n const serverURL =\n config.serverURL !== null && config.serverURL !== ''\n ? config.serverURL\n : `${protocol}://${req.headers.get('host')}`\n\n const verificationURL = `${serverURL}${config.routes.admin}/${collectionConfig.slug}/verify/${token}`\n\n let html = `${req.t('authentication:newAccountCreated', {\n serverURL: config.serverURL,\n verificationURL,\n })}`\n\n const verify = collectionConfig.auth.verify as VerifyConfig\n\n // Allow config to override email content\n if (typeof verify.generateEmailHTML === 'function') {\n html = await verify.generateEmailHTML({\n req,\n token,\n user,\n })\n }\n\n let subject = req.t('authentication:verifyYourEmail')\n\n // Allow config to override email subject\n if (typeof verify.generateEmailSubject === 'function') {\n subject = await verify.generateEmailSubject({\n req,\n token,\n user,\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n email.sendEmail({\n from: `\"${email.defaultFromName}\" <${email.defaultFromName}>`,\n html,\n subject,\n to: user.email,\n })\n }\n}\n"],"names":["URL","sendVerificationEmail","args","collection","config","collectionConfig","disableEmail","email","req","token","user","protocol","url","serverURL","headers","get","verificationURL","routes","admin","slug","html","t","verify","auth","generateEmailHTML","subject","generateEmailSubject","sendEmail","from","defaultFromName","to"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,GAAG,QAAQ,MAAK;AAkBzB,OAAO,eAAeC,sBAAsBC,IAAU;IACpD,2BAA2B;IAC3B,MAAM,EACJC,YAAY,EAAEC,QAAQC,gBAAgB,EAAE,EACxCD,MAAM,EACNE,YAAY,EACZC,KAAK,EACLC,GAAG,EACHC,KAAK,EACLC,IAAI,EACL,GAAGR;IAEJ,IAAI,CAACI,cAAc;QACjB,MAAMK,WAAW,IAAIX,IAAIQ,IAAII,GAAG,EAAED,QAAQ;QAC1C,MAAME,YACJT,OAAOS,SAAS,KAAK,QAAQT,OAAOS,SAAS,KAAK,KAC9CT,OAAOS,SAAS,GAChB,CAAC,EAAEF,SAAS,GAAG,EAAEH,IAAIM,OAAO,CAACC,GAAG,CAAC,QAAQ,CAAC;QAEhD,MAAMC,kBAAkB,CAAC,EAAEH,UAAU,EAAET,OAAOa,MAAM,CAACC,KAAK,CAAC,CAAC,EAAEb,iBAAiBc,IAAI,CAAC,QAAQ,EAAEV,MAAM,CAAC;QAErG,IAAIW,OAAO,CAAC,EAAEZ,IAAIa,CAAC,CAAC,oCAAoC;YACtDR,WAAWT,OAAOS,SAAS;YAC3BG;QACF,GAAG,CAAC;QAEJ,MAAMM,SAASjB,iBAAiBkB,IAAI,CAACD,MAAM;QAE3C,yCAAyC;QACzC,IAAI,OAAOA,OAAOE,iBAAiB,KAAK,YAAY;YAClDJ,OAAO,MAAME,OAAOE,iBAAiB,CAAC;gBACpChB;gBACAC;gBACAC;YACF;QACF;QAEA,IAAIe,UAAUjB,IAAIa,CAAC,CAAC;QAEpB,yCAAyC;QACzC,IAAI,OAAOC,OAAOI,oBAAoB,KAAK,YAAY;YACrDD,UAAU,MAAMH,OAAOI,oBAAoB,CAAC;gBAC1ClB;gBACAC;gBACAC;YACF;QACF;QAEA,mEAAmE;QACnEH,MAAMoB,SAAS,CAAC;YACdC,MAAM,CAAC,CAAC,EAAErB,MAAMsB,eAAe,CAAC,GAAG,EAAEtB,MAAMsB,eAAe,CAAC,CAAC,CAAC;YAC7DT;YACAK;YACAK,IAAIpB,KAAKH,KAAK;QAChB;IACF;AACF"}
@@ -1,5 +1,5 @@
1
1
  import type { LivePreviewConfig, ServerOnlyLivePreviewProperties } from '../../config/types.js';
2
- export type ServerOnlyCollectionProperties = keyof Pick<SanitizedCollectionConfig, 'access' | 'endpoints' | 'hooks'>;
2
+ export type ServerOnlyCollectionProperties = keyof Pick<SanitizedCollectionConfig, 'access' | 'custom' | 'endpoints' | 'hooks'>;
3
3
  export type ServerOnlyCollectionAdminProperties = keyof Pick<SanitizedCollectionConfig['admin'], 'components' | 'hidden' | 'preview'>;
4
4
  export type ClientCollectionConfig = Omit<SanitizedCollectionConfig, 'admin' | 'fields' | ServerOnlyCollectionProperties> & {
5
5
  admin: Omit<SanitizedCollectionConfig['admin'], 'fields' | 'livePreview' | ServerOnlyCollectionAdminProperties> & {
@@ -227,6 +227,9 @@ export declare const createClientCollectionConfig: ({ collection, t, }: {
227
227
  };
228
228
  };
229
229
  };
230
+ custom: {
231
+ [x: string]: any;
232
+ };
230
233
  defaultColumns: string[];
231
234
  description: string | import("../../config/types.js").EntityDescriptionComponent | import("../../config/types.js").EntityDescriptionFunction | {
232
235
  [x: string]: string;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/collections/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAA;AAE/F,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CACrD,yBAAyB,EACzB,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG,MAAM,IAAI,CAC1D,yBAAyB,CAAC,OAAO,CAAC,EAClC,YAAY,GAAG,QAAQ,GAAG,SAAS,CACpC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,yBAAyB,EACzB,OAAO,GAAG,QAAQ,GAAG,8BAA8B,CACpD,GAAG;IACF,KAAK,EAAE,IAAI,CACT,yBAAyB,CAAC,OAAO,CAAC,EAClC,QAAQ,GAAG,aAAa,GAAG,mCAAmC,CAC/D,GAAG;QACF,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAA;KACvE,CAAA;IACD,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAC5B,CAAA;AAED,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAI3D,eAAO,MAAM,4BAA4B,uBAGtC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,CAAC,EAAE,SAAS,CAAA;CACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEA,CAAA;AAED,eAAO,MAAM,6BAA6B,wBAGvC;IACD,WAAW,EAAE,yBAAyB,EAAE,CAAA;IACxC,CAAC,EAAE,SAAS,CAAA;CACb,KAAG,sBAAsB,EACwD,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/collections/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAA;AAE/F,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CACrD,yBAAyB,EACzB,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAC5C,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG,MAAM,IAAI,CAC1D,yBAAyB,CAAC,OAAO,CAAC,EAClC,YAAY,GAAG,QAAQ,GAAG,SAAS,CACpC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,yBAAyB,EACzB,OAAO,GAAG,QAAQ,GAAG,8BAA8B,CACpD,GAAG;IACF,KAAK,EAAE,IAAI,CACT,yBAAyB,CAAC,OAAO,CAAC,EAClC,QAAQ,GAAG,aAAa,GAAG,mCAAmC,CAC/D,GAAG;QACF,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAA;KACvE,CAAA;IACD,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAC5B,CAAA;AAED,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAI3D,eAAO,MAAM,4BAA4B,uBAGtC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,CAAC,EAAE,SAAS,CAAA;CACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEA,CAAA;AAED,eAAO,MAAM,6BAA6B,wBAGvC;IACD,WAAW,EAAE,yBAAyB,EAAE,CAAA;IACxC,CAAC,EAAE,SAAS,CAAA;CACb,KAAG,sBAAsB,EACwD,CAAA"}
@@ -10,7 +10,8 @@ export const createClientCollectionConfig = ({ collection, t })=>{
10
10
  const serverOnlyCollectionProperties = [
11
11
  'hooks',
12
12
  'access',
13
- 'endpoints'
13
+ 'endpoints',
14
+ 'custom'
14
15
  ];
15
16
  serverOnlyCollectionProperties.forEach((key)=>{
16
17
  if (key in sanitized) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/config/client.ts"],"sourcesContent":["import type { LivePreviewConfig, ServerOnlyLivePreviewProperties } from '../../config/types.js'\n\nexport type ServerOnlyCollectionProperties = keyof Pick<\n SanitizedCollectionConfig,\n 'access' | 'endpoints' | 'hooks'\n>\n\nexport type ServerOnlyCollectionAdminProperties = keyof Pick<\n SanitizedCollectionConfig['admin'],\n 'components' | 'hidden' | 'preview'\n>\n\nexport type ClientCollectionConfig = Omit<\n SanitizedCollectionConfig,\n 'admin' | 'fields' | ServerOnlyCollectionProperties\n> & {\n admin: Omit<\n SanitizedCollectionConfig['admin'],\n 'fields' | 'livePreview' | ServerOnlyCollectionAdminProperties\n > & {\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n }\n fields: ClientFieldConfig[]\n}\n\nimport type { TFunction } from '@payloadcms/translations'\n\nimport type { ClientFieldConfig } from '../../fields/config/client.js'\nimport type { SanitizedCollectionConfig } from './types.js'\n\nimport { createClientFieldConfigs } from '../../fields/config/client.js'\n\nexport const createClientCollectionConfig = ({\n collection,\n t,\n}: {\n collection: SanitizedCollectionConfig\n t: TFunction\n}) => {\n const sanitized = { ...collection }\n sanitized.fields = createClientFieldConfigs({ fields: sanitized.fields, t })\n\n const serverOnlyCollectionProperties: Partial<ServerOnlyCollectionProperties>[] = [\n 'hooks',\n 'access',\n 'endpoints',\n // `upload`\n // `admin`\n // are all handled separately\n ]\n\n serverOnlyCollectionProperties.forEach((key) => {\n if (key in sanitized) {\n delete sanitized[key]\n }\n })\n\n if ('upload' in sanitized && typeof sanitized.upload === 'object') {\n sanitized.upload = { ...sanitized.upload }\n delete sanitized.upload.handlers\n delete sanitized.upload.adminThumbnail\n delete sanitized.upload.externalFileHeaderFilter\n }\n\n if ('auth' in sanitized && typeof sanitized.auth === 'object') {\n sanitized.auth = { ...sanitized.auth }\n delete sanitized.auth.strategies\n delete sanitized.auth.forgotPassword\n delete sanitized.auth.verify\n }\n\n if (sanitized.labels) {\n Object.entries(sanitized.labels).forEach(([labelType, collectionLabel]) => {\n if (typeof collectionLabel === 'function') {\n sanitized.labels[labelType] = collectionLabel({ t })\n }\n })\n }\n\n if ('admin' in sanitized) {\n sanitized.admin = { ...sanitized.admin }\n\n const serverOnlyCollectionAdminProperties: Partial<ServerOnlyCollectionAdminProperties>[] = [\n 'components',\n 'hidden',\n 'preview',\n // `livePreview` is handled separately\n ]\n\n serverOnlyCollectionAdminProperties.forEach((key) => {\n if (key in sanitized.admin) {\n delete sanitized.admin[key]\n }\n })\n\n if ('livePreview' in sanitized.admin) {\n sanitized.admin.livePreview = { ...sanitized.admin.livePreview }\n delete sanitized.admin.livePreview.url\n }\n }\n\n return sanitized\n}\n\nexport const createClientCollectionConfigs = ({\n collections,\n t,\n}: {\n collections: SanitizedCollectionConfig[]\n t: TFunction\n}): ClientCollectionConfig[] =>\n collections.map((collection) => createClientCollectionConfig({ collection, t }))\n"],"names":["createClientFieldConfigs","createClientCollectionConfig","collection","t","sanitized","fields","serverOnlyCollectionProperties","forEach","key","upload","handlers","adminThumbnail","externalFileHeaderFilter","auth","strategies","forgotPassword","verify","labels","Object","entries","labelType","collectionLabel","admin","serverOnlyCollectionAdminProperties","livePreview","url","createClientCollectionConfigs","collections","map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AA8BA,SAASA,wBAAwB,QAAQ,gCAA+B;AAExE,OAAO,MAAMC,+BAA+B,CAAC,EAC3CC,UAAU,EACVC,CAAC,EAIF;IACC,MAAMC,YAAY;QAAE,GAAGF,UAAU;IAAC;IAClCE,UAAUC,MAAM,GAAGL,yBAAyB;QAAEK,QAAQD,UAAUC,MAAM;QAAEF;IAAE;IAE1E,MAAMG,iCAA4E;QAChF;QACA;QACA;KAID;IAEDA,+BAA+BC,OAAO,CAAC,CAACC;QACtC,IAAIA,OAAOJ,WAAW;YACpB,OAAOA,SAAS,CAACI,IAAI;QACvB;IACF;IAEA,IAAI,YAAYJ,aAAa,OAAOA,UAAUK,MAAM,KAAK,UAAU;QACjEL,UAAUK,MAAM,GAAG;YAAE,GAAGL,UAAUK,MAAM;QAAC;QACzC,OAAOL,UAAUK,MAAM,CAACC,QAAQ;QAChC,OAAON,UAAUK,MAAM,CAACE,cAAc;QACtC,OAAOP,UAAUK,MAAM,CAACG,wBAAwB;IAClD;IAEA,IAAI,UAAUR,aAAa,OAAOA,UAAUS,IAAI,KAAK,UAAU;QAC7DT,UAAUS,IAAI,GAAG;YAAE,GAAGT,UAAUS,IAAI;QAAC;QACrC,OAAOT,UAAUS,IAAI,CAACC,UAAU;QAChC,OAAOV,UAAUS,IAAI,CAACE,cAAc;QACpC,OAAOX,UAAUS,IAAI,CAACG,MAAM;IAC9B;IAEA,IAAIZ,UAAUa,MAAM,EAAE;QACpBC,OAAOC,OAAO,CAACf,UAAUa,MAAM,EAAEV,OAAO,CAAC,CAAC,CAACa,WAAWC,gBAAgB;YACpE,IAAI,OAAOA,oBAAoB,YAAY;gBACzCjB,UAAUa,MAAM,CAACG,UAAU,GAAGC,gBAAgB;oBAAElB;gBAAE;YACpD;QACF;IACF;IAEA,IAAI,WAAWC,WAAW;QACxBA,UAAUkB,KAAK,GAAG;YAAE,GAAGlB,UAAUkB,KAAK;QAAC;QAEvC,MAAMC,sCAAsF;YAC1F;YACA;YACA;SAED;QAEDA,oCAAoChB,OAAO,CAAC,CAACC;YAC3C,IAAIA,OAAOJ,UAAUkB,KAAK,EAAE;gBAC1B,OAAOlB,UAAUkB,KAAK,CAACd,IAAI;YAC7B;QACF;QAEA,IAAI,iBAAiBJ,UAAUkB,KAAK,EAAE;YACpClB,UAAUkB,KAAK,CAACE,WAAW,GAAG;gBAAE,GAAGpB,UAAUkB,KAAK,CAACE,WAAW;YAAC;YAC/D,OAAOpB,UAAUkB,KAAK,CAACE,WAAW,CAACC,GAAG;QACxC;IACF;IAEA,OAAOrB;AACT,EAAC;AAED,OAAO,MAAMsB,gCAAgC,CAAC,EAC5CC,WAAW,EACXxB,CAAC,EAIF,GACCwB,YAAYC,GAAG,CAAC,CAAC1B,aAAeD,6BAA6B;YAAEC;YAAYC;QAAE,IAAG"}
1
+ {"version":3,"sources":["../../../src/collections/config/client.ts"],"sourcesContent":["import type { LivePreviewConfig, ServerOnlyLivePreviewProperties } from '../../config/types.js'\n\nexport type ServerOnlyCollectionProperties = keyof Pick<\n SanitizedCollectionConfig,\n 'access' | 'custom' | 'endpoints' | 'hooks'\n>\n\nexport type ServerOnlyCollectionAdminProperties = keyof Pick<\n SanitizedCollectionConfig['admin'],\n 'components' | 'hidden' | 'preview'\n>\n\nexport type ClientCollectionConfig = Omit<\n SanitizedCollectionConfig,\n 'admin' | 'fields' | ServerOnlyCollectionProperties\n> & {\n admin: Omit<\n SanitizedCollectionConfig['admin'],\n 'fields' | 'livePreview' | ServerOnlyCollectionAdminProperties\n > & {\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n }\n fields: ClientFieldConfig[]\n}\n\nimport type { TFunction } from '@payloadcms/translations'\n\nimport type { ClientFieldConfig } from '../../fields/config/client.js'\nimport type { SanitizedCollectionConfig } from './types.js'\n\nimport { createClientFieldConfigs } from '../../fields/config/client.js'\n\nexport const createClientCollectionConfig = ({\n collection,\n t,\n}: {\n collection: SanitizedCollectionConfig\n t: TFunction\n}) => {\n const sanitized = { ...collection }\n sanitized.fields = createClientFieldConfigs({ fields: sanitized.fields, t })\n\n const serverOnlyCollectionProperties: Partial<ServerOnlyCollectionProperties>[] = [\n 'hooks',\n 'access',\n 'endpoints',\n 'custom',\n // `upload`\n // `admin`\n // are all handled separately\n ]\n\n serverOnlyCollectionProperties.forEach((key) => {\n if (key in sanitized) {\n delete sanitized[key]\n }\n })\n\n if ('upload' in sanitized && typeof sanitized.upload === 'object') {\n sanitized.upload = { ...sanitized.upload }\n delete sanitized.upload.handlers\n delete sanitized.upload.adminThumbnail\n delete sanitized.upload.externalFileHeaderFilter\n }\n\n if ('auth' in sanitized && typeof sanitized.auth === 'object') {\n sanitized.auth = { ...sanitized.auth }\n delete sanitized.auth.strategies\n delete sanitized.auth.forgotPassword\n delete sanitized.auth.verify\n }\n\n if (sanitized.labels) {\n Object.entries(sanitized.labels).forEach(([labelType, collectionLabel]) => {\n if (typeof collectionLabel === 'function') {\n sanitized.labels[labelType] = collectionLabel({ t })\n }\n })\n }\n\n if ('admin' in sanitized) {\n sanitized.admin = { ...sanitized.admin }\n\n const serverOnlyCollectionAdminProperties: Partial<ServerOnlyCollectionAdminProperties>[] = [\n 'components',\n 'hidden',\n 'preview',\n // `livePreview` is handled separately\n ]\n\n serverOnlyCollectionAdminProperties.forEach((key) => {\n if (key in sanitized.admin) {\n delete sanitized.admin[key]\n }\n })\n\n if ('livePreview' in sanitized.admin) {\n sanitized.admin.livePreview = { ...sanitized.admin.livePreview }\n delete sanitized.admin.livePreview.url\n }\n }\n\n return sanitized\n}\n\nexport const createClientCollectionConfigs = ({\n collections,\n t,\n}: {\n collections: SanitizedCollectionConfig[]\n t: TFunction\n}): ClientCollectionConfig[] =>\n collections.map((collection) => createClientCollectionConfig({ collection, t }))\n"],"names":["createClientFieldConfigs","createClientCollectionConfig","collection","t","sanitized","fields","serverOnlyCollectionProperties","forEach","key","upload","handlers","adminThumbnail","externalFileHeaderFilter","auth","strategies","forgotPassword","verify","labels","Object","entries","labelType","collectionLabel","admin","serverOnlyCollectionAdminProperties","livePreview","url","createClientCollectionConfigs","collections","map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AA8BA,SAASA,wBAAwB,QAAQ,gCAA+B;AAExE,OAAO,MAAMC,+BAA+B,CAAC,EAC3CC,UAAU,EACVC,CAAC,EAIF;IACC,MAAMC,YAAY;QAAE,GAAGF,UAAU;IAAC;IAClCE,UAAUC,MAAM,GAAGL,yBAAyB;QAAEK,QAAQD,UAAUC,MAAM;QAAEF;IAAE;IAE1E,MAAMG,iCAA4E;QAChF;QACA;QACA;QACA;KAID;IAEDA,+BAA+BC,OAAO,CAAC,CAACC;QACtC,IAAIA,OAAOJ,WAAW;YACpB,OAAOA,SAAS,CAACI,IAAI;QACvB;IACF;IAEA,IAAI,YAAYJ,aAAa,OAAOA,UAAUK,MAAM,KAAK,UAAU;QACjEL,UAAUK,MAAM,GAAG;YAAE,GAAGL,UAAUK,MAAM;QAAC;QACzC,OAAOL,UAAUK,MAAM,CAACC,QAAQ;QAChC,OAAON,UAAUK,MAAM,CAACE,cAAc;QACtC,OAAOP,UAAUK,MAAM,CAACG,wBAAwB;IAClD;IAEA,IAAI,UAAUR,aAAa,OAAOA,UAAUS,IAAI,KAAK,UAAU;QAC7DT,UAAUS,IAAI,GAAG;YAAE,GAAGT,UAAUS,IAAI;QAAC;QACrC,OAAOT,UAAUS,IAAI,CAACC,UAAU;QAChC,OAAOV,UAAUS,IAAI,CAACE,cAAc;QACpC,OAAOX,UAAUS,IAAI,CAACG,MAAM;IAC9B;IAEA,IAAIZ,UAAUa,MAAM,EAAE;QACpBC,OAAOC,OAAO,CAACf,UAAUa,MAAM,EAAEV,OAAO,CAAC,CAAC,CAACa,WAAWC,gBAAgB;YACpE,IAAI,OAAOA,oBAAoB,YAAY;gBACzCjB,UAAUa,MAAM,CAACG,UAAU,GAAGC,gBAAgB;oBAAElB;gBAAE;YACpD;QACF;IACF;IAEA,IAAI,WAAWC,WAAW;QACxBA,UAAUkB,KAAK,GAAG;YAAE,GAAGlB,UAAUkB,KAAK;QAAC;QAEvC,MAAMC,sCAAsF;YAC1F;YACA;YACA;SAED;QAEDA,oCAAoChB,OAAO,CAAC,CAACC;YAC3C,IAAIA,OAAOJ,UAAUkB,KAAK,EAAE;gBAC1B,OAAOlB,UAAUkB,KAAK,CAACd,IAAI;YAC7B;QACF;QAEA,IAAI,iBAAiBJ,UAAUkB,KAAK,EAAE;YACpClB,UAAUkB,KAAK,CAACE,WAAW,GAAG;gBAAE,GAAGpB,UAAUkB,KAAK,CAACE,WAAW;YAAC;YAC/D,OAAOpB,UAAUkB,KAAK,CAACE,WAAW,CAACC,GAAG;QACxC;IACF;IAEA,OAAOrB;AACT,EAAC;AAED,OAAO,MAAMsB,gCAAgC,CAAC,EAC5CC,WAAW,EACXxB,CAAC,EAIF,GACCwB,YAAYC,GAAG,CAAC,CAAC1B,aAAeD,6BAA6B;YAAEC;YAAYC;QAAE,IAAG"}
@@ -18,6 +18,7 @@ export declare const defaults: {
18
18
  };
19
19
  admin: {
20
20
  components: {};
21
+ custom: {};
21
22
  enableRichTextLink: boolean;
22
23
  enableRichTextRelationship: boolean;
23
24
  pagination: {
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/collections/config/defaults.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CpB,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;CAUxB,CAAA"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/collections/config/defaults.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CpB,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;CAUxB,CAAA"}
@@ -9,6 +9,7 @@ export const defaults = {
9
9
  },
10
10
  admin: {
11
11
  components: {},
12
+ custom: {},
12
13
  enableRichTextLink: true,
13
14
  enableRichTextRelationship: true,
14
15
  pagination: {