create-blitzpack 0.1.0 → 0.1.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/dist/index.js +35 -77
- package/package.json +5 -6
- package/template/.dockerignore +0 -59
- package/template/.github/workflows/ci.yml +0 -157
- package/template/.husky/pre-commit +0 -1
- package/template/.husky/pre-push +0 -1
- package/template/.lintstagedrc.cjs +0 -4
- package/template/.nvmrc +0 -1
- package/template/.prettierrc +0 -9
- package/template/.vscode/settings.json +0 -13
- package/template/CLAUDE.md +0 -175
- package/template/CONTRIBUTING.md +0 -32
- package/template/Dockerfile +0 -90
- package/template/GETTING_STARTED.md +0 -35
- package/template/LICENSE +0 -21
- package/template/README.md +0 -116
- package/template/apps/api/.dockerignore +0 -51
- package/template/apps/api/.env.local.example +0 -62
- package/template/apps/api/emails/account-deleted-email.tsx +0 -69
- package/template/apps/api/emails/components/email-layout.tsx +0 -154
- package/template/apps/api/emails/config.ts +0 -22
- package/template/apps/api/emails/password-changed-email.tsx +0 -88
- package/template/apps/api/emails/password-reset-email.tsx +0 -86
- package/template/apps/api/emails/verification-email.tsx +0 -85
- package/template/apps/api/emails/welcome-email.tsx +0 -70
- package/template/apps/api/package.json +0 -84
- package/template/apps/api/prisma/migrations/20251012111439_init/migration.sql +0 -13
- package/template/apps/api/prisma/migrations/20251018162629_add_better_auth_fields/migration.sql +0 -67
- package/template/apps/api/prisma/migrations/20251019142208_add_user_role_enum/migration.sql +0 -5
- package/template/apps/api/prisma/migrations/20251019182151_user_auth/migration.sql +0 -7
- package/template/apps/api/prisma/migrations/20251019211416_faster_session_lookup/migration.sql +0 -2
- package/template/apps/api/prisma/migrations/20251119124337_add_upload_model/migration.sql +0 -26
- package/template/apps/api/prisma/migrations/20251120071241_add_scope_to_account/migration.sql +0 -2
- package/template/apps/api/prisma/migrations/20251120072608_add_oauth_token_expiration_fields/migration.sql +0 -10
- package/template/apps/api/prisma/migrations/20251120144705_add_audit_logs/migration.sql +0 -29
- package/template/apps/api/prisma/migrations/20251127123614_remove_impersonated_by/migration.sql +0 -8
- package/template/apps/api/prisma/migrations/20251127125630_remove_audit_logs/migration.sql +0 -11
- package/template/apps/api/prisma/migrations/migration_lock.toml +0 -3
- package/template/apps/api/prisma/schema.prisma +0 -116
- package/template/apps/api/prisma/seed.ts +0 -159
- package/template/apps/api/prisma.config.ts +0 -14
- package/template/apps/api/src/app.ts +0 -377
- package/template/apps/api/src/common/logger.service.ts +0 -227
- package/template/apps/api/src/config/env.ts +0 -60
- package/template/apps/api/src/config/rate-limit.ts +0 -29
- package/template/apps/api/src/hooks/auth.ts +0 -122
- package/template/apps/api/src/plugins/auth.ts +0 -198
- package/template/apps/api/src/plugins/database.ts +0 -45
- package/template/apps/api/src/plugins/logger.ts +0 -33
- package/template/apps/api/src/plugins/multipart.ts +0 -16
- package/template/apps/api/src/plugins/scalar.ts +0 -20
- package/template/apps/api/src/plugins/schedule.ts +0 -52
- package/template/apps/api/src/plugins/services.ts +0 -66
- package/template/apps/api/src/plugins/swagger.ts +0 -56
- package/template/apps/api/src/routes/accounts.ts +0 -91
- package/template/apps/api/src/routes/admin-sessions.ts +0 -92
- package/template/apps/api/src/routes/metrics.ts +0 -71
- package/template/apps/api/src/routes/password.ts +0 -46
- package/template/apps/api/src/routes/sessions.ts +0 -53
- package/template/apps/api/src/routes/stats.ts +0 -38
- package/template/apps/api/src/routes/uploads-serve.ts +0 -27
- package/template/apps/api/src/routes/uploads.ts +0 -154
- package/template/apps/api/src/routes/users.ts +0 -114
- package/template/apps/api/src/routes/verification.ts +0 -90
- package/template/apps/api/src/server.ts +0 -34
- package/template/apps/api/src/services/accounts.service.ts +0 -125
- package/template/apps/api/src/services/authorization.service.ts +0 -162
- package/template/apps/api/src/services/email.service.ts +0 -170
- package/template/apps/api/src/services/file-storage.service.ts +0 -267
- package/template/apps/api/src/services/metrics.service.ts +0 -175
- package/template/apps/api/src/services/password.service.ts +0 -56
- package/template/apps/api/src/services/sessions.service.spec.ts +0 -134
- package/template/apps/api/src/services/sessions.service.ts +0 -276
- package/template/apps/api/src/services/stats.service.ts +0 -273
- package/template/apps/api/src/services/uploads.service.ts +0 -163
- package/template/apps/api/src/services/users.service.spec.ts +0 -249
- package/template/apps/api/src/services/users.service.ts +0 -198
- package/template/apps/api/src/utils/file-validation.ts +0 -108
- package/template/apps/api/start.sh +0 -33
- package/template/apps/api/test/helpers/fastify-app.ts +0 -24
- package/template/apps/api/test/helpers/mock-authorization.ts +0 -16
- package/template/apps/api/test/helpers/mock-logger.ts +0 -28
- package/template/apps/api/test/helpers/mock-prisma.ts +0 -30
- package/template/apps/api/test/helpers/test-db.ts +0 -125
- package/template/apps/api/test/integration/auth-flow.integration.spec.ts +0 -449
- package/template/apps/api/test/integration/password.integration.spec.ts +0 -427
- package/template/apps/api/test/integration/rate-limit.integration.spec.ts +0 -51
- package/template/apps/api/test/integration/sessions.integration.spec.ts +0 -445
- package/template/apps/api/test/integration/users.integration.spec.ts +0 -211
- package/template/apps/api/test/setup.ts +0 -31
- package/template/apps/api/tsconfig.json +0 -26
- package/template/apps/api/vitest.config.ts +0 -35
- package/template/apps/web/.env.local.example +0 -11
- package/template/apps/web/components.json +0 -24
- package/template/apps/web/next.config.ts +0 -22
- package/template/apps/web/package.json +0 -56
- package/template/apps/web/postcss.config.js +0 -5
- package/template/apps/web/public/apple-icon.png +0 -0
- package/template/apps/web/public/icon.png +0 -0
- package/template/apps/web/public/robots.txt +0 -3
- package/template/apps/web/src/app/(admin)/admin/layout.tsx +0 -222
- package/template/apps/web/src/app/(admin)/admin/page.tsx +0 -157
- package/template/apps/web/src/app/(admin)/admin/sessions/page.tsx +0 -18
- package/template/apps/web/src/app/(admin)/admin/users/page.tsx +0 -20
- package/template/apps/web/src/app/(auth)/forgot-password/page.tsx +0 -177
- package/template/apps/web/src/app/(auth)/login/page.tsx +0 -159
- package/template/apps/web/src/app/(auth)/reset-password/page.tsx +0 -245
- package/template/apps/web/src/app/(auth)/signup/page.tsx +0 -153
- package/template/apps/web/src/app/dashboard/change-password/page.tsx +0 -255
- package/template/apps/web/src/app/dashboard/page.tsx +0 -296
- package/template/apps/web/src/app/error.tsx +0 -32
- package/template/apps/web/src/app/examples/file-upload/page.tsx +0 -200
- package/template/apps/web/src/app/favicon.ico +0 -0
- package/template/apps/web/src/app/global-error.tsx +0 -96
- package/template/apps/web/src/app/globals.css +0 -22
- package/template/apps/web/src/app/icon.png +0 -0
- package/template/apps/web/src/app/layout.tsx +0 -34
- package/template/apps/web/src/app/not-found.tsx +0 -28
- package/template/apps/web/src/app/page.tsx +0 -192
- package/template/apps/web/src/components/admin/activity-feed.tsx +0 -101
- package/template/apps/web/src/components/admin/charts/auth-breakdown-chart.tsx +0 -114
- package/template/apps/web/src/components/admin/charts/chart-tooltip.tsx +0 -124
- package/template/apps/web/src/components/admin/charts/realtime-metrics-chart.tsx +0 -511
- package/template/apps/web/src/components/admin/charts/role-distribution-chart.tsx +0 -102
- package/template/apps/web/src/components/admin/charts/session-activity-chart.tsx +0 -90
- package/template/apps/web/src/components/admin/charts/user-growth-chart.tsx +0 -108
- package/template/apps/web/src/components/admin/health-indicator.tsx +0 -175
- package/template/apps/web/src/components/admin/refresh-control.tsx +0 -90
- package/template/apps/web/src/components/admin/session-revoke-all-dialog.tsx +0 -79
- package/template/apps/web/src/components/admin/session-revoke-dialog.tsx +0 -74
- package/template/apps/web/src/components/admin/sessions-management-table.tsx +0 -372
- package/template/apps/web/src/components/admin/stat-card.tsx +0 -137
- package/template/apps/web/src/components/admin/user-create-dialog.tsx +0 -152
- package/template/apps/web/src/components/admin/user-delete-dialog.tsx +0 -73
- package/template/apps/web/src/components/admin/user-edit-dialog.tsx +0 -170
- package/template/apps/web/src/components/admin/users-management-table.tsx +0 -285
- package/template/apps/web/src/components/auth/email-verification-banner.tsx +0 -85
- package/template/apps/web/src/components/auth/github-button.tsx +0 -40
- package/template/apps/web/src/components/auth/google-button.tsx +0 -54
- package/template/apps/web/src/components/auth/protected-route.tsx +0 -66
- package/template/apps/web/src/components/auth/redirect-if-authenticated.tsx +0 -31
- package/template/apps/web/src/components/auth/with-auth.tsx +0 -30
- package/template/apps/web/src/components/error/error-card.tsx +0 -47
- package/template/apps/web/src/components/error/forbidden.tsx +0 -25
- package/template/apps/web/src/components/landing/command-block.tsx +0 -64
- package/template/apps/web/src/components/landing/feature-card.tsx +0 -60
- package/template/apps/web/src/components/landing/included-feature-card.tsx +0 -63
- package/template/apps/web/src/components/landing/logo.tsx +0 -41
- package/template/apps/web/src/components/landing/tech-badge.tsx +0 -11
- package/template/apps/web/src/components/layout/auth-nav.tsx +0 -58
- package/template/apps/web/src/components/layout/footer.tsx +0 -3
- package/template/apps/web/src/config/landing-data.ts +0 -152
- package/template/apps/web/src/config/site.ts +0 -5
- package/template/apps/web/src/hooks/api/__tests__/use-users.test.tsx +0 -181
- package/template/apps/web/src/hooks/api/use-admin-sessions.ts +0 -75
- package/template/apps/web/src/hooks/api/use-admin-stats.ts +0 -33
- package/template/apps/web/src/hooks/api/use-sessions.ts +0 -52
- package/template/apps/web/src/hooks/api/use-uploads.ts +0 -156
- package/template/apps/web/src/hooks/api/use-users.ts +0 -149
- package/template/apps/web/src/hooks/use-mobile.ts +0 -21
- package/template/apps/web/src/hooks/use-realtime-metrics.ts +0 -120
- package/template/apps/web/src/lib/__tests__/utils.test.ts +0 -29
- package/template/apps/web/src/lib/api.ts +0 -151
- package/template/apps/web/src/lib/auth.ts +0 -13
- package/template/apps/web/src/lib/env.ts +0 -52
- package/template/apps/web/src/lib/form-utils.ts +0 -11
- package/template/apps/web/src/lib/utils.ts +0 -1
- package/template/apps/web/src/providers.tsx +0 -34
- package/template/apps/web/src/store/atoms.ts +0 -15
- package/template/apps/web/src/test/helpers/test-utils.tsx +0 -44
- package/template/apps/web/src/test/setup.ts +0 -8
- package/template/apps/web/tailwind.config.ts +0 -5
- package/template/apps/web/tsconfig.json +0 -26
- package/template/apps/web/vitest.config.ts +0 -32
- package/template/assets/logo-512.png +0 -0
- package/template/assets/logo.svg +0 -4
- package/template/docker-compose.prod.yml +0 -66
- package/template/docker-compose.yml +0 -36
- package/template/eslint.config.ts +0 -119
- package/template/package.json +0 -77
- package/template/packages/tailwind-config/package.json +0 -9
- package/template/packages/tailwind-config/theme.css +0 -179
- package/template/packages/types/package.json +0 -29
- package/template/packages/types/src/__tests__/schemas.test.ts +0 -255
- package/template/packages/types/src/api-response.ts +0 -53
- package/template/packages/types/src/health-check.ts +0 -11
- package/template/packages/types/src/pagination.ts +0 -41
- package/template/packages/types/src/role.ts +0 -5
- package/template/packages/types/src/session.ts +0 -48
- package/template/packages/types/src/stats.ts +0 -113
- package/template/packages/types/src/upload.ts +0 -51
- package/template/packages/types/src/user.ts +0 -36
- package/template/packages/types/tsconfig.json +0 -5
- package/template/packages/types/vitest.config.ts +0 -21
- package/template/packages/ui/components.json +0 -21
- package/template/packages/ui/package.json +0 -108
- package/template/packages/ui/src/__tests__/button.test.tsx +0 -70
- package/template/packages/ui/src/alert-dialog.tsx +0 -141
- package/template/packages/ui/src/alert.tsx +0 -66
- package/template/packages/ui/src/animated-theme-toggler.tsx +0 -167
- package/template/packages/ui/src/avatar.tsx +0 -53
- package/template/packages/ui/src/badge.tsx +0 -36
- package/template/packages/ui/src/button.tsx +0 -84
- package/template/packages/ui/src/card.tsx +0 -92
- package/template/packages/ui/src/checkbox.tsx +0 -32
- package/template/packages/ui/src/data-table/data-table-column-header.tsx +0 -68
- package/template/packages/ui/src/data-table/data-table-pagination.tsx +0 -99
- package/template/packages/ui/src/data-table/data-table-toolbar.tsx +0 -55
- package/template/packages/ui/src/data-table/data-table-view-options.tsx +0 -63
- package/template/packages/ui/src/data-table/data-table.tsx +0 -167
- package/template/packages/ui/src/dialog.tsx +0 -143
- package/template/packages/ui/src/dropdown-menu.tsx +0 -257
- package/template/packages/ui/src/empty-state.tsx +0 -52
- package/template/packages/ui/src/file-upload-input.tsx +0 -202
- package/template/packages/ui/src/form.tsx +0 -168
- package/template/packages/ui/src/hooks/use-mobile.ts +0 -19
- package/template/packages/ui/src/icons/brand-icons.tsx +0 -16
- package/template/packages/ui/src/input.tsx +0 -21
- package/template/packages/ui/src/label.tsx +0 -24
- package/template/packages/ui/src/lib/utils.ts +0 -6
- package/template/packages/ui/src/password-input.tsx +0 -102
- package/template/packages/ui/src/popover.tsx +0 -48
- package/template/packages/ui/src/radio-group.tsx +0 -45
- package/template/packages/ui/src/scroll-area.tsx +0 -58
- package/template/packages/ui/src/select.tsx +0 -187
- package/template/packages/ui/src/separator.tsx +0 -28
- package/template/packages/ui/src/sheet.tsx +0 -139
- package/template/packages/ui/src/sidebar.tsx +0 -726
- package/template/packages/ui/src/skeleton-variants.tsx +0 -87
- package/template/packages/ui/src/skeleton.tsx +0 -13
- package/template/packages/ui/src/slider.tsx +0 -63
- package/template/packages/ui/src/sonner.tsx +0 -25
- package/template/packages/ui/src/spinner.tsx +0 -16
- package/template/packages/ui/src/switch.tsx +0 -31
- package/template/packages/ui/src/table.tsx +0 -116
- package/template/packages/ui/src/tabs.tsx +0 -66
- package/template/packages/ui/src/textarea.tsx +0 -18
- package/template/packages/ui/src/tooltip.tsx +0 -61
- package/template/packages/ui/src/user-avatar.tsx +0 -97
- package/template/packages/ui/test-config.js +0 -3
- package/template/packages/ui/tsconfig.json +0 -12
- package/template/packages/ui/turbo.json +0 -18
- package/template/packages/ui/vitest.config.ts +0 -17
- package/template/packages/ui/vitest.setup.ts +0 -1
- package/template/packages/utils/package.json +0 -23
- package/template/packages/utils/src/__tests__/utils.test.ts +0 -223
- package/template/packages/utils/src/array.ts +0 -18
- package/template/packages/utils/src/async.ts +0 -3
- package/template/packages/utils/src/date.ts +0 -77
- package/template/packages/utils/src/errors.ts +0 -73
- package/template/packages/utils/src/number.ts +0 -11
- package/template/packages/utils/src/string.ts +0 -13
- package/template/packages/utils/tsconfig.json +0 -5
- package/template/packages/utils/vitest.config.ts +0 -21
- package/template/pnpm-workspace.yaml +0 -4
- package/template/tsconfig.base.json +0 -32
- package/template/turbo.json +0 -133
- package/template/vitest.shared.ts +0 -26
- package/template/vitest.workspace.ts +0 -9
package/template/Dockerfile
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# Multi-stage Dockerfile for API deployment
|
|
2
|
-
# Optimized for pnpm monorepo with Prisma
|
|
3
|
-
|
|
4
|
-
# Stage 1: Dependencies
|
|
5
|
-
FROM node:22-alpine AS deps
|
|
6
|
-
RUN apk add --no-cache libc6-compat openssl
|
|
7
|
-
|
|
8
|
-
# Install pnpm
|
|
9
|
-
RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
|
|
10
|
-
|
|
11
|
-
WORKDIR /app
|
|
12
|
-
|
|
13
|
-
# Copy workspace files
|
|
14
|
-
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
|
|
15
|
-
|
|
16
|
-
# Copy all package.json files for workspace dependencies
|
|
17
|
-
COPY apps/api/package.json apps/api/
|
|
18
|
-
COPY packages/types/package.json packages/types/
|
|
19
|
-
COPY packages/utils/package.json packages/utils/
|
|
20
|
-
|
|
21
|
-
# Install dependencies (frozen lockfile for reproducible builds)
|
|
22
|
-
RUN pnpm install --frozen-lockfile --prod=false
|
|
23
|
-
|
|
24
|
-
# Stage 2: Builder
|
|
25
|
-
FROM node:22-alpine AS builder
|
|
26
|
-
RUN apk add --no-cache libc6-compat openssl
|
|
27
|
-
|
|
28
|
-
RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
|
|
29
|
-
|
|
30
|
-
WORKDIR /app
|
|
31
|
-
|
|
32
|
-
# Copy installed dependencies from deps stage
|
|
33
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
34
|
-
COPY --from=deps /app/apps/api/node_modules ./apps/api/node_modules
|
|
35
|
-
COPY --from=deps /app/packages/types/node_modules ./packages/types/node_modules
|
|
36
|
-
COPY --from=deps /app/packages/utils/node_modules ./packages/utils/node_modules
|
|
37
|
-
|
|
38
|
-
# Copy source code
|
|
39
|
-
COPY . .
|
|
40
|
-
|
|
41
|
-
# Build shared packages first (types and utils)
|
|
42
|
-
RUN pnpm --filter @repo/packages-types build
|
|
43
|
-
RUN pnpm --filter @repo/packages-utils build
|
|
44
|
-
|
|
45
|
-
# Generate Prisma Client
|
|
46
|
-
RUN pnpm --filter @repo/api db:generate
|
|
47
|
-
|
|
48
|
-
# Build the API
|
|
49
|
-
RUN pnpm --filter @repo/api build
|
|
50
|
-
|
|
51
|
-
# Stage 3: Runner (production)
|
|
52
|
-
FROM node:22-alpine AS runner
|
|
53
|
-
RUN apk add --no-cache openssl
|
|
54
|
-
|
|
55
|
-
RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
|
|
56
|
-
|
|
57
|
-
WORKDIR /app
|
|
58
|
-
|
|
59
|
-
# Create non-root user for security
|
|
60
|
-
RUN addgroup --system --gid 1001 nodejs && \
|
|
61
|
-
adduser --system --uid 1001 fastify
|
|
62
|
-
|
|
63
|
-
# Copy necessary files from builder
|
|
64
|
-
COPY --from=builder --chown=fastify:nodejs /app/apps/api/dist ./apps/api/dist
|
|
65
|
-
COPY --from=builder --chown=fastify:nodejs /app/apps/api/package.json ./apps/api/
|
|
66
|
-
COPY --from=builder --chown=fastify:nodejs /app/apps/api/prisma ./apps/api/prisma
|
|
67
|
-
COPY --from=builder --chown=fastify:nodejs /app/apps/api/start.sh ./apps/api/
|
|
68
|
-
COPY --from=builder --chown=fastify:nodejs /app/packages ./packages
|
|
69
|
-
COPY --from=builder --chown=fastify:nodejs /app/node_modules ./node_modules
|
|
70
|
-
COPY --from=builder --chown=fastify:nodejs /app/apps/api/node_modules ./apps/api/node_modules
|
|
71
|
-
COPY --from=builder --chown=fastify:nodejs /app/package.json ./package.json
|
|
72
|
-
COPY --from=builder --chown=fastify:nodejs /app/pnpm-workspace.yaml ./pnpm-workspace.yaml
|
|
73
|
-
|
|
74
|
-
# Make start script executable
|
|
75
|
-
RUN chmod +x /app/apps/api/start.sh
|
|
76
|
-
|
|
77
|
-
# Switch to non-root user
|
|
78
|
-
USER fastify
|
|
79
|
-
|
|
80
|
-
WORKDIR /app/apps/api
|
|
81
|
-
|
|
82
|
-
# Expose the API port
|
|
83
|
-
EXPOSE 8080
|
|
84
|
-
|
|
85
|
-
# Health check
|
|
86
|
-
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
|
87
|
-
CMD node -e "require('http').get('http://localhost:8080/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
|
|
88
|
-
|
|
89
|
-
# Start command (handles database wake-up, runs migrations, then starts server)
|
|
90
|
-
CMD ["/app/apps/api/start.sh"]
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# Blitzpack Template Setup
|
|
2
|
-
|
|
3
|
-
After clicking "Use this template" and cloning your repository:
|
|
4
|
-
|
|
5
|
-
## Quick Start (Use As-Is)
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
pnpm install
|
|
9
|
-
pnpm init:project
|
|
10
|
-
pnpm dev
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
**That's it!** The template works out of the box. Customize when ready.
|
|
14
|
-
|
|
15
|
-
## When You're Ready to Customize
|
|
16
|
-
|
|
17
|
-
### Update Branding
|
|
18
|
-
|
|
19
|
-
- `apps/web/src/config/site.ts` → Project name, description, GitHub URL
|
|
20
|
-
- `README.md` → Replace Blitzpack README.md with yours
|
|
21
|
-
|
|
22
|
-
### Optional: Change Database Credentials
|
|
23
|
-
|
|
24
|
-
Default credentials: `postgres/postgres_dev_password/app_dev`
|
|
25
|
-
|
|
26
|
-
To use different credentials:
|
|
27
|
-
|
|
28
|
-
1. Update `docker-compose.yml` (POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB)
|
|
29
|
-
2. Update `apps/api/.env.local` (DATABASE_URL must match step 1)
|
|
30
|
-
3. Restart Docker: `docker compose down && docker compose up -d`
|
|
31
|
-
4. Run migrations: `pnpm --filter @repo/api db:migrate`
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
**Delete this file when done.**
|
package/template/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Arman Ganjoo
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
package/template/README.md
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<img src="assets/logo.svg" alt="Blitzpack Logo" width="200">
|
|
3
|
-
<h1>Blitzpack</h1>
|
|
4
|
-
<p>Full-stack TypeScript monorepo template with Next.js, Fastify, and Turborepo. From zero to production in minutes.</p>
|
|
5
|
-
|
|
6
|
-
[](LICENSE)
|
|
7
|
-
[](https://nodejs.org/)
|
|
8
|
-
[](https://pnpm.io/)
|
|
9
|
-
[](https://www.typescriptlang.org/)
|
|
10
|
-
[](https://github.com/CarboxyDev/blitzpack/actions/workflows/ci.yml)
|
|
11
|
-
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Why Blitzpack?
|
|
17
|
-
|
|
18
|
-
Stop wasting days bootstrapping your next project. Most templates hand you a skeleton and leave you to figure out database migrations, API documentation, logging infrastructure, and much more. Blitzpack ships with all of it configured and working. You just need to run a single script to get started with a production-ready full-stack application.
|
|
19
|
-
|
|
20
|
-
**Ship your next project faster with battle-tested infrastructure already wired up.**
|
|
21
|
-
|
|
22
|
-
- **Zero-config setup**: Run one command and you're ready to code. Environment files, Docker containers, database migrations—all handled automatically.
|
|
23
|
-
|
|
24
|
-
- **Full-stack type safety**: Zod schemas define your API contracts once in `packages/types`, then flow automatically to web forms, API validation, and database queries. No duplicate validation logic.
|
|
25
|
-
|
|
26
|
-
- **Production-grade infrastructure**: Better-auth with session management and OAuth ready. Request ID tracing, automatic validation, rate limiting, structured logging, and environment-aware error responses out of the box.
|
|
27
|
-
|
|
28
|
-
- **AI pair programming ready**: Comprehensive CLAUDE.md file means AI assistants understand your architecture instantly and can accelerate your development.
|
|
29
|
-
|
|
30
|
-
## Tech Stack
|
|
31
|
-
|
|
32
|
-
**Web:** Next.js, React, TanStack Query, Tailwind CSS
|
|
33
|
-
|
|
34
|
-
**Backend:** Fastify, Prisma, PostgreSQL
|
|
35
|
-
|
|
36
|
-
**Monorepo:** Turborepo, pnpm workspaces
|
|
37
|
-
|
|
38
|
-
<details>
|
|
39
|
-
<summary>Full stack details</summary>
|
|
40
|
-
|
|
41
|
-
<p>
|
|
42
|
-
|
|
43
|
-
**Web**
|
|
44
|
-
|
|
45
|
-
- Next.js 16 + React 19
|
|
46
|
-
- TanStack Query v5 for server state
|
|
47
|
-
- shadcn/ui + Tailwind CSS v4
|
|
48
|
-
- React Hook Form + Zod validation
|
|
49
|
-
- Jotai for client state
|
|
50
|
-
|
|
51
|
-
**API**
|
|
52
|
-
|
|
53
|
-
- Fastify 5
|
|
54
|
-
- Prisma 7 + PostgreSQL 17
|
|
55
|
-
- Better-auth for authentication
|
|
56
|
-
- Pino for logging
|
|
57
|
-
- Scalar API docs
|
|
58
|
-
- Helmet + rate limiting
|
|
59
|
-
|
|
60
|
-
**Monorepo**
|
|
61
|
-
|
|
62
|
-
- pnpm workspaces + Turborepo
|
|
63
|
-
- Shared packages for types, utils, config in `packages/`
|
|
64
|
-
- Vitest for testing
|
|
65
|
-
- Husky + lint-staged for pre-commit hooks
|
|
66
|
-
</p>
|
|
67
|
-
</details>
|
|
68
|
-
|
|
69
|
-
## Quick Start
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
# Install dependencies
|
|
73
|
-
pnpm install
|
|
74
|
-
|
|
75
|
-
# Automated setup (creates .env files, starts docker, runs migrations)
|
|
76
|
-
pnpm init:project
|
|
77
|
-
|
|
78
|
-
# Start development
|
|
79
|
-
pnpm dev
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
The setup script handles everything: environment files, docker containers, database migrations, and optional seeding. Safe to run multiple times.
|
|
83
|
-
|
|
84
|
-
You must have docker installed and running on your machine.
|
|
85
|
-
|
|
86
|
-
**What's running:**
|
|
87
|
-
|
|
88
|
-
- Web: [http://localhost:3000](http://localhost:3000)
|
|
89
|
-
- API: [http://localhost:8080/api](http://localhost:8080/api)
|
|
90
|
-
- API Docs: [http://localhost:8080/docs](http://localhost:8080/docs)
|
|
91
|
-
- Health Check: [http://localhost:8080/health](http://localhost:8080/health)
|
|
92
|
-
|
|
93
|
-
**Database tools:**
|
|
94
|
-
|
|
95
|
-
- Prisma Studio: Run `pnpm db:studio` to open [http://localhost:5555](http://localhost:5555) (recommended for data inspection)
|
|
96
|
-
|
|
97
|
-
**Built-in pages:**
|
|
98
|
-
|
|
99
|
-
- `/examples` - Component examples
|
|
100
|
-
- `/dashboard` - Protected user dashboard
|
|
101
|
-
- `/login` - Sign in page
|
|
102
|
-
- `/signup` - Create new account
|
|
103
|
-
- `/forgot-password` - Forgot password page
|
|
104
|
-
- `/reset-password` - Reset password page
|
|
105
|
-
|
|
106
|
-
## Project Structure
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
blitzpack/
|
|
110
|
-
├── apps/
|
|
111
|
-
│ ├── web/ # Next.js app
|
|
112
|
-
│ └── api/ # Fastify API
|
|
113
|
-
└── packages/
|
|
114
|
-
├── types/ # Zod schemas + inferred types
|
|
115
|
-
└── utils/ # Shared utilities
|
|
116
|
-
```
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Dependencies
|
|
2
|
-
node_modules
|
|
3
|
-
.pnpm-store
|
|
4
|
-
|
|
5
|
-
# Build outputs
|
|
6
|
-
dist
|
|
7
|
-
build
|
|
8
|
-
.next
|
|
9
|
-
*.tsbuildinfo
|
|
10
|
-
|
|
11
|
-
# Development files
|
|
12
|
-
.env
|
|
13
|
-
.env.local
|
|
14
|
-
.env.*.local
|
|
15
|
-
*.log
|
|
16
|
-
npm-debug.log*
|
|
17
|
-
yarn-debug.log*
|
|
18
|
-
yarn-error.log*
|
|
19
|
-
pnpm-debug.log*
|
|
20
|
-
|
|
21
|
-
# Testing
|
|
22
|
-
coverage
|
|
23
|
-
test-results
|
|
24
|
-
.vitest
|
|
25
|
-
|
|
26
|
-
# IDE
|
|
27
|
-
.vscode
|
|
28
|
-
.idea
|
|
29
|
-
*.swp
|
|
30
|
-
*.swo
|
|
31
|
-
.DS_Store
|
|
32
|
-
|
|
33
|
-
# Git
|
|
34
|
-
.git
|
|
35
|
-
.gitignore
|
|
36
|
-
.gitattributes
|
|
37
|
-
|
|
38
|
-
# Documentation
|
|
39
|
-
*.md
|
|
40
|
-
!README.md
|
|
41
|
-
|
|
42
|
-
# CI/CD
|
|
43
|
-
.github
|
|
44
|
-
.gitlab-ci.yml
|
|
45
|
-
.travis.yml
|
|
46
|
-
|
|
47
|
-
# Misc
|
|
48
|
-
.cache
|
|
49
|
-
.temp
|
|
50
|
-
tmp
|
|
51
|
-
temp
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
NODE_ENV=development
|
|
2
|
-
API_URL=http://localhost:8080
|
|
3
|
-
FRONTEND_URL=http://localhost:3000
|
|
4
|
-
PORT=8080
|
|
5
|
-
|
|
6
|
-
# Database connection string for local Docker PostgreSQL
|
|
7
|
-
# Match credentials from docker-compose.yml
|
|
8
|
-
# Note: Test database will automatically use app_dev_test (suffix added by test runner)
|
|
9
|
-
DATABASE_URL=postgresql://postgres:postgres_dev_password@localhost:5432/app_dev
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
# Cookie secret for signing cookies
|
|
13
|
-
COOKIE_SECRET=dev-secret-change-in-production-use-random-string
|
|
14
|
-
|
|
15
|
-
# Logging verbosity level
|
|
16
|
-
# - minimal: Only errors and critical warnings (recommended for production)
|
|
17
|
-
# - normal: Standard HTTP requests, business events, errors (default)
|
|
18
|
-
# - detailed: Include debug info, SQL queries, cache operations
|
|
19
|
-
# - verbose: Everything including request/response bodies, timing breakdowns
|
|
20
|
-
LOG_LEVEL=normal
|
|
21
|
-
|
|
22
|
-
# Better Auth configuration
|
|
23
|
-
BETTER_AUTH_SECRET=dev-secret-change-in-production-must-be-at-least-32-characters
|
|
24
|
-
# Base URL of your API for Better Auth callbacks
|
|
25
|
-
BETTER_AUTH_URL=http://localhost:8080
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# Email Service Configuration
|
|
30
|
-
# You MUST verify your domain in Resend dashboard before sending emails
|
|
31
|
-
RESEND_API_KEY=re_xxxxxxxxxxxx
|
|
32
|
-
EMAIL_FROM=noreply@yourdomain.com
|
|
33
|
-
|
|
34
|
-
# OAuth Provider Credentials (Optional but recommended)
|
|
35
|
-
# Google and GitHub OAuth are enabled by default.
|
|
36
|
-
# Google OAuth Setup:
|
|
37
|
-
# 1. Go to: https://console.cloud.google.com/apis/credentials
|
|
38
|
-
# 2. Create OAuth 2.0 Client ID (Web application)
|
|
39
|
-
# 3. Add authorized redirect URI: http://localhost:8080/api/auth/callback/google
|
|
40
|
-
# 4. For production, add: https://<domain>.com/api/auth/callback/google
|
|
41
|
-
GOOGLE_CLIENT_ID=
|
|
42
|
-
GOOGLE_CLIENT_SECRET=
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
# GitHub OAuth Setup:
|
|
46
|
-
# 1. Go to: https://github.com/settings/developers
|
|
47
|
-
# 2. Create new OAuth App
|
|
48
|
-
# 3. Set Authorization callback URL: http://localhost:8080/api/auth/callback/github
|
|
49
|
-
# 4. For production, add: https://<domain>.com/api/auth/callback/github
|
|
50
|
-
GITHUB_CLIENT_ID=
|
|
51
|
-
GITHUB_CLIENT_SECRET=
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
# File Storage Configuration (OPTIONAL)
|
|
55
|
-
# Defaults to local file storage if not configured
|
|
56
|
-
# For S3-compatible storage (AWS S3, Cloudflare R2, MinIO, etc.)
|
|
57
|
-
# STORAGE_TYPE=local
|
|
58
|
-
# S3_BUCKET=
|
|
59
|
-
# S3_REGION=auto
|
|
60
|
-
# S3_ACCESS_KEY_ID=
|
|
61
|
-
# S3_SECRET_ACCESS_KEY=
|
|
62
|
-
# S3_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { Link, Text } from '@react-email/components';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
|
|
4
|
-
import { EmailLayout } from './components/email-layout';
|
|
5
|
-
import { emailConfig } from './config';
|
|
6
|
-
|
|
7
|
-
interface AccountDeletedEmailProps {
|
|
8
|
-
userEmail: string;
|
|
9
|
-
deletedAt: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export default function AccountDeletedEmail({
|
|
13
|
-
userEmail = 'user@example.com',
|
|
14
|
-
deletedAt = new Date().toLocaleString('en-US', {
|
|
15
|
-
dateStyle: 'medium',
|
|
16
|
-
timeStyle: 'short',
|
|
17
|
-
}),
|
|
18
|
-
}: AccountDeletedEmailProps) {
|
|
19
|
-
const { appName, supportEmail } = emailConfig;
|
|
20
|
-
|
|
21
|
-
return (
|
|
22
|
-
<EmailLayout
|
|
23
|
-
preview={`Your ${appName} account has been deleted`}
|
|
24
|
-
heading="Account deleted"
|
|
25
|
-
>
|
|
26
|
-
<Text style={paragraph}>
|
|
27
|
-
Your account (<strong>{userEmail}</strong>) has been permanently deleted
|
|
28
|
-
on {deletedAt}.
|
|
29
|
-
</Text>
|
|
30
|
-
|
|
31
|
-
<Text style={paragraph}>
|
|
32
|
-
All your data has been removed from our systems. This action cannot be
|
|
33
|
-
undone.
|
|
34
|
-
</Text>
|
|
35
|
-
|
|
36
|
-
<Text style={paragraph}>
|
|
37
|
-
If you didn't request this deletion or believe this was done in error,
|
|
38
|
-
please contact us immediately at{' '}
|
|
39
|
-
<Link href={`mailto:${supportEmail}`} style={link}>
|
|
40
|
-
{supportEmail}
|
|
41
|
-
</Link>
|
|
42
|
-
.
|
|
43
|
-
</Text>
|
|
44
|
-
|
|
45
|
-
<Text style={paragraphSmall}>
|
|
46
|
-
Thank you for being part of {appName}. We're sorry to see you go.
|
|
47
|
-
</Text>
|
|
48
|
-
</EmailLayout>
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const paragraph: React.CSSProperties = {
|
|
53
|
-
color: '#334155',
|
|
54
|
-
fontSize: '15px',
|
|
55
|
-
lineHeight: '24px',
|
|
56
|
-
margin: '0 0 24px',
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
const paragraphSmall: React.CSSProperties = {
|
|
60
|
-
color: '#94a3b8',
|
|
61
|
-
fontSize: '13px',
|
|
62
|
-
lineHeight: '20px',
|
|
63
|
-
margin: '24px 0 0',
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const link: React.CSSProperties = {
|
|
67
|
-
color: '#2563eb',
|
|
68
|
-
textDecoration: 'underline',
|
|
69
|
-
};
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Body,
|
|
3
|
-
Container,
|
|
4
|
-
Head,
|
|
5
|
-
Heading,
|
|
6
|
-
Hr,
|
|
7
|
-
Html,
|
|
8
|
-
Img,
|
|
9
|
-
Link,
|
|
10
|
-
Preview,
|
|
11
|
-
Section,
|
|
12
|
-
Text,
|
|
13
|
-
} from '@react-email/components';
|
|
14
|
-
import * as React from 'react';
|
|
15
|
-
|
|
16
|
-
import { emailConfig } from '../config';
|
|
17
|
-
|
|
18
|
-
interface EmailLayoutProps {
|
|
19
|
-
preview: string;
|
|
20
|
-
heading: string;
|
|
21
|
-
children: React.ReactNode;
|
|
22
|
-
showFooterLinks?: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function EmailLayout({
|
|
26
|
-
preview,
|
|
27
|
-
heading,
|
|
28
|
-
children,
|
|
29
|
-
showFooterLinks = true,
|
|
30
|
-
}: EmailLayoutProps) {
|
|
31
|
-
const { appName, logoUrl, primaryColor, supportEmail } = emailConfig;
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<Html>
|
|
35
|
-
<Head />
|
|
36
|
-
<Preview>{preview}</Preview>
|
|
37
|
-
<Body style={main}>
|
|
38
|
-
<Container style={container}>
|
|
39
|
-
<Section style={logoSection}>
|
|
40
|
-
{logoUrl ? (
|
|
41
|
-
<Img src={logoUrl} width="48" height="48" alt={appName} />
|
|
42
|
-
) : (
|
|
43
|
-
<Text style={{ ...logoText, color: primaryColor }}>
|
|
44
|
-
{appName}
|
|
45
|
-
</Text>
|
|
46
|
-
)}
|
|
47
|
-
</Section>
|
|
48
|
-
|
|
49
|
-
<Section style={contentSection}>
|
|
50
|
-
<Heading style={h1}>{heading}</Heading>
|
|
51
|
-
{children}
|
|
52
|
-
</Section>
|
|
53
|
-
|
|
54
|
-
<Hr style={hr} />
|
|
55
|
-
|
|
56
|
-
<Section style={footer}>
|
|
57
|
-
{showFooterLinks && (
|
|
58
|
-
<Text style={footerLinks}>
|
|
59
|
-
<Link href={`mailto:${supportEmail}`} style={footerLink}>
|
|
60
|
-
Contact Support
|
|
61
|
-
</Link>
|
|
62
|
-
</Text>
|
|
63
|
-
)}
|
|
64
|
-
<Text style={footerText}>
|
|
65
|
-
© {new Date().getFullYear()} {appName}. All rights reserved.
|
|
66
|
-
</Text>
|
|
67
|
-
<Text style={footerMuted}>
|
|
68
|
-
If you didn't expect this email, you can safely ignore it.
|
|
69
|
-
</Text>
|
|
70
|
-
</Section>
|
|
71
|
-
</Container>
|
|
72
|
-
</Body>
|
|
73
|
-
</Html>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const main: React.CSSProperties = {
|
|
78
|
-
backgroundColor: '#f8fafc',
|
|
79
|
-
fontFamily:
|
|
80
|
-
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif',
|
|
81
|
-
padding: '40px 0',
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
const container: React.CSSProperties = {
|
|
85
|
-
backgroundColor: '#ffffff',
|
|
86
|
-
margin: '0 auto',
|
|
87
|
-
maxWidth: '560px',
|
|
88
|
-
borderRadius: '12px',
|
|
89
|
-
border: '1px solid #e2e8f0',
|
|
90
|
-
overflow: 'hidden',
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const logoSection: React.CSSProperties = {
|
|
94
|
-
padding: '32px 40px 24px',
|
|
95
|
-
textAlign: 'center',
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const logoText: React.CSSProperties = {
|
|
99
|
-
fontSize: '24px',
|
|
100
|
-
fontWeight: '700',
|
|
101
|
-
margin: '0',
|
|
102
|
-
letterSpacing: '-0.5px',
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
const contentSection: React.CSSProperties = {
|
|
106
|
-
padding: '0 40px 32px',
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
const h1: React.CSSProperties = {
|
|
110
|
-
color: '#0f172a',
|
|
111
|
-
fontSize: '24px',
|
|
112
|
-
fontWeight: '600',
|
|
113
|
-
lineHeight: '32px',
|
|
114
|
-
margin: '0 0 24px',
|
|
115
|
-
letterSpacing: '-0.25px',
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const hr: React.CSSProperties = {
|
|
119
|
-
borderColor: '#e2e8f0',
|
|
120
|
-
borderTop: 'none',
|
|
121
|
-
margin: '0',
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
const footer: React.CSSProperties = {
|
|
125
|
-
padding: '24px 40px',
|
|
126
|
-
backgroundColor: '#f8fafc',
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
const footerLinks: React.CSSProperties = {
|
|
130
|
-
textAlign: 'center',
|
|
131
|
-
margin: '0 0 16px',
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const footerLink: React.CSSProperties = {
|
|
135
|
-
color: '#64748b',
|
|
136
|
-
fontSize: '13px',
|
|
137
|
-
textDecoration: 'underline',
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
const footerText: React.CSSProperties = {
|
|
141
|
-
color: '#64748b',
|
|
142
|
-
fontSize: '13px',
|
|
143
|
-
lineHeight: '20px',
|
|
144
|
-
textAlign: 'center',
|
|
145
|
-
margin: '0 0 8px',
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const footerMuted: React.CSSProperties = {
|
|
149
|
-
color: '#94a3b8',
|
|
150
|
-
fontSize: '12px',
|
|
151
|
-
lineHeight: '18px',
|
|
152
|
-
textAlign: 'center',
|
|
153
|
-
margin: '0',
|
|
154
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Email template configuration.
|
|
3
|
-
*
|
|
4
|
-
* IMPORTANT: Update these values before deploying to production.
|
|
5
|
-
* The logo must be hosted at a publicly accessible URL.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export interface EmailConfig {
|
|
9
|
-
appName: string;
|
|
10
|
-
websiteUrl: string;
|
|
11
|
-
supportEmail: string;
|
|
12
|
-
primaryColor: string;
|
|
13
|
-
logoUrl: string | undefined;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const emailConfig: EmailConfig = {
|
|
17
|
-
appName: 'Your App',
|
|
18
|
-
websiteUrl: 'https://yourapp.com',
|
|
19
|
-
supportEmail: 'support@yourapp.com',
|
|
20
|
-
primaryColor: '#2563eb',
|
|
21
|
-
logoUrl: undefined,
|
|
22
|
-
};
|