summaryrefslogtreecommitdiff
path: root/packages/env
diff options
context:
space:
mode:
authorMaze <167211895+mazeincoding@users.noreply.github.com>2026-01-31 00:20:04 +0100
committerGitHub <noreply@github.com>2026-01-31 00:20:04 +0100
commit7bf0984698e43b9aa2dd879f65951318ed410390 (patch)
treeccf2cd590a47d550152afc07129cb55c71a9ec35 /packages/env
parent0173db99448d1c4c6415dcf15272e17551b48b04 (diff)
downloadopencut-7bf0984698e43b9aa2dd879f65951318ed410390.tar.gz
codebase overhaul (#697)
Diffstat (limited to 'packages/env')
-rw-r--r--packages/env/package.json21
-rw-r--r--packages/env/src/tools.ts29
-rw-r--r--packages/env/src/types/node-env.d.ts1
-rw-r--r--packages/env/src/web.ts34
4 files changed, 85 insertions, 0 deletions
diff --git a/packages/env/package.json b/packages/env/package.json
new file mode 100644
index 00000000..0b794ef4
--- /dev/null
+++ b/packages/env/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "@opencut/env",
+ "version": "0.0.0",
+ "description": "Environment package for OpenCut",
+ "main": "./src/index.ts",
+ "types": "./src/index.ts",
+ "exports": {
+ ".": "./src/index.ts",
+ "./web": "./src/web.ts",
+ "./tools": "./src/tools.ts"
+ },
+ "dependencies": {
+ "zod": "^4.0.5"
+ },
+ "devDependencies": {
+ "dotenv": "^16.4.7",
+ "@types/bun": "latest",
+ "@types/node": "^24.2.1",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/packages/env/src/tools.ts b/packages/env/src/tools.ts
new file mode 100644
index 00000000..625e3d71
--- /dev/null
+++ b/packages/env/src/tools.ts
@@ -0,0 +1,29 @@
+import { z } from "zod";
+
+const toolsEnvSchema = z.object({
+ // Node
+ NODE_ENV: z.enum(["development", "production", "test"]),
+ ANALYZE: z.string().optional(),
+ NEXT_RUNTIME: z.enum(["nodejs", "edge"]).optional(),
+
+ // Public
+ NEXT_PUBLIC_SITE_URL: z.url().default("http://localhost:3000"),
+
+ // Server
+ DATABASE_URL: z
+ .string()
+ .startsWith("postgres://")
+ .or(z.string().startsWith("postgresql://")),
+
+ BETTER_AUTH_SECRET: z.string(),
+ UPSTASH_REDIS_REST_URL: z.url(),
+ UPSTASH_REDIS_REST_TOKEN: z.string(),
+ CLOUDFLARE_ACCOUNT_ID: z.string(),
+ R2_ACCESS_KEY_ID: z.string(),
+ R2_SECRET_ACCESS_KEY: z.string(),
+ R2_BUCKET_NAME: z.string(),
+});
+
+export type ToolsEnv = z.infer<typeof toolsEnvSchema>;
+
+export const toolsEnv = toolsEnvSchema.parse(process.env);
diff --git a/packages/env/src/types/node-env.d.ts b/packages/env/src/types/node-env.d.ts
new file mode 100644
index 00000000..7e3a61cb
--- /dev/null
+++ b/packages/env/src/types/node-env.d.ts
@@ -0,0 +1 @@
+/// <reference types="node" />
diff --git a/packages/env/src/web.ts b/packages/env/src/web.ts
new file mode 100644
index 00000000..4e8b550e
--- /dev/null
+++ b/packages/env/src/web.ts
@@ -0,0 +1,34 @@
+import { z } from "zod";
+
+const webEnvSchema = z.object({
+ // Node
+ NODE_ENV: z.enum(["development", "production", "test"]),
+ ANALYZE: z.string().optional(),
+ NEXT_RUNTIME: z.enum(["nodejs", "edge"]).optional(),
+
+ // Public
+ NEXT_PUBLIC_SITE_URL: z.url().default("http://localhost:3000"),
+ NEXT_PUBLIC_MARBLE_API_URL: z.url(),
+
+ // Server
+ DATABASE_URL: z
+ .string()
+ .startsWith("postgres://")
+ .or(z.string().startsWith("postgresql://")),
+
+ BETTER_AUTH_SECRET: z.string(),
+ UPSTASH_REDIS_REST_URL: z.url(),
+ UPSTASH_REDIS_REST_TOKEN: z.string(),
+ MARBLE_WORKSPACE_KEY: z.string(),
+ FREESOUND_CLIENT_ID: z.string(),
+ FREESOUND_API_KEY: z.string(),
+ CLOUDFLARE_ACCOUNT_ID: z.string(),
+ R2_ACCESS_KEY_ID: z.string(),
+ R2_SECRET_ACCESS_KEY: z.string(),
+ R2_BUCKET_NAME: z.string(),
+ MODAL_TRANSCRIPTION_URL: z.url(),
+});
+
+export type WebEnv = z.infer<typeof webEnvSchema>;
+
+export const webEnv = webEnvSchema.parse(process.env);