@latte-macchiat-io/latte-payload 1.0.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.
Files changed (253) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.env.example +29 -0
  3. package/.github/workflows/ci.yml +160 -0
  4. package/.github/workflows/publish.yml +126 -0
  5. package/.nvmrc +1 -0
  6. package/.prettierignore +2 -0
  7. package/.prettierrc +11 -0
  8. package/CHANGELOG.md +87 -0
  9. package/README.md +364 -0
  10. package/TESTING_AND_DOCUMENTATION_SETUP.md +348 -0
  11. package/dist/access/adminAccessOnly.d.ts +25 -0
  12. package/dist/access/adminAccessOnly.d.ts.map +1 -0
  13. package/dist/access/adminAccessOnly.js +11 -0
  14. package/dist/access/adminAccessOnly.js.map +1 -0
  15. package/dist/access/admins.d.ts +72 -0
  16. package/dist/access/admins.d.ts.map +1 -0
  17. package/dist/access/admins.js +76 -0
  18. package/dist/access/admins.js.map +1 -0
  19. package/dist/access/anyone.d.ts +35 -0
  20. package/dist/access/anyone.d.ts.map +1 -0
  21. package/dist/access/anyone.js +34 -0
  22. package/dist/access/anyone.js.map +1 -0
  23. package/dist/access/authenticated.d.ts +63 -0
  24. package/dist/access/authenticated.d.ts.map +1 -0
  25. package/dist/access/authenticated.js +68 -0
  26. package/dist/access/authenticated.js.map +1 -0
  27. package/dist/access/authenticatedAccessOnly.d.ts +13 -0
  28. package/dist/access/authenticatedAccessOnly.d.ts.map +1 -0
  29. package/dist/access/authenticatedAccessOnly.js +11 -0
  30. package/dist/access/authenticatedAccessOnly.js.map +1 -0
  31. package/dist/access/index.d.ts +7 -0
  32. package/dist/access/index.d.ts.map +1 -0
  33. package/dist/access/index.js +7 -0
  34. package/dist/access/index.js.map +1 -0
  35. package/dist/access/publicReadAuthenticatedAccess.d.ts +13 -0
  36. package/dist/access/publicReadAuthenticatedAccess.d.ts.map +1 -0
  37. package/dist/access/publicReadAuthenticatedAccess.js +12 -0
  38. package/dist/access/publicReadAuthenticatedAccess.js.map +1 -0
  39. package/dist/collections/ContactMessages/hooks/sendEmailNotification.d.ts +31 -0
  40. package/dist/collections/ContactMessages/hooks/sendEmailNotification.d.ts.map +1 -0
  41. package/dist/collections/ContactMessages/hooks/sendEmailNotification.js +29 -0
  42. package/dist/collections/ContactMessages/hooks/sendEmailNotification.js.map +1 -0
  43. package/dist/collections/ContactMessages/index.d.ts +27 -0
  44. package/dist/collections/ContactMessages/index.d.ts.map +1 -0
  45. package/dist/collections/ContactMessages/index.js +81 -0
  46. package/dist/collections/ContactMessages/index.js.map +1 -0
  47. package/dist/collections/EmailTemplates/index.d.ts +26 -0
  48. package/dist/collections/EmailTemplates/index.d.ts.map +1 -0
  49. package/dist/collections/EmailTemplates/index.js +74 -0
  50. package/dist/collections/EmailTemplates/index.js.map +1 -0
  51. package/dist/collections/Media/index.d.ts +3 -0
  52. package/dist/collections/Media/index.d.ts.map +1 -0
  53. package/dist/collections/Media/index.js +22 -0
  54. package/dist/collections/Media/index.js.map +1 -0
  55. package/dist/collections/QueuedEmails/components/HtmlViewer.d.ts +3 -0
  56. package/dist/collections/QueuedEmails/components/HtmlViewer.d.ts.map +1 -0
  57. package/dist/collections/QueuedEmails/components/HtmlViewer.js +11 -0
  58. package/dist/collections/QueuedEmails/components/HtmlViewer.js.map +1 -0
  59. package/dist/collections/QueuedEmails/components/RetryEmailButtons.d.ts +2 -0
  60. package/dist/collections/QueuedEmails/components/RetryEmailButtons.d.ts.map +1 -0
  61. package/dist/collections/QueuedEmails/components/RetryEmailButtons.js +79 -0
  62. package/dist/collections/QueuedEmails/components/RetryEmailButtons.js.map +1 -0
  63. package/dist/collections/QueuedEmails/index.d.ts +3 -0
  64. package/dist/collections/QueuedEmails/index.d.ts.map +1 -0
  65. package/dist/collections/QueuedEmails/index.js +245 -0
  66. package/dist/collections/QueuedEmails/index.js.map +1 -0
  67. package/dist/collections/Users/auth-emails/forgot-password-email.d.ts +51 -0
  68. package/dist/collections/Users/auth-emails/forgot-password-email.d.ts.map +1 -0
  69. package/dist/collections/Users/auth-emails/forgot-password-email.js +90 -0
  70. package/dist/collections/Users/auth-emails/forgot-password-email.js.map +1 -0
  71. package/dist/collections/Users/auth-emails/verify-email.d.ts +51 -0
  72. package/dist/collections/Users/auth-emails/verify-email.d.ts.map +1 -0
  73. package/dist/collections/Users/auth-emails/verify-email.js +80 -0
  74. package/dist/collections/Users/auth-emails/verify-email.js.map +1 -0
  75. package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.d.ts +3 -0
  76. package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.d.ts.map +1 -0
  77. package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.js +19 -0
  78. package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.js.map +1 -0
  79. package/dist/collections/Users/index.d.ts +76 -0
  80. package/dist/collections/Users/index.d.ts.map +1 -0
  81. package/dist/collections/Users/index.js +116 -0
  82. package/dist/collections/Users/index.js.map +1 -0
  83. package/dist/collections/index.d.ts +10 -0
  84. package/dist/collections/index.d.ts.map +1 -0
  85. package/dist/collections/index.js +14 -0
  86. package/dist/collections/index.js.map +1 -0
  87. package/dist/components/index.d.ts +3 -0
  88. package/dist/components/index.d.ts.map +1 -0
  89. package/dist/components/index.js +4 -0
  90. package/dist/components/index.js.map +1 -0
  91. package/dist/forms/states.d.ts +8 -0
  92. package/dist/forms/states.d.ts.map +1 -0
  93. package/dist/forms/states.js +16 -0
  94. package/dist/forms/states.js.map +1 -0
  95. package/dist/forms/translate-errors.d.ts +8 -0
  96. package/dist/forms/translate-errors.d.ts.map +1 -0
  97. package/dist/forms/translate-errors.js +11 -0
  98. package/dist/forms/translate-errors.js.map +1 -0
  99. package/dist/forms/validators.d.ts +10 -0
  100. package/dist/forms/validators.d.ts.map +1 -0
  101. package/dist/forms/validators.js +23 -0
  102. package/dist/forms/validators.js.map +1 -0
  103. package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.d.ts +2 -0
  104. package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.d.ts.map +1 -0
  105. package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.js +5 -0
  106. package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.js.map +1 -0
  107. package/dist/globals/PrivacyPolicy/index.d.ts +3 -0
  108. package/dist/globals/PrivacyPolicy/index.d.ts.map +1 -0
  109. package/dist/globals/PrivacyPolicy/index.js +31 -0
  110. package/dist/globals/PrivacyPolicy/index.js.map +1 -0
  111. package/dist/globals/TermsOfUse/hooks/revalidate-cache.d.ts +2 -0
  112. package/dist/globals/TermsOfUse/hooks/revalidate-cache.d.ts.map +1 -0
  113. package/dist/globals/TermsOfUse/hooks/revalidate-cache.js +5 -0
  114. package/dist/globals/TermsOfUse/hooks/revalidate-cache.js.map +1 -0
  115. package/dist/globals/TermsOfUse/index.d.ts +3 -0
  116. package/dist/globals/TermsOfUse/index.d.ts.map +1 -0
  117. package/dist/globals/TermsOfUse/index.js +31 -0
  118. package/dist/globals/TermsOfUse/index.js.map +1 -0
  119. package/dist/globals/index.d.ts +3 -0
  120. package/dist/globals/index.d.ts.map +1 -0
  121. package/dist/globals/index.js +3 -0
  122. package/dist/globals/index.js.map +1 -0
  123. package/dist/index.d.ts +13 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +20 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/tasks/index.d.ts +2 -0
  128. package/dist/tasks/index.d.ts.map +1 -0
  129. package/dist/tasks/index.js +2 -0
  130. package/dist/tasks/index.js.map +1 -0
  131. package/dist/tasks/process-email-queue.d.ts +46 -0
  132. package/dist/tasks/process-email-queue.d.ts.map +1 -0
  133. package/dist/tasks/process-email-queue.js +199 -0
  134. package/dist/tasks/process-email-queue.js.map +1 -0
  135. package/dist/types/index.d.ts +14 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +2 -0
  138. package/dist/types/index.js.map +1 -0
  139. package/dist/types/slug.d.ts +2 -0
  140. package/dist/types/slug.d.ts.map +1 -0
  141. package/dist/types/slug.js +11 -0
  142. package/dist/types/slug.js.map +1 -0
  143. package/dist/utils/database-dates.d.ts +3 -0
  144. package/dist/utils/database-dates.d.ts.map +1 -0
  145. package/dist/utils/database-dates.js +6 -0
  146. package/dist/utils/database-dates.js.map +1 -0
  147. package/dist/utils/email/generate-email-html.d.ts +23 -0
  148. package/dist/utils/email/generate-email-html.d.ts.map +1 -0
  149. package/dist/utils/email/generate-email-html.js +42 -0
  150. package/dist/utils/email/generate-email-html.js.map +1 -0
  151. package/dist/utils/email/get-email-template.d.ts +8 -0
  152. package/dist/utils/email/get-email-template.d.ts.map +1 -0
  153. package/dist/utils/email/get-email-template.js +14 -0
  154. package/dist/utils/email/get-email-template.js.map +1 -0
  155. package/dist/utils/email/index.d.ts +4 -0
  156. package/dist/utils/email/index.d.ts.map +1 -0
  157. package/dist/utils/email/index.js +4 -0
  158. package/dist/utils/email/index.js.map +1 -0
  159. package/dist/utils/email/queue-email.d.ts +29 -0
  160. package/dist/utils/email/queue-email.d.ts.map +1 -0
  161. package/dist/utils/email/queue-email.js +79 -0
  162. package/dist/utils/email/queue-email.js.map +1 -0
  163. package/dist/utils/get-global.d.ts +6 -0
  164. package/dist/utils/get-global.d.ts.map +1 -0
  165. package/dist/utils/get-global.js +20 -0
  166. package/dist/utils/get-global.js.map +1 -0
  167. package/dist/utils/id-from-payload.d.ts +4 -0
  168. package/dist/utils/id-from-payload.d.ts.map +1 -0
  169. package/dist/utils/id-from-payload.js +10 -0
  170. package/dist/utils/id-from-payload.js.map +1 -0
  171. package/dist/utils/index.d.ts +4 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +4 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/migrations.d.ts +2 -0
  176. package/dist/utils/migrations.d.ts.map +1 -0
  177. package/dist/utils/migrations.js +18 -0
  178. package/dist/utils/migrations.js.map +1 -0
  179. package/dist/utils/payload-client.d.ts +10 -0
  180. package/dist/utils/payload-client.d.ts.map +1 -0
  181. package/dist/utils/payload-client.js +14 -0
  182. package/dist/utils/payload-client.js.map +1 -0
  183. package/dist/utils/slugify.d.ts +8 -0
  184. package/dist/utils/slugify.d.ts.map +1 -0
  185. package/dist/utils/slugify.js +15 -0
  186. package/dist/utils/slugify.js.map +1 -0
  187. package/eslint.config.mjs +90 -0
  188. package/package.json +139 -0
  189. package/pnpm-workspace.yaml +4 -0
  190. package/src/access/adminAccessOnly.ts +13 -0
  191. package/src/access/admins.ts +78 -0
  192. package/src/access/anyone.ts +35 -0
  193. package/src/access/authenticated.ts +70 -0
  194. package/src/access/authenticatedAccessOnly.ts +13 -0
  195. package/src/access/index.ts +6 -0
  196. package/src/access/publicReadAuthenticatedAccess.ts +14 -0
  197. package/src/collections/ContactMessages/hooks/sendEmailNotification.ts +58 -0
  198. package/src/collections/ContactMessages/index.ts +100 -0
  199. package/src/collections/EmailTemplates/index.ts +89 -0
  200. package/src/collections/Media/index.ts +24 -0
  201. package/src/collections/QueuedEmails/components/HtmlViewer.tsx +16 -0
  202. package/src/collections/QueuedEmails/components/RetryEmailButtons.tsx +115 -0
  203. package/src/collections/QueuedEmails/index.ts +246 -0
  204. package/src/collections/Users/auth-emails/forgot-password-email.ts +135 -0
  205. package/src/collections/Users/auth-emails/verify-email.ts +123 -0
  206. package/src/collections/Users/hooks/ensureFirstUserIsAdmin.ts +22 -0
  207. package/src/collections/Users/index.ts +201 -0
  208. package/src/collections/index.ts +23 -0
  209. package/src/components/index.ts +3 -0
  210. package/src/forms/states.ts +23 -0
  211. package/src/forms/translate-errors.ts +13 -0
  212. package/src/forms/validators.ts +33 -0
  213. package/src/globals/PrivacyPolicy/hooks/revalidate-cache.ts +5 -0
  214. package/src/globals/PrivacyPolicy/index.ts +33 -0
  215. package/src/globals/TermsOfUse/hooks/revalidate-cache.ts +5 -0
  216. package/src/globals/TermsOfUse/index.ts +33 -0
  217. package/src/globals/index.ts +2 -0
  218. package/src/index.ts +26 -0
  219. package/src/tasks/index.ts +7 -0
  220. package/src/tasks/process-email-queue.ts +261 -0
  221. package/src/types/index.ts +15 -0
  222. package/src/types/slug.ts +11 -0
  223. package/src/utils/database-dates.ts +6 -0
  224. package/src/utils/email/generate-email-html.ts +63 -0
  225. package/src/utils/email/get-email-template.ts +18 -0
  226. package/src/utils/email/index.ts +3 -0
  227. package/src/utils/email/queue-email.ts +109 -0
  228. package/src/utils/get-global.ts +25 -0
  229. package/src/utils/id-from-payload.ts +11 -0
  230. package/src/utils/index.ts +3 -0
  231. package/src/utils/migrations.ts +18 -0
  232. package/src/utils/payload-client.ts +16 -0
  233. package/src/utils/slugify.ts +21 -0
  234. package/tests/fixtures/email-template.html +58 -0
  235. package/tests/fixtures/sample-data.ts +56 -0
  236. package/tests/helpers/create-test-user.ts +37 -0
  237. package/tests/helpers/init-payload.ts +59 -0
  238. package/tests/setup.integration.ts +9 -0
  239. package/tests/setup.ts +4 -0
  240. package/tests/unit/access/adminAccessOnly.spec.ts +117 -0
  241. package/tests/unit/access/admins.spec.ts +68 -0
  242. package/tests/unit/access/anyone.spec.ts +28 -0
  243. package/tests/unit/access/authenticated.spec.ts +53 -0
  244. package/tests/unit/access/authenticatedAccessOnly.spec.ts +112 -0
  245. package/tests/unit/access/publicReadAuthenticatedAccess.spec.ts +112 -0
  246. package/tests/unit/forms/validators.spec.ts +348 -0
  247. package/tests/unit/utils/database-dates.spec.ts +97 -0
  248. package/tests/unit/utils/id-from-payload.spec.ts +142 -0
  249. package/tests/unit/utils/slugify.spec.ts +185 -0
  250. package/tsconfig.json +31 -0
  251. package/typedoc.json +40 -0
  252. package/vitest.config.ts +31 -0
  253. package/vitest.integration.config.ts +27 -0
@@ -0,0 +1,51 @@
1
+ import { PayloadRequest, TypedUser } from 'payload';
2
+ import type { Locale } from '../../../types';
3
+ export interface ForgotPasswordEmailConfig {
4
+ /**
5
+ * Default locale to use if user has no locale set
6
+ * @default 'en'
7
+ */
8
+ defaultLocale?: Locale;
9
+ /**
10
+ * Function to generate the password reset URL
11
+ * @param token - The reset token
12
+ * @param user - The user object
13
+ * @returns The full password reset URL
14
+ */
15
+ generateResetUrl?: (token: string, user: TypedUser) => Promise<string> | string;
16
+ /**
17
+ * Timezone for logging email send time
18
+ * @default 'Europe/Brussels'
19
+ */
20
+ timezone?: string;
21
+ }
22
+ /**
23
+ * Create forgot password email HTML generator with custom configuration
24
+ */
25
+ export declare function createForgotPasswordEmailGenerator(config?: ForgotPasswordEmailConfig): (args?: {
26
+ req?: PayloadRequest;
27
+ token?: string;
28
+ user?: TypedUser;
29
+ }) => Promise<string>;
30
+ /**
31
+ * Create forgot password email subject generator with custom configuration
32
+ */
33
+ export declare function createForgotPasswordEmailSubjectGenerator(config?: ForgotPasswordEmailConfig): (args?: {
34
+ req?: PayloadRequest;
35
+ token?: string;
36
+ user?: TypedUser;
37
+ }) => Promise<string>;
38
+ /**
39
+ * Default forgot password email generators
40
+ */
41
+ export declare const generateForgotPasswordEmailHtmlFromTemplate: (args?: {
42
+ req?: PayloadRequest;
43
+ token?: string;
44
+ user?: TypedUser;
45
+ }) => Promise<string>;
46
+ export declare const generateForgotPasswordEmailSubjectFromTemplate: (args?: {
47
+ req?: PayloadRequest;
48
+ token?: string;
49
+ user?: TypedUser;
50
+ }) => Promise<string>;
51
+ //# sourceMappingURL=forgot-password-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgot-password-email.d.ts","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/forgot-password-email.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKhE,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAEhF;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,CAAC,EAAE,yBAAyB,IAIjB,OAAO;IACvE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CAAC,CAsDpB;AAED;;GAEG;AACH,wBAAgB,yCAAyC,CAAC,MAAM,CAAC,EAAE,yBAAyB,IAGrB,OAAO;IAC1E,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CAAC,CAqBpB;AAED;;GAEG;AACH,eAAO,MAAM,2CAA2C,UAhGmB;IACvE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CA4F2E,CAAC;AAChG,eAAO,MAAM,8CAA8C,UA/BmB;IAC1E,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CA2BqF,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { TZDate } from '@date-fns/tz';
2
+ import { headers } from 'next/headers';
3
+ import { generateEmailHtmlFromTemplate, toDatabaseTZDate } from '../../../utils';
4
+ const emailCode = 'password-lost';
5
+ /**
6
+ * Create forgot password email HTML generator with custom configuration
7
+ */
8
+ export function createForgotPasswordEmailGenerator(config) {
9
+ const defaultLocale = config?.defaultLocale || 'en';
10
+ const timezone = config?.timezone || 'Europe/Brussels';
11
+ return async function generateForgotPasswordEmailHtmlFromTemplate(args) {
12
+ if (!args || !args.req || !args.token || !args.user) {
13
+ throw new Error(`generateForgotPasswordEmailHtmlFromTemplate > Missing required parameters`);
14
+ }
15
+ const payload = args.req.payload;
16
+ // Generate reset URL
17
+ let resetUrl;
18
+ if (config?.generateResetUrl) {
19
+ resetUrl = await config.generateResetUrl(args.token, args.user);
20
+ }
21
+ else {
22
+ // Default URL generation
23
+ const headersList = await headers();
24
+ const requestDomain = headersList.get('host') || 'localhost:3000';
25
+ const protocol = requestDomain.includes('localhost') ? 'http' : 'https';
26
+ resetUrl = `${protocol}://${requestDomain}/reset-password?token=${args.token}`;
27
+ }
28
+ const emailContent = await generateEmailHtmlFromTemplate({
29
+ payload: payload,
30
+ emailCode: emailCode,
31
+ locale: args.user.locale || defaultLocale,
32
+ variables: {
33
+ name: args.user.name || '',
34
+ token: args.token,
35
+ url: resetUrl,
36
+ },
37
+ });
38
+ console.log(`Sending email to ${args.user.email} with subject ${emailContent?.subject}`);
39
+ // Log the email in queued-emails as 'sent' for tracking (Payload sends this directly)
40
+ try {
41
+ await payload.create({
42
+ collection: 'queued-emails',
43
+ data: {
44
+ status: 'sent',
45
+ code: emailCode,
46
+ recipient: args.user.email || '',
47
+ subject: emailContent?.subject || '',
48
+ htmlBody: emailContent?.body || '',
49
+ attemptCount: 1,
50
+ maxAttempts: 1,
51
+ sentAt: toDatabaseTZDate(TZDate.tz(timezone)),
52
+ // No idempotencyKey to allow multiple password reset emails
53
+ },
54
+ });
55
+ }
56
+ catch (error) {
57
+ payload.logger.error(`Error logging sent email in queued-emails: ${error}`);
58
+ }
59
+ return emailContent?.body || `Template ${emailCode} not found`;
60
+ };
61
+ }
62
+ /**
63
+ * Create forgot password email subject generator with custom configuration
64
+ */
65
+ export function createForgotPasswordEmailSubjectGenerator(config) {
66
+ const defaultLocale = config?.defaultLocale || 'en';
67
+ return async function generateForgotPasswordEmailSubjectFromTemplate(args) {
68
+ if (!args || !args.req || !args.user) {
69
+ throw new Error(`generateForgotPasswordEmailSubjectFromTemplate > Missing required parameters`);
70
+ }
71
+ const payload = args.req.payload;
72
+ const emailContentTemplateDocs = await payload.find({
73
+ collection: 'email-templates',
74
+ where: { code: { equals: emailCode } },
75
+ limit: 1,
76
+ locale: args.user.locale || defaultLocale,
77
+ });
78
+ if (!emailContentTemplateDocs || emailContentTemplateDocs.totalDocs === 0) {
79
+ payload.logger.error(`Email template with code ${emailCode} not found`);
80
+ return `Template "${emailCode}" not found`;
81
+ }
82
+ return emailContentTemplateDocs.docs[0]?.subject || `Template "${emailCode}" not found`;
83
+ };
84
+ }
85
+ /**
86
+ * Default forgot password email generators
87
+ */
88
+ export const generateForgotPasswordEmailHtmlFromTemplate = createForgotPasswordEmailGenerator();
89
+ export const generateForgotPasswordEmailSubjectFromTemplate = createForgotPasswordEmailSubjectGenerator();
90
+ //# sourceMappingURL=forgot-password-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgot-password-email.js","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/forgot-password-email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { PayloadRequest, TypedUser } from 'payload';
2
+ import type { Locale } from '../../../types';
3
+ export interface VerifyEmailConfig {
4
+ /**
5
+ * Default locale to use if user has no locale set
6
+ * @default 'en'
7
+ */
8
+ defaultLocale?: Locale;
9
+ /**
10
+ * Function to generate the verification URL
11
+ * @param token - The verification token
12
+ * @param user - The user object
13
+ * @returns The full verification URL
14
+ */
15
+ generateVerifyUrl?: (token: string, user: any) => Promise<string> | string;
16
+ /**
17
+ * Timezone for logging email send time
18
+ * @default 'Europe/Brussels'
19
+ */
20
+ timezone?: string;
21
+ }
22
+ /**
23
+ * Create verify email HTML generator with custom configuration
24
+ */
25
+ export declare function createVerifyEmailGenerator(config?: VerifyEmailConfig): ({ req, token, user, }: {
26
+ req: PayloadRequest;
27
+ token: string;
28
+ user: TypedUser;
29
+ }) => Promise<string>;
30
+ /**
31
+ * Create verify email subject generator with custom configuration
32
+ */
33
+ export declare function createVerifyEmailSubjectGenerator(config?: VerifyEmailConfig): ({ req, user }: {
34
+ req: PayloadRequest;
35
+ token: string;
36
+ user: any;
37
+ }) => Promise<string>;
38
+ /**
39
+ * Default verify email generators
40
+ */
41
+ export declare const generateVerifyEmailHtmlFromTemplate: ({ req, token, user, }: {
42
+ req: PayloadRequest;
43
+ token: string;
44
+ user: TypedUser;
45
+ }) => Promise<string>;
46
+ export declare const generateVerifyEmailSubjectFromTemplate: ({ req, user }: {
47
+ req: PayloadRequest;
48
+ token: string;
49
+ user: any;
50
+ }) => Promise<string>;
51
+ //# sourceMappingURL=verify-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-email.d.ts","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/verify-email.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKhE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IAEH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAE3E;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,CAAC,EAAE,iBAAiB,IAIT,uBAIvD;IACD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,KAAG,OAAO,CAAC,MAAM,CAAC,CAkDpB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,CAAC,EAAE,iBAAiB,IAIb,eAAe;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CAAC,CAWhJ;AAED;;GAEG;AACH,eAAO,MAAM,mCAAmC,0BA/E3C;IACD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,KAAG,OAAO,CAAC,MAAM,CA2E2D,CAAC;AAChF,eAAO,MAAM,sCAAsC,kBAjB2B;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CAiBvD,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { TZDate } from '@date-fns/tz';
2
+ import { headers } from 'next/headers';
3
+ import { generateEmailHtmlFromTemplate, getEmailTemplateByCode, toDatabaseTZDate } from '../../../utils';
4
+ const emailCode = 'verify-email';
5
+ /**
6
+ * Create verify email HTML generator with custom configuration
7
+ */
8
+ export function createVerifyEmailGenerator(config) {
9
+ const defaultLocale = config?.defaultLocale || 'en';
10
+ const timezone = config?.timezone || 'Europe/Brussels';
11
+ return async function generateVerifyEmailHtmlFromTemplate({ req, token, user, }) {
12
+ const payload = req.payload;
13
+ // Generate verification URL
14
+ let verifyUrl;
15
+ if (config?.generateVerifyUrl) {
16
+ verifyUrl = await config.generateVerifyUrl(token, user);
17
+ }
18
+ else {
19
+ // Default URL generation
20
+ const headersList = await headers();
21
+ const requestDomain = headersList.get('host') || 'localhost:3000';
22
+ const protocol = requestDomain.includes('localhost') ? 'http' : 'https';
23
+ verifyUrl = `${protocol}://${requestDomain}/verify-email?token=${token}`;
24
+ }
25
+ const emailContent = await generateEmailHtmlFromTemplate({
26
+ payload: payload,
27
+ emailCode: emailCode,
28
+ locale: user.locale || defaultLocale,
29
+ variables: {
30
+ name: user.name || '',
31
+ token: token,
32
+ url: verifyUrl,
33
+ },
34
+ });
35
+ payload.logger.debug(`Sending email to ${user.email} with subject ${emailContent?.subject}`);
36
+ // Log the email in queued-emails as 'sent' for tracking (Payload sends this directly)
37
+ try {
38
+ await payload.create({
39
+ collection: 'queued-emails',
40
+ data: {
41
+ idempotencyKey: `${emailCode}-${user.id}`,
42
+ status: 'sent',
43
+ code: emailCode,
44
+ recipient: user.email || '',
45
+ subject: emailContent?.subject || '',
46
+ htmlBody: emailContent?.body || '',
47
+ attemptCount: 1,
48
+ maxAttempts: 1,
49
+ sentAt: toDatabaseTZDate(TZDate.tz(timezone)),
50
+ },
51
+ });
52
+ }
53
+ catch (error) {
54
+ payload.logger.error(`Error logging sent email in queued-emails: ${error}`);
55
+ }
56
+ return emailContent?.body || 'Template "verify-email" not found';
57
+ };
58
+ }
59
+ /**
60
+ * Create verify email subject generator with custom configuration
61
+ */
62
+ export function createVerifyEmailSubjectGenerator(config) {
63
+ const defaultLocale = config?.defaultLocale || 'en';
64
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
+ return async function generateVerifyEmailSubjectFromTemplate({ req, user }) {
66
+ const payload = req.payload;
67
+ const template = await getEmailTemplateByCode({
68
+ locale: user.locale || defaultLocale,
69
+ code: emailCode,
70
+ payload,
71
+ });
72
+ return template?.subject || `Template "${emailCode}" not found`;
73
+ };
74
+ }
75
+ /**
76
+ * Default verify email generators
77
+ */
78
+ export const generateVerifyEmailHtmlFromTemplate = createVerifyEmailGenerator();
79
+ export const generateVerifyEmailSubjectFromTemplate = createVerifyEmailSubjectGenerator();
80
+ //# sourceMappingURL=verify-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-email.js","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/verify-email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FieldHook } from 'payload';
2
+ export declare const ensureFirstUserIsAdmin: FieldHook<any>;
3
+ //# sourceMappingURL=ensureFirstUserIsAdmin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureFirstUserIsAdmin.d.ts","sourceRoot":"","sources":["../../../../src/collections/Users/hooks/ensureFirstUserIsAdmin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AASzC,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,GAAG,CAYjD,CAAC"}
@@ -0,0 +1,19 @@
1
+ // ensure the first user created is an admin
2
+ // 1. lookup a single user on create as succinctly as possible
3
+ // 2. if there are no users found, append `admin` to the roles array
4
+ // access control is already handled by this fields `access` property
5
+ // it ensures that only admins can create and update the `roles` field
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ export const ensureFirstUserIsAdmin = async ({ req, operation, value }) => {
8
+ if (operation === 'create') {
9
+ const users = await req.payload.find({ collection: 'users', limit: 0, depth: 0 });
10
+ if (users.totalDocs === 0) {
11
+ // if `admin` not in array of values, add it
12
+ if (!(value || []).includes('admin')) {
13
+ return [...(value || []), 'admin'];
14
+ }
15
+ }
16
+ }
17
+ return value;
18
+ };
19
+ //# sourceMappingURL=ensureFirstUserIsAdmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureFirstUserIsAdmin.js","sourceRoot":"","sources":["../../../../src/collections/Users/hooks/ensureFirstUserIsAdmin.ts"],"names":[],"mappings":"AAEA,4CAA4C;AAC5C,8DAA8D;AAC9D,oEAAoE;AACpE,qEAAqE;AACrE,sEAAsE;AAEtE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAmB,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;IACxF,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YAC1B,4CAA4C;YAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ import { createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, type ForgotPasswordEmailConfig } from './auth-emails/forgot-password-email';
3
+ import { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, type VerifyEmailConfig } from './auth-emails/verify-email';
4
+ import type { Locale } from '../../types';
5
+ export interface UsersCollectionConfig {
6
+ /**
7
+ * User roles
8
+ * @default ['admin', 'user']
9
+ */
10
+ roles?: Array<{
11
+ label: {
12
+ fr: string;
13
+ nl: string;
14
+ en: string;
15
+ };
16
+ value: string;
17
+ }>;
18
+ /**
19
+ * Available locales for users
20
+ * @default [{ label: { fr: 'Anglais', nl: 'Engels', en: 'English' }, value: 'en' }, ...]
21
+ */
22
+ locales?: Array<{
23
+ label: {
24
+ fr: string;
25
+ nl: string;
26
+ en: string;
27
+ };
28
+ value: Locale;
29
+ }>;
30
+ /**
31
+ * Default locale
32
+ * @default 'en'
33
+ */
34
+ defaultLocale?: Locale;
35
+ /**
36
+ * Token expiration in seconds
37
+ * @default 60 * 60 * 24 * 365 (1 year)
38
+ */
39
+ tokenExpiration?: number;
40
+ /**
41
+ * Maximum login attempts before lockout
42
+ * @default 10
43
+ */
44
+ maxLoginAttempts?: number;
45
+ /**
46
+ * Lockout time in milliseconds
47
+ * @default 1000 * 60 * 10 (10 minutes)
48
+ */
49
+ lockTime?: number;
50
+ /**
51
+ * Forgot password expiration in milliseconds
52
+ * @default 1000 * 60 * 60 * 24 * 10 (10 days)
53
+ */
54
+ forgotPasswordExpiration?: number;
55
+ /**
56
+ * Configuration for verify email
57
+ */
58
+ verifyEmailConfig?: VerifyEmailConfig;
59
+ /**
60
+ * Configuration for forgot password email
61
+ */
62
+ forgotPasswordEmailConfig?: ForgotPasswordEmailConfig;
63
+ }
64
+ /**
65
+ * Create Users collection with optional configuration
66
+ *
67
+ * @param config - Optional configuration for the Users collection
68
+ * @returns CollectionConfig for Users
69
+ */
70
+ export declare function createUsersCollection(config?: UsersCollectionConfig): CollectionConfig;
71
+ /**
72
+ * Default Users collection
73
+ */
74
+ export declare const Users: CollectionConfig;
75
+ export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, type VerifyEmailConfig, type ForgotPasswordEmailConfig, };
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/Users/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EACL,kCAAkC,EAClC,yCAAyC,EACzC,KAAK,yBAAyB,EAG/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EAGjC,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEhF;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElF;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAEtC;;OAEG;IACH,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,gBAAgB,CAwGtF;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,kBAA0B,CAAC;AAG7C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,EACzC,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, generateForgotPasswordEmailHtmlFromTemplate, generateForgotPasswordEmailSubjectFromTemplate, } from './auth-emails/forgot-password-email';
2
+ import { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, generateVerifyEmailHtmlFromTemplate, generateVerifyEmailSubjectFromTemplate, } from './auth-emails/verify-email';
3
+ import { ensureFirstUserIsAdmin } from './hooks/ensureFirstUserIsAdmin';
4
+ import { adminsFieldLevel } from '../../access/admins';
5
+ import { authenticatedAccessOnly } from '../../access/authenticatedAccessOnly';
6
+ /**
7
+ * Create Users collection with optional configuration
8
+ *
9
+ * @param config - Optional configuration for the Users collection
10
+ * @returns CollectionConfig for Users
11
+ */
12
+ export function createUsersCollection(config) {
13
+ const roles = config?.roles || [
14
+ {
15
+ label: { fr: 'Administrateur', nl: 'Beheerder', en: 'Admin' },
16
+ value: 'admin',
17
+ },
18
+ {
19
+ label: { fr: 'User', nl: 'Gebruiker', en: 'User' },
20
+ value: 'user',
21
+ },
22
+ ];
23
+ const locales = config?.locales || [
24
+ {
25
+ label: { fr: 'Anglais', nl: 'Engels', en: 'English' },
26
+ value: 'en',
27
+ },
28
+ {
29
+ label: { fr: 'Français', nl: 'Frans', en: 'French' },
30
+ value: 'fr',
31
+ },
32
+ {
33
+ label: { fr: 'Néerlandais', nl: 'Nederlands', en: 'Dutch' },
34
+ value: 'nl',
35
+ },
36
+ ];
37
+ return {
38
+ slug: 'users',
39
+ labels: {
40
+ singular: { fr: 'Utilisateur', en: 'User', nl: 'Gebruiker' },
41
+ plural: { fr: 'Utilisateurs', en: 'Users', nl: 'Gebruikers' },
42
+ },
43
+ admin: {
44
+ useAsTitle: 'email',
45
+ hideAPIURL: true,
46
+ group: { fr: 'Utilisateurs', nl: 'Gebruikers', en: 'Users' },
47
+ },
48
+ access: authenticatedAccessOnly,
49
+ auth: {
50
+ tokenExpiration: config?.tokenExpiration ?? 60 * 60 * 24 * 365, // In seconds, 1 year
51
+ maxLoginAttempts: config?.maxLoginAttempts ?? 10,
52
+ lockTime: config?.lockTime ?? 1000 * 60 * 10, // In milliseconds, 10 minutes
53
+ verify: {
54
+ generateEmailHTML: config?.verifyEmailConfig ? createVerifyEmailGenerator(config.verifyEmailConfig) : generateVerifyEmailHtmlFromTemplate,
55
+ generateEmailSubject: config?.verifyEmailConfig
56
+ ? createVerifyEmailSubjectGenerator(config.verifyEmailConfig)
57
+ : generateVerifyEmailSubjectFromTemplate,
58
+ },
59
+ forgotPassword: {
60
+ expiration: config?.forgotPasswordExpiration ?? 1000 * 60 * 60 * 24 * 10, // In milliseconds, 10 days
61
+ generateEmailHTML: config?.forgotPasswordEmailConfig
62
+ ? createForgotPasswordEmailGenerator(config.forgotPasswordEmailConfig)
63
+ : generateForgotPasswordEmailHtmlFromTemplate,
64
+ generateEmailSubject: config?.forgotPasswordEmailConfig
65
+ ? createForgotPasswordEmailSubjectGenerator(config.forgotPasswordEmailConfig)
66
+ : generateForgotPasswordEmailSubjectFromTemplate,
67
+ },
68
+ },
69
+ fields: [
70
+ // Email added by default
71
+ // Add more fields as needed
72
+ {
73
+ type: 'row',
74
+ fields: [
75
+ {
76
+ name: 'name',
77
+ label: { fr: 'Nom', nl: 'Naam', en: 'Name' },
78
+ type: 'text',
79
+ required: false,
80
+ },
81
+ {
82
+ name: 'locale',
83
+ label: { fr: 'Langue', nl: 'Taal', en: 'Language' },
84
+ type: 'select',
85
+ hasMany: false,
86
+ defaultValue: config?.defaultLocale || 'en',
87
+ options: locales,
88
+ },
89
+ ],
90
+ },
91
+ {
92
+ name: 'roles',
93
+ label: { fr: 'Rôles', nl: 'Rollen', en: 'Roles' },
94
+ type: 'select',
95
+ hasMany: true,
96
+ defaultValue: ['user'],
97
+ options: roles,
98
+ hooks: {
99
+ beforeChange: [ensureFirstUserIsAdmin],
100
+ },
101
+ access: {
102
+ read: adminsFieldLevel,
103
+ create: adminsFieldLevel,
104
+ update: adminsFieldLevel,
105
+ },
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ /**
111
+ * Default Users collection
112
+ */
113
+ export const Users = createUsersCollection();
114
+ // Re-export auth email generators for customization
115
+ export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, };
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collections/Users/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kCAAkC,EAClC,yCAAyC,EAEzC,2CAA2C,EAC3C,8CAA8C,GAC/C,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,mCAAmC,EACnC,sCAAsC,GAEvC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAyD/E;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI;QAC7B;YACE,KAAK,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE;YAC7D,KAAK,EAAE,OAAO;SACf;QACD;YACE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE;YAClD,KAAK,EAAE,MAAM;SACd;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI;QACjC;YACE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE;YACrD,KAAK,EAAE,IAAc;SACtB;QACD;YACE,KAAK,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE;YACpD,KAAK,EAAE,IAAc;SACtB;QACD;YACE,KAAK,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE;YAC3D,KAAK,EAAE,IAAc;SACtB;KACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE;YACN,QAAQ,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE;YAC5D,MAAM,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE;SAC9D;QACD,KAAK,EAAE;YACL,UAAU,EAAE,OAAO;YACnB,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE;SAC7D;QACD,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE;YACJ,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,qBAAqB;YACrF,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,EAAE;YAChD,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,8BAA8B;YAE5E,MAAM,EAAE;gBACN,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,mCAAmC;gBACzI,oBAAoB,EAAE,MAAM,EAAE,iBAAiB;oBAC7C,CAAC,CAAC,iCAAiC,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBAC7D,CAAC,CAAC,sCAAsC;aAC3C;YACD,cAAc,EAAE;gBACd,UAAU,EAAE,MAAM,EAAE,wBAAwB,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,2BAA2B;gBACrG,iBAAiB,EAAE,MAAM,EAAE,yBAAyB;oBAClD,CAAC,CAAC,kCAAkC,CAAC,MAAM,CAAC,yBAAyB,CAAC;oBACtE,CAAC,CAAC,2CAA2C;gBAC/C,oBAAoB,EAAE,MAAM,EAAE,yBAAyB;oBACrD,CAAC,CAAC,yCAAyC,CAAC,MAAM,CAAC,yBAAyB,CAAC;oBAC7E,CAAC,CAAC,8CAA8C;aACnD;SACF;QAED,MAAM,EAAE;YACN,yBAAyB;YACzB,4BAA4B;YAE5B;gBACE,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;wBAC5C,IAAI,EAAE,MAAM;wBACZ,QAAQ,EAAE,KAAK;qBAChB;oBAED;wBACE,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE;wBACnD,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,KAAK;wBACd,YAAY,EAAE,MAAM,EAAE,aAAa,IAAI,IAAI;wBAC3C,OAAO,EAAE,OAAO;qBACjB;iBACF;aACF;YAED;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE;gBACjD,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,CAAC,MAAM,CAAC;gBACtB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,YAAY,EAAE,CAAC,sBAAsB,CAAC;iBACvC;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,gBAAgB;oBACtB,MAAM,EAAE,gBAAgB;oBACxB,MAAM,EAAE,gBAAgB;iBACzB;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC;AAE7C,oDAAoD;AACpD,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,GAG1C,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { Users, createUsersCollection, type UsersCollectionConfig } from './Users';
2
+ export { Media } from './Media';
3
+ export { ContactMessages, createContactMessagesCollection, type ContactMessagesConfig } from './ContactMessages';
4
+ export { EmailTemplates, createEmailTemplatesCollection, type EmailTemplatesConfig } from './EmailTemplates';
5
+ export { QueuedEmails } from './QueuedEmails';
6
+ export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, type VerifyEmailConfig, type ForgotPasswordEmailConfig, } from './Users';
7
+ export { createSendEmailNotificationHook, type SendEmailNotificationConfig } from './ContactMessages';
8
+ export { HTMLViewer } from './QueuedEmails/components/HtmlViewer';
9
+ export { RetryEmailButtons } from './QueuedEmails/components/RetryEmailButtons';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,EACzC,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,+BAA+B,EAAE,KAAK,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGtG,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC"}
@@ -0,0 +1,14 @@
1
+ // Collections
2
+ export { Users, createUsersCollection } from './Users';
3
+ export { Media } from './Media';
4
+ export { ContactMessages, createContactMessagesCollection } from './ContactMessages';
5
+ export { EmailTemplates, createEmailTemplatesCollection } from './EmailTemplates';
6
+ export { QueuedEmails } from './QueuedEmails';
7
+ // Users auth emails
8
+ export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, } from './Users';
9
+ // ContactMessages hooks
10
+ export { createSendEmailNotificationHook } from './ContactMessages';
11
+ // QueuedEmails components
12
+ export { HTMLViewer } from './QueuedEmails/components/HtmlViewer';
13
+ export { RetryEmailButtons } from './QueuedEmails/components/RetryEmailButtons';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAA8B,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAA8B,MAAM,mBAAmB,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAA6B,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,oBAAoB;AACpB,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,GAG1C,MAAM,SAAS,CAAC;AAEjB,wBAAwB;AACxB,OAAO,EAAE,+BAA+B,EAAoC,MAAM,mBAAmB,CAAC;AAEtG,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { HTMLViewer } from '../collections/QueuedEmails/components/HtmlViewer';
2
+ export { RetryEmailButtons } from '../collections/QueuedEmails/components/RetryEmailButtons';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mDAAmD,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Re-export components from collections for backward compatibility
2
+ export { HTMLViewer } from '../collections/QueuedEmails/components/HtmlViewer';
3
+ export { RetryEmailButtons } from '../collections/QueuedEmails/components/RetryEmailButtons';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,mDAAmD,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function createSuccessFormState<T>(previousState: T): {
2
+ success: true;
3
+ } & T;
4
+ export declare function extractFormDataToReturn<T extends Record<string, unknown>>({ formData, excludes, }: {
5
+ formData: FormData;
6
+ excludes?: (keyof T)[];
7
+ }): T;
8
+ //# sourceMappingURL=states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../src/forms/states.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,CAKjF;AAID,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACzE,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACxB,GAAG,CAAC,CAOJ"}
@@ -0,0 +1,16 @@
1
+ export function createSuccessFormState(previousState) {
2
+ return {
3
+ ...previousState,
4
+ success: true,
5
+ };
6
+ }
7
+ // TODO createErrorFormState
8
+ export function extractFormDataToReturn({ formData, excludes, }) {
9
+ const data = Object.fromEntries(formData.entries());
10
+ excludes?.forEach((field) => {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ data[field] = '';
13
+ });
14
+ return data;
15
+ }
16
+ //# sourceMappingURL=states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/forms/states.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAI,aAAgB;IACxD,OAAO;QACL,GAAG,aAAa;QAChB,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,4BAA4B;AAE5B,MAAM,UAAU,uBAAuB,CAAoC,EACzE,QAAQ,EACR,QAAQ,GAIT;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAM,CAAC;IACzD,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,8DAA8D;QAC7D,IAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare function translateFormErrors<T extends z.ZodTypeAny>(errors: z.inferFlattenedErrors<T>): Promise<{
3
+ fieldErrors: {
4
+ [k: string]: string[];
5
+ };
6
+ formErrors: string[];
7
+ }>;
8
+ //# sourceMappingURL=translate-errors.d.ts.map