Adds a first-party analytics system with no third-party trackers and no persistent per-visitor identifiers: events are grouped into sessions via a daily-rotating pseudonymous hash (IP+UA+host, HMAC-salted, never stored raw). - New "Analytics" section in the Payload admin, gated by a canViewAnalytics permission on Users, following the existing custom-admin-view pattern used by the calendar feature - Sessions, page views, unique visitors, top/entry/exit pages, events, device/browser breakdown, date range filter with period comparison - Raw events and daily aggregate rollups as their own collections, with configurable retention and a cron endpoint that rolls up before purging - Cookie consent banner (necessary/preferences/statistics) with categories and copy editable from a new CMS global; a track() helper that is a complete no-op without statistics consent, so nothing is ever sent before a visitor opts in - track() calls wired into the booking flow, contact form, and navigation
51 lines
1.4 KiB
JSON
51 lines
1.4 KiB
JSON
{
|
|
"name": "anouma",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "tsx watch server.ts",
|
|
"build": "next build",
|
|
"start": "NODE_ENV=production tsx server.ts",
|
|
"lint": "eslint",
|
|
"test": "echo \"No automated test suite configured yet — add one (e.g. vitest) and update this script.\"",
|
|
"payload": "payload",
|
|
"generate:types": "payload generate:types",
|
|
"generate:importmap": "payload generate:importmap",
|
|
"migrate": "payload migrate",
|
|
"migrate:create": "payload migrate:create",
|
|
"seed": "payload run scripts/seed.ts",
|
|
"seo:check": "payload run scripts/seo-check.ts"
|
|
},
|
|
"dependencies": {
|
|
"@payloadcms/db-postgres": "^3.88.0",
|
|
"@payloadcms/next": "^3.88.0",
|
|
"@payloadcms/richtext-lexical": "^3.88.0",
|
|
"@payloadcms/ui": "^3.88.0",
|
|
"drizzle-orm": "^0.45.2",
|
|
"framer-motion": "^13.1.1",
|
|
"graphql": "^16.14.2",
|
|
"next": "16.3.2",
|
|
"nodemailer": "^9.0.5",
|
|
"payload": "^3.88.0",
|
|
"react": "19.2.8",
|
|
"react-dom": "19.2.8",
|
|
"recharts": "^3.10.1",
|
|
"sharp": "^0.35.3",
|
|
"tsx": "^4.23.12",
|
|
"ws": "^8.21.3"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/postcss": "^4",
|
|
"@types/node": "^20",
|
|
"@types/nodemailer": "^8.0.1",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"@types/ws": "^8.18.1",
|
|
"eslint": "^9",
|
|
"eslint-config-next": "16.3.2",
|
|
"tailwindcss": "^4",
|
|
"typescript": "^5"
|
|
}
|
|
}
|