Complete architecture for a ClickUp/Notion/Miro-class project management app: - Turborepo monorepo with Next.js 15, TypeScript, PostgreSQL (Drizzle ORM) - Object-centered database schema (everything is an Object: tasks, projects, docs, whiteboards) - NextAuth v5 authentication with credentials + OAuth providers - tRPC v11 API layer with full CRUD for objects, properties, relations, templates, search - Three-panel UI: collapsible sidebar, center content area, push-in right panel - Purple/teal theme with light/dark mode via Shadcn/ui + Tailwind CSS - Multiple views: List, Kanban board (dnd-kit), Table (spreadsheet), Embedded iframe - TipTap rich text editor with slash commands, custom blocks (callout, toggle, mention, embed, divider), AI block - Real-time collaboration via Yjs + Hocuspocus with presence/cursors - tldraw whiteboard with custom shape cards (task, document, project) - MCP server exposing all app data/tools for AI agents - AI chat panel, editor AI slash commands, Cmd+K command palette - Template system with built-in templates (Bug Report, Meeting Notes, Sprint) - Full-text search with result highlighting - Docker Compose for full-stack deployment (web + collab + postgres + redis) Made-with: Cursor
22 lines
934 B
TypeScript
22 lines
934 B
TypeScript
/**
|
|
* Resolves drizzle-orm from @tasks/database's dependency tree so the MCP app
|
|
* does not need drizzle-orm as a direct dependency (bundler + runtime).
|
|
*/
|
|
// @ts-nocheck — Node built-ins; package lacks @types/node in this package's tsconfig
|
|
import { createRequire } from "node:module";
|
|
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const require = createRequire(import.meta.url);
|
|
const databaseDir = path.join(path.dirname(fileURLToPath(import.meta.url)), "../../../packages/database");
|
|
const drizzlePath = require.resolve("drizzle-orm", { paths: [databaseDir] });
|
|
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any
|
|
const d: any = require(drizzlePath);
|
|
|
|
export const and = d.and;
|
|
export const asc = d.asc;
|
|
export const eq = d.eq;
|
|
export const ilike = d.ilike;
|
|
export const inArray = d.inArray;
|
|
export const isNull = d.isNull;
|
|
export const or = d.or;
|