diff --git a/apps/roam/scripts/compile.ts b/apps/roam/scripts/compile.ts index 7f9d9c453..f4ff4e83b 100644 --- a/apps/roam/scripts/compile.ts +++ b/apps/roam/scripts/compile.ts @@ -2,9 +2,18 @@ import esbuild from "esbuild"; import fs from "fs"; import path from "path"; import { z } from "zod"; -// https://linear.app/discourse-graphs/issue/ENG-766/upgrade-all-commonjs-to-esm -// import { envContents } from "@repo/database/dbDotEnv"; -const { envContents } = require("@repo/database/dbDotEnv"); +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; +} // 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 01755c7f7..3347bbe1f 100644 --- a/apps/roam/scripts/deploy.ts +++ b/apps/roam/scripts/deploy.ts @@ -2,9 +2,11 @@ import { put } from "@vercel/blob"; import fs, { readFileSync } from "fs"; import { join } from "path"; import { compile } from "./compile"; +import { config } from "@repo/database/dbDotEnv"; +import { execSync } from "child_process"; if (process.env.NODE_ENV !== "production") { - require("dotenv").config(); + config(); } const deploy = async () => { @@ -38,10 +40,7 @@ const deploy = async () => { // 2. GitHub Actions environment variable for pushes/tags process.env.GITHUB_REF_NAME || // 3. Local Git branch resolution - require("child_process") - .execSync("git rev-parse --abbrev-ref HEAD") - .toString() - .trim() || + execSync("git rev-parse --abbrev-ref HEAD").toString().trim() || // 4. Final fallback "main"; diff --git a/apps/roam/src/utils/conceptConversion.ts b/apps/roam/src/utils/conceptConversion.ts index 3a999afd0..c654a02ea 100644 --- a/apps/roam/src/utils/conceptConversion.ts +++ b/apps/roam/src/utils/conceptConversion.ts @@ -3,11 +3,7 @@ import getDiscourseRelations from "./getDiscourseRelations"; import type { DiscourseRelation } from "./getDiscourseRelations"; import type { SupabaseContext } from "~/utils/supabaseContext"; -// import type { LocalConceptDataInput } from "@repo/database/inputTypes"; -// TODO: Change to apps/roam to ESM and delete below -// // linear.app/discourse-graphs/issue/ENG-766/upgrade-all-commonjs-to-esm -// Define the type locally to avoid ESM import issues -type LocalConceptDataInput = any; +import type { LocalConceptDataInput } from "@repo/database/inputTypes"; const getNodeExtraData = ( node_uid: string, diff --git a/apps/roam/src/utils/hyde.ts b/apps/roam/src/utils/hyde.ts index 300760ba5..5c793f92a 100644 --- a/apps/roam/src/utils/hyde.ts +++ b/apps/roam/src/utils/hyde.ts @@ -3,7 +3,7 @@ import { getLoggedInClient } from "./supabaseContext"; import { Result } from "./types"; import normalizePageTitle from "roamjs-components/queries/normalizePageTitle"; import findDiscourseNode from "./findDiscourseNode"; -const { nextApiRoot } = require("@repo/utils/execContext"); +import { nextApiRoot } from "@repo/utils/execContext"; type ApiEmbeddingResponse = { data: Array<{ @@ -93,11 +93,11 @@ const generateHypotheticalNode: HypotheticalNodeGenerator = async ({ }) => { const { relationLabel, relatedNodeText, relatedNodeFormat } = relationType; - const userPromptContent = `Given the source discourse node \`\`\`${node}\`\`\`, -and considering the relation \`\`\`${relationLabel}\`\`\` -which typically connects to a node of type \`\`\`${relatedNodeText}\`\`\` -(formatted like \`\`\`${relatedNodeFormat}\`\`\`), -generate a hypothetical related discourse node text that would plausibly fit this relationship. + const userPromptContent = `Given the source discourse node \`\`\`${node}\`\`\`, +and considering the relation \`\`\`${relationLabel}\`\`\` +which typically connects to a node of type \`\`\`${relatedNodeText}\`\`\` +(formatted like \`\`\`${relatedNodeFormat}\`\`\`), +generate a hypothetical related discourse node text that would plausibly fit this relationship. Only return the text of the hypothetical node.`; const requestBody = { documents: [{ role: "user", content: userPromptContent }], diff --git a/apps/roam/src/utils/supabaseContext.ts b/apps/roam/src/utils/supabaseContext.ts index 2326481a3..040ed422b 100644 --- a/apps/roam/src/utils/supabaseContext.ts +++ b/apps/roam/src/utils/supabaseContext.ts @@ -6,23 +6,13 @@ import getRoamUrl from "roamjs-components/dom/getRoamUrl"; import { DISCOURSE_CONFIG_PAGE_TITLE } from "~/utils/renderNodeConfigPage"; import getBlockProps from "~/utils/getBlockProps"; import setBlockProps from "~/utils/setBlockProps"; -// https://linear.app/discourse-graphs/issue/ENG-766/upgrade-all-commonjs-to-esm -// import type { Enums } from "@repo/database/dbTypes"; -// import type { DGSupabaseClient } from "@repo/database/lib/client"; -// import { -// fetchOrCreateSpaceDirect, -// fetchOrCreatePlatformAccount, -// createLoggedInClient, -// } from "@repo/database/lib/contextFunctions"; -const { +import type { Enums } from "@repo/database/dbTypes"; +import type { DGSupabaseClient } from "@repo/database/lib/client"; +import { fetchOrCreateSpaceDirect, fetchOrCreatePlatformAccount, createLoggedInClient, -} = require("@repo/database/lib/contextFunctions"); -// TEMP TODO: Change to apps/roam to ESM -// https://linear.app/discourse-graphs/issue/ENG-766/upgrade-all-commonjs-to-esm -type DGSupabaseClient = any; // Supabase client type -type Enums = T extends "Platform" ? "Roam" | "Obsidian" : never; +} from "@repo/database/lib/contextFunctions"; declare const crypto: { randomUUID: () => string }; diff --git a/apps/roam/src/utils/upsertNodesAsContentWithEmbeddings.ts b/apps/roam/src/utils/upsertNodesAsContentWithEmbeddings.ts index 8f6509c9e..0c69cc0a4 100644 --- a/apps/roam/src/utils/upsertNodesAsContentWithEmbeddings.ts +++ b/apps/roam/src/utils/upsertNodesAsContentWithEmbeddings.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { type RoamDiscourseNodeData } from "./getAllDiscourseNodesSince"; import { type SupabaseContext } from "./supabaseContext"; -// https://linear.app/discourse-graphs/issue/ENG-766/upgrade-all-commonjs-to-esm -const { nextApiRoot } = require("@repo/utils/execContext"); +import { nextApiRoot } from "@repo/utils/execContext"; type LocalContentDataInput = any; type DGSupabaseClient = any; type Json = any; diff --git a/apps/roam/tsconfig.json b/apps/roam/tsconfig.json index 17b945182..12b649dcb 100644 --- a/apps/roam/tsconfig.json +++ b/apps/roam/tsconfig.json @@ -1,13 +1,16 @@ { "extends": "@repo/typescript-config/react-library.json", - "include": ["src", "src/types.d.ts", "tailwind.config.ts", "tests", "scripts"], + "include": [ + "src", + "src/types.d.ts", + "tailwind.config.ts", + "tests", + "scripts" + ], "compilerOptions": { "baseUrl": ".", "outDir": "dist", "allowJs": false, - "esModuleInterop": false, - "forceConsistentCasingInFileNames": true, - "jsx": "react", "noUncheckedIndexedAccess": false } } diff --git a/apps/website/next.config.ts b/apps/website/next.config.ts index 9a1b29483..c34e983e8 100644 --- a/apps/website/next.config.ts +++ b/apps/website/next.config.ts @@ -5,6 +5,5 @@ const nextConfig = { serverRuntimeConfig: { maxDuration: 300, }, - transpilePackages: ["@repo/database", "@repo/utils", "@repo/ui"], }; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 8ffc00b2e..3495fe143 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "dependencies": { "@octokit/auth-app": "^7.1.4", "@octokit/core": "^6.1.3", + "@repo/database": "*", "@repo/types": "*", "@vercel/blob": "^0.27.0", "contrast-color": "^1.0.1", @@ -68,7 +69,6 @@ "tldraw": "2.3.0" }, "devDependencies": { - "@repo/database": "*", "@repo/tailwind-config": "*", "@types/contrast-color": "^1.0.0", "@types/react-vertical-timeline-component": "^3.3.3", diff --git a/packages/database/cucumber.json b/packages/database/cucumber.json index 06014fc9c..a3a28f635 100644 --- a/packages/database/cucumber.json +++ b/packages/database/cucumber.json @@ -1,6 +1,6 @@ { "default": { - "loader": ["ts-node/esm"], - "import": ["features/step-definitions/**/*.ts"] + "requireModule": ["ts-node/register"], + "require": ["features/step-definitions/**/*.ts"] } } diff --git a/packages/database/package.json b/packages/database/package.json index 22e235c63..0ff7522f9 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -3,24 +3,54 @@ "version": "0.0.0", "private": true, "license": "Apache-2.0", - "type": "module", "exports": { - "./lib/*": "./src/lib/*.ts", - "./dbDotEnv": "./src/dbDotEnv.ts", - "./dbTypes": "./src/dbTypes.ts", - "./inputTypes": "./src/inputTypes.ts" + "./lib/*": { + "types": "./dist/src/lib/*.d.ts", + "require": "./dist/src/lib/*.js", + "default": "./dist/src/lib/*.js" + }, + "./dbDotEnv": { + "types": "./dist/src/dbDotEnv.d.ts", + "require": "./dist/src/dbDotEnv.js", + "default": "./dist/src/dbDotEnv.js" + }, + "./dbTypes": { + "types": "./dist/src/dbTypes.d.ts", + "require": "./dist/src/dbTypes.js", + "default": "./dist/src/dbTypes.js" + }, + "./inputTypes": { + "types": "./dist/src/inputTypes.d.ts", + "default": "./dist/src/inputTypes.d.ts" + } + }, + "typesVersions": { + "*": { + "lib/*": [ + "dist/src/lib/*.d.ts" + ], + "./dbDotEnv": [ + "dist/src/dbDotEnv.d.ts" + ], + "./dbTypes": [ + "dist/src/dbTypes.d.ts" + ], + "./inputTypes": [ + "dist/src/inputTypes.d.ts" + ] + } }, "scripts": { "init": "supabase login", - "dev": "supabase start && tsx scripts/createEnv.ts && supabase functions serve", + "dev": "supabase start && tsx scripts/createEnv.mts && supabase functions serve", "stop": "supabase stop", - "check-types": "tsc --noEmit --skipLibCheck", + "check-types": "tsc --emitDeclarationOnly --skipLibCheck", "check-schema": "tsx scripts/lint.ts && supabase stop && npm run dbdiff", "lint": "eslint . && tsx scripts/lint.ts", "lint:fix": "tsx scripts/lint.ts -f", - "build": "tsx scripts/build.ts && npm run genenv -- local", + "build": "tsc && tsx scripts/build.ts && npm run genenv -- local", "test": "tsc && cucumber-js", - "genenv": "tsx scripts/createEnv.ts", + "genenv": "tsx scripts/createEnv.mts", "gentypes:production": "supabase start && supabase gen types typescript --project-id \"$SUPABASE_PROJECT_ID\" --schema public > src/dbTypes.ts", "dbdiff": "supabase stop && supabase db diff", "dbdiff:save": "supabase stop && supabase db diff -f", diff --git a/packages/database/scripts/build.ts b/packages/database/scripts/build.ts index 214a6573e..f46db498c 100644 --- a/packages/database/scripts/build.ts +++ b/packages/database/scripts/build.ts @@ -3,7 +3,7 @@ import { writeFileSync } from "fs"; import { join, dirname } from "path"; import { fileURLToPath } from "url"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(__filename); const projectRoot = join(__dirname, ".."); if (process.env.HOME !== "/vercel") { @@ -12,10 +12,12 @@ if (process.env.HOME !== "/vercel") { execSync("supabase migrations up", { cwd: projectRoot, stdio: "inherit" }); const stdout = execSync( "supabase gen types typescript --local --schema public", - { encoding: "utf8" , cwd: projectRoot }, + { encoding: "utf8", cwd: projectRoot }, + ); + writeFileSync( + join(projectRoot, "src", "dbTypes.ts"), + "// Generated by supabase -- do not edit\n" + stdout, ); - writeFileSync(join(projectRoot, "src", "dbTypes.ts"), - "// Generated by supabase -- do not edit\n" + stdout); } catch (err) { console.error(err); throw err; diff --git a/packages/database/scripts/createEnv.ts b/packages/database/scripts/createEnv.mts similarity index 100% rename from packages/database/scripts/createEnv.ts rename to packages/database/scripts/createEnv.mts diff --git a/packages/database/scripts/deploy.ts b/packages/database/scripts/deploy.ts index 2b9e89718..c4372925d 100644 --- a/packages/database/scripts/deploy.ts +++ b/packages/database/scripts/deploy.ts @@ -72,4 +72,4 @@ const main = () => { process.exit(1); } }; -if (import.meta.url === `file://${process.argv[1]}`) main(); +if (__filename === process.argv[1]) main(); diff --git a/packages/database/scripts/lint.ts b/packages/database/scripts/lint.ts index 03870ecd7..a4f397bf4 100644 --- a/packages/database/scripts/lint.ts +++ b/packages/database/scripts/lint.ts @@ -1,9 +1,8 @@ import { exec } from "node:child_process"; import { readdir, Dirent } from "node:fs"; import { join, dirname } from "path"; -import { fileURLToPath } from "url"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(__filename); const projectRoot = join(__dirname, ".."); const main = () => { @@ -66,4 +65,4 @@ const main = () => { process.exit(1); } }; -if (import.meta.url === `file://${process.argv[1]}`) main(); +if (__filename === process.argv[1]) main(); diff --git a/packages/database/src/dbDotEnv.ts b/packages/database/src/dbDotEnv.ts index 9667dc225..b6afc9bfc 100644 --- a/packages/database/src/dbDotEnv.ts +++ b/packages/database/src/dbDotEnv.ts @@ -1,9 +1,15 @@ import dotenv from "dotenv"; import { readFileSync, existsSync } from "fs"; -import { join, dirname } from "path"; +import { join, dirname, basename } from "path"; import { fileURLToPath } from "url"; -const __dirname = dirname(dirname(fileURLToPath(import.meta.url))); +const findRoot = (): string => { + let dir = __filename; + while (basename(dir) !== "database") { + dir = dirname(dir); + } + return dir; +}; export const getVariant = (): string | null => { if (process.env.HOME === "/vercel" || process.env.GITHUB_ACTIONS === "true") @@ -23,7 +29,7 @@ export const getVariant = (): string | null => { export const envFilePath = () => { const variant: string | null = getVariant(); if (variant === null) return null; - const name = join(__dirname, `.env.${variant}`); + const name = join(findRoot(), `.env.${variant}`); return existsSync(name) ? name : null; }; diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index 6b1ee18b2..3db4efa48 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": ".", - "noEmit": true, "outDir": "dist" }, "include": [ diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index abb9d3dc6..b7055643d 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -1,7 +1,6 @@ { "name": "@repo/eslint-config", "version": "0.0.0", - "type": "module", "license": "Apache-2.0", "private": true, "exports": { diff --git a/packages/typescript-config/base.json b/packages/typescript-config/base.json index bb6f2a15d..325608d0c 100644 --- a/packages/typescript-config/base.json +++ b/packages/typescript-config/base.json @@ -7,9 +7,9 @@ "incremental": false, "isolatedModules": true, "lib": ["es2022", "DOM", "DOM.Iterable"], - "module": "NodeNext", + "module": "nodenext", "moduleDetection": "force", - "moduleResolution": "NodeNext", + "moduleResolution": "nodenext", "noUncheckedIndexedAccess": true, "resolveJsonModule": true, "skipLibCheck": true, diff --git a/packages/ui/package.json b/packages/ui/package.json index e8ed779dd..0bd7892dd 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -3,23 +3,45 @@ "version": "0.0.0", "private": true, "license": "Apache-2.0", - "type": "module", "exports": { "./globals.css": "./src/globals.css", "./postcss.config": "./postcss.config.mjs", "./tailwind.config": "./tailwind.config.ts", - "./lib/*": "./src/lib/*.ts", - "./hooks/*": [ - "./src/hooks/*.ts", - "./src/hooks/*.tsx" - ], - "./components/*": "./src/components/*.tsx" + "./lib/*": { + "types": "./dist/src/lib/*.d.ts", + "require": "./dist/src/lib/*.js", + "default": "./dist/src/lib/*.js" + }, + "./hooks/*": { + "types": "./dist/src/hooks/*.d.ts", + "require": "./dist/src/hooks/*.js", + "default": "./dist/src/hooks/*.js" + }, + "./components/*": { + "types": "./dist/src/components/*.d.ts", + "require": "./dist/src/components/*.js", + "default": "./dist/src/components/*.js" + } + }, + "typesVersions": { + "*": { + "lib/*": [ + "dist/lib/*.d.ts" + ], + "hooks/*": [ + "dist/hooks/*.d.ts" + ], + "components/*": [ + "dist/components/*.d.ts" + ] + } }, "scripts": { "lint": "eslint .", + "build": "tsc", "lint:fix": "eslint . --fix", "generate:component": "turbo gen react-component", - "check-types": "tsc --noEmit --skipLibCheck", + "check-types": "tsc --emitDeclarationOnly --skipLibCheck", "ui": "npx shadcn@latest" }, "devDependencies": { diff --git a/packages/ui/src/components/ui/card.tsx b/packages/ui/src/components/ui/card.tsx index 9fb532a11..b892b644d 100644 --- a/packages/ui/src/components/ui/card.tsx +++ b/packages/ui/src/components/ui/card.tsx @@ -1,4 +1,4 @@ -import { cn } from "@repo/ui/lib/utils"; +import { cn } from "../../lib/utils"; type CardProps = React.HTMLAttributes & { ref?: React.Ref; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 4e2982125..63b252fc5 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@repo/typescript-config/react-library.json", "compilerOptions": { "baseUrl": ".", - "rootDir": "." + "rootDir": ".", + "outDir": "dist" }, "include": ["src", "turbo", "scripts"] } diff --git a/packages/utils/package.json b/packages/utils/package.json index 346abcb76..b2fb97a35 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -3,11 +3,23 @@ "version": "0.0.0", "private": true, "license": "Apache-2.0", - "type": "module", "exports": { - "./*": "./src/*.ts" + "./*": { + "types": "./dist/src/*.d.ts", + "require": "./dist/src/*.js", + "default": "./dist/src/*.js" + } + }, + "typesVersions": { + "*": { + "*": [ + "dist/src/*.d.ts" + ] + } }, "scripts": { + "build": "tsc", + "check-types": "tsc --emitDeclarationOnly --skipLibCheck", "lint": "eslint ." } } diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index df8317c22..0a22b3d5d 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@repo/typescript-config/base.json", "compilerOptions": { "baseUrl": ".", - "noEmit": true + "rootDir": ".", + "outDir": "dist" }, "include": ["./src/**/*"] } diff --git a/turbo.json b/turbo.json index 39ae8018f..fbaefe529 100644 --- a/turbo.json +++ b/turbo.json @@ -58,7 +58,8 @@ }, "deploy": { "cache": false, - "inputs": ["$TURBO_DEFAULT$", ".env*"] + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "dependsOn": ["@repo/database#build"] }, "publish": { "cache": false,