From 27bcb8bbef8ea0928d5c34a1b94f5bd79911dce3 Mon Sep 17 00:00:00 2001 From: lethdat Date: Mon, 12 Jan 2026 02:08:47 +0700 Subject: [PATCH] change architecture --- bun.lock | 6 +- components.d.ts | 48 +- package.json | 2 +- plugins/ssrPlugin.ts | 4 +- .../api/httpClientAdapter.client.ts | 0 .../api/httpClientAdapter.server.ts | 0 src/{ => client}/api/rpc/auth.ts | 0 src/{ => client}/api/rpc/commom.ts | 0 src/{ => client}/api/rpc/index.ts | 0 src/{ => client}/api/rpc/s3_handle.ts | 0 src/{ => client}/api/rpcclient.ts | 0 .../components/DashboardLayout.vue | 12 +- src/{ => client}/components/RootLayout.vue | 0 src/{ => client}/components/VueHead.tsx | 0 src/{ => client}/components/icons/Add.vue | 0 src/{ => client}/components/icons/Bell.vue | 0 .../components/icons/CheckIcon.vue | 0 src/{ => client}/components/icons/Credit.vue | 0 src/{ => client}/components/icons/Home.vue | 0 src/{ => client}/components/icons/Layout.vue | 0 .../components/icons/TestIcon.vue | 0 src/{ => client}/components/icons/Upload.vue | 0 src/{ => client}/components/icons/Video.vue | 0 src/{ => client}/components/icons/index.ts | 0 src/{client.ts => client/index.ts} | 2 +- src/{ => client}/lib/constants.ts | 0 .../lib/hoc/withErrorBoundary.tsx | 0 src/{ => client}/lib/manifest.ts | 2 +- src/{ => client}/lib/primeCssContent.ts | 0 src/{ => client}/lib/primePassthrough.ts | 0 .../lib/swr/cache/adapters/localStorage.ts | 0 src/{ => client}/lib/swr/cache/index.ts | 0 src/{ => client}/lib/swr/index.ts | 0 src/{ => client}/lib/swr/lib/hash.ts | 0 src/{ => client}/lib/swr/lib/web-preset.ts | 0 src/{ => client}/lib/swr/types.ts | 0 src/{ => client}/lib/swr/use-swrv.ts | 0 src/{ => client}/lib/utils.ts | 0 src/{ => client}/routes/NotFound.vue | 2 +- src/{ => client}/routes/add/Add.vue | 0 src/{ => client}/routes/auth/forgot.vue | 0 src/{ => client}/routes/auth/layout.vue | 0 src/{ => client}/routes/auth/login.vue | 2 +- src/{ => client}/routes/auth/signup.vue | 0 src/{ => client}/routes/index.ts | 6 +- .../routes/public-routes/Home.vue | 2 +- .../routes/public-routes/Layout.vue | 0 .../routes/public-routes/Privacy.vue | 0 .../routes/public-routes/Terms.vue | 0 src/{ => client}/stores/auth.ts | 2 +- src/{ => client}/worker/ssrLayout.ts | 0 src/main.ts | 117 ++--- src/server/HonoAdapter/adapter.ts | 2 +- .../HonoAdapter}/ssrRender.ts | 6 +- src/server/HonoAdapter/test.ts | 466 ------------------ src/server/app.controller.ts | 13 - src/server/app.module.ts | 24 +- src/server/app.service.ts | 6 - src/server/common/adapter/hono/HonoAdapter.ts | 86 ++++ .../common/adapter/hono/HonoApplication.ts | 36 ++ src/server/common/adapter/hono/_adapter.ts | 298 +++++++++++ src/server/common/adapter/hono/_nest.ts | 28 ++ src/server/common/adapter/hono/_util.ts | 154 ++++++ src/server/common/adapter/hono/hono.impl.ts | 18 + src/server/common/adapter/hono/index.ts | 3 + src/server/common/constant/messages.ts | 71 +++ .../common/filter/http-exception.filter.ts | 105 ++++ .../interceptor/transform.interceptor.ts | 24 + .../common/pipes/CustomZodValidation.pipe.ts | 14 + src/server/modules/auth/auth.controller.ts | 13 + src/server/modules/auth/auth.module.ts | 16 + src/server/modules/auth/auth.service.ts | 6 + src/shared/createVueApp.ts | 6 +- tsconfig.json | 2 +- uno.config.ts | 10 +- vite.config.ts | 4 +- 76 files changed, 997 insertions(+), 621 deletions(-) rename src/{ => client}/api/httpClientAdapter.client.ts (100%) rename src/{ => client}/api/httpClientAdapter.server.ts (100%) rename src/{ => client}/api/rpc/auth.ts (100%) rename src/{ => client}/api/rpc/commom.ts (100%) rename src/{ => client}/api/rpc/index.ts (100%) rename src/{ => client}/api/rpc/s3_handle.ts (100%) rename src/{ => client}/api/rpcclient.ts (100%) rename src/{ => client}/components/DashboardLayout.vue (88%) rename src/{ => client}/components/RootLayout.vue (100%) rename src/{ => client}/components/VueHead.tsx (100%) rename src/{ => client}/components/icons/Add.vue (100%) rename src/{ => client}/components/icons/Bell.vue (100%) rename src/{ => client}/components/icons/CheckIcon.vue (100%) rename src/{ => client}/components/icons/Credit.vue (100%) rename src/{ => client}/components/icons/Home.vue (100%) rename src/{ => client}/components/icons/Layout.vue (100%) rename src/{ => client}/components/icons/TestIcon.vue (100%) rename src/{ => client}/components/icons/Upload.vue (100%) rename src/{ => client}/components/icons/Video.vue (100%) rename src/{ => client}/components/icons/index.ts (100%) rename src/{client.ts => client/index.ts} (83%) rename src/{ => client}/lib/constants.ts (100%) rename src/{ => client}/lib/hoc/withErrorBoundary.tsx (100%) rename src/{ => client}/lib/manifest.ts (98%) rename src/{ => client}/lib/primeCssContent.ts (100%) rename src/{ => client}/lib/primePassthrough.ts (100%) rename src/{ => client}/lib/swr/cache/adapters/localStorage.ts (100%) rename src/{ => client}/lib/swr/cache/index.ts (100%) rename src/{ => client}/lib/swr/index.ts (100%) rename src/{ => client}/lib/swr/lib/hash.ts (100%) rename src/{ => client}/lib/swr/lib/web-preset.ts (100%) rename src/{ => client}/lib/swr/types.ts (100%) rename src/{ => client}/lib/swr/use-swrv.ts (100%) rename src/{ => client}/lib/utils.ts (100%) rename src/{ => client}/routes/NotFound.vue (87%) rename src/{ => client}/routes/add/Add.vue (100%) rename src/{ => client}/routes/auth/forgot.vue (100%) rename src/{ => client}/routes/auth/layout.vue (100%) rename src/{ => client}/routes/auth/login.vue (98%) rename src/{ => client}/routes/auth/signup.vue (100%) rename src/{ => client}/routes/index.ts (96%) rename src/{ => client}/routes/public-routes/Home.vue (99%) rename src/{ => client}/routes/public-routes/Layout.vue (100%) rename src/{ => client}/routes/public-routes/Privacy.vue (100%) rename src/{ => client}/routes/public-routes/Terms.vue (100%) rename src/{ => client}/stores/auth.ts (98%) rename src/{ => client}/worker/ssrLayout.ts (100%) rename src/{worker => server/HonoAdapter}/ssrRender.ts (95%) delete mode 100644 src/server/HonoAdapter/test.ts delete mode 100644 src/server/app.controller.ts delete mode 100644 src/server/app.service.ts create mode 100644 src/server/common/adapter/hono/HonoAdapter.ts create mode 100644 src/server/common/adapter/hono/HonoApplication.ts create mode 100644 src/server/common/adapter/hono/_adapter.ts create mode 100644 src/server/common/adapter/hono/_nest.ts create mode 100644 src/server/common/adapter/hono/_util.ts create mode 100644 src/server/common/adapter/hono/hono.impl.ts create mode 100644 src/server/common/adapter/hono/index.ts create mode 100644 src/server/common/constant/messages.ts create mode 100644 src/server/common/filter/http-exception.filter.ts create mode 100644 src/server/common/interceptor/transform.interceptor.ts create mode 100644 src/server/common/pipes/CustomZodValidation.pipe.ts create mode 100644 src/server/modules/auth/auth.controller.ts create mode 100644 src/server/modules/auth/auth.module.ts create mode 100644 src/server/modules/auth/auth.service.ts diff --git a/bun.lock b/bun.lock index 3beb8e1..d157996 100644 --- a/bun.lock +++ b/bun.lock @@ -11,7 +11,6 @@ "@hiogawa/tiny-rpc": "^0.2.3-pre.18", "@hiogawa/utils": "^1.7.0", "@hono-di/cli": "^0.0.15", - "@hono-di/core": "^0.0.15", "@nestjs/common": "^11.1.11", "@nestjs/core": "^11.1.11", "@primeuix/themes": "^2.0.2", @@ -21,6 +20,7 @@ "clsx": "^2.1.1", "hono": "^4.11.3", "is-mobile": "^5.0.0", + "nestjs-zod": "^5.1.1", "pinia": "^3.0.4", "primevue": "^4.5.4", "reflect-metadata": "^0.2.2", @@ -640,6 +640,8 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], @@ -762,6 +764,8 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nestjs-zod": ["nestjs-zod@5.1.1", "", { "dependencies": { "deepmerge": "^4.3.1" }, "peerDependencies": { "@nestjs/common": "^10.0.0 || ^11.0.0", "@nestjs/swagger": "^7.4.2 || ^8.0.0 || ^11.0.0", "rxjs": "^7.0.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@nestjs/swagger"] }, "sha512-pXa9Jrdip7iedKvGxJTvvCFVRCoIcNENPCsHjpCefPH3PcFejRgkZkUcr3TYITRyxnUk7Zy5OsLpirZGLYBfBQ=="], + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], diff --git a/components.d.ts b/components.d.ts index 50cbcb9..3dfeaf3 100644 --- a/components.d.ts +++ b/components.d.ts @@ -12,47 +12,47 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { - Add: typeof import('./src/components/icons/Add.vue')['default'] - Bell: typeof import('./src/components/icons/Bell.vue')['default'] + Add: typeof import('./src/client/components/icons/Add.vue')['default'] + Bell: typeof import('./src/client/components/icons/Bell.vue')['default'] Button: typeof import('primevue/button')['default'] Checkbox: typeof import('primevue/checkbox')['default'] - CheckIcon: typeof import('./src/components/icons/CheckIcon.vue')['default'] - Credit: typeof import('./src/components/icons/Credit.vue')['default'] - DashboardLayout: typeof import('./src/components/DashboardLayout.vue')['default'] - Home: typeof import('./src/components/icons/Home.vue')['default'] + CheckIcon: typeof import('./src/client/components/icons/CheckIcon.vue')['default'] + Credit: typeof import('./src/client/components/icons/Credit.vue')['default'] + DashboardLayout: typeof import('./src/client/components/DashboardLayout.vue')['default'] + Home: typeof import('./src/client/components/icons/Home.vue')['default'] InputText: typeof import('primevue/inputtext')['default'] - Layout: typeof import('./src/components/icons/Layout.vue')['default'] + Layout: typeof import('./src/client/components/icons/Layout.vue')['default'] Message: typeof import('primevue/message')['default'] Password: typeof import('primevue/password')['default'] - RootLayout: typeof import('./src/components/RootLayout.vue')['default'] + RootLayout: typeof import('./src/client/components/RootLayout.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] - TestIcon: typeof import('./src/components/icons/TestIcon.vue')['default'] - Upload: typeof import('./src/components/icons/Upload.vue')['default'] - Video: typeof import('./src/components/icons/Video.vue')['default'] - VueHead: typeof import('./src/components/VueHead.tsx')['default'] + TestIcon: typeof import('./src/client/components/icons/TestIcon.vue')['default'] + Upload: typeof import('./src/client/components/icons/Upload.vue')['default'] + Video: typeof import('./src/client/components/icons/Video.vue')['default'] + VueHead: typeof import('./src/client/components/VueHead.tsx')['default'] } } // For TSX support declare global { - const Add: typeof import('./src/components/icons/Add.vue')['default'] - const Bell: typeof import('./src/components/icons/Bell.vue')['default'] + const Add: typeof import('./src/client/components/icons/Add.vue')['default'] + const Bell: typeof import('./src/client/components/icons/Bell.vue')['default'] const Button: typeof import('primevue/button')['default'] const Checkbox: typeof import('primevue/checkbox')['default'] - const CheckIcon: typeof import('./src/components/icons/CheckIcon.vue')['default'] - const Credit: typeof import('./src/components/icons/Credit.vue')['default'] - const DashboardLayout: typeof import('./src/components/DashboardLayout.vue')['default'] - const Home: typeof import('./src/components/icons/Home.vue')['default'] + const CheckIcon: typeof import('./src/client/components/icons/CheckIcon.vue')['default'] + const Credit: typeof import('./src/client/components/icons/Credit.vue')['default'] + const DashboardLayout: typeof import('./src/client/components/DashboardLayout.vue')['default'] + const Home: typeof import('./src/client/components/icons/Home.vue')['default'] const InputText: typeof import('primevue/inputtext')['default'] - const Layout: typeof import('./src/components/icons/Layout.vue')['default'] + const Layout: typeof import('./src/client/components/icons/Layout.vue')['default'] const Message: typeof import('primevue/message')['default'] const Password: typeof import('primevue/password')['default'] - const RootLayout: typeof import('./src/components/RootLayout.vue')['default'] + const RootLayout: typeof import('./src/client/components/RootLayout.vue')['default'] const RouterLink: typeof import('vue-router')['RouterLink'] const RouterView: typeof import('vue-router')['RouterView'] - const TestIcon: typeof import('./src/components/icons/TestIcon.vue')['default'] - const Upload: typeof import('./src/components/icons/Upload.vue')['default'] - const Video: typeof import('./src/components/icons/Video.vue')['default'] - const VueHead: typeof import('./src/components/VueHead.tsx')['default'] + const TestIcon: typeof import('./src/client/components/icons/TestIcon.vue')['default'] + const Upload: typeof import('./src/client/components/icons/Upload.vue')['default'] + const Video: typeof import('./src/client/components/icons/Video.vue')['default'] + const VueHead: typeof import('./src/client/components/VueHead.tsx')['default'] } \ No newline at end of file diff --git a/package.json b/package.json index 01bedd0..89a91d9 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "@hiogawa/tiny-rpc": "^0.2.3-pre.18", "@hiogawa/utils": "^1.7.0", "@hono-di/cli": "^0.0.15", - "@hono-di/core": "^0.0.15", "@nestjs/common": "^11.1.11", "@nestjs/core": "^11.1.11", "@primeuix/themes": "^2.0.2", @@ -23,6 +22,7 @@ "clsx": "^2.1.1", "hono": "^4.11.3", "is-mobile": "^5.0.0", + "nestjs-zod": "^5.1.1", "pinia": "^3.0.4", "primevue": "^4.5.4", "reflect-metadata": "^0.2.2", diff --git a/plugins/ssrPlugin.ts b/plugins/ssrPlugin.ts index 860b016..eab88bc 100644 --- a/plugins/ssrPlugin.ts +++ b/plugins/ssrPlugin.ts @@ -115,8 +115,8 @@ export default function ssrPlugin(): Plugin[] { return path.resolve( __dirname, options?.ssr - ? pwd+"/src/api/httpClientAdapter.server.ts" - : pwd+"/src/api/httpClientAdapter.client.ts" + ? pwd+"/src/client/api/httpClientAdapter.server.ts" + : pwd+"/src/client/api/httpClientAdapter.client.ts" ); }, async configResolved(config) { diff --git a/src/api/httpClientAdapter.client.ts b/src/client/api/httpClientAdapter.client.ts similarity index 100% rename from src/api/httpClientAdapter.client.ts rename to src/client/api/httpClientAdapter.client.ts diff --git a/src/api/httpClientAdapter.server.ts b/src/client/api/httpClientAdapter.server.ts similarity index 100% rename from src/api/httpClientAdapter.server.ts rename to src/client/api/httpClientAdapter.server.ts diff --git a/src/api/rpc/auth.ts b/src/client/api/rpc/auth.ts similarity index 100% rename from src/api/rpc/auth.ts rename to src/client/api/rpc/auth.ts diff --git a/src/api/rpc/commom.ts b/src/client/api/rpc/commom.ts similarity index 100% rename from src/api/rpc/commom.ts rename to src/client/api/rpc/commom.ts diff --git a/src/api/rpc/index.ts b/src/client/api/rpc/index.ts similarity index 100% rename from src/api/rpc/index.ts rename to src/client/api/rpc/index.ts diff --git a/src/api/rpc/s3_handle.ts b/src/client/api/rpc/s3_handle.ts similarity index 100% rename from src/api/rpc/s3_handle.ts rename to src/client/api/rpc/s3_handle.ts diff --git a/src/api/rpcclient.ts b/src/client/api/rpcclient.ts similarity index 100% rename from src/api/rpcclient.ts rename to src/client/api/rpcclient.ts diff --git a/src/components/DashboardLayout.vue b/src/client/components/DashboardLayout.vue similarity index 88% rename from src/components/DashboardLayout.vue rename to src/client/components/DashboardLayout.vue index 8e494b7..54c1a35 100644 --- a/src/components/DashboardLayout.vue +++ b/src/client/components/DashboardLayout.vue @@ -1,12 +1,10 @@ \ No newline at end of file diff --git a/src/routes/add/Add.vue b/src/client/routes/add/Add.vue similarity index 100% rename from src/routes/add/Add.vue rename to src/client/routes/add/Add.vue diff --git a/src/routes/auth/forgot.vue b/src/client/routes/auth/forgot.vue similarity index 100% rename from src/routes/auth/forgot.vue rename to src/client/routes/auth/forgot.vue diff --git a/src/routes/auth/layout.vue b/src/client/routes/auth/layout.vue similarity index 100% rename from src/routes/auth/layout.vue rename to src/client/routes/auth/layout.vue diff --git a/src/routes/auth/login.vue b/src/client/routes/auth/login.vue similarity index 98% rename from src/routes/auth/login.vue rename to src/client/routes/auth/login.vue index 8a0cd9a..b18cf9e 100644 --- a/src/routes/auth/login.vue +++ b/src/client/routes/auth/login.vue @@ -74,7 +74,7 @@ import { reactive } from 'vue'; import { Form, type FormSubmitEvent } from '@primevue/forms'; import { zodResolver } from '@primevue/forms/resolvers/zod'; import { z } from 'zod'; -import { useAuthStore } from '@/stores/auth'; +import { useAuthStore } from '@/client/stores/auth'; const auth = useAuthStore(); // const $form = Form.useFormContext(); diff --git a/src/routes/auth/signup.vue b/src/client/routes/auth/signup.vue similarity index 100% rename from src/routes/auth/signup.vue rename to src/client/routes/auth/signup.vue diff --git a/src/routes/index.ts b/src/client/routes/index.ts similarity index 96% rename from src/routes/index.ts rename to src/client/routes/index.ts index adc39c0..140394f 100644 --- a/src/routes/index.ts +++ b/src/client/routes/index.ts @@ -6,7 +6,7 @@ import { createWebHistory, type RouteRecordRaw, } from "vue-router"; -import { useAuthStore } from "@/stores/auth"; +import { useAuthStore } from "@/client/stores/auth"; type RouteData = RouteRecordRaw & { meta?: ResolvableValue & { requiresAuth?: boolean }; @@ -15,7 +15,7 @@ type RouteData = RouteRecordRaw & { const routes: RouteData[] = [ { path: "/", - component: () => import("@/components/RootLayout.vue"), + component: () => import("@/client/components/RootLayout.vue"), children: [ { path: "", @@ -76,7 +76,7 @@ const routes: RouteData[] = [ }, { path: "", - component: () => import("@/components/DashboardLayout.vue"), + component: () => import("@/client/components/DashboardLayout.vue"), meta: { requiresAuth: true }, children: [ { diff --git a/src/routes/public-routes/Home.vue b/src/client/routes/public-routes/Home.vue similarity index 99% rename from src/routes/public-routes/Home.vue rename to src/client/routes/public-routes/Home.vue index 8f13353..20a4749 100644 --- a/src/routes/public-routes/Home.vue +++ b/src/client/routes/public-routes/Home.vue @@ -184,7 +184,7 @@