feat: add ESLint flat config, Prettier, dependency-cruiser, and Husky

Setup code quality tooling for the monorepo:
- ESLint 9 flat config with TypeScript, import ordering, and NestJS rules
- Prettier with consistent formatting across all files
- dependency-cruiser enforcing module boundary rules (no cross-module internals, no circular deps)
- Husky + lint-staged for pre-commit hooks
- Auto-fixed existing files for type imports and import ordering

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-07 23:57:28 +07:00
parent e1e5fa6252
commit 83d55de65b
28 changed files with 2365 additions and 155 deletions

View File

@@ -7,7 +7,7 @@
"build": "nest build",
"start": "node dist/main",
"start:prod": "node dist/main",
"lint": "eslint \"{src,test}/**/*.ts\"",
"lint": "eslint src/",
"test": "vitest run",
"typecheck": "tsc --noEmit"
},
@@ -15,7 +15,12 @@
"@nestjs/common": "^11.0.0",
"@nestjs/core": "^11.0.0",
"@nestjs/cqrs": "^11.0.0",
"@nestjs/event-emitter": "^3.0.0",
"@nestjs/platform-express": "^11.0.0",
"@prisma/client": "^6.0.0",
"ioredis": "^5.4.0",
"pino": "^9.0.0",
"pino-pretty": "^13.0.0",
"reflect-metadata": "^0.2.0",
"rxjs": "^7.8.0"
},
@@ -26,6 +31,7 @@
"@types/express": "^5.0.0",
"@types/node": "^22.0.0",
"typescript": "^5.7.0",
"prisma": "^6.0.0",
"vitest": "^3.0.0"
}
}

View File

@@ -1,9 +1,10 @@
import { SharedModule } from '@modules/shared';
import { Module } from '@nestjs/common';
import { CqrsModule } from '@nestjs/cqrs';
import { AppController } from './app.controller';
@Module({
imports: [CqrsModule.forRoot()],
imports: [CqrsModule.forRoot(), SharedModule],
controllers: [AppController],
})
export class AppModule {}

View File

@@ -8,8 +8,11 @@
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"declaration": false,
"declarationMap": false
"declarationMap": false,
"paths": {
"@modules/*": ["../../src/modules/*"]
}
},
"include": ["src/**/*"],
"include": ["src/**/*", "../../src/modules/**/*"],
"exclude": ["node_modules", "dist"]
}

View File

@@ -6,11 +6,7 @@ export const metadata: Metadata = {
description: 'Vietnam Real Estate Platform',
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="vi">
<body>{children}</body>

View File

@@ -1,10 +1,7 @@
import type { Config } from 'tailwindcss';
const config: Config = {
content: [
'./app/**/*.{ts,tsx}',
'./components/**/*.{ts,tsx}',
],
content: ['./app/**/*.{ts,tsx}', './components/**/*.{ts,tsx}'],
theme: {
extend: {},
},

View File

@@ -2,11 +2,7 @@
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"target": "ES2017",
"lib": [
"DOM",
"DOM.Iterable",
"ES2022"
],
"lib": ["DOM", "DOM.Iterable", "ES2022"],
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "preserve",
@@ -17,9 +13,7 @@
}
],
"paths": {
"@/*": [
"./*"
]
"@/*": ["./*"]
},
"declaration": false,
"declarationMap": false,
@@ -28,14 +22,6 @@
"allowJs": true,
"isolatedModules": true
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules",
".next"
]
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules", ".next"]
}