feat: turbostarter boilerplate
Production-ready Next.js boilerplate with: - Runtime env validation (fail-fast on missing vars) - Feature-gated config (S3, Stripe, email, OAuth) - Docker + Coolify deployment pipeline - PostgreSQL + pgvector, MinIO S3, Better Auth - TypeScript strict mode (no ignoreBuildErrors) - i18n (en/es), AI modules, billing, monitoring Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
55
apps/mobile/env.config.ts
Normal file
55
apps/mobile/env.config.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import { defineEnv } from "envin";
|
||||
import * as z from "zod";
|
||||
|
||||
import { preset as analytics } from "@turbostarter/analytics-mobile/env";
|
||||
import { preset as monitoring } from "@turbostarter/monitoring-mobile/env";
|
||||
import { envConfig } from "@turbostarter/shared/constants";
|
||||
import { ThemeColor, ThemeMode } from "@turbostarter/ui";
|
||||
|
||||
const castStringToBool = z.preprocess((val) => {
|
||||
if (typeof val === "string") {
|
||||
if (["1", "true"].includes(val.toLowerCase())) return true;
|
||||
if (["0", "false"].includes(val.toLowerCase())) return false;
|
||||
}
|
||||
return val;
|
||||
}, z.coerce.boolean());
|
||||
|
||||
export default defineEnv({
|
||||
...envConfig,
|
||||
extends: [analytics, monitoring],
|
||||
clientPrefix: "EXPO_PUBLIC_",
|
||||
client: {
|
||||
EXPO_PUBLIC_AUTH_PASSWORD: castStringToBool.optional().default(true),
|
||||
EXPO_PUBLIC_AUTH_MAGIC_LINK: castStringToBool.optional().default(false),
|
||||
EXPO_PUBLIC_AUTH_ANONYMOUS: castStringToBool.optional().default(true),
|
||||
EXPO_PUBLIC_GOOGLE_CLIENT_ID: z.string().optional().default(""),
|
||||
|
||||
EXPO_PUBLIC_SITE_URL: z.url(),
|
||||
EXPO_PUBLIC_DEFAULT_LOCALE: z.string().optional().default("en"),
|
||||
EXPO_PUBLIC_THEME_MODE: z
|
||||
.enum(ThemeMode)
|
||||
.optional()
|
||||
.default(ThemeMode.SYSTEM),
|
||||
EXPO_PUBLIC_THEME_COLOR: z
|
||||
.enum(ThemeColor)
|
||||
.optional()
|
||||
.default(ThemeColor.ORANGE),
|
||||
},
|
||||
env: {
|
||||
...process.env,
|
||||
EXPO_PUBLIC_SITE_URL: process.env.EXPO_PUBLIC_SITE_URL,
|
||||
EXPO_PUBLIC_DEFAULT_LOCALE: process.env.EXPO_PUBLIC_DEFAULT_LOCALE,
|
||||
EXPO_PUBLIC_THEME_MODE: process.env.EXPO_PUBLIC_THEME_MODE,
|
||||
EXPO_PUBLIC_THEME_COLOR: process.env.EXPO_PUBLIC_THEME_COLOR,
|
||||
|
||||
EXPO_PUBLIC_AUTH_PASSWORD: process.env.EXPO_PUBLIC_AUTH_PASSWORD,
|
||||
EXPO_PUBLIC_AUTH_MAGIC_LINK: process.env.EXPO_PUBLIC_AUTH_MAGIC_LINK,
|
||||
EXPO_PUBLIC_AUTH_ANONYMOUS: process.env.EXPO_PUBLIC_AUTH_ANONYMOUS,
|
||||
EXPO_PUBLIC_GOOGLE_CLIENT_ID: process.env.EXPO_PUBLIC_GOOGLE_CLIENT_ID,
|
||||
|
||||
EXPO_PUBLIC_POSTHOG_KEY: process.env.EXPO_PUBLIC_POSTHOG_KEY,
|
||||
EXPO_PUBLIC_POSTHOG_HOST: process.env.EXPO_PUBLIC_POSTHOG_HOST,
|
||||
EXPO_PUBLIC_SENTRY_DSN: process.env.EXPO_PUBLIC_SENTRY_DSN,
|
||||
EXPO_PUBLIC_SENTRY_ENVIRONMENT: process.env.EXPO_PUBLIC_SENTRY_ENVIRONMENT,
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user