diff --git a/packages/site/astro.config.mjs b/packages/site/astro.config.mjs
index 7c3812f..daaff8a 100644
--- a/packages/site/astro.config.mjs
+++ b/packages/site/astro.config.mjs
@@ -145,6 +145,11 @@ export default defineConfig({
label: "SQLite",
link: "/examples/sqlite",
},
+ {
+ label: "User session",
+ link: "/examples/session",
+ badge: "WIP",
+ },
{
label: "Upload file",
link: "/examples/upload-file",
diff --git a/packages/site/src/pages/examples/_session.code.tsx b/packages/site/src/pages/examples/_session.code.tsx
new file mode 100644
index 0000000..8849cac
--- /dev/null
+++ b/packages/site/src/pages/examples/_session.code.tsx
@@ -0,0 +1,98 @@
+// @ts-nocheck
+import {
+ s,
+ SessionHandler,
+ iocParam,
+ RequestUrl,
+ SessionClass,
+ MiddlewareClass,
+ Input,
+ $api,
+ $route,
+ createAction,
+} from "dreamkit";
+import { createSignal, createResource } from "solid-js";
+
+export class UserSession extends SessionClass({
+ name: "user",
+ props: { id: s.number() },
+}) {}
+
+export const logout = $api.self({ SessionHandler }).create(function () {
+ this.sessionHander.remove(UserSession);
+ return Response.redirect("/");
+});
+
+export const login = $api
+ .title("Login")
+ .self({ SessionHandler })
+ .params({ user: s.string(), password: s.string() })
+ .create(async (params) => {
+ if (params.user === "admin" && params.password === "admin") {
+ await this.sessionHandler.set(UserSession, { id: 1 });
+ return Response.redirect("/");
+ } else {
+ throw new Error("Invalid auth");
+ }
+ });
+
+export const fetchUserData = $api
+ .self({
+ UserSession,
+ })
+ .create(function () {
+ return { id: this.userSession.data.id };
+ });
+
+export class AuthMiddleware extends MiddlewareClass({
+ RequestUrl,
+ UserSession: iocParam(UserSession).optional(),
+}) {
+ override onRequest() {
+ if (this.userSession) {
+ if (this.requestUrl.is("/", "/login")) {
+ return Response.redirect("/panel");
+ }
+ } else if (!this.requestUrl.is("/")) {
+ return Response.redirect("/login");
+ }
+ }
+}
+
+export const loginRoute = $route
+ .api({ login })
+ .path("/login")
+ .params({ user: s.string().optional() })
+ .create(function ({ params, api }) {
+ const [user, setUser] = createSignal(params.user ?? "");
+ const [password, setPassword] = createSignal("");
+ const login = createAction(api.login).with(() => ({
+ user: user(),
+ password: password(),
+ }));
+ return (
+ <>
+
+
+
+ >
+ );
+ });
+
+export const panelRoute = $route
+ .api({ fetchUserData, logout })
+ .path("/panel")
+ .create(function ({ api }) {
+ const logout = createAction(api.logout);
+ const [userData] = createResource(api.fetchUserData);
+ return (
+ <>
+
+ user id: {userData()?.id}
+ >
+ );
+ });
diff --git a/packages/site/src/pages/examples/session.astro b/packages/site/src/pages/examples/session.astro
new file mode 100644
index 0000000..fd12e8d
--- /dev/null
+++ b/packages/site/src/pages/examples/session.astro
@@ -0,0 +1,10 @@
+---
+import ExamplePage from "../../components/ExamplePage.astro";
+---
+
+
diff --git a/packages/site/src/utils/examples.ts b/packages/site/src/utils/examples.ts
index 9722f8f..bc976a0 100644
--- a/packages/site/src/utils/examples.ts
+++ b/packages/site/src/utils/examples.ts
@@ -21,6 +21,8 @@ export const parseExample = (example: ExampleProps, index: number) => {
const value = values.join(":").trim();
(params as any)[key] = value;
return false;
+ } else if (line.trim() === "// @ts-nocheck") {
+ return false;
} else if (line.trim() === "// @ts-expect-error") {
return false;
} else if (line.trim() === "{/* @ts-expect-error */}") {