@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.
- package/.claude/settings.local.json +9 -0
- package/.env.example +29 -0
- package/.github/workflows/ci.yml +160 -0
- package/.github/workflows/publish.yml +126 -0
- package/.nvmrc +1 -0
- package/.prettierignore +2 -0
- package/.prettierrc +11 -0
- package/CHANGELOG.md +87 -0
- package/README.md +364 -0
- package/TESTING_AND_DOCUMENTATION_SETUP.md +348 -0
- package/dist/access/adminAccessOnly.d.ts +25 -0
- package/dist/access/adminAccessOnly.d.ts.map +1 -0
- package/dist/access/adminAccessOnly.js +11 -0
- package/dist/access/adminAccessOnly.js.map +1 -0
- package/dist/access/admins.d.ts +72 -0
- package/dist/access/admins.d.ts.map +1 -0
- package/dist/access/admins.js +76 -0
- package/dist/access/admins.js.map +1 -0
- package/dist/access/anyone.d.ts +35 -0
- package/dist/access/anyone.d.ts.map +1 -0
- package/dist/access/anyone.js +34 -0
- package/dist/access/anyone.js.map +1 -0
- package/dist/access/authenticated.d.ts +63 -0
- package/dist/access/authenticated.d.ts.map +1 -0
- package/dist/access/authenticated.js +68 -0
- package/dist/access/authenticated.js.map +1 -0
- package/dist/access/authenticatedAccessOnly.d.ts +13 -0
- package/dist/access/authenticatedAccessOnly.d.ts.map +1 -0
- package/dist/access/authenticatedAccessOnly.js +11 -0
- package/dist/access/authenticatedAccessOnly.js.map +1 -0
- package/dist/access/index.d.ts +7 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/index.js +7 -0
- package/dist/access/index.js.map +1 -0
- package/dist/access/publicReadAuthenticatedAccess.d.ts +13 -0
- package/dist/access/publicReadAuthenticatedAccess.d.ts.map +1 -0
- package/dist/access/publicReadAuthenticatedAccess.js +12 -0
- package/dist/access/publicReadAuthenticatedAccess.js.map +1 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.d.ts +31 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.d.ts.map +1 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.js +29 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.js.map +1 -0
- package/dist/collections/ContactMessages/index.d.ts +27 -0
- package/dist/collections/ContactMessages/index.d.ts.map +1 -0
- package/dist/collections/ContactMessages/index.js +81 -0
- package/dist/collections/ContactMessages/index.js.map +1 -0
- package/dist/collections/EmailTemplates/index.d.ts +26 -0
- package/dist/collections/EmailTemplates/index.d.ts.map +1 -0
- package/dist/collections/EmailTemplates/index.js +74 -0
- package/dist/collections/EmailTemplates/index.js.map +1 -0
- package/dist/collections/Media/index.d.ts +3 -0
- package/dist/collections/Media/index.d.ts.map +1 -0
- package/dist/collections/Media/index.js +22 -0
- package/dist/collections/Media/index.js.map +1 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.d.ts +3 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.d.ts.map +1 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.js +11 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.js.map +1 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.d.ts +2 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.d.ts.map +1 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.js +79 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.js.map +1 -0
- package/dist/collections/QueuedEmails/index.d.ts +3 -0
- package/dist/collections/QueuedEmails/index.d.ts.map +1 -0
- package/dist/collections/QueuedEmails/index.js +245 -0
- package/dist/collections/QueuedEmails/index.js.map +1 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.d.ts +51 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.d.ts.map +1 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.js +90 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.js.map +1 -0
- package/dist/collections/Users/auth-emails/verify-email.d.ts +51 -0
- package/dist/collections/Users/auth-emails/verify-email.d.ts.map +1 -0
- package/dist/collections/Users/auth-emails/verify-email.js +80 -0
- package/dist/collections/Users/auth-emails/verify-email.js.map +1 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.d.ts +3 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.d.ts.map +1 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.js +19 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.js.map +1 -0
- package/dist/collections/Users/index.d.ts +76 -0
- package/dist/collections/Users/index.d.ts.map +1 -0
- package/dist/collections/Users/index.js +116 -0
- package/dist/collections/Users/index.js.map +1 -0
- package/dist/collections/index.d.ts +10 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +14 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/forms/states.d.ts +8 -0
- package/dist/forms/states.d.ts.map +1 -0
- package/dist/forms/states.js +16 -0
- package/dist/forms/states.js.map +1 -0
- package/dist/forms/translate-errors.d.ts +8 -0
- package/dist/forms/translate-errors.d.ts.map +1 -0
- package/dist/forms/translate-errors.js +11 -0
- package/dist/forms/translate-errors.js.map +1 -0
- package/dist/forms/validators.d.ts +10 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms/validators.js +23 -0
- package/dist/forms/validators.js.map +1 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.d.ts +2 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.d.ts.map +1 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.js +5 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.js.map +1 -0
- package/dist/globals/PrivacyPolicy/index.d.ts +3 -0
- package/dist/globals/PrivacyPolicy/index.d.ts.map +1 -0
- package/dist/globals/PrivacyPolicy/index.js +31 -0
- package/dist/globals/PrivacyPolicy/index.js.map +1 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.d.ts +2 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.d.ts.map +1 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.js +5 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.js.map +1 -0
- package/dist/globals/TermsOfUse/index.d.ts +3 -0
- package/dist/globals/TermsOfUse/index.d.ts.map +1 -0
- package/dist/globals/TermsOfUse/index.js +31 -0
- package/dist/globals/TermsOfUse/index.js.map +1 -0
- package/dist/globals/index.d.ts +3 -0
- package/dist/globals/index.d.ts.map +1 -0
- package/dist/globals/index.js +3 -0
- package/dist/globals/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +2 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/process-email-queue.d.ts +46 -0
- package/dist/tasks/process-email-queue.d.ts.map +1 -0
- package/dist/tasks/process-email-queue.js +199 -0
- package/dist/tasks/process-email-queue.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/slug.d.ts +2 -0
- package/dist/types/slug.d.ts.map +1 -0
- package/dist/types/slug.js +11 -0
- package/dist/types/slug.js.map +1 -0
- package/dist/utils/database-dates.d.ts +3 -0
- package/dist/utils/database-dates.d.ts.map +1 -0
- package/dist/utils/database-dates.js +6 -0
- package/dist/utils/database-dates.js.map +1 -0
- package/dist/utils/email/generate-email-html.d.ts +23 -0
- package/dist/utils/email/generate-email-html.d.ts.map +1 -0
- package/dist/utils/email/generate-email-html.js +42 -0
- package/dist/utils/email/generate-email-html.js.map +1 -0
- package/dist/utils/email/get-email-template.d.ts +8 -0
- package/dist/utils/email/get-email-template.d.ts.map +1 -0
- package/dist/utils/email/get-email-template.js +14 -0
- package/dist/utils/email/get-email-template.js.map +1 -0
- package/dist/utils/email/index.d.ts +4 -0
- package/dist/utils/email/index.d.ts.map +1 -0
- package/dist/utils/email/index.js +4 -0
- package/dist/utils/email/index.js.map +1 -0
- package/dist/utils/email/queue-email.d.ts +29 -0
- package/dist/utils/email/queue-email.d.ts.map +1 -0
- package/dist/utils/email/queue-email.js +79 -0
- package/dist/utils/email/queue-email.js.map +1 -0
- package/dist/utils/get-global.d.ts +6 -0
- package/dist/utils/get-global.d.ts.map +1 -0
- package/dist/utils/get-global.js +20 -0
- package/dist/utils/get-global.js.map +1 -0
- package/dist/utils/id-from-payload.d.ts +4 -0
- package/dist/utils/id-from-payload.d.ts.map +1 -0
- package/dist/utils/id-from-payload.js +10 -0
- package/dist/utils/id-from-payload.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/migrations.d.ts +2 -0
- package/dist/utils/migrations.d.ts.map +1 -0
- package/dist/utils/migrations.js +18 -0
- package/dist/utils/migrations.js.map +1 -0
- package/dist/utils/payload-client.d.ts +10 -0
- package/dist/utils/payload-client.d.ts.map +1 -0
- package/dist/utils/payload-client.js +14 -0
- package/dist/utils/payload-client.js.map +1 -0
- package/dist/utils/slugify.d.ts +8 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +15 -0
- package/dist/utils/slugify.js.map +1 -0
- package/eslint.config.mjs +90 -0
- package/package.json +139 -0
- package/pnpm-workspace.yaml +4 -0
- package/src/access/adminAccessOnly.ts +13 -0
- package/src/access/admins.ts +78 -0
- package/src/access/anyone.ts +35 -0
- package/src/access/authenticated.ts +70 -0
- package/src/access/authenticatedAccessOnly.ts +13 -0
- package/src/access/index.ts +6 -0
- package/src/access/publicReadAuthenticatedAccess.ts +14 -0
- package/src/collections/ContactMessages/hooks/sendEmailNotification.ts +58 -0
- package/src/collections/ContactMessages/index.ts +100 -0
- package/src/collections/EmailTemplates/index.ts +89 -0
- package/src/collections/Media/index.ts +24 -0
- package/src/collections/QueuedEmails/components/HtmlViewer.tsx +16 -0
- package/src/collections/QueuedEmails/components/RetryEmailButtons.tsx +115 -0
- package/src/collections/QueuedEmails/index.ts +246 -0
- package/src/collections/Users/auth-emails/forgot-password-email.ts +135 -0
- package/src/collections/Users/auth-emails/verify-email.ts +123 -0
- package/src/collections/Users/hooks/ensureFirstUserIsAdmin.ts +22 -0
- package/src/collections/Users/index.ts +201 -0
- package/src/collections/index.ts +23 -0
- package/src/components/index.ts +3 -0
- package/src/forms/states.ts +23 -0
- package/src/forms/translate-errors.ts +13 -0
- package/src/forms/validators.ts +33 -0
- package/src/globals/PrivacyPolicy/hooks/revalidate-cache.ts +5 -0
- package/src/globals/PrivacyPolicy/index.ts +33 -0
- package/src/globals/TermsOfUse/hooks/revalidate-cache.ts +5 -0
- package/src/globals/TermsOfUse/index.ts +33 -0
- package/src/globals/index.ts +2 -0
- package/src/index.ts +26 -0
- package/src/tasks/index.ts +7 -0
- package/src/tasks/process-email-queue.ts +261 -0
- package/src/types/index.ts +15 -0
- package/src/types/slug.ts +11 -0
- package/src/utils/database-dates.ts +6 -0
- package/src/utils/email/generate-email-html.ts +63 -0
- package/src/utils/email/get-email-template.ts +18 -0
- package/src/utils/email/index.ts +3 -0
- package/src/utils/email/queue-email.ts +109 -0
- package/src/utils/get-global.ts +25 -0
- package/src/utils/id-from-payload.ts +11 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/migrations.ts +18 -0
- package/src/utils/payload-client.ts +16 -0
- package/src/utils/slugify.ts +21 -0
- package/tests/fixtures/email-template.html +58 -0
- package/tests/fixtures/sample-data.ts +56 -0
- package/tests/helpers/create-test-user.ts +37 -0
- package/tests/helpers/init-payload.ts +59 -0
- package/tests/setup.integration.ts +9 -0
- package/tests/setup.ts +4 -0
- package/tests/unit/access/adminAccessOnly.spec.ts +117 -0
- package/tests/unit/access/admins.spec.ts +68 -0
- package/tests/unit/access/anyone.spec.ts +28 -0
- package/tests/unit/access/authenticated.spec.ts +53 -0
- package/tests/unit/access/authenticatedAccessOnly.spec.ts +112 -0
- package/tests/unit/access/publicReadAuthenticatedAccess.spec.ts +112 -0
- package/tests/unit/forms/validators.spec.ts +348 -0
- package/tests/unit/utils/database-dates.spec.ts +97 -0
- package/tests/unit/utils/id-from-payload.spec.ts +142 -0
- package/tests/unit/utils/slugify.spec.ts +185 -0
- package/tsconfig.json +31 -0
- package/typedoc.json +40 -0
- package/vitest.config.ts +31 -0
- package/vitest.integration.config.ts +27 -0
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
|
package/.prettierignore
ADDED
package/.prettierrc
ADDED
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
|