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 @@