// @ts-check import tseslint from "typescript-eslint"; /** * Hexagonal dependency boundary (CLAUDE.md #1): packages/domain + packages/ports * are PURE — no framework/SDK, no adapters, no db. They may import only * packages/ports and packages/contracts. * * Uses glob `patterns` (not `paths`) so subpath imports like * "drizzle-orm/node-postgres" or "@nestjs/common" are also caught. */ const FORBIDDEN_PATTERNS = [ { group: ["@nestjs/*"], message: "domain/ports must not import NestJS." }, { group: ["next", "next/*"], message: "domain/ports must not import Next.js." }, { group: ["react", "react/*", "react-dom", "react-dom/*"], message: "domain/ports must not import React." }, { group: ["ai", "ai/*", "openai", "openai/*", "@ai-sdk/*"], message: "domain/ports must not import AI SDKs (use LlmPort)." }, { group: ["drizzle-orm", "drizzle-orm/*", "pg", "pg/*"], message: "domain/ports must not import the DB layer (use a port)." }, { group: ["resend", "grammy", "grammy/*"], message: "domain/ports must not import channel/email SDKs (use ports)." }, { group: ["playwright", "playwright/*"], message: "domain/ports must not import playwright." }, { group: ["@supabase/*"], message: "domain/ports must not import supabase." }, { group: ["inngest", "inngest/*"], message: "domain/ports must not import inngest (use WorkflowPort)." }, { group: ["@aws-sdk/*"], message: "domain/ports must not import the AWS SDK (use a port)." }, { group: ["@courtmitra/adapters", "@courtmitra/adapters/*", "@courtmitra/db", "@courtmitra/db/*"], message: "domain/ports must not import adapters or the db package.", }, ]; export default tseslint.config( { ignores: ["**/dist/**", "**/.next/**", "**/node_modules/**", "**/.turbo/**", "**/*.config.*", "**/next-env.d.ts", "**/evaluate/**"], }, ...tseslint.configs.recommended, { rules: { "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }], }, }, { files: ["packages/domain/**/*.ts", "packages/ports/**/*.ts"], rules: { "@typescript-eslint/no-explicit-any": "error", "no-restricted-imports": ["error", { patterns: FORBIDDEN_PATTERNS }], }, }, );