@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,9 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(npx tsc:*)",
5
+ "Bash(pnpm test:unit:*)",
6
+ "Bash(pnpm test:coverage:*)"
7
+ ]
8
+ }
9
+ }
package/.env.example ADDED
@@ -0,0 +1,29 @@
1
+ # Database
2
+ DATABASE_URI=postgresql://user:password@localhost:5432/dbname
3
+
4
+ # Payload
5
+ PAYLOAD_SECRET=your-secret-key-here
6
+
7
+ # Email Configuration
8
+ ENABLE_EMAILS_SENDING=true
9
+
10
+ # Production Email (Resend)
11
+ RESEND_API_KEY=re_your_api_key_here
12
+
13
+ # Development Email (Nodemailer + Mailpit)
14
+ SMTP_HOST=localhost
15
+ SMTP_PORT=1025
16
+ SMTP_USER=
17
+ SMTP_PASS=
18
+ SMTP_FROM_ADDRESS=noreply@yourdomain.com
19
+
20
+ # Contact Form
21
+ EMAIL_DEFAULT_CONTACT_ADDRESS=contact@yourdomain.com
22
+
23
+ # S3 Storage (optional)
24
+ S3_ENDPOINT=https://s3.amazonaws.com
25
+ S3_REGION=us-east-1
26
+ S3_ACCESS_KEY_ID=your_access_key
27
+ S3_SECRET_ACCESS_KEY=your_secret_key
28
+ S3_BUCKET=your-bucket-name
29
+ S3_FORCE_PATH_STYLE=false
@@ -0,0 +1,160 @@
1
+ name: CI - Pull Request Validation
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ paths:
8
+ - 'src/**'
9
+ - 'tests/**'
10
+ - 'package.json'
11
+ - 'pnpm-lock.yaml'
12
+ - 'tsconfig.json'
13
+ - 'vitest.config.ts'
14
+ - 'vitest.integration.config.ts'
15
+ - '.github/workflows/ci.yml'
16
+
17
+ permissions:
18
+ contents: read
19
+ pull-requests: write # For posting coverage comments
20
+
21
+ jobs:
22
+ lint:
23
+ runs-on: ubuntu-latest
24
+ timeout-minutes: 5
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+
28
+ - name: Setup pnpm
29
+ uses: pnpm/action-setup@v4
30
+ with:
31
+ version: 10
32
+
33
+ - name: Setup Node.js
34
+ uses: actions/setup-node@v4
35
+ with:
36
+ node-version: '24'
37
+ cache: 'pnpm'
38
+
39
+ - name: Install Dependencies
40
+ run: pnpm install --frozen-lockfile
41
+
42
+ - name: Run ESLint
43
+ run: pnpm lint
44
+
45
+ - name: Run Prettier Check
46
+ run: pnpm prettier
47
+
48
+ test:
49
+ runs-on: ubuntu-latest
50
+ timeout-minutes: 10
51
+ steps:
52
+ - uses: actions/checkout@v4
53
+
54
+ - name: Setup pnpm
55
+ uses: pnpm/action-setup@v4
56
+ with:
57
+ version: 10
58
+
59
+ - name: Setup Node.js
60
+ uses: actions/setup-node@v4
61
+ with:
62
+ node-version: '24'
63
+ cache: 'pnpm'
64
+
65
+ - name: Install Dependencies
66
+ run: pnpm install --frozen-lockfile
67
+
68
+ - name: Run Unit Tests
69
+ run: pnpm test:unit
70
+
71
+ - name: Generate Coverage Report
72
+ run: pnpm test:coverage
73
+
74
+ - name: Upload Coverage Reports
75
+ uses: codecov/codecov-action@v4
76
+ if: always()
77
+ with:
78
+ files: ./coverage/lcov.info
79
+ fail_ci_if_error: false
80
+ token: ${{ secrets.CODECOV_TOKEN }}
81
+
82
+ - name: Comment Coverage on PR
83
+ if: github.event_name == 'pull_request'
84
+ uses: actions/github-script@v7
85
+ with:
86
+ script: |
87
+ const fs = require('fs');
88
+
89
+ // Read coverage summary
90
+ let coverageSummary;
91
+ try {
92
+ coverageSummary = JSON.parse(fs.readFileSync('./coverage/coverage-summary.json', 'utf8'));
93
+ } catch (error) {
94
+ console.log('No coverage summary found');
95
+ return;
96
+ }
97
+
98
+ const { lines, statements, functions, branches } = coverageSummary.total;
99
+
100
+ const comment = `## 📊 Test Coverage Report
101
+
102
+ | Metric | Coverage | Status |
103
+ |--------|----------|--------|
104
+ | Lines | ${lines.pct.toFixed(2)}% | ${lines.pct >= 60 ? '✅' : '⚠️'} |
105
+ | Statements | ${statements.pct.toFixed(2)}% | ${statements.pct >= 60 ? '✅' : '⚠️'} |
106
+ | Functions | ${functions.pct.toFixed(2)}% | ${functions.pct >= 60 ? '✅' : '⚠️'} |
107
+ | Branches | ${branches.pct.toFixed(2)}% | ${branches.pct >= 60 ? '✅' : '⚠️'} |
108
+
109
+ **Target:** 60% minimum on all metrics
110
+
111
+ <details>
112
+ <summary>View detailed coverage</summary>
113
+
114
+ \`\`\`
115
+ Lines: ${lines.covered}/${lines.total}
116
+ Statements: ${statements.covered}/${statements.total}
117
+ Functions: ${functions.covered}/${functions.total}
118
+ Branches: ${branches.covered}/${branches.total}
119
+ \`\`\`
120
+ </details>
121
+ `;
122
+
123
+ github.rest.issues.createComment({
124
+ issue_number: context.issue.number,
125
+ owner: context.repo.owner,
126
+ repo: context.repo.repo,
127
+ body: comment
128
+ });
129
+
130
+ build:
131
+ runs-on: ubuntu-latest
132
+ timeout-minutes: 5
133
+ steps:
134
+ - uses: actions/checkout@v4
135
+
136
+ - name: Setup pnpm
137
+ uses: pnpm/action-setup@v4
138
+ with:
139
+ version: 10
140
+
141
+ - name: Setup Node.js
142
+ uses: actions/setup-node@v4
143
+ with:
144
+ node-version: '24'
145
+ cache: 'pnpm'
146
+
147
+ - name: Install Dependencies
148
+ run: pnpm install --frozen-lockfile
149
+
150
+ - name: Build TypeScript
151
+ run: pnpm build
152
+
153
+ - name: Verify Build Output
154
+ run: |
155
+ echo "Checking dist/ directory..."
156
+ ls -la dist/
157
+ echo "Verifying .d.ts files exist..."
158
+ find dist -name "*.d.ts" | wc -l
159
+ echo "Verifying .js files exist..."
160
+ find dist -name "*.js" | wc -l
@@ -0,0 +1,126 @@
1
+ name: Publish Components
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ paths:
7
+ - 'src/**' # Trigger on any source file changes
8
+ - 'package.json' # Trigger on package.json changes
9
+ - 'pnpm-lock.yaml' # Trigger on lockfile changes
10
+ - '.github/workflows/publish.yml' # Trigger on workflow changes
11
+
12
+ permissions:
13
+ contents: write # Write is required to tag the release
14
+ packages: write
15
+ attestations: write
16
+ id-token: write
17
+
18
+ jobs:
19
+ publish:
20
+ runs-on: ubuntu-latest
21
+ timeout-minutes: 3
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ with:
25
+ fetch-depth: 0 # Important for version calculation
26
+
27
+ - name: Setup pnpm
28
+ uses: pnpm/action-setup@v4
29
+ with:
30
+ # version: 9 # Version is taken from package.json
31
+ run_install: false
32
+
33
+ - name: Setup Node.js
34
+ uses: actions/setup-node@v6
35
+ with:
36
+ node-version: '24'
37
+ registry-url: 'https://registry.npmjs.org'
38
+ always-auth: 'true'
39
+ cache: 'pnpm'
40
+
41
+ - name: Upgrade npm for OIDC support (pnpm uses npm internally)
42
+ run: npm install -g npm@latest
43
+ # pnpm publish uses npm's registry client - npm 11.5.1+ required for OIDC trusted publishing
44
+
45
+ - name: Install Dependencies
46
+ run: pnpm install --frozen-lockfile
47
+
48
+ - name: Run Linting
49
+ run: pnpm lint
50
+
51
+ - name: Run Unit Tests
52
+ run: pnpm test:unit
53
+
54
+ - name: Build Package
55
+ run: pnpm build
56
+
57
+ - name: Get previous version
58
+ id: prev_version
59
+ run: |
60
+ PREV_VERSION=$(pnpm pkg get version | tr -d '"')
61
+ echo "prev_version=$PREV_VERSION" >> $GITHUB_OUTPUT
62
+
63
+ - name: Calculate new version
64
+ id: version
65
+ run: |
66
+ # Get last tag
67
+ LAST_TAG=$(git describe --tags --abbrev=0)
68
+
69
+ # Check for changes in the same paths that trigger the workflow
70
+ CHANGES=$(git diff --name-only $LAST_TAG HEAD | grep -E '^(src/|package.json|pnpm-lock.yaml|.github/workflows/publish.yml)' || true)
71
+
72
+ # Read current version
73
+ CURRENT_VERSION=${{ steps.prev_version.outputs.prev_version }}
74
+
75
+ # Split version into parts
76
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
77
+
78
+ if [ -n "$CHANGES" ]; then
79
+ echo "Detected changes in relevant paths:"
80
+ echo "$CHANGES"
81
+ NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
82
+ else
83
+ echo "No relevant changes detected since last tag."
84
+ NEW_VERSION="$CURRENT_VERSION"
85
+ fi
86
+
87
+ echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
88
+
89
+ - name: Update version in package.json
90
+ if: steps.version.outputs.new_version != steps.prev_version.outputs.prev_version
91
+ run: pnpm version ${{ steps.version.outputs.new_version }} --no-git-tag-version
92
+
93
+ - name: Verify package contents
94
+ run: |
95
+ echo "Verifying source files will be published..."
96
+ echo "Files that will be included in the package:"
97
+ npm pack --dry-run
98
+ echo ""
99
+ echo "Source TypeScript files found:"
100
+ find src -name "*.ts" | wc -l
101
+ echo "Source CSS.TS files found:"
102
+ find src -name "*.css.ts" | wc -l
103
+
104
+ - name: Commit package.json changes
105
+ if: steps.version.outputs.new_version != steps.prev_version.outputs.prev_version
106
+ run: |
107
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
108
+ git config --local user.name "github-actions[bot]"
109
+ git add package.json
110
+ git commit -m "chore: bump version to v${{ steps.version.outputs.new_version }}"
111
+ git push
112
+
113
+ - name: Publish to npm (Trusted Publisher)
114
+ if: steps.version.outputs.new_version != steps.prev_version.outputs.prev_version
115
+ run: pnpm publish --access public --no-git-checks # no-git-checks required -> https://github.com/pnpm/pnpm/issues/5894
116
+ # Using OIDC Trusted Publishing - configured on npmjs.com
117
+ # No token needed! Authentication via id-token: write permission
118
+ # Note: --provenance flag removed because GitHub repo is private (provenance requires public repos)
119
+
120
+ - name: Create Git tag
121
+ if: steps.version.outputs.new_version != steps.prev_version.outputs.prev_version
122
+ run: |
123
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
124
+ git config --local user.name "github-actions[bot]"
125
+ git tag -a v${{ steps.version.outputs.new_version }} -m "Release v${{ steps.version.outputs.new_version }}"
126
+ git push origin v${{ steps.version.outputs.new_version }}
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ 24
@@ -0,0 +1,2 @@
1
+ .next
2
+ node_modules
package/.prettierrc ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "singleQuote": true,
3
+ "arrowParens": "always",
4
+ "trailingComma": "es5",
5
+ "printWidth": 150,
6
+ "tabWidth": 2,
7
+ "bracketSpacing": true,
8
+ "bracketSameLine": true,
9
+ "endOfLine": "lf",
10
+ "semi": true
11
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,87 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ - Comprehensive test suite with 189 unit tests
12
+ - Test coverage for access control functions (100% coverage)
13
+ - Test coverage for utility functions (100% coverage)
14
+ - Test coverage for form validators (100% coverage)
15
+ - Vitest testing framework with unit and integration test configurations
16
+ - GitHub Actions CI workflow for PR validation
17
+ - Test coverage reporting in PRs
18
+ - TypeDoc API documentation generation
19
+ - Enhanced JSDoc comments for better code documentation
20
+
21
+ ### Changed
22
+ - Enhanced publish workflow to run tests before publishing
23
+ - Updated .gitignore to exclude test and documentation artifacts
24
+
25
+ ### Fixed
26
+ - None
27
+
28
+ ## [1.0.0] - 2024-12-26
29
+
30
+ ### Added
31
+ - Initial release
32
+ - **Collections:**
33
+ - Users collection with authentication and email verification
34
+ - Media collection with S3 storage support
35
+ - ContactMessages collection for contact form submissions
36
+ - EmailTemplates collection for managing email templates
37
+ - QueuedEmails collection with retry logic and status tracking
38
+ - **Globals:**
39
+ - PrivacyPolicy global configuration
40
+ - TermsOfUse global configuration
41
+ - **Access Control:**
42
+ - `admins` - Admin-only access control
43
+ - `authenticated` - Authenticated user access control
44
+ - `anyone` - Public access control
45
+ - `adminAccessOnly` - Full admin-only access object
46
+ - `authenticatedAccessOnly` - Full authenticated access object
47
+ - `publicReadAuthenticatedAccess` - Public read with authenticated write
48
+ - **Utilities:**
49
+ - Email queueing system with `queueEmail` utility
50
+ - Email HTML generation from templates
51
+ - Email template retrieval utilities
52
+ - Database date conversion utilities
53
+ - Slugify utility for URL-safe strings
54
+ - ID extraction from PayloadCMS responses
55
+ - **Tasks:**
56
+ - `process-email-queue` background task for async email processing
57
+ - Exponential backoff retry logic for failed emails
58
+ - **Components:**
59
+ - HtmlViewer component for admin UI
60
+ - RetryEmailButtons component for manual email retry
61
+ - **Forms:**
62
+ - Form validators: requiredString, requiredEmailString, requiredPasswordString
63
+ - Honeypot validator for bot detection
64
+ - Required checkbox validator
65
+ - Error translation utilities
66
+ - US states data
67
+ - **TypeScript:**
68
+ - Full TypeScript support with strict mode
69
+ - Type exports for all collections, globals, and utilities
70
+ - Locale types (en, fr, nl)
71
+ - Email template code types
72
+ - **Documentation:**
73
+ - Comprehensive README with usage examples
74
+ - Installation and setup instructions
75
+ - Environment variables documentation
76
+ - Type exports documentation
77
+
78
+ ### Technical Details
79
+ - Built with PayloadCMS 3.64.0
80
+ - Supports React 19 and Next.js 15
81
+ - Node.js 22+ required
82
+ - pnpm 10 package manager
83
+ - ESLint and Prettier configured
84
+ - Automated NPM publishing with OIDC
85
+
86
+ [Unreleased]: https://github.com/latte-macchiat-io/latte-payload/compare/v1.0.0...HEAD
87
+ [1.0.0]: https://github.com/latte-macchiat-io/latte-payload/releases/tag/v1.0.0