diff --git a/bun.lockb b/bun.lockb index 833c566..ec717d4 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/eslint.config.mjs b/eslint.config.mjs index 45981b7..827bfa3 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -23,7 +23,29 @@ export default antfu( "perfectionist/sort-imports": [ "error", { - internalPattern: ["@/**"], + groups: [ + ["external-type", "builtin", "external"], + ["internal-type", "internal"], + [ + "parent-type", + "parent", + "sibling-type", + "sibling", + "index-type", + "index", + ], + ], + customGroups: { + type: { + internal: "^@/.*", + external: "^@(?!/).*", + }, + value: { + internal: "^@/.*", + external: "^@(?!/).*", + }, + }, + newlinesBetween: "always", }, ], "unicorn/filename-case": [ diff --git a/package.json b/package.json index 3fba7c9..7e6d5bd 100644 --- a/package.json +++ b/package.json @@ -28,25 +28,25 @@ "db:studio": "drizzle-kit studio --port=4000" }, "dependencies": { - "@hono/zod-openapi": "^0.18.0", + "@hono/zod-openapi": "^0.18.3", "@oslojs/crypto": "^1.0.1", "@oslojs/encoding": "^1.1.0", - "@scalar/hono-api-reference": "^0.5.159", + "@scalar/hono-api-reference": "^0.5.162", "drizzle-kit": "^0.28.1", - "drizzle-orm": "^0.36.1", + "drizzle-orm": "^0.36.4", "drizzle-zod": "^0.5.1", - "hono": "^4.6.9", + "hono": "^4.6.12", "hono-pino": "^0.7.0", "pino": "^9.5.0", "postgres": "^3.4.5", "zod": "^3.23.8" }, "devDependencies": { - "@antfu/eslint-config": "^3.8.0", + "@antfu/eslint-config": "^3.11.2", "@types/bun": "latest", - "eslint": "^9.14.0", - "eslint-plugin-format": "^0.1.2", - "husky": "^9.1.6", + "eslint": "^9.16.0", + "eslint-plugin-format": "^0.1.3", + "husky": "^9.1.7", "lint-staged": "^15.2.10", "pino-pretty": "^13.0.0" }, diff --git a/src/common/helpers/activity-log.helper.ts b/src/common/helpers/activity-log.helper.ts index 1b65f42..360219e 100644 --- a/src/common/helpers/activity-log.helper.ts +++ b/src/common/helpers/activity-log.helper.ts @@ -1,10 +1,8 @@ -import type { IActivityMetadata } from "@/modules/activities/activity.types"; - import { db } from "@/db/adapter"; import { activityModel } from "@/db/schemas"; +import type { IActivityMetadata } from "@/modules/activities/activity.types"; import type { ActivityTypeValues } from "../enums"; - import { customLogger } from "../middlewares"; export async function logActivity(params: { diff --git a/src/common/helpers/json-content-required.helper.ts b/src/common/helpers/json-content-required.helper.ts index 7c5e8ec..696195c 100644 --- a/src/common/helpers/json-content-required.helper.ts +++ b/src/common/helpers/json-content-required.helper.ts @@ -1,5 +1,4 @@ import type { ZodSchema } from "../lib/types"; - import { jsonContent } from "./json-content.helper"; function jsonContentRequired( diff --git a/src/common/lib/configure-open-api.lib.ts b/src/common/lib/configure-open-api.lib.ts index dc0d8d9..9617fcc 100644 --- a/src/common/lib/configure-open-api.lib.ts +++ b/src/common/lib/configure-open-api.lib.ts @@ -2,9 +2,8 @@ import { apiReference } from "@scalar/hono-api-reference"; import env from "@/env"; -import type { AppOpenAPI } from "./types"; - import packageJSON from "../../../package.json"; +import type { AppOpenAPI } from "./types"; export function configureOpenAPI(app: AppOpenAPI) { app.doc("/doc", { diff --git a/src/common/lib/create-app.lib.ts b/src/common/lib/create-app.lib.ts index a906052..38844d6 100644 --- a/src/common/lib/create-app.lib.ts +++ b/src/common/lib/create-app.lib.ts @@ -1,7 +1,5 @@ import { OpenAPIHono } from "@hono/zod-openapi"; -import type { AppBindings, AppOpenAPI } from "./types"; - import { notFoundMiddleware, onErrorMiddleware, @@ -9,6 +7,7 @@ import { serveEmojiFavicon, } from "../middlewares"; import { defaultHook } from "../utils/default-hook.util"; +import type { AppBindings, AppOpenAPI } from "./types"; export function createRouter() { return new OpenAPIHono({ diff --git a/src/common/middlewares/auth.middleware.ts b/src/common/middlewares/auth.middleware.ts index 50eb682..c1d7bb5 100644 --- a/src/common/middlewares/auth.middleware.ts +++ b/src/common/middlewares/auth.middleware.ts @@ -1,11 +1,9 @@ import type { MiddlewareHandler } from "hono"; - import { getCookie } from "hono/cookie"; import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; import type { AuthRole } from "../enums"; - import { validateSessionToken } from "../utils/sessions.util"; export function authMiddleware(): MiddlewareHandler { diff --git a/src/common/middlewares/on-error.middleware.ts b/src/common/middlewares/on-error.middleware.ts index ce1ae86..9db837c 100644 --- a/src/common/middlewares/on-error.middleware.ts +++ b/src/common/middlewares/on-error.middleware.ts @@ -1,11 +1,9 @@ import type { ErrorHandler } from "hono"; -import type { z } from "zod"; - import { HTTPException } from "hono/http-exception"; +import type { z } from "zod"; import { ZodError } from "zod"; import type { ErrorSchema } from "../schema/error-object.schema"; - import * as HTTP_CODE from "../utils/http-status-codes.util"; import * as HTTP_PHRASE from "../utils/http-status-phrases.util"; diff --git a/src/common/utils/sessions.util.ts b/src/common/utils/sessions.util.ts index 4ce3e49..e42d045 100644 --- a/src/common/utils/sessions.util.ts +++ b/src/common/utils/sessions.util.ts @@ -1,11 +1,10 @@ import { encodeBase32LowerCaseNoPadding } from "@oslojs/encoding"; import { eq } from "drizzle-orm"; -import type { TSelectSessionSchema } from "@/db/schemas/session.model"; -import type { TSelectUserSchema } from "@/db/schemas/user.model"; - import { db } from "@/db/adapter"; +import type { TSelectSessionSchema } from "@/db/schemas/session.model"; import sessionModel from "@/db/schemas/session.model"; +import type { TSelectUserSchema } from "@/db/schemas/user.model"; import userModel from "@/db/schemas/user.model"; export type SessionValidationResult = diff --git a/src/db/schemas/account.model.ts b/src/db/schemas/account.model.ts index 44c5fd0..5dd6151 100644 --- a/src/db/schemas/account.model.ts +++ b/src/db/schemas/account.model.ts @@ -1,7 +1,6 @@ -import type { z } from "zod"; - import { pgTable, timestamp, unique, varchar } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import userModel from "./user.model"; diff --git a/src/db/schemas/activity.model.ts b/src/db/schemas/activity.model.ts index 9de7b0a..7064d1d 100644 --- a/src/db/schemas/activity.model.ts +++ b/src/db/schemas/activity.model.ts @@ -1,5 +1,3 @@ -import type { z } from "zod"; - import { jsonb, pgEnum, @@ -8,6 +6,7 @@ import { varchar, } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import { activityTypeArr } from "@/common/enums"; diff --git a/src/db/schemas/category.model.ts b/src/db/schemas/category.model.ts index 6e1926c..f33cb4d 100644 --- a/src/db/schemas/category.model.ts +++ b/src/db/schemas/category.model.ts @@ -1,5 +1,3 @@ -import type { z } from "zod"; - import { relations } from "drizzle-orm"; import { boolean, @@ -10,6 +8,7 @@ import { varchar, } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import userModel, { lower } from "./user.model"; diff --git a/src/db/schemas/expense.model.ts b/src/db/schemas/expense.model.ts index c4e2f59..ed08070 100644 --- a/src/db/schemas/expense.model.ts +++ b/src/db/schemas/expense.model.ts @@ -1,5 +1,3 @@ -import type { z } from "zod"; - import { pgEnum, pgTable, @@ -9,6 +7,7 @@ import { varchar, } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import { splitTypeArr } from "@/common/enums"; diff --git a/src/db/schemas/group.model.ts b/src/db/schemas/group.model.ts index 79cbe73..7eea824 100644 --- a/src/db/schemas/group.model.ts +++ b/src/db/schemas/group.model.ts @@ -1,7 +1,6 @@ -import type { z } from "zod"; - import { pgEnum, pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import { GroupStatus, groupStatusArr } from "@/common/enums"; diff --git a/src/db/schemas/session.model.ts b/src/db/schemas/session.model.ts index c235621..632ecf7 100644 --- a/src/db/schemas/session.model.ts +++ b/src/db/schemas/session.model.ts @@ -1,7 +1,6 @@ -import type { z } from "zod"; - import { pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import userModel from "./user.model"; diff --git a/src/db/schemas/split.model.ts b/src/db/schemas/split.model.ts index 701dfbd..a4f76b6 100644 --- a/src/db/schemas/split.model.ts +++ b/src/db/schemas/split.model.ts @@ -1,5 +1,3 @@ -import type { z } from "zod"; - import { boolean, pgTable, @@ -8,6 +6,7 @@ import { varchar, } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import expenseModel from "./expense.model"; import userModel from "./user.model"; diff --git a/src/db/schemas/user.model.ts b/src/db/schemas/user.model.ts index df69e26..b5399f2 100644 --- a/src/db/schemas/user.model.ts +++ b/src/db/schemas/user.model.ts @@ -1,8 +1,6 @@ import type { SQL } from "drizzle-orm"; -import type { AnyPgColumn } from "drizzle-orm/pg-core"; -import type { z } from "zod"; - import { relations, sql } from "drizzle-orm"; +import type { AnyPgColumn } from "drizzle-orm/pg-core"; import { boolean, pgEnum, @@ -12,6 +10,7 @@ import { varchar, } from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; import { AuthRoles, authRolesArr } from "@/common/enums"; diff --git a/src/modules/activities/activity.handlers.ts b/src/modules/activities/activity.handlers.ts index ccde81a..dca794b 100644 --- a/src/modules/activities/activity.handlers.ts +++ b/src/modules/activities/activity.handlers.ts @@ -1,12 +1,10 @@ -import type { AppRouteHandler } from "@/common/lib/types"; - import { AuthRoles } from "@/common/enums"; import { generateMetadata } from "@/common/helpers/metadata.helper"; +import type { AppRouteHandler } from "@/common/lib/types"; import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; -import type { TGetActivitiesRoute } from "./activity.routes"; - import { getActivitiesRepository } from "./activity.repository"; +import type { TGetActivitiesRoute } from "./activity.routes"; import { organizeActivities } from "./activity.utils"; export const getActivities: AppRouteHandler = async ( diff --git a/src/modules/activities/activity.repository.ts b/src/modules/activities/activity.repository.ts index 6c9d2a1..c16dde6 100644 --- a/src/modules/activities/activity.repository.ts +++ b/src/modules/activities/activity.repository.ts @@ -1,14 +1,11 @@ import type { SQL } from "drizzle-orm"; - import { and, asc, desc, sql } from "drizzle-orm"; -import type { TInsertActivitySchema } from "@/db/schemas/activity.model"; - import { db } from "@/db/adapter"; +import type { TInsertActivitySchema } from "@/db/schemas/activity.model"; import activityModel from "@/db/schemas/activity.model"; import type { TActivityQuery } from "./activity.schema"; - import { activitySortBy } from "./activity.utils"; export async function createActivityRepository(payload: TInsertActivitySchema) { diff --git a/src/modules/activities/activity.utils.ts b/src/modules/activities/activity.utils.ts index a512695..7d912b0 100644 --- a/src/modules/activities/activity.utils.ts +++ b/src/modules/activities/activity.utils.ts @@ -1,6 +1,5 @@ -import type { TSelectActivitySchema } from "@/db/schemas/activity.model"; - import { activityModel } from "@/db/schemas"; +import type { TSelectActivitySchema } from "@/db/schemas/activity.model"; import type { IActivityMetadata } from "./activity.types"; diff --git a/src/modules/auth/auth.handlers.ts b/src/modules/auth/auth.handlers.ts index 00c9e8c..af8245b 100644 --- a/src/modules/auth/auth.handlers.ts +++ b/src/modules/auth/auth.handlers.ts @@ -1,8 +1,7 @@ import { deleteCookie, setCookie } from "hono/cookie"; -import type { AppRouteHandler } from "@/common/lib/types"; - import { AuthRoles } from "@/common/enums"; +import type { AppRouteHandler } from "@/common/lib/types"; import { hashPassword, verifyPasswordHash, @@ -14,13 +13,6 @@ import { db } from "@/db/adapter"; import { accountModel, sessionModel, userModel } from "@/db/schemas"; import env from "@/env"; -import type { - TLoggedInUserDetails, - TLoginRoute, - TLogoutRoute, - TRegisterRoute, -} from "./auth.routes"; - import { getAccountRepository } from "../accounts/account.repository"; import { createSessionReposiroty, @@ -30,6 +22,12 @@ import { getUserByEmailRepository, getUserByIdRepository, } from "../users/user.repository"; +import type { + TLoggedInUserDetails, + TLoginRoute, + TLogoutRoute, + TRegisterRoute, +} from "./auth.routes"; export const register: AppRouteHandler = async (c) => { const payload = c.req.valid("json"); diff --git a/src/modules/categories/category.handlers.ts b/src/modules/categories/category.handlers.ts index d6659cc..d999d70 100644 --- a/src/modules/categories/category.handlers.ts +++ b/src/modules/categories/category.handlers.ts @@ -1,18 +1,9 @@ -import type { AppRouteHandler } from "@/common/lib/types"; -import type { TSelectCategorySchema } from "@/db/schemas/category.model"; - import { ActivityType, AuthRoles } from "@/common/enums"; import { logActivity } from "@/common/helpers/activity-log.helper"; import { generateMetadata } from "@/common/helpers/metadata.helper"; +import type { AppRouteHandler } from "@/common/lib/types"; import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; - -import type { - TCreateCategoryRoute, - TDeleteCategoryRoute, - TGetCategoriesRoute, - TGetCategoryRoute, - TUpdateCategoryRoute, -} from "./category.routes"; +import type { TSelectCategorySchema } from "@/db/schemas/category.model"; import { createCategoryRepository, @@ -24,6 +15,13 @@ import { getCategoryRepository, updateCategoryByIdRepository, } from "./category.repository"; +import type { + TCreateCategoryRoute, + TDeleteCategoryRoute, + TGetCategoriesRoute, + TGetCategoryRoute, + TUpdateCategoryRoute, +} from "./category.routes"; export const createCategory: AppRouteHandler = async ( c, diff --git a/src/modules/categories/category.repository.ts b/src/modules/categories/category.repository.ts index 97ea464..e348b1f 100644 --- a/src/modules/categories/category.repository.ts +++ b/src/modules/categories/category.repository.ts @@ -1,15 +1,12 @@ import type { SQL } from "drizzle-orm"; - import { and, asc, desc, eq, ilike, isNull, or, sql } from "drizzle-orm"; -import type { TInsertCategorySchema } from "@/db/schemas/category.model"; - import { db } from "@/db/adapter"; import { categoryModel } from "@/db/schemas"; +import type { TInsertCategorySchema } from "@/db/schemas/category.model"; import { lower } from "@/db/schemas/user.model"; import type { TCategoryQuery } from "./category.schema"; - import { categorySortBy } from "./category.util"; export async function createCategoryRepository( diff --git a/src/modules/group/group.handler.ts b/src/modules/group/group.handler.ts index 946e79f..e854e03 100644 --- a/src/modules/group/group.handler.ts +++ b/src/modules/group/group.handler.ts @@ -1,16 +1,14 @@ -import type { AppRouteHandler } from "@/common/lib/types"; -import type { TSelectGroupSchema } from "@/db/schemas/group.model"; - import { ActivityType } from "@/common/enums"; import { logActivity } from "@/common/helpers/activity-log.helper"; +import type { AppRouteHandler } from "@/common/lib/types"; import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; - -import type { TCreateGroupRoute, TDeleteGroupRoute } from "./group.routes"; +import type { TSelectGroupSchema } from "@/db/schemas/group.model"; import { createGroupRepository, deleteGroupRepository, } from "./group.repository"; +import type { TCreateGroupRoute, TDeleteGroupRoute } from "./group.routes"; export const createGroup: AppRouteHandler = async (c) => { const user = c.get("user"); diff --git a/src/modules/group/group.repository.ts b/src/modules/group/group.repository.ts index 6b42563..fbcf8e6 100644 --- a/src/modules/group/group.repository.ts +++ b/src/modules/group/group.repository.ts @@ -1,8 +1,7 @@ import { eq } from "drizzle-orm"; -import type { TInsertGroupSchema } from "@/db/schemas/group.model"; - import { db } from "@/db/adapter"; +import type { TInsertGroupSchema } from "@/db/schemas/group.model"; import groupModel from "@/db/schemas/group.model"; export async function createGroupRepository(groupPayload: TInsertGroupSchema) { diff --git a/src/modules/health-check/health-check.handler.ts b/src/modules/health-check/health-check.handler.ts index ec19531..b84c406 100644 --- a/src/modules/health-check/health-check.handler.ts +++ b/src/modules/health-check/health-check.handler.ts @@ -1,5 +1,4 @@ import type { AppRouteHandler } from "@/common/lib/types"; - import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; import type { HealthCheckRoute } from "./health-check.route"; diff --git a/src/modules/sessions/session.handler.ts b/src/modules/sessions/session.handler.ts index 35b7cd2..7909fed 100644 --- a/src/modules/sessions/session.handler.ts +++ b/src/modules/sessions/session.handler.ts @@ -1,6 +1,5 @@ -import type { TInsertSessionSchema } from "@/db/schemas/session.model"; - import { generateSessionToken } from "@/common/utils/sessions.util"; +import type { TInsertSessionSchema } from "@/db/schemas/session.model"; import { createSessionReposiroty } from "./session.repository"; diff --git a/src/modules/sessions/session.repository.ts b/src/modules/sessions/session.repository.ts index 9c797fb..3bba295 100644 --- a/src/modules/sessions/session.repository.ts +++ b/src/modules/sessions/session.repository.ts @@ -1,9 +1,8 @@ import { eq } from "drizzle-orm"; -import type { TInsertSessionSchema } from "@/db/schemas/session.model"; - import { db } from "@/db/adapter"; import { sessionModel } from "@/db/schemas"; +import type { TInsertSessionSchema } from "@/db/schemas/session.model"; export async function createSessionReposiroty( sessionData: TInsertSessionSchema, diff --git a/src/modules/users/user.handlers.ts b/src/modules/users/user.handlers.ts index ab40d56..dba1227 100644 --- a/src/modules/users/user.handlers.ts +++ b/src/modules/users/user.handlers.ts @@ -1,10 +1,8 @@ import type { AppRouteHandler } from "@/common/lib/types"; - import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; -import type { CreateUserRoute } from "./user.routes"; - import { createUserRepository } from "./user.repository"; +import type { CreateUserRoute } from "./user.routes"; export const createUser: AppRouteHandler = async (c) => { const userPayload = c.req.valid("json"); diff --git a/src/modules/users/user.repository.ts b/src/modules/users/user.repository.ts index 82be2e4..aea4260 100644 --- a/src/modules/users/user.repository.ts +++ b/src/modules/users/user.repository.ts @@ -1,8 +1,7 @@ import { eq } from "drizzle-orm"; -import type { TInsertUserSchema } from "@/db/schemas/user.model"; - import { db } from "@/db/adapter"; +import type { TInsertUserSchema } from "@/db/schemas/user.model"; import userModel, { lower } from "@/db/schemas/user.model"; export async function createUserRepository(payload: TInsertUserSchema) {