diff --git a/apps/roam/scripts/compile.ts b/apps/roam/scripts/compile.ts index b639a9df0..0dfcbdf87 100644 --- a/apps/roam/scripts/compile.ts +++ b/apps/roam/scripts/compile.ts @@ -18,18 +18,7 @@ const getVersion = (): string => { const getBuildDate = (): string => { return new Date().toISOString().split("T")[0]; // YYYY-MM-DD format }; -let envContents = null; - -try { - const dbDotEnv = require("@repo/database/dbDotEnv"); - envContents = dbDotEnv.envContents; -} catch (error) { - if ((error as Error).message.includes("Cannot find module")) { - console.error("Build the database module before compiling roam"); - process.exit(1); - } - throw error; -} +const { envContents } = require("@repo/database/dbDotEnv"); // https://github.com/evanw/esbuild/issues/337#issuecomment-954633403 const importAsGlobals = ( diff --git a/apps/roam/scripts/deploy.ts b/apps/roam/scripts/deploy.ts index 59c0137ef..b060e6700 100644 --- a/apps/roam/scripts/deploy.ts +++ b/apps/roam/scripts/deploy.ts @@ -2,7 +2,7 @@ import { put } from "@vercel/blob"; import fs, { readFileSync } from "fs"; import { join } from "path"; import { compile } from "./compile"; -import { config } from "@repo/database/dbDotEnv"; +const { config } = require("@repo/database/dbDotEnv"); import { execSync } from "child_process"; if (process.env.NODE_ENV !== "production") { diff --git a/apps/website/app/utils/supabase/middleware.ts b/apps/website/app/utils/supabase/middleware.ts index 35ee1e6ee..ba247e2bb 100644 --- a/apps/website/app/utils/supabase/middleware.ts +++ b/apps/website/app/utils/supabase/middleware.ts @@ -1,6 +1,6 @@ import { createServerClient } from "@supabase/ssr"; import { NextResponse, type NextRequest } from "next/server"; -import { envContents } from "@repo/database/dbDotEnv"; +const { envContents } = require("@repo/database/dbDotEnv"); // Inspired by https://supabase.com/ui/docs/nextjs/password-based-auth diff --git a/apps/website/app/utils/supabase/server.ts b/apps/website/app/utils/supabase/server.ts index 357c7c9f7..5b448cb6d 100644 --- a/apps/website/app/utils/supabase/server.ts +++ b/apps/website/app/utils/supabase/server.ts @@ -1,7 +1,7 @@ import { createServerClient, type CookieOptions } from "@supabase/ssr"; import { cookies } from "next/headers"; import type { Database } from "@repo/database/dbTypes"; -import { envContents } from "@repo/database/dbDotEnv"; +const { envContents } = require("@repo/database/dbDotEnv"); // Inspired by https://supabase.com/ui/docs/nextjs/password-based-auth diff --git a/apps/website/next.config.ts b/apps/website/next.config.ts index 2eca0225b..79161757c 100644 --- a/apps/website/next.config.ts +++ b/apps/website/next.config.ts @@ -1,5 +1,5 @@ import type { NextConfig } from "next"; -import { config } from "@repo/database/dbDotEnv"; +const { config } = require("@repo/database/dbDotEnv"); config(); diff --git a/packages/database/doc/tasks.dot b/packages/database/doc/tasks.dot index bd67a8c56..50611c1d0 100644 --- a/packages/database/doc/tasks.dot +++ b/packages/database/doc/tasks.dot @@ -20,6 +20,7 @@ deploy deploy_functions migrate gentypes +bootstrap /* supabase functions */ node [color=purple] @@ -58,6 +59,7 @@ cucumber_js s_migrate -> migrations_up dev -> setup dev -> serve + setup -> bootstrap setup -> genenv setup -> migrate serve -> s_serve @@ -83,4 +85,5 @@ cucumber_js build -> tsc s_genTypes -> generate_schema s_migrate -> sup_start + bootstrap -> tsc } diff --git a/packages/database/package.json b/packages/database/package.json index c8bda01eb..b0d87cbcb 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -6,9 +6,10 @@ "exports": { "./lib/*": "./src/lib/*.ts", "./dbDotEnv": { - "types": "./types/dbDotEnv.d.ts", - "import": "./src/dbDotEnv.mjs", - "default": "./src/dbDotEnv.mjs" + "types": "./dist/src/dbDotEnv.d.mts", + "import": "./dist/src/dbDotEnv.mjs", + "require": "./dist/src/dbDotEnv.mjs", + "default": "./dist/src/dbDotEnv.mjs" }, "./dbTypes": "./src/dbTypes.ts", "./inputTypes": "./src/inputTypes.ts" @@ -16,18 +17,19 @@ "typesVersions": { "*": { "./dbDotEnv": [ - "types/dbDotEnv.d.ts" + "dist/src/dbDotEnv.d.mts" ] } }, "scripts": { "init": "supabase login", - "setup": "pnpm run genenv && pnpm run migrate", + "setup": "pnpm run bootstrap && pnpm run genenv && pnpm run migrate", + "bootstrap": "tsc -p tsconfig_bootstrap.json", "dev": "pnpm run setup && pnpm run serve", "build": "pnpm run setup && tsc", "serve": "tsx scripts/serve.ts", "stop": "supabase stop", - "check-types": "tsc --noEmit --skipLibCheck", + "check-types": "tsc -p tsconfig_lint.json", "check-schema": "tsx scripts/lintSchemas.ts && supabase stop && pnpm run dbdiff", "lint": "eslint . && tsx scripts/lintSchemas.ts && tsx scripts/lintFunctions.ts", "lint:fix": "eslint --fix . && tsx scripts/lintSchemas.ts -f && tsx scripts/lintFunctions.ts", diff --git a/packages/database/scripts/genTypes.ts b/packages/database/scripts/genTypes.ts index fbb031ece..7611ca617 100644 --- a/packages/database/scripts/genTypes.ts +++ b/packages/database/scripts/genTypes.ts @@ -1,7 +1,7 @@ import { execSync } from "node:child_process"; import { writeFileSync } from "fs"; import { join, dirname } from "path"; -import { getVariant } from "@repo/database/dbDotEnv"; +import { getVariant } from "../src/dbDotEnv.mts"; const __dirname = dirname(__filename); const projectRoot = join(__dirname, ".."); diff --git a/packages/database/scripts/serve.ts b/packages/database/scripts/serve.ts index f02c6479c..eaaee02c8 100644 --- a/packages/database/scripts/serve.ts +++ b/packages/database/scripts/serve.ts @@ -1,7 +1,7 @@ import { execSync } from "node:child_process"; import { writeFileSync } from "fs"; import { join, dirname } from "path"; -import { getVariant } from "@repo/database/dbDotEnv"; +import { getVariant } from "../src/dbDotEnv.mts"; const __dirname = dirname(__filename); const projectRoot = join(__dirname, ".."); diff --git a/packages/database/src/dbDotEnv.mjs b/packages/database/src/dbDotEnv.mts similarity index 77% rename from packages/database/src/dbDotEnv.mjs rename to packages/database/src/dbDotEnv.mts index 023af9f17..e6a2bed67 100644 --- a/packages/database/src/dbDotEnv.mjs +++ b/packages/database/src/dbDotEnv.mts @@ -3,9 +3,12 @@ import { join, dirname, basename } from "node:path"; import { fileURLToPath } from "node:url"; import dotenv from "dotenv"; -// Note: This file is written as mjs so it can be used before typescript compilation. -// This means the corresponding .d.ts file is currently maintained by hand. -// Remember to update it as needed. +export type Variant = + | "none" + | "local" + | "branch" + | "production" + | "implicit"; const findRoot = () => { let dir = fileURLToPath(import.meta.url); @@ -15,24 +18,28 @@ const findRoot = () => { return dir; }; -export const getVariant = () => { +const VARIANTS = new Set([ + "none", + "local", + "branch", + "production", + "implicit", + ]); + +export const getVariant = (): Variant => { const processHasVars = !!process.env["SUPABASE_URL"] && !!process.env["SUPABASE_ANON_KEY"]; const useDbArgPos = (process.argv || []).indexOf("--use-db"); let variant = - useDbArgPos > 0 + (useDbArgPos > 0 ? process.argv[useDbArgPos + 1] - : process.env["SUPABASE_USE_DB"]; + : process.env["SUPABASE_USE_DB"]) as Variant | undefined; if (variant === undefined) { dotenv.config(); - variant = process.env["SUPABASE_USE_DB"]; + variant = process.env["SUPABASE_USE_DB"] as Variant | undefined; } - if ( - ["local", "branch", "production", "none", "implicit", undefined].indexOf( - variant, - ) === -1 - ) { + if (variant !== undefined && !VARIANTS.has(variant)) { throw new Error("Invalid variant: " + variant); } @@ -61,14 +68,14 @@ export const getVariant = () => { return variant; }; -export const envFilePath = () => { +export const envFilePath = (): string | null => { const variant = getVariant(); if (variant === "implicit" || variant === "none") return null; const name = join(findRoot(), `.env.${variant}`); return existsSync(name) ? name : null; }; -export const envContents = () => { +export const envContents = (): Partial> => { const path = envFilePath(); if (!path) { // Fallback to process.env when running in production environments @@ -85,7 +92,7 @@ export const envContents = () => { let configDone = false; -export const config = () => { +export const config = (): void => { if (configDone) return; const path = envFilePath(); if (path) dotenv.config({ path }); diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index 3db4efa48..8a064de87 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -5,11 +5,6 @@ "rootDir": ".", "outDir": "dist" }, - "include": [ - "./src/**/*", - "./scripts/**/*", - "./features/step-definitions/**/*", - "./features/support/**/*" - ], + "include": ["./src/**/*"], "exclude": ["supabase"] } diff --git a/packages/database/tsconfig_bootstrap.json b/packages/database/tsconfig_bootstrap.json new file mode 100644 index 000000000..2030d9e70 --- /dev/null +++ b/packages/database/tsconfig_bootstrap.json @@ -0,0 +1,9 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": ".", + "outDir": "dist" + }, + "include": ["./src/dbDotEnv.mts"] +} diff --git a/packages/database/tsconfig_lint.json b/packages/database/tsconfig_lint.json new file mode 100644 index 000000000..47bc4f18e --- /dev/null +++ b/packages/database/tsconfig_lint.json @@ -0,0 +1,20 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": ".", + "outDir": "dist", + "allowImportingTsExtensions": true, + "module": "esnext", + "moduleResolution": "bundler", + "declaration": true, + "noEmit": true + }, + "include": [ + "./src/**/*", + "./scripts/**/*", + "./features/step-definitions/**/*", + "./features/support/**/*" + ], + "exclude": ["supabase"] +} diff --git a/packages/database/types/dbDotEnv.d.ts b/packages/database/types/dbDotEnv.d.ts deleted file mode 100644 index 7b29c1062..000000000 --- a/packages/database/types/dbDotEnv.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type Variant = - | "none" - | "local" - | "branch" - | "production" - | "implicit"; -export declare const getVariant: () => Variant; -export declare const envFilePath: () => string | null; -export declare const envContents: () => Partial>; -export declare const config: () => void; diff --git a/turbo.json b/turbo.json index 18ab2bcde..705ad0a00 100644 --- a/turbo.json +++ b/turbo.json @@ -40,9 +40,15 @@ ], "tasks": { "build": { - "dependsOn": ["@repo/database#genenv"], + "dependsOn": ["^build"], "inputs": ["$TURBO_DEFAULT$", ".env*"], - "outputs": [".next/**", "!.next/cache/**", "dist/**", "src/dbTypes.ts"] + "outputs": [ + ".next/**", + "!.next/cache/**", + "dist/**", + "src/dbTypes.ts", + ".env*" + ] }, "build-schema": { "inputs": ["$TURBO_DEFAULT$", ".env*"], @@ -58,8 +64,10 @@ "passThroughEnv": ["OBSIDIAN_PLUGIN_PATH"], "cache": false, "persistent": true, - "inputs": ["$TURBO_DEFAULT$", ".env*"] + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "dependsOn": ["@repo/database#bootstrap"] }, + "bootstrap": {}, "roam#dev": { "with": ["@repo/database#dev"] },