diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/env.ts | 20 | ||||
| -rw-r--r-- | src/lib/featureFlags.ts | 15 |
2 files changed, 32 insertions, 3 deletions
diff --git a/src/lib/env.ts b/src/lib/env.ts index 927e756..920df14 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -1,5 +1,10 @@ import { ZodIssueCode, z } from 'zod' +const interpretEnvVarAsBool = (val: unknown): boolean => { + if (typeof val !== 'string') return false + return ['true', 'yes', '1', 'on'].includes(val.toLowerCase()) +} + const envSchema = z .object({ POSTGRES_URL_NON_POOLING: z.string().url(), @@ -12,14 +17,23 @@ const envSchema = z ? `https://${process.env.VERCEL_URL}` : 'http://localhost:3000', ), - NEXT_PUBLIC_ENABLE_EXPENSE_DOCUMENTS: z.coerce.boolean().default(false), + NEXT_PUBLIC_ENABLE_EXPENSE_DOCUMENTS: z.preprocess( + interpretEnvVarAsBool, + z.boolean().default(false), + ), S3_UPLOAD_KEY: z.string().optional(), S3_UPLOAD_SECRET: z.string().optional(), S3_UPLOAD_BUCKET: z.string().optional(), S3_UPLOAD_REGION: z.string().optional(), S3_UPLOAD_ENDPOINT: z.string().optional(), - NEXT_PUBLIC_ENABLE_RECEIPT_EXTRACT: z.coerce.boolean().default(false), - NEXT_PUBLIC_ENABLE_CATEGORY_EXTRACT: z.coerce.boolean().default(false), + NEXT_PUBLIC_ENABLE_RECEIPT_EXTRACT: z.preprocess( + interpretEnvVarAsBool, + z.boolean().default(false), + ), + NEXT_PUBLIC_ENABLE_CATEGORY_EXTRACT: z.preprocess( + interpretEnvVarAsBool, + z.boolean().default(false), + ), OPENAI_API_KEY: z.string().optional(), }) .superRefine((env, ctx) => { diff --git a/src/lib/featureFlags.ts b/src/lib/featureFlags.ts new file mode 100644 index 0000000..e57ca9c --- /dev/null +++ b/src/lib/featureFlags.ts @@ -0,0 +1,15 @@ +'use server' + +import { env } from './env' + +export async function getRuntimeFeatureFlags() { + return { + enableExpenseDocuments: env.NEXT_PUBLIC_ENABLE_EXPENSE_DOCUMENTS, + enableReceiptExtract: env.NEXT_PUBLIC_ENABLE_RECEIPT_EXTRACT, + enableCategoryExtract: env.NEXT_PUBLIC_ENABLE_CATEGORY_EXTRACT, + } +} + +export type RuntimeFeatureFlags = Awaited< + ReturnType<typeof getRuntimeFeatureFlags> +> |
