This repository contains the scalable project foundation for the Applicant Tracking System (ATS) intern assignment. It is pre-configured with Next.js 15, TypeScript (Strict Mode), Tailwind CSS v4, shadcn/ui, Prisma ORM 7, SQLite, Vitest (unit/integration testing), and Playwright (end-to-end testing).
- Framework: Next.js 15.5 (App Router)
- Language: TypeScript 5 (Strict mode enabled)
- Styling: Tailwind CSS v4 & shadcn/ui
- Database ORM: Prisma ORM 7.8
- Database Engine: SQLite (Local
dev.db) - Database Driver Adapter:
@prisma/adapter-better-sqlite3&better-sqlite3 - Unit Testing: Vitest & React Testing Library (jsdom environment)
- E2E Testing: Playwright
The project conforms to the expected folder structure and separates core domains:
├── app/ # Next.js App Router (pages, layouts, globals.css)
│ ├── components/ # Custom page components or page-level items
│ ├── favicon.ico # Website favicon
│ ├── globals.css # Tailwind CSS v4 & custom theme definitions
│ ├── layout.tsx # Global HTML layout, Google Font Setup (Outfit)
│ └── page.tsx # Dynamic Seed Verification homepage
├── components/ # Reusable UI components
│ └── ui/ # shadcn/ui components (button, card, input, badge)
├── lib/ # Shared library scripts and utility exports
│ ├── db.ts # Prisma Client instance with SQLite driver adapter
│ └── utils.ts # Tailwind utility helper (cn class-names merger)
├── prisma/ # Database schemas and migration configurations
│ ├── migrations/ # SQL migrations history generated by Prisma
│ ├── schema.prisma # Prisma database schemas (Job, Candidate, Application)
│ └── seed.ts # TS Database Seeding mechanism
├── tests/ # Testing directory split by test type
│ ├── e2e/ # Playwright E2E tests
│ │ └── basic.spec.ts # Basic page load verification test
│ ├── unit/ # Vitest Unit/Integration tests
│ │ └── basic.test.tsx# Home page element rendering unit test
│ └── setup.ts # Testing Library matchers setup for Vitest
├── types/ # Shared TypeScript models and application type exports
│ └── ats.ts # Job, Candidate, Application type definitions
├── .env # Environment config variables (local database path)
├── eslint.config.mjs # ESLint linter configuration
├── next.config.ts # Next.js config settings
├── package.json # Dependency scripts and metadata
├── playwright.config.ts # Playwright configuration
├── postcss.config.mjs # PostCSS configuration for Tailwind v4
├── prisma.config.ts # Prisma 7 centralized configuration file
├── tsconfig.json # TypeScript strict configuration file
└── vitest.config.ts # Vitest configuration file
Follow these steps to set up the project locally:
Ensure you have Node.js (v20+ recommended) installed on your system.
Clone the repository and run the following command to install the required packages:
npm installCreate the local SQLite database (dev.db at the root) and apply migrations:
npx prisma migrate dev --name initPopulate the database with initial jobs, candidates, and applications:
npm run db:seedRun the local Next.js development server:
npm run devOpen http://localhost:3000 in your browser. The landing page will dynamically fetch and list the seeded database objects, verifying that the database connection is fully active.
To run unit tests (located in tests/unit):
npm run testTo run tests in watch mode (interactive development):
npm run test:watchEnsure the dev server or local production builds can boot. Run the E2E test suite (located in tests/e2e):
npm run test:e2eThis project is built using Prisma 7.8.0, which introduces significant changes in connection behavior:
- Centralized Configuration (
prisma.config.ts): Connection URLs are no longer configured withinschema.prisma. Instead, they reside inprisma.config.tsand fetch environment variables from.env. - Driver Adapters: Prisma 7 deprecates native Rust-based engine connections for local setups in favor of Driver Adapters. Consequently, the project connects to the database via
@prisma/adapter-better-sqlite3and thebetter-sqlite3package in lib/db.ts. - centralized seeding: Under Prisma 7, the seed command config resides in
prisma.config.tsunder themigrations.seedkey rather thanpackage.json.