lapeh 2.4.8 → 2.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.js CHANGED
@@ -231,7 +231,7 @@ function runBuild() {
231
231
 
232
232
  // Compile TS
233
233
  try {
234
- execSync('npx tsc && npx tsc-alias', { stdio: 'inherit' });
234
+ execSync('npx tsc -p tsconfig.build.json && npx tsc-alias -p tsconfig.build.json', { stdio: 'inherit' });
235
235
  } catch (e) {
236
236
  console.error('❌ Build failed.');
237
237
  process.exit(1);
@@ -255,7 +255,7 @@ async function upgradeProject() {
255
255
 
256
256
  // Files/Folders to overwrite/copy
257
257
  const filesToSync = [
258
- 'bin', // Ensure CLI script is updated
258
+ // 'bin', // Removed: CLI script is managed by package
259
259
  'lib', // Ensure core framework files are updated
260
260
  'scripts',
261
261
  'docker-compose.yml',
@@ -268,7 +268,47 @@ async function upgradeProject() {
268
268
  'src/prisma.ts', // Core framework file
269
269
  ];
270
270
 
271
- // Helper to copy recursive
271
+ // Helper to sync directory (copy new/updated, delete removed)
272
+ function syncDirectory(src, dest) {
273
+ if (!fs.existsSync(src)) return;
274
+
275
+ // Ensure dest exists
276
+ if (!fs.existsSync(dest)) {
277
+ fs.mkdirSync(dest, { recursive: true });
278
+ }
279
+
280
+ // 1. Copy/Update files from src to dest
281
+ const srcEntries = fs.readdirSync(src, { withFileTypes: true });
282
+ const srcEntryNames = new Set();
283
+
284
+ for (const entry of srcEntries) {
285
+ srcEntryNames.add(entry.name);
286
+ const srcPath = path.join(src, entry.name);
287
+ const destPath = path.join(dest, entry.name);
288
+
289
+ if (entry.isDirectory()) {
290
+ syncDirectory(srcPath, destPath);
291
+ } else {
292
+ fs.copyFileSync(srcPath, destPath);
293
+ }
294
+ }
295
+
296
+ // 2. Delete files in dest that are not in src (only if we are syncing a folder)
297
+ const destEntries = fs.readdirSync(dest, { withFileTypes: true });
298
+ for (const entry of destEntries) {
299
+ if (!srcEntryNames.has(entry.name)) {
300
+ const destPath = path.join(dest, entry.name);
301
+ console.log(`🗑️ Removing obsolete file/directory: ${destPath}`);
302
+ if (entry.isDirectory()) {
303
+ fs.rmSync(destPath, { recursive: true, force: true });
304
+ } else {
305
+ fs.unlinkSync(destPath);
306
+ }
307
+ }
308
+ }
309
+ }
310
+
311
+ // Helper to copy recursive (legacy, kept for other uses if any, but replaced by syncDirectory for upgrade)
272
312
  function copyRecursive(src, dest) {
273
313
  if (!fs.existsSync(src)) return;
274
314
  const stats = fs.statSync(src);
@@ -309,8 +349,17 @@ async function upgradeProject() {
309
349
  const destPath = path.join(currentDir, item);
310
350
 
311
351
  if (fs.existsSync(srcPath)) {
312
- console.log(`🔄 Updating ${item}...`);
313
- copyRecursive(srcPath, destPath);
352
+ const stats = fs.statSync(srcPath);
353
+ if (stats.isDirectory()) {
354
+ console.log(`🔄 Syncing directory ${item}...`);
355
+ syncDirectory(srcPath, destPath);
356
+ } else {
357
+ console.log(`🔄 Updating file ${item}...`);
358
+ // Ensure dir exists
359
+ const destDir = path.dirname(destPath);
360
+ if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true });
361
+ fs.copyFileSync(srcPath, destPath);
362
+ }
314
363
  }
315
364
  }
316
365
 
@@ -1,2 +1,3 @@
1
+ export declare function createApp(): Promise<import("express-serve-static-core").Express>;
1
2
  export declare function bootstrap(): Promise<void>;
2
3
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../lib/bootstrap.ts"],"names":[],"mappings":"AAmBA,wBAAsB,SAAS,kBAmI9B"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../lib/bootstrap.ts"],"names":[],"mappings":"AAmBA,wBAAsB,SAAS,yDAyG9B;AAED,wBAAsB,SAAS,kBAwD9B"}
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createApp = createApp;
6
7
  exports.bootstrap = bootstrap;
7
8
  const dotenv_1 = __importDefault(require("dotenv"));
8
9
  dotenv_1.default.config();
@@ -21,18 +22,11 @@ const error_1 = require("./middleware/error");
21
22
  const rateLimit_1 = require("./middleware/rateLimit");
22
23
  const requestLogger_1 = require("./middleware/requestLogger");
23
24
  const response_1 = require("./utils/response");
24
- async function bootstrap() {
25
+ async function createApp() {
25
26
  // Register aliases for production runtime
26
27
  // Since user code (compiled JS) uses require('@lapeh/...')
27
28
  // We map '@lapeh' to the directory containing this file (lib/ or dist/lib/)
28
29
  module_alias_1.default.addAlias("@lapeh", __dirname);
29
- // Validasi Environment Variables
30
- const requiredEnvs = ["DATABASE_URL", "JWT_SECRET"];
31
- const missingEnvs = requiredEnvs.filter((key) => !process.env[key]);
32
- if (missingEnvs.length > 0) {
33
- console.error(`❌ Missing required environment variables: ${missingEnvs.join(", ")}`);
34
- process.exit(1);
35
- }
36
30
  const app = (0, express_1.default)();
37
31
  app.disable("x-powered-by");
38
32
  app.use((0, compression_1.default)());
@@ -76,15 +70,48 @@ async function bootstrap() {
76
70
  ? path_1.default.join(process.cwd(), "dist", "src", "routes")
77
71
  : path_1.default.join(process.cwd(), "src", "routes");
78
72
  // Gunakan require agar sinkron dan mudah dicatch
79
- const { apiRouter } = require(userRoutesPath);
80
- app.use("/api", apiRouter);
81
- console.log(`✅ User routes loaded successfully from ${isProduction ? "dist/" : ""}src/routes`);
73
+ // Check if file exists before requiring to avoid crash in tests/clean env
74
+ try {
75
+ // In test environment, we might need to point to src/routes explicitly if not compiled
76
+ // const routesPath = process.env.NODE_ENV === 'test'
77
+ // ? path.join(process.cwd(), "src", "routes", "index.ts")
78
+ // : userRoutesPath;
79
+ // Note: For TS files in jest, we rely on ts-jest handling 'require' if it points to .ts or we need to use 'import'
80
+ // But 'require' in jest with ts-jest should work if configured.
81
+ // However, require(path) with .ts extension might be tricky.
82
+ // Let's stick to userRoutesPath but maybe adjust for test env.
83
+ // Check if we are in test environment and using ts-jest
84
+ // If so, we might need to import the TS file directly via relative path if alias is not working for require
85
+ const { apiRouter } = require(userRoutesPath);
86
+ app.use("/api", apiRouter);
87
+ console.log(`✅ User routes loaded successfully from ${isProduction ? "dist/" : ""}src/routes`);
88
+ }
89
+ catch (e) {
90
+ // If it's just missing module, maybe we are in test mode or fresh install
91
+ if (process.env.NODE_ENV !== "test") {
92
+ console.warn(`⚠️ Could not load user routes from ${userRoutesPath}. (This is expected during initial setup or if src/routes is missing)`);
93
+ }
94
+ else {
95
+ // In test mode, we really want to know if it failed to load
96
+ console.error(`Error loading routes in test mode from ${userRoutesPath}:`, e);
97
+ }
98
+ }
82
99
  }
83
100
  catch (error) {
84
- console.warn("⚠️ Could not load user routes. Make sure you export 'apiRouter'.");
85
101
  console.error(error);
86
102
  }
87
103
  app.use(error_1.errorHandler);
104
+ return app;
105
+ }
106
+ async function bootstrap() {
107
+ // Validasi Environment Variables
108
+ const requiredEnvs = ["DATABASE_URL", "JWT_SECRET"];
109
+ const missingEnvs = requiredEnvs.filter((key) => !process.env[key]);
110
+ if (missingEnvs.length > 0) {
111
+ console.error(`❌ Missing required environment variables: ${missingEnvs.join(", ")}`);
112
+ process.exit(1);
113
+ }
114
+ const app = await createApp();
88
115
  const port = process.env.PORT ? Number(process.env.PORT) : 4000;
89
116
  const server = http_1.default.createServer(app);
90
117
  (0, realtime_1.initRealtime)(server);
@@ -107,7 +107,7 @@ async function register(req, res) {
107
107
  },
108
108
  });
109
109
  }
110
- (0, response_1.sendFastSuccess)(res, 200, registerSerializer, {
110
+ (0, response_1.sendFastSuccess)(res, 201, registerSerializer, {
111
111
  status: "success",
112
112
  message: "Registration successful",
113
113
  data: {
@@ -2,6 +2,21 @@
2
2
 
3
3
  File ini mencatat semua perubahan, pembaruan, dan perbaikan yang dilakukan pada framework Lapeh, diurutkan berdasarkan tanggal.
4
4
 
5
+ ## [2025-12-28] - Sunday, December 28, 2025 - Upgrade & Testing Improvements (v2.4.9)
6
+
7
+ ### 🚀 Features & Fixes
8
+
9
+ - **Smart Upgrade CLI**:
10
+
11
+ - Updated `npx lapeh upgrade` to perform full synchronization (mirroring).
12
+ - Files removed in the latest framework version are now automatically removed from user projects, keeping them clean.
13
+ - Removed `bin` folder from synchronization as it is managed by the package.
14
+
15
+ - **Comprehensive Testing Support**:
16
+ - Updated `tsconfig.json` to support `@lapeh/*` path aliases within the `tests` folder.
17
+ - The `tests` folder is now excluded from production builds (via `tsconfig.build.json`), resulting in a cleaner `dist/` folder.
18
+ - Jest documentation and configuration have been adjusted for seamless integration.
19
+
5
20
  ## [2025-12-28] - Minggu, 28 Desember 2025 - Perbaikan Kompatibilitas & Automasi
6
21
 
7
22
  ### 🛠️ Perbaikan Bug (Bug Fixes)
@@ -2,6 +2,21 @@
2
2
 
3
3
  File ini mencatat semua perubahan, pembaruan, dan perbaikan yang dilakukan pada framework Lapeh, diurutkan berdasarkan tanggal.
4
4
 
5
+ ## [2025-12-28] - Minggu, 28 Desember 2025 - Perbaikan Upgrade & Testing (v2.4.9)
6
+
7
+ ### 🚀 Fitur & Perbaikan
8
+
9
+ - **Smart Upgrade CLI**:
10
+
11
+ - Memperbarui perintah `npx lapeh upgrade` agar melakukan sinkronisasi penuh (mirroring).
12
+ - File yang dihapus di versi terbaru framework sekarang akan otomatis dihapus juga dari proyek pengguna, menjaga proyek tetap bersih.
13
+ - Menghapus folder `bin` dari proses sinkronisasi ke proyek pengguna karena folder tersebut dikelola oleh paket.
14
+
15
+ - **Dukungan Testing Komprehensif**:
16
+ - Konfigurasi `tsconfig.json` diperbarui untuk mendukung path alias `@lapeh/*` di dalam folder `tests`.
17
+ - Folder `tests` sekarang dikecualikan dari proses build produksi (via `tsconfig.build.json`), menghasilkan folder `dist/` yang lebih bersih.
18
+ - Dokumentasi dan konfigurasi Jest telah disesuaikan untuk integrasi yang mulus.
19
+
5
20
  ## [2025-12-28] - Minggu, 28 Desember 2025 - Perbaikan Kompatibilitas & Automasi
6
21
 
7
22
  ### 🛠️ Perbaikan Bug (Bug Fixes)
package/lib/bootstrap.ts CHANGED
@@ -17,22 +17,12 @@ import { apiLimiter } from "./middleware/rateLimit";
17
17
  import { requestLogger } from "./middleware/requestLogger";
18
18
  import { sendSuccess } from "./utils/response";
19
19
 
20
- export async function bootstrap() {
20
+ export async function createApp() {
21
21
  // Register aliases for production runtime
22
22
  // Since user code (compiled JS) uses require('@lapeh/...')
23
23
  // We map '@lapeh' to the directory containing this file (lib/ or dist/lib/)
24
24
  moduleAlias.addAlias("@lapeh", __dirname);
25
25
 
26
- // Validasi Environment Variables
27
- const requiredEnvs = ["DATABASE_URL", "JWT_SECRET"];
28
- const missingEnvs = requiredEnvs.filter((key) => !process.env[key]);
29
- if (missingEnvs.length > 0) {
30
- console.error(
31
- `❌ Missing required environment variables: ${missingEnvs.join(", ")}`
32
- );
33
- process.exit(1);
34
- }
35
-
36
26
  const app = express();
37
27
 
38
28
  app.disable("x-powered-by");
@@ -88,22 +78,64 @@ export async function bootstrap() {
88
78
  : path.join(process.cwd(), "src", "routes");
89
79
 
90
80
  // Gunakan require agar sinkron dan mudah dicatch
91
- const { apiRouter } = require(userRoutesPath);
92
- app.use("/api", apiRouter);
93
- console.log(
94
- `✅ User routes loaded successfully from ${
95
- isProduction ? "dist/" : ""
96
- }src/routes`
97
- );
81
+ // Check if file exists before requiring to avoid crash in tests/clean env
82
+ try {
83
+ // In test environment, we might need to point to src/routes explicitly if not compiled
84
+ // const routesPath = process.env.NODE_ENV === 'test'
85
+ // ? path.join(process.cwd(), "src", "routes", "index.ts")
86
+ // : userRoutesPath;
87
+
88
+ // Note: For TS files in jest, we rely on ts-jest handling 'require' if it points to .ts or we need to use 'import'
89
+ // But 'require' in jest with ts-jest should work if configured.
90
+
91
+ // However, require(path) with .ts extension might be tricky.
92
+ // Let's stick to userRoutesPath but maybe adjust for test env.
93
+
94
+ // Check if we are in test environment and using ts-jest
95
+ // If so, we might need to import the TS file directly via relative path if alias is not working for require
96
+
97
+ const { apiRouter } = require(userRoutesPath);
98
+ app.use("/api", apiRouter);
99
+ console.log(
100
+ `✅ User routes loaded successfully from ${
101
+ isProduction ? "dist/" : ""
102
+ }src/routes`
103
+ );
104
+ } catch (e) {
105
+ // If it's just missing module, maybe we are in test mode or fresh install
106
+ if (process.env.NODE_ENV !== "test") {
107
+ console.warn(
108
+ `⚠️ Could not load user routes from ${userRoutesPath}. (This is expected during initial setup or if src/routes is missing)`
109
+ );
110
+ } else {
111
+ // In test mode, we really want to know if it failed to load
112
+ console.error(
113
+ `Error loading routes in test mode from ${userRoutesPath}:`,
114
+ e
115
+ );
116
+ }
117
+ }
98
118
  } catch (error) {
99
- console.warn(
100
- "⚠️ Could not load user routes. Make sure you export 'apiRouter'."
101
- );
102
119
  console.error(error);
103
120
  }
104
121
 
105
122
  app.use(errorHandler);
106
123
 
124
+ return app;
125
+ }
126
+
127
+ export async function bootstrap() {
128
+ // Validasi Environment Variables
129
+ const requiredEnvs = ["DATABASE_URL", "JWT_SECRET"];
130
+ const missingEnvs = requiredEnvs.filter((key) => !process.env[key]);
131
+ if (missingEnvs.length > 0) {
132
+ console.error(
133
+ `❌ Missing required environment variables: ${missingEnvs.join(", ")}`
134
+ );
135
+ process.exit(1);
136
+ }
137
+
138
+ const app = await createApp();
107
139
  const port = process.env.PORT ? Number(process.env.PORT) : 4000;
108
140
  const server = http.createServer(app);
109
141
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lapeh",
3
- "version": "2.4.8",
3
+ "version": "2.4.9",
4
4
  "description": "Framework API Express yang siap pakai (Standardized)",
5
5
  "main": "dist/lib/bootstrap.js",
6
6
  "bin": {
@@ -47,6 +47,7 @@
47
47
  "typecheck": "tsc --noEmit",
48
48
  "lint": "eslint .",
49
49
  "lint:fix": "eslint . --fix",
50
+ "test": "jest",
50
51
  "prisma:generate": "node scripts/compile-schema.js && prisma generate",
51
52
  "prisma:migrate": "node scripts/compile-schema.js && prisma migrate dev",
52
53
  "prisma:deploy": "node scripts/compile-schema.js && prisma migrate deploy",
@@ -123,9 +124,14 @@
123
124
  },
124
125
  "devDependencies": {
125
126
  "@eslint/js": "^9.39.2",
127
+ "@types/jest": "^30.0.0",
126
128
  "@types/module-alias": "^2.0.4",
129
+ "@types/supertest": "^6.0.3",
127
130
  "eslint": "^9.39.2",
128
131
  "globals": "^16.5.0",
132
+ "jest": "^30.2.0",
133
+ "supertest": "^7.1.4",
134
+ "ts-jest": "^29.4.6",
129
135
  "typescript-eslint": "^8.50.1"
130
136
  }
131
137
  }
@@ -122,7 +122,7 @@ export async function register(req: Request, res: Response) {
122
122
  });
123
123
  }
124
124
 
125
- sendFastSuccess(res, 200, registerSerializer, {
125
+ sendFastSuccess(res, 201, registerSerializer, {
126
126
  status: "success",
127
127
  message: "Registration successful",
128
128
  data: {
@@ -14,6 +14,11 @@
14
14
  "date": 1766768402694,
15
15
  "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-27.log",
16
16
  "hash": "7b83a98dcb0ded21998f90e8c58a724cbb2534104205f97e15b409cfa080e982"
17
+ },
18
+ {
19
+ "date": 1766895868212,
20
+ "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-28.log",
21
+ "hash": "43121130a6745af0345b445cc3497d27a18a857e350d002848a27b0c71a577ae"
17
22
  }
18
23
  ],
19
24
  "hashType": "sha256"
@@ -0,0 +1,725 @@
1
+ [2025-12-28 11:24:28] WARN: Bad Request
2
+ Errors: {
3
+ "field": "Required"
4
+ }
5
+ Meta: {"statusCode":400}
6
+ [2025-12-28 11:25:08] WARN: Bad Request
7
+ Errors: {
8
+ "field": "Required"
9
+ }
10
+ Meta: {"statusCode":400}
11
+ [2025-12-28 11:26:08] WARN: Bad Request
12
+ Errors: {
13
+ "field": "Required"
14
+ }
15
+ Meta: {"statusCode":400}
16
+ [2025-12-28 11:26:12] INFO: GET / 200 - 8ms - ::ffff:127.0.0.1
17
+ [2025-12-28 11:26:12] WARN: GET /unknown 404 - 1ms - ::ffff:127.0.0.1
18
+ [2025-12-28 11:28:26] WARN: Bad Request
19
+ Errors: {
20
+ "field": "Required"
21
+ }
22
+ Meta: {"statusCode":400}
23
+ [2025-12-28 11:28:28] INFO: GET / 200 - 8ms - ::ffff:127.0.0.1
24
+ [2025-12-28 11:28:28] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
25
+ [2025-12-28 11:29:18] WARN: Bad Request
26
+ Errors: {
27
+ "field": "Required"
28
+ }
29
+ Meta: {"statusCode":400}
30
+ [2025-12-28 11:29:19] INFO: GET / 200 - 10ms - ::ffff:127.0.0.1
31
+ [2025-12-28 11:29:19] WARN: GET /unknown 404 - 1ms - ::ffff:127.0.0.1
32
+ [2025-12-28 11:29:20] WARN: POST /api/auth/register 404 - 407ms - ::ffff:127.0.0.1
33
+ [2025-12-28 11:29:20] WARN: POST /api/auth/login 404 - 1ms - ::ffff:127.0.0.1
34
+ [2025-12-28 11:31:42] WARN: Bad Request
35
+ Errors: {
36
+ "field": "Required"
37
+ }
38
+ Meta: {"statusCode":400}
39
+ [2025-12-28 11:31:44] INFO: GET / 200 - 10ms - ::ffff:127.0.0.1
40
+ [2025-12-28 11:31:44] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
41
+ [2025-12-28 11:31:44] WARN: POST /api/auth/register 404 - 17ms - ::ffff:127.0.0.1
42
+ [2025-12-28 11:31:44] WARN: POST /api/auth/register 404 - 1ms - ::ffff:127.0.0.1
43
+ [2025-12-28 11:31:44] WARN: POST /api/auth/login 404 - 1ms - ::ffff:127.0.0.1
44
+ [2025-12-28 11:32:10] WARN: Bad Request
45
+ Errors: {
46
+ "field": "Required"
47
+ }
48
+ Meta: {"statusCode":400}
49
+ [2025-12-28 11:32:32] WARN: Bad Request
50
+ Errors: {
51
+ "field": "Required"
52
+ }
53
+ Meta: {"statusCode":400}
54
+ [2025-12-28 11:32:33] INFO: GET / 200 - 8ms - ::ffff:127.0.0.1
55
+ [2025-12-28 11:32:33] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
56
+ [2025-12-28 11:32:33] WARN: POST /api/auth/register 404 - 17ms - ::ffff:127.0.0.1
57
+ [2025-12-28 11:32:33] WARN: POST /api/auth/register 404 - 1ms - ::ffff:127.0.0.1
58
+ [2025-12-28 11:32:34] WARN: POST /api/auth/login 404 - 1ms - ::ffff:127.0.0.1
59
+ [2025-12-28 11:32:53] WARN: Bad Request
60
+ Errors: {
61
+ "field": "Required"
62
+ }
63
+ Meta: {"statusCode":400}
64
+ [2025-12-28 11:32:54] INFO: GET / 200 - 8ms - ::ffff:127.0.0.1
65
+ [2025-12-28 11:32:54] WARN: GET /unknown 404 - 1ms - ::ffff:127.0.0.1
66
+ [2025-12-28 11:32:55] WARN: Validation error
67
+ Errors: {
68
+ "confirmPassword": [
69
+ "Required"
70
+ ],
71
+ "email": [
72
+ "The email has already been taken."
73
+ ]
74
+ }
75
+ Meta: {"statusCode":422}
76
+ [2025-12-28 11:32:55] WARN: POST /api/auth/register 422 - 472ms - ::ffff:127.0.0.1
77
+ [2025-12-28 11:32:55] WARN: Validation error
78
+ Errors: {
79
+ "confirmPassword": [
80
+ "Required"
81
+ ],
82
+ "email": [
83
+ "The email has already been taken."
84
+ ]
85
+ }
86
+ Meta: {"statusCode":422}
87
+ [2025-12-28 11:32:55] WARN: POST /api/auth/register 422 - 64ms - ::ffff:127.0.0.1
88
+ [2025-12-28 11:32:55] ERROR:
89
+ Invalid `prisma.users.findUnique()` invocation in
90
+ E:\PROJECT\ANY\2026\lapeh\src\controllers\authController.ts:148:35
91
+
92
+ 145 return;
93
+ 146 }
94
+ 147 const { email, password } = await validator.validated();
95
+ → 148 const user = await prisma.users.findUnique(
96
+ Database `lapeh_test` does not exist on the database server
97
+ PrismaClientKnownRequestError:
98
+ Invalid `prisma.users.findUnique()` invocation in
99
+ E:\PROJECT\ANY\2026\lapeh\src\controllers\authController.ts:148:35
100
+
101
+ 145 return;
102
+ 146 }
103
+ 147 const { email, password } = await validator.validated();
104
+ → 148 const user = await prisma.users.findUnique(
105
+ Database `lapeh_test` does not exist on the database server
106
+ at qr.handleRequestError (E:\PROJECT\ANY\2026\lapeh\node_modules\@prisma\client\src\runtime\RequestHandler.ts:228:13)
107
+ at qr.handleAndLogRequestError (E:\PROJECT\ANY\2026\lapeh\node_modules\@prisma\client\src\runtime\RequestHandler.ts:174:12)
108
+ at qr.request (E:\PROJECT\ANY\2026\lapeh\node_modules\@prisma\client\src\runtime\RequestHandler.ts:143:12)
109
+ at processTicksAndRejections (node:internal/process/task_queues:105:5)
110
+ at a (E:\PROJECT\ANY\2026\lapeh\node_modules\@prisma\client\src\runtime\getPrismaClient.ts:805:24)
111
+ at login (E:\PROJECT\ANY\2026\lapeh\src\controllers\authController.ts:148:16)
112
+ [2025-12-28 11:32:55] ERROR:
113
+ Invalid `prisma.users.findUnique()` invocation in
114
+ E:\PROJECT\ANY\2026\lapeh\src\controllers\authController.ts:148:35
115
+
116
+ 145 return;
117
+ 146 }
118
+ 147 const { email, password } = await validator.validated();
119
+ → 148 const user = await prisma.users.findUnique(
120
+ Database `lapeh_test` does not exist on the database server
121
+ Meta: {"statusCode":500}
122
+ [2025-12-28 11:32:55] WARN: POST /api/auth/login 500 - 61ms - ::ffff:127.0.0.1
123
+ [2025-12-28 11:34:44] WARN: Bad Request
124
+ Errors: {
125
+ "field": "Required"
126
+ }
127
+ Meta: {"statusCode":400}
128
+ [2025-12-28 11:34:47] INFO: GET / 200 - 13ms - ::ffff:127.0.0.1
129
+ [2025-12-28 11:34:47] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
130
+ [2025-12-28 11:34:47] WARN: Validation error
131
+ Errors: {
132
+ "confirmPassword": [
133
+ "Required"
134
+ ],
135
+ "email": [
136
+ "The email has already been taken."
137
+ ]
138
+ }
139
+ Meta: {"statusCode":422}
140
+ [2025-12-28 11:34:47] WARN: POST /api/auth/register 422 - 247ms - ::ffff:127.0.0.1
141
+ [2025-12-28 11:34:47] WARN: Validation error
142
+ Errors: {
143
+ "confirmPassword": [
144
+ "Required"
145
+ ],
146
+ "email": [
147
+ "The email has already been taken."
148
+ ]
149
+ }
150
+ Meta: {"statusCode":422}
151
+ [2025-12-28 11:34:47] WARN: POST /api/auth/register 422 - 52ms - ::ffff:127.0.0.1
152
+ [2025-12-28 11:34:47] INFO: POST /api/auth/login 200 - 94ms - ::ffff:127.0.0.1
153
+ [2025-12-28 11:36:20] WARN: Bad Request
154
+ Errors: {
155
+ "field": "Required"
156
+ }
157
+ Meta: {"statusCode":400}
158
+ [2025-12-28 11:36:21] INFO: GET / 200 - 10ms - ::ffff:127.0.0.1
159
+ [2025-12-28 11:36:21] WARN: GET /unknown 404 - 3ms - ::ffff:127.0.0.1
160
+ [2025-12-28 11:36:22] INFO: POST /api/auth/register 200 - 105ms - ::ffff:127.0.0.1
161
+ [2025-12-28 11:36:22] WARN: Validation error
162
+ Errors: {
163
+ "email": [
164
+ "The email has already been taken."
165
+ ]
166
+ }
167
+ Meta: {"statusCode":422}
168
+ [2025-12-28 11:36:22] WARN: POST /api/auth/register 422 - 7ms - ::ffff:127.0.0.1
169
+ [2025-12-28 11:36:22] INFO: POST /api/auth/login 200 - 75ms - ::ffff:127.0.0.1
170
+ [2025-12-28 11:37:16] WARN: Bad Request
171
+ Errors: {
172
+ "field": "Required"
173
+ }
174
+ Meta: {"statusCode":400}
175
+ [2025-12-28 11:37:16] INFO: GET / 200 - 11ms - ::ffff:127.0.0.1
176
+ [2025-12-28 11:37:16] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
177
+ [2025-12-28 11:37:16] INFO: POST /api/auth/register 200 - 92ms - ::ffff:127.0.0.1
178
+ [2025-12-28 11:37:16] WARN: Validation error
179
+ Errors: {
180
+ "email": [
181
+ "The email has already been taken."
182
+ ]
183
+ }
184
+ Meta: {"statusCode":422}
185
+ [2025-12-28 11:37:16] WARN: POST /api/auth/register 422 - 5ms - ::ffff:127.0.0.1
186
+ [2025-12-28 11:37:17] INFO: POST /api/auth/login 200 - 65ms - ::ffff:127.0.0.1
187
+ [2025-12-28 11:38:28] WARN: Bad Request
188
+ Errors: {
189
+ "field": "Required"
190
+ }
191
+ Meta: {"statusCode":400}
192
+ [2025-12-28 11:38:30] INFO: GET / 200 - 7ms - ::ffff:127.0.0.1
193
+ [2025-12-28 11:38:30] WARN: GET /unknown 404 - 1ms - ::ffff:127.0.0.1
194
+ [2025-12-28 11:38:30] INFO: POST /api/auth/register 200 - 88ms - ::ffff:127.0.0.1
195
+ [2025-12-28 11:38:30] WARN: Validation error
196
+ Errors: {
197
+ "email": [
198
+ "The email has already been taken."
199
+ ]
200
+ }
201
+ Meta: {"statusCode":422}
202
+ [2025-12-28 11:38:30] WARN: POST /api/auth/register 422 - 5ms - ::ffff:127.0.0.1
203
+ [2025-12-28 11:38:30] INFO: POST /api/auth/login 200 - 70ms - ::ffff:127.0.0.1
204
+ [2025-12-28 11:39:37] WARN: Bad Request
205
+ Errors: {
206
+ "field": "Required"
207
+ }
208
+ Meta: {"statusCode":400}
209
+ [2025-12-28 11:39:37] INFO: GET / 200 - 8ms - ::ffff:127.0.0.1
210
+ [2025-12-28 11:39:37] WARN: GET /unknown 404 - 1ms - ::ffff:127.0.0.1
211
+ [2025-12-28 11:39:38] INFO: POST /api/auth/register 200 - 91ms - ::ffff:127.0.0.1
212
+ [2025-12-28 11:39:38] WARN: Validation error
213
+ Errors: {
214
+ "email": [
215
+ "The email has already been taken."
216
+ ]
217
+ }
218
+ Meta: {"statusCode":422}
219
+ [2025-12-28 11:39:38] WARN: POST /api/auth/register 422 - 7ms - ::ffff:127.0.0.1
220
+ [2025-12-28 11:39:38] INFO: POST /api/auth/login 200 - 66ms - ::ffff:127.0.0.1
221
+ [2025-12-28 11:41:52] WARN: Bad Request
222
+ Errors: {
223
+ "field": "Required"
224
+ }
225
+ Meta: {"statusCode":400}
226
+ [2025-12-28 11:41:54] INFO: GET / 200 - 13ms - ::ffff:127.0.0.1
227
+ [2025-12-28 11:41:54] INFO: POST /api/auth/register 200 - 95ms - ::ffff:127.0.0.1
228
+ [2025-12-28 11:41:54] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
229
+ [2025-12-28 11:41:54] WARN: Validation error
230
+ Errors: {
231
+ "email": [
232
+ "The email has already been taken."
233
+ ]
234
+ }
235
+ Meta: {"statusCode":422}
236
+ [2025-12-28 11:41:54] WARN: POST /api/auth/register 422 - 4ms - ::ffff:127.0.0.1
237
+ [2025-12-28 11:41:54] INFO: GET /api/pets 200 - 8ms - ::ffff:127.0.0.1
238
+ [2025-12-28 11:41:54] INFO: POST /api/pets 201 - 12ms - ::ffff:127.0.0.1
239
+ [2025-12-28 11:41:54] WARN: Validation error
240
+ Errors: {
241
+ "species": [
242
+ "Required"
243
+ ],
244
+ "age": [
245
+ "Expected number, received nan"
246
+ ]
247
+ }
248
+ Meta: {"statusCode":422}
249
+ [2025-12-28 11:41:54] WARN: POST /api/pets 422 - 4ms - ::ffff:127.0.0.1
250
+ [2025-12-28 11:41:54] INFO: GET /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
251
+ [2025-12-28 11:41:54] WARN: Pet not found
252
+ Meta: {"statusCode":404}
253
+ [2025-12-28 11:41:54] WARN: GET /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
254
+ [2025-12-28 11:41:54] INFO: PUT /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
255
+ [2025-12-28 11:41:54] WARN: Pet not found
256
+ Meta: {"statusCode":404}
257
+ [2025-12-28 11:41:54] WARN: PUT /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
258
+ [2025-12-28 11:41:54] INFO: DELETE /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
259
+ [2025-12-28 11:41:54] WARN: Pet not found
260
+ Meta: {"statusCode":404}
261
+ [2025-12-28 11:41:54] WARN: DELETE /api/pets/999 404 - 1ms - ::ffff:127.0.0.1
262
+ [2025-12-28 11:41:54] INFO: POST /api/auth/login 200 - 61ms - ::ffff:127.0.0.1
263
+ [2025-12-28 11:42:22] WARN: Bad Request
264
+ Errors: {
265
+ "field": "Required"
266
+ }
267
+ Meta: {"statusCode":400}
268
+ [2025-12-28 11:42:23] INFO: GET /api/pets 200 - 10ms - ::ffff:127.0.0.1
269
+ [2025-12-28 11:42:23] INFO: POST /api/pets 201 - 19ms - ::ffff:127.0.0.1
270
+ [2025-12-28 11:42:23] WARN: Validation error
271
+ Errors: {
272
+ "species": [
273
+ "Required"
274
+ ],
275
+ "age": [
276
+ "Expected number, received nan"
277
+ ]
278
+ }
279
+ Meta: {"statusCode":422}
280
+ [2025-12-28 11:42:23] WARN: POST /api/pets 422 - 4ms - ::ffff:127.0.0.1
281
+ [2025-12-28 11:42:23] INFO: GET /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
282
+ [2025-12-28 11:42:23] INFO: GET / 200 - 9ms - ::ffff:127.0.0.1
283
+ [2025-12-28 11:42:23] WARN: Pet not found
284
+ Meta: {"statusCode":404}
285
+ [2025-12-28 11:42:23] WARN: GET /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
286
+ [2025-12-28 11:42:23] INFO: PUT /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
287
+ [2025-12-28 11:42:23] WARN: Pet not found
288
+ Meta: {"statusCode":404}
289
+ [2025-12-28 11:42:23] WARN: GET /unknown 404 - 3ms - ::ffff:127.0.0.1
290
+ [2025-12-28 11:42:23] WARN: PUT /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
291
+ [2025-12-28 11:42:23] INFO: DELETE /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
292
+ [2025-12-28 11:42:23] WARN: Pet not found
293
+ Meta: {"statusCode":404}
294
+ [2025-12-28 11:42:23] WARN: DELETE /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
295
+ [2025-12-28 11:42:23] INFO: POST /api/auth/register 200 - 83ms - ::ffff:127.0.0.1
296
+ [2025-12-28 11:42:23] WARN: Validation error
297
+ Errors: {
298
+ "email": [
299
+ "The email has already been taken."
300
+ ]
301
+ }
302
+ Meta: {"statusCode":422}
303
+ [2025-12-28 11:42:23] WARN: POST /api/auth/register 422 - 7ms - ::ffff:127.0.0.1
304
+ [2025-12-28 11:42:23] INFO: POST /api/auth/login 200 - 64ms - ::ffff:127.0.0.1
305
+ [2025-12-28 11:42:24] INFO: GET /api/rbac/roles 200 - 8ms - ::ffff:127.0.0.1
306
+ [2025-12-28 11:42:24] INFO: POST /api/rbac/roles 201 - 8ms - ::ffff:127.0.0.1
307
+ [2025-12-28 11:42:24] INFO: POST /api/rbac/permissions 201 - 2ms - ::ffff:127.0.0.1
308
+ [2025-12-28 11:42:24] INFO: GET /api/rbac/permissions 200 - 1ms - ::ffff:127.0.0.1
309
+ [2025-12-28 11:42:24] INFO: POST /api/rbac/users/assign-role 200 - 1ms - ::ffff:127.0.0.1
310
+ [2025-12-28 11:42:24] WARN: User not found
311
+ Meta: {"statusCode":404}
312
+ [2025-12-28 11:42:24] WARN: POST /api/rbac/users/assign-role 404 - 4ms - ::ffff:127.0.0.1
313
+ [2025-12-28 11:42:43] WARN: Bad Request
314
+ Errors: {
315
+ "field": "Required"
316
+ }
317
+ Meta: {"statusCode":400}
318
+ [2025-12-28 11:42:44] INFO: GET /api/rbac/roles 200 - 10ms - ::ffff:127.0.0.1
319
+ [2025-12-28 11:42:44] INFO: POST /api/rbac/roles 201 - 17ms - ::ffff:127.0.0.1
320
+ [2025-12-28 11:42:44] INFO: POST /api/rbac/permissions 201 - 2ms - ::ffff:127.0.0.1
321
+ [2025-12-28 11:42:44] INFO: GET /api/rbac/permissions 200 - 2ms - ::ffff:127.0.0.1
322
+ [2025-12-28 11:42:44] INFO: POST /api/rbac/users/assign-role 200 - 1ms - ::ffff:127.0.0.1
323
+ [2025-12-28 11:42:44] WARN: User not found
324
+ Meta: {"statusCode":404}
325
+ [2025-12-28 11:42:44] WARN: POST /api/rbac/users/assign-role 404 - 4ms - ::ffff:127.0.0.1
326
+ [2025-12-28 11:42:44] INFO: GET /api/pets 200 - 10ms - ::ffff:127.0.0.1
327
+ [2025-12-28 11:42:44] INFO: GET / 200 - 11ms - ::ffff:127.0.0.1
328
+ [2025-12-28 11:42:44] INFO: POST /api/pets 201 - 11ms - ::ffff:127.0.0.1
329
+ [2025-12-28 11:42:44] WARN: GET /unknown 404 - 1ms - ::ffff:127.0.0.1
330
+ [2025-12-28 11:42:44] WARN: Validation error
331
+ Errors: {
332
+ "species": [
333
+ "Required"
334
+ ],
335
+ "age": [
336
+ "Expected number, received nan"
337
+ ]
338
+ }
339
+ Meta: {"statusCode":422}
340
+ [2025-12-28 11:42:44] WARN: POST /api/pets 422 - 4ms - ::ffff:127.0.0.1
341
+ [2025-12-28 11:42:44] INFO: GET /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
342
+ [2025-12-28 11:42:44] WARN: Pet not found
343
+ Meta: {"statusCode":404}
344
+ [2025-12-28 11:42:44] WARN: GET /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
345
+ [2025-12-28 11:42:44] INFO: PUT /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
346
+ [2025-12-28 11:42:44] WARN: Pet not found
347
+ Meta: {"statusCode":404}
348
+ [2025-12-28 11:42:44] WARN: PUT /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
349
+ [2025-12-28 11:42:44] INFO: DELETE /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
350
+ [2025-12-28 11:42:44] WARN: Pet not found
351
+ Meta: {"statusCode":404}
352
+ [2025-12-28 11:42:44] WARN: DELETE /api/pets/999 404 - 1ms - ::ffff:127.0.0.1
353
+ [2025-12-28 11:42:45] INFO: POST /api/auth/register 200 - 84ms - ::ffff:127.0.0.1
354
+ [2025-12-28 11:42:45] WARN: Validation error
355
+ Errors: {
356
+ "email": [
357
+ "The email has already been taken."
358
+ ]
359
+ }
360
+ Meta: {"statusCode":422}
361
+ [2025-12-28 11:42:45] WARN: POST /api/auth/register 422 - 4ms - ::ffff:127.0.0.1
362
+ [2025-12-28 11:42:45] INFO: POST /api/auth/login 200 - 63ms - ::ffff:127.0.0.1
363
+ [2025-12-28 11:49:41] INFO: GET /api/pets 200 - 17ms - ::ffff:127.0.0.1
364
+ [2025-12-28 11:49:41] INFO: GET /api/pets?search=Fluffy 200 - 1ms - ::ffff:127.0.0.1
365
+ [2025-12-28 11:49:41] INFO: GET /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
366
+ [2025-12-28 11:49:41] WARN: Pet not found
367
+ Meta: {"statusCode":404}
368
+ [2025-12-28 11:49:41] WARN: GET /api/pets/999 404 - 3ms - ::ffff:127.0.0.1
369
+ [2025-12-28 11:49:42] INFO: POST /api/pets 201 - 576ms - ::ffff:127.0.0.1
370
+ [2025-12-28 11:49:42] WARN: Validation error
371
+ Errors: {
372
+ "species": [
373
+ "Required"
374
+ ],
375
+ "age": [
376
+ "Expected number, received nan"
377
+ ]
378
+ }
379
+ Meta: {"statusCode":422}
380
+ [2025-12-28 11:49:42] WARN: POST /api/pets 422 - 3ms - ::ffff:127.0.0.1
381
+ [2025-12-28 11:49:42] INFO: PUT /api/pets/1 200 - 3ms - ::ffff:127.0.0.1
382
+ [2025-12-28 11:49:42] WARN: Pet not found
383
+ Meta: {"statusCode":404}
384
+ [2025-12-28 11:49:42] WARN: PUT /api/pets/999 404 - 7ms - ::ffff:127.0.0.1
385
+ [2025-12-28 11:49:42] INFO: DELETE /api/pets/1 200 - 3ms - ::ffff:127.0.0.1
386
+ [2025-12-28 11:49:42] WARN: Pet not found
387
+ Meta: {"statusCode":404}
388
+ [2025-12-28 11:49:42] WARN: DELETE /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
389
+ [2025-12-28 11:50:51] WARN: GET /api/auth/me 404 - 17ms - ::ffff:127.0.0.1
390
+ [2025-12-28 11:50:51] WARN: GET /api/auth/me 404 - 1ms - ::ffff:127.0.0.1
391
+ [2025-12-28 11:50:51] WARN: PUT /api/auth/profile 404 - 17ms - ::ffff:127.0.0.1
392
+ [2025-12-28 11:50:51] WARN: PUT /api/auth/password 404 - 1ms - ::ffff:127.0.0.1
393
+ [2025-12-28 11:50:52] WARN: PUT /api/auth/password 404 - 1ms - ::ffff:127.0.0.1
394
+ [2025-12-28 11:50:52] WARN: POST /api/auth/refresh-token 404 - 0ms - ::ffff:127.0.0.1
395
+ [2025-12-28 11:50:52] WARN: POST /api/auth/refresh-token 404 - 1ms - ::ffff:127.0.0.1
396
+ [2025-12-28 11:52:04] INFO: GET /api/auth/me 200 - 41ms - ::ffff:127.0.0.1
397
+ [2025-12-28 11:52:04] WARN: User not found
398
+ Meta: {"statusCode":404}
399
+ [2025-12-28 11:52:04] WARN: GET /api/auth/me 404 - 7ms - ::ffff:127.0.0.1
400
+ [2025-12-28 11:52:04] INFO: PUT /api/auth/profile 200 - 47ms - ::ffff:127.0.0.1
401
+ [2025-12-28 11:52:04] INFO: PUT /api/auth/password 200 - 157ms - ::ffff:127.0.0.1
402
+ [2025-12-28 11:52:04] WARN: Invalid credentials
403
+ Errors: {
404
+ "field": "currentPassword",
405
+ "message": "Current password is incorrect"
406
+ }
407
+ Meta: {"statusCode":401}
408
+ [2025-12-28 11:52:04] WARN: PUT /api/auth/password 401 - 69ms - ::ffff:127.0.0.1
409
+ [2025-12-28 11:52:04] INFO: POST /api/auth/refresh 200 - 6ms - ::ffff:127.0.0.1
410
+ [2025-12-28 11:52:04] WARN: Invalid refresh token
411
+ Meta: {"statusCode":401}
412
+ [2025-12-28 11:52:04] WARN: POST /api/auth/refresh 401 - 2ms - ::ffff:127.0.0.1
413
+ [2025-12-28 11:52:27] INFO: GET /api/auth/me 200 - 14ms - ::ffff:127.0.0.1
414
+ [2025-12-28 11:52:27] WARN: User not found
415
+ Meta: {"statusCode":404}
416
+ [2025-12-28 11:52:27] WARN: GET /api/auth/me 404 - 6ms - ::ffff:127.0.0.1
417
+ [2025-12-28 11:52:27] INFO: PUT /api/auth/profile 200 - 25ms - ::ffff:127.0.0.1
418
+ [2025-12-28 11:52:27] INFO: PUT /api/auth/password 200 - 159ms - ::ffff:127.0.0.1
419
+ [2025-12-28 11:52:27] WARN: Invalid credentials
420
+ Errors: {
421
+ "field": "currentPassword",
422
+ "message": "Current password is incorrect"
423
+ }
424
+ Meta: {"statusCode":401}
425
+ [2025-12-28 11:52:27] WARN: PUT /api/auth/password 401 - 92ms - ::ffff:127.0.0.1
426
+ [2025-12-28 11:52:27] INFO: POST /api/auth/refresh 200 - 6ms - ::ffff:127.0.0.1
427
+ [2025-12-28 11:52:27] WARN: Invalid refresh token
428
+ Meta: {"statusCode":401}
429
+ [2025-12-28 11:52:27] WARN: POST /api/auth/refresh 401 - 2ms - ::ffff:127.0.0.1
430
+ [2025-12-28 11:53:42] INFO: POST /api/auth/register 201 - 102ms - ::ffff:127.0.0.1
431
+ [2025-12-28 11:53:42] WARN: Validation error
432
+ Errors: {
433
+ "email": [
434
+ "The email has already been taken."
435
+ ]
436
+ }
437
+ Meta: {"statusCode":422}
438
+ [2025-12-28 11:53:42] WARN: POST /api/auth/register 422 - 3ms - ::ffff:127.0.0.1
439
+ [2025-12-28 11:53:42] INFO: POST /api/auth/login 200 - 65ms - ::ffff:127.0.0.1
440
+ [2025-12-28 11:55:01] WARN: Bad Request
441
+ Errors: {
442
+ "field": "Required"
443
+ }
444
+ Meta: {"statusCode":400}
445
+ [2025-12-28 11:55:01] INFO: GET /api/pets 200 - 16ms - ::ffff:127.0.0.1
446
+ [2025-12-28 11:55:01] INFO: GET /api/pets 200 - 33ms - ::ffff:127.0.0.1
447
+ [2025-12-28 11:55:01] INFO: GET /api/pets?search=Fluffy 200 - 1ms - ::ffff:127.0.0.1
448
+ [2025-12-28 11:55:01] INFO: GET /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
449
+ [2025-12-28 11:55:01] INFO: GET /api/auth/me 200 - 36ms - ::ffff:127.0.0.1
450
+ [2025-12-28 11:55:01] WARN: Pet not found
451
+ Meta: {"statusCode":404}
452
+ [2025-12-28 11:55:02] WARN: User not found
453
+ Meta: {"statusCode":404}
454
+ [2025-12-28 11:55:02] INFO: POST /api/pets 201 - 22ms - ::ffff:127.0.0.1
455
+ [2025-12-28 11:55:02] INFO: GET /api/rbac/roles 200 - 14ms - ::ffff:127.0.0.1
456
+ [2025-12-28 11:55:02] WARN: GET /api/auth/me 404 - 8ms - ::ffff:127.0.0.1
457
+ [2025-12-28 11:55:02] WARN: Validation error
458
+ Errors: {
459
+ "species": [
460
+ "Required"
461
+ ],
462
+ "age": [
463
+ "Expected number, received nan"
464
+ ]
465
+ }
466
+ Meta: {"statusCode":422}
467
+ [2025-12-28 11:55:02] WARN: GET /api/pets/999 404 - 30ms - ::ffff:127.0.0.1
468
+ [2025-12-28 11:55:02] WARN: POST /api/pets 422 - 8ms - ::ffff:127.0.0.1
469
+ [2025-12-28 11:55:02] INFO: GET /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
470
+ [2025-12-28 11:55:02] INFO: PUT /api/auth/profile 200 - 20ms - ::ffff:127.0.0.1
471
+ [2025-12-28 11:55:02] WARN: Pet not found
472
+ Meta: {"statusCode":404}
473
+ [2025-12-28 11:55:02] WARN: GET /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
474
+ [2025-12-28 11:55:02] INFO: POST /api/pets 201 - 21ms - ::ffff:127.0.0.1
475
+ [2025-12-28 11:55:02] INFO: PUT /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
476
+ [2025-12-28 11:55:02] INFO: POST /api/rbac/roles 201 - 22ms - ::ffff:127.0.0.1
477
+ [2025-12-28 11:55:02] INFO: POST /api/auth/register 201 - 161ms - ::ffff:127.0.0.1
478
+ [2025-12-28 11:55:02] WARN: Pet not found
479
+ Meta: {"statusCode":404}
480
+ [2025-12-28 11:55:02] WARN: Validation error
481
+ Errors: {
482
+ "species": [
483
+ "Required"
484
+ ],
485
+ "age": [
486
+ "Expected number, received nan"
487
+ ]
488
+ }
489
+ Meta: {"statusCode":422}
490
+ [2025-12-28 11:55:02] WARN: PUT /api/pets/999 404 - 3ms - ::ffff:127.0.0.1
491
+ [2025-12-28 11:55:02] INFO: POST /api/rbac/permissions 201 - 3ms - ::ffff:127.0.0.1
492
+ [2025-12-28 11:55:02] WARN: POST /api/pets 422 - 5ms - ::ffff:127.0.0.1
493
+ [2025-12-28 11:55:02] INFO: DELETE /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
494
+ [2025-12-28 11:55:02] WARN: Pet not found
495
+ Meta: {"statusCode":404}
496
+ [2025-12-28 11:55:02] INFO: PUT /api/pets/1 200 - 3ms - ::ffff:127.0.0.1
497
+ [2025-12-28 11:55:02] INFO: GET /api/rbac/permissions 200 - 2ms - ::ffff:127.0.0.1
498
+ [2025-12-28 11:55:02] WARN: DELETE /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
499
+ [2025-12-28 11:55:02] WARN: Validation error
500
+ Errors: {
501
+ "email": [
502
+ "The email has already been taken."
503
+ ]
504
+ }
505
+ Meta: {"statusCode":422}
506
+ [2025-12-28 11:55:02] WARN: POST /api/auth/register 422 - 9ms - ::ffff:127.0.0.1
507
+ [2025-12-28 11:55:02] WARN: Pet not found
508
+ Meta: {"statusCode":404}
509
+ [2025-12-28 11:55:02] WARN: PUT /api/pets/999 404 - 4ms - ::ffff:127.0.0.1
510
+ [2025-12-28 11:55:02] INFO: POST /api/rbac/users/assign-role 200 - 5ms - ::ffff:127.0.0.1
511
+ [2025-12-28 11:55:02] INFO: DELETE /api/pets/1 200 - 4ms - ::ffff:127.0.0.1
512
+ [2025-12-28 11:55:02] WARN: User not found
513
+ Meta: {"statusCode":404}
514
+ [2025-12-28 11:55:02] WARN: Pet not found
515
+ Meta: {"statusCode":404}
516
+ [2025-12-28 11:55:02] WARN: DELETE /api/pets/999 404 - 4ms - ::ffff:127.0.0.1
517
+ [2025-12-28 11:55:02] WARN: POST /api/rbac/users/assign-role 404 - 32ms - ::ffff:127.0.0.1
518
+ [2025-12-28 11:55:02] INFO: GET / 200 - 11ms - ::ffff:127.0.0.1
519
+ [2025-12-28 11:55:02] WARN: GET /unknown 404 - 2ms - ::ffff:127.0.0.1
520
+ [2025-12-28 11:55:02] INFO: POST /api/auth/login 200 - 82ms - ::ffff:127.0.0.1
521
+ [2025-12-28 11:55:02] INFO: PUT /api/auth/password 200 - 146ms - ::ffff:127.0.0.1
522
+ [2025-12-28 11:55:02] WARN: Invalid credentials
523
+ Errors: {
524
+ "field": "currentPassword",
525
+ "message": "Current password is incorrect"
526
+ }
527
+ Meta: {"statusCode":401}
528
+ [2025-12-28 11:55:02] WARN: PUT /api/auth/password 401 - 68ms - ::ffff:127.0.0.1
529
+ [2025-12-28 11:55:02] INFO: POST /api/auth/refresh 200 - 5ms - ::ffff:127.0.0.1
530
+ [2025-12-28 11:55:02] WARN: Invalid refresh token
531
+ Meta: {"statusCode":401}
532
+ [2025-12-28 11:55:02] WARN: POST /api/auth/refresh 401 - 2ms - ::ffff:127.0.0.1
533
+ [2025-12-28 11:59:35] WARN: Bad Request
534
+ Errors: {
535
+ "field": "Required"
536
+ }
537
+ Meta: {"statusCode":400}
538
+ [2025-12-28 12:00:10] WARN: Bad Request
539
+ Errors: {
540
+ "field": "Required"
541
+ }
542
+ Meta: {"statusCode":400}
543
+ [2025-12-28 12:00:11] INFO: POST /api/auth/register 201 - 235ms - ::ffff:127.0.0.1
544
+ [2025-12-28 12:00:11] WARN: Validation error
545
+ Errors: {
546
+ "email": [
547
+ "The email has already been taken."
548
+ ]
549
+ }
550
+ Meta: {"statusCode":422}
551
+ [2025-12-28 12:00:11] WARN: POST /api/auth/register 422 - 11ms - ::ffff:127.0.0.1
552
+ [2025-12-28 12:00:11] INFO: GET / 200 - 15ms - ::ffff:127.0.0.1
553
+ [2025-12-28 12:00:11] WARN: GET /unknown 404 - 4ms - ::ffff:127.0.0.1
554
+ [2025-12-28 12:00:11] INFO: POST /api/auth/login 200 - 123ms - ::ffff:127.0.0.1
555
+ [2025-12-28 12:00:11] INFO: GET /api/auth/me 200 - 17ms - ::ffff:127.0.0.1
556
+ [2025-12-28 12:00:11] WARN: User not found
557
+ Meta: {"statusCode":404}
558
+ [2025-12-28 12:00:11] WARN: GET /api/auth/me 404 - 7ms - ::ffff:127.0.0.1
559
+ [2025-12-28 12:00:11] INFO: PUT /api/auth/profile 200 - 22ms - ::ffff:127.0.0.1
560
+ [2025-12-28 12:00:11] INFO: GET /api/pets 200 - 16ms - ::ffff:127.0.0.1
561
+ [2025-12-28 12:00:11] INFO: POST /api/pets 201 - 43ms - ::ffff:127.0.0.1
562
+ [2025-12-28 12:00:11] INFO: GET /api/rbac/roles 200 - 36ms - ::ffff:127.0.0.1
563
+ [2025-12-28 12:00:11] WARN: Validation error
564
+ Errors: {
565
+ "species": [
566
+ "Required"
567
+ ],
568
+ "age": [
569
+ "Expected number, received nan"
570
+ ]
571
+ }
572
+ Meta: {"statusCode":422}
573
+ [2025-12-28 12:00:11] INFO: PUT /api/auth/password 200 - 212ms - ::ffff:127.0.0.1
574
+ [2025-12-28 12:00:11] WARN: POST /api/pets 422 - 16ms - ::ffff:127.0.0.1
575
+ [2025-12-28 12:00:11] INFO: GET /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
576
+ [2025-12-28 12:00:11] WARN: Pet not found
577
+ Meta: {"statusCode":404}
578
+ [2025-12-28 12:00:11] WARN: GET /api/pets/999 404 - 9ms - ::ffff:127.0.0.1
579
+ [2025-12-28 12:00:11] INFO: POST /api/rbac/roles 201 - 29ms - ::ffff:127.0.0.1
580
+ [2025-12-28 12:00:11] INFO: PUT /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
581
+ [2025-12-28 12:00:11] WARN: Pet not found
582
+ Meta: {"statusCode":404}
583
+ [2025-12-28 12:00:11] WARN: PUT /api/pets/999 404 - 3ms - ::ffff:127.0.0.1
584
+ [2025-12-28 12:00:11] INFO: POST /api/rbac/permissions 201 - 7ms - ::ffff:127.0.0.1
585
+ [2025-12-28 12:00:11] INFO: DELETE /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
586
+ [2025-12-28 12:00:11] INFO: GET /api/rbac/permissions 200 - 5ms - ::ffff:127.0.0.1
587
+ [2025-12-28 12:00:11] WARN: Pet not found
588
+ Meta: {"statusCode":404}
589
+ [2025-12-28 12:00:11] WARN: DELETE /api/pets/999 404 - 5ms - ::ffff:127.0.0.1
590
+ [2025-12-28 12:00:11] INFO: POST /api/rbac/users/assign-role 200 - 6ms - ::ffff:127.0.0.1
591
+ [2025-12-28 12:00:11] WARN: User not found
592
+ Meta: {"statusCode":404}
593
+ [2025-12-28 12:00:11] WARN: POST /api/rbac/users/assign-role 404 - 11ms - ::ffff:127.0.0.1
594
+ [2025-12-28 12:00:12] WARN: Invalid credentials
595
+ Errors: {
596
+ "field": "currentPassword",
597
+ "message": "Current password is incorrect"
598
+ }
599
+ Meta: {"statusCode":401}
600
+ [2025-12-28 12:00:12] WARN: PUT /api/auth/password 401 - 121ms - ::ffff:127.0.0.1
601
+ [2025-12-28 12:00:12] INFO: POST /api/auth/refresh 200 - 7ms - ::ffff:127.0.0.1
602
+ [2025-12-28 12:00:12] WARN: Invalid refresh token
603
+ Meta: {"statusCode":401}
604
+ [2025-12-28 12:00:12] WARN: POST /api/auth/refresh 401 - 3ms - ::ffff:127.0.0.1
605
+ [2025-12-28 12:00:12] INFO: POST /api/auth/avatar 200 - 7ms - ::ffff:127.0.0.1
606
+ [2025-12-28 12:00:12] INFO: GET /api/pets 200 - 9ms - ::ffff:127.0.0.1
607
+ [2025-12-28 12:00:12] INFO: GET /api/pets?search=Fluffy 200 - 1ms - ::ffff:127.0.0.1
608
+ [2025-12-28 12:00:12] INFO: GET /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
609
+ [2025-12-28 12:00:12] WARN: Pet not found
610
+ Meta: {"statusCode":404}
611
+ [2025-12-28 12:00:12] WARN: GET /api/pets/999 404 - 4ms - ::ffff:127.0.0.1
612
+ [2025-12-28 12:00:12] INFO: POST /api/pets 201 - 12ms - ::ffff:127.0.0.1
613
+ [2025-12-28 12:00:12] WARN: Validation error
614
+ Errors: {
615
+ "species": [
616
+ "Required"
617
+ ],
618
+ "age": [
619
+ "Expected number, received nan"
620
+ ]
621
+ }
622
+ Meta: {"statusCode":422}
623
+ [2025-12-28 12:00:12] WARN: POST /api/pets 422 - 4ms - ::ffff:127.0.0.1
624
+ [2025-12-28 12:00:12] INFO: PUT /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
625
+ [2025-12-28 12:00:12] WARN: Pet not found
626
+ Meta: {"statusCode":404}
627
+ [2025-12-28 12:00:12] WARN: PUT /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
628
+ [2025-12-28 12:00:12] INFO: DELETE /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
629
+ [2025-12-28 12:00:12] WARN: Pet not found
630
+ Meta: {"statusCode":404}
631
+ [2025-12-28 12:00:12] WARN: DELETE /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
632
+ [2025-12-28 12:00:47] WARN: Bad Request
633
+ Errors: {
634
+ "field": "Required"
635
+ }
636
+ Meta: {"statusCode":400}
637
+ [2025-12-28 12:00:48] INFO: GET / 200 - 23ms - ::ffff:127.0.0.1
638
+ [2025-12-28 12:00:48] INFO: GET /api/pets 200 - 15ms - ::ffff:127.0.0.1
639
+ [2025-12-28 12:00:48] WARN: GET /unknown 404 - 3ms - ::ffff:127.0.0.1
640
+ [2025-12-28 12:00:48] INFO: GET /api/pets?search=Fluffy 200 - 5ms - ::ffff:127.0.0.1
641
+ [2025-12-28 12:00:48] INFO: GET /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
642
+ [2025-12-28 12:00:48] WARN: Pet not found
643
+ Meta: {"statusCode":404}
644
+ [2025-12-28 12:00:48] WARN: GET /api/pets/999 404 - 15ms - ::ffff:127.0.0.1
645
+ [2025-12-28 12:00:48] INFO: GET /api/rbac/roles 200 - 25ms - ::ffff:127.0.0.1
646
+ [2025-12-28 12:00:48] INFO: POST /api/pets 201 - 19ms - ::ffff:127.0.0.1
647
+ [2025-12-28 12:00:48] WARN: Validation error
648
+ Errors: {
649
+ "species": [
650
+ "Required"
651
+ ],
652
+ "age": [
653
+ "Expected number, received nan"
654
+ ]
655
+ }
656
+ Meta: {"statusCode":422}
657
+ [2025-12-28 12:00:48] WARN: POST /api/pets 422 - 4ms - ::ffff:127.0.0.1
658
+ [2025-12-28 12:00:48] INFO: PUT /api/pets/1 200 - 3ms - ::ffff:127.0.0.1
659
+ [2025-12-28 12:00:48] INFO: POST /api/rbac/roles 201 - 18ms - ::ffff:127.0.0.1
660
+ [2025-12-28 12:00:48] WARN: Pet not found
661
+ Meta: {"statusCode":404}
662
+ [2025-12-28 12:00:48] WARN: PUT /api/pets/999 404 - 3ms - ::ffff:127.0.0.1
663
+ [2025-12-28 12:00:48] INFO: POST /api/rbac/permissions 201 - 6ms - ::ffff:127.0.0.1
664
+ [2025-12-28 12:00:48] INFO: DELETE /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
665
+ [2025-12-28 12:00:48] INFO: GET /api/rbac/permissions 200 - 2ms - ::ffff:127.0.0.1
666
+ [2025-12-28 12:00:48] WARN: Pet not found
667
+ Meta: {"statusCode":404}
668
+ [2025-12-28 12:00:48] WARN: DELETE /api/pets/999 404 - 4ms - ::ffff:127.0.0.1
669
+ [2025-12-28 12:00:48] INFO: POST /api/rbac/users/assign-role 200 - 4ms - ::ffff:127.0.0.1
670
+ [2025-12-28 12:00:48] WARN: User not found
671
+ Meta: {"statusCode":404}
672
+ [2025-12-28 12:00:48] WARN: POST /api/rbac/users/assign-role 404 - 8ms - ::ffff:127.0.0.1
673
+ [2025-12-28 12:00:48] INFO: POST /api/auth/register 201 - 107ms - ::ffff:127.0.0.1
674
+ [2025-12-28 12:00:48] WARN: Validation error
675
+ Errors: {
676
+ "email": [
677
+ "The email has already been taken."
678
+ ]
679
+ }
680
+ Meta: {"statusCode":422}
681
+ [2025-12-28 12:00:48] WARN: POST /api/auth/register 422 - 6ms - ::ffff:127.0.0.1
682
+ [2025-12-28 12:00:48] INFO: GET /api/auth/me 200 - 11ms - ::ffff:127.0.0.1
683
+ [2025-12-28 12:00:48] INFO: GET /api/pets 200 - 12ms - ::ffff:127.0.0.1
684
+ [2025-12-28 12:00:48] WARN: User not found
685
+ Meta: {"statusCode":404}
686
+ [2025-12-28 12:00:48] WARN: GET /api/auth/me 404 - 5ms - ::ffff:127.0.0.1
687
+ [2025-12-28 12:00:48] INFO: POST /api/pets 201 - 12ms - ::ffff:127.0.0.1
688
+ [2025-12-28 12:00:48] INFO: PUT /api/auth/profile 200 - 10ms - ::ffff:127.0.0.1
689
+ [2025-12-28 12:00:48] WARN: Validation error
690
+ Errors: {
691
+ "species": [
692
+ "Required"
693
+ ],
694
+ "age": [
695
+ "Expected number, received nan"
696
+ ]
697
+ }
698
+ Meta: {"statusCode":422}
699
+ [2025-12-28 12:00:48] WARN: POST /api/pets 422 - 6ms - ::ffff:127.0.0.1
700
+ [2025-12-28 12:00:48] INFO: GET /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
701
+ [2025-12-28 12:00:48] WARN: Pet not found
702
+ Meta: {"statusCode":404}
703
+ [2025-12-28 12:00:48] WARN: GET /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
704
+ [2025-12-28 12:00:48] INFO: PUT /api/pets/1 200 - 2ms - ::ffff:127.0.0.1
705
+ [2025-12-28 12:00:48] WARN: Pet not found
706
+ Meta: {"statusCode":404}
707
+ [2025-12-28 12:00:48] WARN: PUT /api/pets/999 404 - 2ms - ::ffff:127.0.0.1
708
+ [2025-12-28 12:00:48] INFO: DELETE /api/pets/1 200 - 1ms - ::ffff:127.0.0.1
709
+ [2025-12-28 12:00:48] WARN: Pet not found
710
+ Meta: {"statusCode":404}
711
+ [2025-12-28 12:00:48] WARN: DELETE /api/pets/999 404 - 1ms - ::ffff:127.0.0.1
712
+ [2025-12-28 12:00:49] INFO: POST /api/auth/login 200 - 85ms - ::ffff:127.0.0.1
713
+ [2025-12-28 12:00:49] INFO: PUT /api/auth/password 200 - 128ms - ::ffff:127.0.0.1
714
+ [2025-12-28 12:00:49] WARN: Invalid credentials
715
+ Errors: {
716
+ "field": "currentPassword",
717
+ "message": "Current password is incorrect"
718
+ }
719
+ Meta: {"statusCode":401}
720
+ [2025-12-28 12:00:49] WARN: PUT /api/auth/password 401 - 71ms - ::ffff:127.0.0.1
721
+ [2025-12-28 12:00:49] INFO: POST /api/auth/refresh 200 - 4ms - ::ffff:127.0.0.1
722
+ [2025-12-28 12:00:49] WARN: Invalid refresh token
723
+ Meta: {"statusCode":401}
724
+ [2025-12-28 12:00:49] WARN: POST /api/auth/refresh 401 - 2ms - ::ffff:127.0.0.1
725
+ [2025-12-28 12:00:49] INFO: POST /api/auth/avatar 200 - 6ms - ::ffff:127.0.0.1
package/tsconfig.json CHANGED
@@ -21,7 +21,8 @@
21
21
  "lib",
22
22
  "src",
23
23
  "prisma",
24
- "generated"
24
+ "generated",
25
+ "tests"
25
26
  ],
26
27
  "exclude": [
27
28
  "node_modules",