From 219be916cb406035a4f125b1dda6c105b0077c8c Mon Sep 17 00:00:00 2001 From: w4c-templates Date: Sun, 11 Oct 2026 23:23:30 +0300 Subject: [PATCH] chore(template): publish Base.Next --- .dockerignore | 12 + .env.example | 15 + .eslintrc.json | 7 + .github/workflows/ci.yml | 33 + .gitignore | 11 + .w4c/preview.png | Bin 0 -> 71921 bytes .w4c/qa.json | 31 + .w4c/template.json | 30 + README.md | 69 +- app/(app)/dashboard/page.tsx | 59 + app/(app)/layout.tsx | 12 + app/(auth)/layout.tsx | 13 + app/(auth)/login/page.tsx | 15 + app/(auth)/register/page.tsx | 15 + app/(marketing)/layout.tsx | 12 + app/(marketing)/legal/privacy/page.tsx | 10 + app/(marketing)/legal/terms/page.tsx | 10 + app/(marketing)/page.tsx | 44 + app/(marketing)/pricing/page.tsx | 74 + app/admin/audit/page.tsx | 39 + app/admin/layout.tsx | 28 + app/admin/page.tsx | 45 + app/admin/users/page.tsx | 51 + app/api/admin/users/[id]/route.ts | 43 + app/api/admin/users/route.ts | 17 + app/api/auth/login/route.ts | 31 + app/api/auth/logout/route.ts | 10 + app/api/auth/me/route.ts | 10 + app/api/auth/register/route.ts | 44 + app/api/billing/checkout/route.ts | 43 + app/api/billing/webhook/route.ts | 35 + app/api/health/route.ts | 7 + app/error.tsx | 13 + app/globals.css | 153 + app/layout.tsx | 31 + app/loading.tsx | 10 + app/not-found.tsx | 14 + app/robots.ts | 9 + app/sitemap.ts | 12 + components/AdminNav.tsx | 24 + components/AuthForm.tsx | 79 + components/SiteFooter.tsx | 25 + components/SiteHeader.tsx | 49 + components/ThemeToggle.tsx | 41 + components/UpgradeButton.tsx | 43 + components/admin/UserActions.tsx | 44 + components/ui/index.tsx | 68 + docker/Dockerfile | 23 + docker/docker-compose.yml | 15 + lib/env.ts | 20 + lib/i18n.ts | 19 + lib/password.ts | 10 + lib/plans.ts | 41 + lib/server/audit.ts | 15 + lib/server/auth.ts | 64 + lib/server/db.ts | 8 + lib/server/email.ts | 44 + lib/server/payments.ts | 86 + lib/utils.ts | 21 + messages/en.json | 71 + middleware.ts | 28 + next.config.ts | 26 + package-lock.json | 8771 ++++++++++++++++++++++++ package.json | 46 + postcss.config.mjs | 5 + prisma/schema.prisma | 58 + prisma/seed.ts | 51 + public/favicon.svg | 4 + tests/e2e/smoke.mjs | 75 + tests/unit/auth.test.ts | 19 + tests/unit/plans.test.ts | 22 + tsconfig.json | 21 + tsconfig.tsbuildinfo | 1 + vitest.config.ts | 12 + 74 files changed, 11064 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .w4c/preview.png create mode 100644 .w4c/qa.json create mode 100644 .w4c/template.json create mode 100644 app/(app)/dashboard/page.tsx create mode 100644 app/(app)/layout.tsx create mode 100644 app/(auth)/layout.tsx create mode 100644 app/(auth)/login/page.tsx create mode 100644 app/(auth)/register/page.tsx create mode 100644 app/(marketing)/layout.tsx create mode 100644 app/(marketing)/legal/privacy/page.tsx create mode 100644 app/(marketing)/legal/terms/page.tsx create mode 100644 app/(marketing)/page.tsx create mode 100644 app/(marketing)/pricing/page.tsx create mode 100644 app/admin/audit/page.tsx create mode 100644 app/admin/layout.tsx create mode 100644 app/admin/page.tsx create mode 100644 app/admin/users/page.tsx create mode 100644 app/api/admin/users/[id]/route.ts create mode 100644 app/api/admin/users/route.ts create mode 100644 app/api/auth/login/route.ts create mode 100644 app/api/auth/logout/route.ts create mode 100644 app/api/auth/me/route.ts create mode 100644 app/api/auth/register/route.ts create mode 100644 app/api/billing/checkout/route.ts create mode 100644 app/api/billing/webhook/route.ts create mode 100644 app/api/health/route.ts create mode 100644 app/error.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/loading.tsx create mode 100644 app/not-found.tsx create mode 100644 app/robots.ts create mode 100644 app/sitemap.ts create mode 100644 components/AdminNav.tsx create mode 100644 components/AuthForm.tsx create mode 100644 components/SiteFooter.tsx create mode 100644 components/SiteHeader.tsx create mode 100644 components/ThemeToggle.tsx create mode 100644 components/UpgradeButton.tsx create mode 100644 components/admin/UserActions.tsx create mode 100644 components/ui/index.tsx create mode 100644 docker/Dockerfile create mode 100644 docker/docker-compose.yml create mode 100644 lib/env.ts create mode 100644 lib/i18n.ts create mode 100644 lib/password.ts create mode 100644 lib/plans.ts create mode 100644 lib/server/audit.ts create mode 100644 lib/server/auth.ts create mode 100644 lib/server/db.ts create mode 100644 lib/server/email.ts create mode 100644 lib/server/payments.ts create mode 100644 lib/utils.ts create mode 100644 messages/en.json create mode 100644 middleware.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 public/favicon.svg create mode 100644 tests/e2e/smoke.mjs create mode 100644 tests/unit/auth.test.ts create mode 100644 tests/unit/plans.test.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.tsbuildinfo create mode 100644 vitest.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..776ad08 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +node_modules +.next +.git +.env +.env.local +*.db +docker +.github +.w4c +tests +README.md +coverage diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..325de68 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# --- Core ------------------------------------------------------------------- +# SQLite in development; point at Postgres in production (see README). +DATABASE_URL="file:./dev.db" +# Public origin used for absolute URLs (sitemap, OG, checkout redirects). +NEXT_PUBLIC_SITE_URL="http://localhost:3000" + +# --- Payments (optional) ---------------------------------------------------- +# Leave empty to use the built-in mock provider (no keys needed). +STRIPE_SECRET_KEY="" +STRIPE_WEBHOOK_SECRET="" + +# --- Email (optional) ------------------------------------------------------- +# Leave empty to use the built-in log provider (no keys needed). +RESEND_API_KEY="" +EMAIL_FROM="Acme " diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..3b8ecbf --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": "next/core-web-vitals", + "rules": { + "@next/next/no-img-element": "off", + "react/no-unescaped-entities": "off" + } +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..be6fc50 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + quality: + runs-on: ubuntu-latest + env: + DATABASE_URL: "file:./ci.db" + NEXT_PUBLIC_SITE_URL: "http://localhost:3000" + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npm run lint + - run: npm run typecheck + - run: npm run db:setup + - run: npm test + - run: npm run build + - name: e2e smoke + run: | + npm start & + for i in $(seq 1 60); do + if curl -sf http://127.0.0.1:3000/api/health >/dev/null; then break; fi + sleep 1 + done + npm run test:e2e diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee7ee5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules +.next +out +dist +coverage +.env +.env.local +*.db +*.db-journal +.vercel +next-env.d.ts diff --git a/.w4c/preview.png b/.w4c/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..bfae3a7926f59f26fac971265d7da982b2f90664 GIT binary patch literal 71921 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 literal 0 HcmV?d00001 diff --git a/.w4c/qa.json b/.w4c/qa.json new file mode 100644 index 0000000..3f85790 --- /dev/null +++ b/.w4c/qa.json @@ -0,0 +1,31 @@ +{ + "install": "npm ci", + "setup": "npm run db:setup", + "lint": "npm run lint", + "typecheck": "npm run typecheck", + "unit": "npm run test", + "build": "npm run build", + "start": "npm run start", + "e2e": "node tests/e2e/smoke.mjs", + "port": 3000, + "health": "/api/health", + "env": { + "DATABASE_URL": "file:./dev.db", + "NEXT_PUBLIC_SITE_URL": "http://localhost:3000" + }, + "routes": [ + { "path": "/", "expect": [200] }, + { "path": "/pricing", "expect": [200] }, + { "path": "/login", "expect": [200] }, + { "path": "/register", "expect": [200] }, + { "path": "/legal/privacy", "expect": [200] }, + { "path": "/dashboard", "expect": [307, 302] }, + { "path": "/admin", "expect": [307, 302] }, + { "path": "/api/health", "expect": [200] }, + { "path": "/api/auth/me", "expect": [401] }, + { "path": "/api/admin/users", "expect": [401] }, + { "path": "/sitemap.xml", "expect": [200] }, + { "path": "/robots.txt", "expect": [200] } + ], + "timeout": { "install": 900, "build": 900, "boot": 120 } +} diff --git a/.w4c/template.json b/.w4c/template.json new file mode 100644 index 0000000..0afe757 --- /dev/null +++ b/.w4c/template.json @@ -0,0 +1,30 @@ +{ + "schema": 2, + "system": "v2", + "catalog": false, + "id": "base-next", + "case": "base", + "stack": "next", + "title": "Base — Next.js", + "description": "The shared core: auth, roles, Prisma, mock payments/email, admin shell, SEO, CI and Docker.", + "tags": ["base", "next", "starter"], + "preview": ".w4c/preview.png", + "agentId": "w4c-start2", + "defaultName": "my-app", + "featured": false, + "env": [ + { "key": "DATABASE_URL", "required": false, "note": "SQLite by default; Postgres in production" }, + { "key": "NEXT_PUBLIC_SITE_URL", "required": false, "note": "Public origin for sitemap/OG/checkout" }, + { "key": "STRIPE_SECRET_KEY", "required": false, "note": "mock provider is used when absent" }, + { "key": "RESEND_API_KEY", "required": false, "note": "log provider is used when absent" } + ], + "modules": [ + { "id": "resend-email", "skill": "integration-resend-email" }, + { "id": "s3-storage", "skill": "integration-s3-storage" }, + { "id": "analytics", "skill": "integration-analytics" } + ], + "seededAccounts": [ + { "role": "admin", "email": "admin@example.com", "password": "password" }, + { "role": "user", "email": "user@example.com", "password": "password" } + ] +} diff --git a/README.md b/README.md index 3095b07..ec2b128 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,68 @@ -# templates2.Base.Next +# Base — Next.js (templates2) -The shared core: auth, roles, Prisma, mock payments/email, admin shell, SEO, CI and Docker. \ No newline at end of file +A **ready-to-run** Next.js (App Router) base application. It is the shared core every Next.js +v2 case forks: authentication, roles, Prisma, mock payments and email, an admin shell, SEO, +i18n, observability, CI and a Docker image — all working on the first run. + +> Not listed in the user catalog (`"catalog": false` in `.w4c/template.json`); it exists to be +> forked by cases such as `Store.Next` or `Saas.Next`. + +## Quickstart + +```bash +npm ci +cp .env.example .env # SQLite + mock providers by default — no keys needed +npm run db:setup # prisma db push + seed +npm run dev # http://localhost:3000 +``` + +Demo accounts (seeded): `admin@example.com` (admin) and `user@example.com` (user) — password +`password`. + +## Scripts + +| Script | What it does | +|---|---| +| `npm run dev` | Dev server with HMR | +| `npm run build` / `npm start` | Production build / serve | +| `npm run lint` / `npm run typecheck` | ESLint / `tsc --noEmit` | +| `npm test` | Unit tests (Vitest) | +| `npm run test:e2e` | HTTP end-to-end smoke (server must be running) | +| `npm run db:setup` | `prisma db push` + seed | +| `npm run db:seed` | Seed only | + +## What works out of the box + +- **Auth & roles** — email + password, bcrypt, httpOnly cookie sessions (`Session` table), `user` + and `admin` roles, server-side guards (`requireUser`, `requireAdmin`) and API authorization. +- **Payments** — a provider interface with a **mock provider that needs no keys** and activates the + subscription immediately, plus a Stripe provider that turns on when `STRIPE_SECRET_KEY` is set. + Webhooks are signature-checked and idempotent. +- **Email** — a log provider by default, Resend when `RESEND_API_KEY` is set. +- **Admin** — role-gated shell, overview dashboard, users table (role change / delete with + confirmation) and an audit log. +- **SEO** — per-route metadata, OpenGraph, JSON-LD, `sitemap.xml`, `robots.txt`. +- **i18n** — English dictionary in `messages/en.json`, looked up via `t()`. +- **Observability** — `/api/health`, error boundary and loading/empty states. +- **Delivery** — multi-stage Dockerfile with a healthcheck, and CI running lint + typecheck + unit + + build + e2e. + +## Data model + +`prisma/schema.prisma`: `User`, `Session`, `Subscription`, `AuditLog`. SQLite in development; +point `DATABASE_URL` at Postgres for production. + +## Deployment + +```bash +docker compose -f docker/docker-compose.yml up --build +``` + +## Quality + +```bash +node ../templates2/qa.mjs Base.Next # from the repo root: node templates2/qa.mjs Base.Next +``` + +The harness isolates a clean copy, then runs install → verify → test → build → boot → routes → +e2e → screenshot. See [`../CONTRACT.md`](../CONTRACT.md) for the Definition of Done. diff --git a/app/(app)/dashboard/page.tsx b/app/(app)/dashboard/page.tsx new file mode 100644 index 0000000..d4c5d19 --- /dev/null +++ b/app/(app)/dashboard/page.tsx @@ -0,0 +1,59 @@ +import Link from 'next/link'; +import { Badge, Card } from '@/components/ui'; +import { requireUser } from '@/lib/server/auth'; +import { db } from '@/lib/server/db'; +import { getPlan } from '@/lib/plans'; +import { t } from '@/lib/i18n'; + +export const dynamic = 'force-dynamic'; + +export default async function DashboardPage() { + const user = await requireUser(); + const sub = await db.subscription.findUnique({ where: { userId: user.id } }); + const plan = getPlan(sub?.plan); + const usedCalls = await db.auditLog.count({ where: { actorId: user.id } }); + + const usage = [ + { label: 'Seats', used: 1, limit: plan.limits.seats }, + { label: 'API calls', used: usedCalls, limit: plan.limits.apiCalls }, + ]; + + return ( +
+
+
+

{t('dashboard.title')}

+

{t('dashboard.welcome', { name: user.name || user.email })}

+
+ {plan.name} +
+ + {t('pricing.choose')}}> +

+ {plan.name} — ${plan.price} / month +

+
+ + +
    + {usage.map((u) => { + const pct = Math.min(100, Math.round((u.used / u.limit) * 100)); + return ( +
  • +
    + {u.label} + + {u.used} / {u.limit} + +
    +
    +
    +
    +
  • + ); + })} +
+
+
+ ); +} diff --git a/app/(app)/layout.tsx b/app/(app)/layout.tsx new file mode 100644 index 0000000..f5818a2 --- /dev/null +++ b/app/(app)/layout.tsx @@ -0,0 +1,12 @@ +import { SiteHeader } from '@/components/SiteHeader'; +import { SiteFooter } from '@/components/SiteFooter'; + +export default function AppLayout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+ +
+ ); +} diff --git a/app/(auth)/layout.tsx b/app/(auth)/layout.tsx new file mode 100644 index 0000000..c36e6dc --- /dev/null +++ b/app/(auth)/layout.tsx @@ -0,0 +1,13 @@ +import Link from 'next/link'; +import { t } from '@/lib/i18n'; + +export default function AuthLayout({ children }: { children: React.ReactNode }) { + return ( +
+ + {t('brand.name')} + +
{children}
+
+ ); +} diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx new file mode 100644 index 0000000..3b76b82 --- /dev/null +++ b/app/(auth)/login/page.tsx @@ -0,0 +1,15 @@ +import { Suspense } from 'react'; +import { redirect } from 'next/navigation'; +import { AuthForm } from '@/components/AuthForm'; +import { getCurrentUser } from '@/lib/server/auth'; + +export const dynamic = 'force-dynamic'; + +export default async function LoginPage() { + if (await getCurrentUser()) redirect('/dashboard'); + return ( + Loading…

}> + +
+ ); +} diff --git a/app/(auth)/register/page.tsx b/app/(auth)/register/page.tsx new file mode 100644 index 0000000..2ffbaee --- /dev/null +++ b/app/(auth)/register/page.tsx @@ -0,0 +1,15 @@ +import { Suspense } from 'react'; +import { redirect } from 'next/navigation'; +import { AuthForm } from '@/components/AuthForm'; +import { getCurrentUser } from '@/lib/server/auth'; + +export const dynamic = 'force-dynamic'; + +export default async function RegisterPage() { + if (await getCurrentUser()) redirect('/dashboard'); + return ( + Loading…

}> + +
+ ); +} diff --git a/app/(marketing)/layout.tsx b/app/(marketing)/layout.tsx new file mode 100644 index 0000000..b77354a --- /dev/null +++ b/app/(marketing)/layout.tsx @@ -0,0 +1,12 @@ +import { SiteHeader } from '@/components/SiteHeader'; +import { SiteFooter } from '@/components/SiteFooter'; + +export default function MarketingLayout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+ +
+ ); +} diff --git a/app/(marketing)/legal/privacy/page.tsx b/app/(marketing)/legal/privacy/page.tsx new file mode 100644 index 0000000..0bfe977 --- /dev/null +++ b/app/(marketing)/legal/privacy/page.tsx @@ -0,0 +1,10 @@ +export default function PrivacyPage() { + return ( +
+

Privacy Policy

+

+ This is a placeholder legal page. Replace it with your own policy before going live. +

+
+ ); +} diff --git a/app/(marketing)/legal/terms/page.tsx b/app/(marketing)/legal/terms/page.tsx new file mode 100644 index 0000000..65d9a97 --- /dev/null +++ b/app/(marketing)/legal/terms/page.tsx @@ -0,0 +1,10 @@ +export default function TermsPage() { + return ( +
+

Terms of Service

+

+ This is a placeholder legal page. Replace it with your own terms before going live. +

+
+ ); +} diff --git a/app/(marketing)/page.tsx b/app/(marketing)/page.tsx new file mode 100644 index 0000000..95c8fea --- /dev/null +++ b/app/(marketing)/page.tsx @@ -0,0 +1,44 @@ +import Link from 'next/link'; +import { t } from '@/lib/i18n'; + +const features = ['auth', 'billing', 'admin', 'seo'] as const; + +export default function HomePage() { + const jsonLd = { + '@context': 'https://schema.org', + '@type': 'WebSite', + name: t('brand.name'), + url: process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000', + }; + return ( + <> +