Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d34989c
style: format code with prettier and eslint
Pikaz0r922 Mar 2, 2026
911578e
style: format code with prettier and eslint
Pikaz0r922 Mar 2, 2026
877205c
style: format code with prettier and eslint
Pikaz0r922 Mar 2, 2026
ddd1df4
style: format code with prettier and eslint
Pikaz0r922 Mar 2, 2026
1b94631
style: format code with prettier and eslint
Pikaz0r922 Mar 2, 2026
f9e9bba
style: format code with prettier and eslint
Pikaz0r922 Mar 2, 2026
90c7d19
feat: setup eslint, prettier, husky and lint-staged
Pikaz0r922 Mar 2, 2026
ce173a6
style: fix formatting
Pikaz0r922 Mar 2, 2026
5bb9d09
fix: changed scripts
Pikaz0r922 Mar 2, 2026
cf8666b
feat: add scripts check
Pikaz0r922 Mar 2, 2026
1014af9
fix: delete removed unnecessary rules
Pikaz0r922 Mar 2, 2026
30a3047
fix: changed scripts
Pikaz0r922 Mar 2, 2026
2cbe5f3
feat: add script
Pikaz0r922 Mar 2, 2026
d504829
fix: format package.json
Pikaz0r922 Mar 2, 2026
0c78085
feat: add ignore files
Pikaz0r922 Mar 2, 2026
fc7552f
fix: fix lint-staged
Pikaz0r922 Mar 2, 2026
47cdea9
fix: remove rules
Pikaz0r922 Mar 2, 2026
94a783f
fix: resolve merge conflicts with dev
Pikaz0r922 Mar 4, 2026
e07d469
fix: fix file
Pikaz0r922 Mar 4, 2026
3c970f3
fix: resolved package.json conflicts
Pikaz0r922 Mar 4, 2026
e62af2d
chore: remove github actions workflows
Pikaz0r922 Mar 4, 2026
8cd32d0
feat:add login and register pages
Pikaz0r922 Mar 16, 2026
4c81c42
style: apply Prettier formatting
Pikaz0r922 Mar 16, 2026
31355ae
delete pnpm-lock
Pikaz0r922 Mar 18, 2026
2d5dc20
Revert "style: apply Prettier formatting"
Pikaz0r922 Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pnpm exec lint-staged
pnpm lint:fsd:frontend
pnpm typecheck:backend
pnpm typecheck:frontend
7 changes: 7 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
node_modules
dist
build
.next
coverage
pnpm-lock.yaml
*.tsbuildinfo
12 changes: 6 additions & 6 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"endOfLine": "auto"
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"endOfLine": "auto"
}
1 change: 1 addition & 0 deletions apps/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"test": "jest",
"test:ci": "jest --runInBand",
"lint": "eslint .",
"lint:fix": "eslint --fix",
"format": "prettier --write .",
"format:check": "prettier --check ."
},
Expand Down
13 changes: 13 additions & 0 deletions apps/frontend/app/auth/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export default function AuthLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<main className="min-h-screen flex items-center justify-center bg-gray-100">
<div className="w-full max-w-md p-8 bg-white rounded-xl shadow">
{children}
</div>
</main>
)
}
7 changes: 7 additions & 0 deletions apps/frontend/app/auth/login/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import LoginForm from "../../features/auth/login/ui/LoginForm";

export default function LoginPage() {
return (
<LoginForm />
);
}
8 changes: 8 additions & 0 deletions apps/frontend/app/auth/register/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import RegisterForm from "../../features/auth/register/ui/RegisterForm"
export default function RegisterPage({ children }: { children: React.ReactNode }) {
return (
<div>
<RegisterForm />
</div>
);
}
70 changes: 70 additions & 0 deletions apps/frontend/app/features/auth/login/ui/LoginForm.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
'use client';
import Link from 'next/link';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

const formSchema = z.object({
email: z.email('Неверный формат email'),
password: z.string().min(6, 'Минимум 6 символов').max(32, 'Слишком длинный пароль'),
});

type FormState = z.infer<typeof formSchema>;

export default function LoginForm() {
const {
register,
handleSubmit,
reset,
formState: { errors },
} = useForm({
resolver: zodResolver(formSchema),
mode: 'onChange',
});
const onSubmit = (data: FormState): void => {
console.log(data);
reset();
};
return (
<div>
<h1 className="text-2xl font-semibold mb-2"># Task-tracker</h1>

<h2 className="text-lg font-medium mb-4">С возвращением</h2>

<form className="space-y-2 mb-4" onSubmit={handleSubmit(onSubmit)}>
<div>
<p>Почта</p>
<input
{...register('email')}
type="email"
placeholder="example@company.com"
className="w-full border rounded px-3 py-2"
/>
{errors.email && <p className="text-red-500 text-sm">{errors.email.message}</p>}
</div>
<div>
<p>Пароль</p>
<input
{...register('password')}
type="password"
placeholder="Введите пароль"
className="w-full border rounded px-3 py-2"
/>
</div>
{errors.password && <p className="text-red-500 text-sm">{errors.password.message}</p>}
<button className="w-full bg-blue-600 text-white py-2 rounded">Войти</button>
</form>
<div className="flex flex-col justify-center items-center gap-10">
<Link className="text-blue-700" href="/auth/reset-password">
Забыли пароль?
</Link>
<div className="flex gap-2">
<p className="text-gray-500">Нет аккаунта?</p>
<Link className="text-blue-700" href="/auth/register">
Зарегистрироваться
</Link>
</div>
</div>
</div>
);
}
70 changes: 70 additions & 0 deletions apps/frontend/app/features/auth/register/ui/RegisterForm.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"use client"

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

const formSchema = z.object({
email: z.email('Неверный формат email'),
name: z.string().min(2, 'Слишком короткое имя').max(15, 'Слишком длинное имя'),
password: z.string().min(6, 'Минимум 6 символов').max(32, 'Слишком длинный пароль'),
});

type FormState = z.infer<typeof formSchema>;

export default function RegisterForm() {
const {
register,
handleSubmit,
reset,
formState: { errors },
} = useForm({
resolver: zodResolver(formSchema),
mode: 'onChange',
});
const onSubmit = (data: FormState): void => {
console.log(data);
reset();
};
return (
<div>
<h1 className="text-2xl font-semibold mb-2"># Task-tracker</h1>

<h2 className="text-lg font-medium mb-4">С возвращением</h2>

<form className="space-y-2 mb-4" onSubmit={handleSubmit(onSubmit)}>
<div>
<p>Почта</p>
<input
{...register("email")}
type="email"
placeholder="example@company.com"
className="w-full border rounded px-3 py-2"
/>
{errors.email && <p className="text-red-500 text-sm">{errors.email.message}</p>}
</div>
<div>
<p>Имя</p>
<input
{...register("name")}
type="text"
placeholder="example"
className="w-full border rounded px-3 py-2"
/>
{errors.name && <p className="text-red-500 text-sm">{errors.name.message}</p>}
</div>
<div>
<p>Пароль</p>
<input
{...register("password")}
type="password"
placeholder="Введите пароль"
className="w-full border rounded px-3 py-2"
/>
{errors.password && <p className="text-red-500 text-sm">{errors.password.message}</p>}
</div>
<button className="w-full bg-blue-600 text-white py-2 rounded">Зарегистрироваться</button>
</form>
</div>
);
}
2 changes: 1 addition & 1 deletion apps/frontend/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
/// <reference types="next/navigation-types/compat/navigation" />
import './.next/types/routes.d.ts';
import "./.next/dev/types/routes.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
32 changes: 16 additions & 16 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
services:
postgres:
container_name: postgres
image: postgres:latest
restart: always
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: ${DB_DATABASE}
postgres:
container_name: postgres
image: postgres:latest
restart: always
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: ${DB_DATABASE}

ports:
- '5433:5432'
volumes:
- postgres_data:/var/lib/postgresql/postgres_data
networks:
- nestjs
ports:
- '5433:5432'
volumes:
- postgres_data:/var/lib/postgresql/postgres_data
networks:
- nestjs

volumes:
postgres_data:
postgres_data:

networks:
nestjs:
nestjs:
41 changes: 38 additions & 3 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
import eslint from '@eslint/js';
import { defineConfig } from 'eslint/config';
import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import importPlugin from 'eslint-plugin-import';
import unusedImports from 'eslint-plugin-unused-imports';
import prettier from 'eslint-plugin-prettier';
import globals from 'globals'; // Добавили для работы окружений

export default defineConfig(eslint.configs.recommended, tseslint.configs.recommended);
export default [
js.configs.recommended,
...tseslint.configs.recommended,

{
files: ['**/*.{ts,tsx}'],
languageOptions: {
parser: tseslint.parser,
parserOptions: {
project: ['./tsconfig.json'],
},
globals: {
...globals.es2021,
},
},
},
{
plugins: {
import: importPlugin,
'unused-imports': unusedImports,
prettier,
},
rules: {
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'unused-imports/no-unused-imports': 'error',
},
},

{
ignores: ['node_modules', 'dist', '.next', 'build', '**/jest.config.ts', '**/*.config.ts'],
},
];
54 changes: 37 additions & 17 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "task-tracker",
"version": "1.0.0",
"private": "true",
"description": "",
"main": "index.js",
"scripts": {
"name": "task-tracker",
"version": "1.0.0",
"private": "true",
"description": "",
"main": "index.js",
"scripts": {
"dev": "pnpm run --parallel dev",
"build": "pnpm run --parallel build",
"start": "pnpm run --parallel start",
Expand All @@ -28,16 +28,36 @@
"test:backend:ci": "pnpm --filter @task-tracker/backend test:ci",
"typecheck:backend": "pnpm --filter @task-tracker/backend typecheck",
"prisma:generate:backend": "pnpm --filter @task-tracker/backend prisma:generate",
"prisma:migrate:deploy:backend": "pnpm --filter @task-tracker/backend prisma:migrate:deploy"
"prisma:migrate:deploy:backend": "pnpm --filter @task-tracker/backend prisma:migrate:deploy",
"prepare": "husky"
},
"devDependencies": {
"@eslint/js": "9.39.2",
"@types/node": "^25.0.0",
"eslint": "^9.39.2",
"prettier": "^3.0.0",
"typescript": "^5.0.0",
"typescript-eslint": "^8.56.0"
},
"license": "ISC",
"packageManager": "pnpm@10.29.3"
"lint-staged": {
".{ts,tsx,js,,mjs}": [
"eslint --fix --no-warn-ignored",
"prettier --write"
],
".{json,css,md}": [
"prettier --write"
]
},
"devDependencies": {
"@eslint/js": "9.39.2",
"@types/node": "^25.0.0",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-n": "^17.24.0",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-unused-imports": "^4.4.1",
"globals": "^17.3.0",
"husky": "^9.1.7",
"lint-staged": "^16.3.1",
"prettier": "^3.0.0",
"typescript": "^5.0.0",
"typescript-eslint": "^8.56.0"
},
"license": "ISC",
"packageManager": "pnpm@10.29.3"
}
24 changes: 12 additions & 12 deletions packages/shared-types/package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "@task-tracker/shared-types",
"version": "1.0.0",
"private": "true",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"packageManager": "pnpm@10.29.3"
"name": "@task-tracker/shared-types",
"version": "1.0.0",
"private": "true",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"packageManager": "pnpm@10.29.3"
}
Loading