From 6906d76075dd9caf1f94795fa148a63cc5b81f96 Mon Sep 17 00:00:00 2001
From: steel <mael.acier@ensiie.fr>
Date: Sat, 14 Sep 2024 22:06:44 +0200
Subject: [PATCH] module augmentation

---
 src/app.d.ts                      |  9 +++++----
 src/lib/adapters/sqlite-memory.ts |  7 +++++++
 src/lib/index.ts                  | 19 ++++++++++++++++---
 src/lib/types.ts                  | 13 +------------
 src/routes/login/+page.server.ts  |  3 ++-
 5 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/src/app.d.ts b/src/app.d.ts
index a979ab2..d5b5ecf 100644
--- a/src/app.d.ts
+++ b/src/app.d.ts
@@ -1,11 +1,12 @@
 // See https://kit.svelte.dev/docs/types#app
-
-import type { Locals as AriseLocals } from "$lib/types.ts";
-import type { aidc } from "./auth.ts";
+import { Locals as ILocals } from "$lib/types.ts";
 
 declare global {
   namespace App {
-    interface Locals extends AriseLocals<typeof aidc> {}
+    interface Locals extends ILocals {
+      user: import("lucia").User | null;
+      session: import("lucia").Session | null;
+    }
   }
 }
 
diff --git a/src/lib/adapters/sqlite-memory.ts b/src/lib/adapters/sqlite-memory.ts
index 19aa4ba..b9c63ed 100644
--- a/src/lib/adapters/sqlite-memory.ts
+++ b/src/lib/adapters/sqlite-memory.ts
@@ -78,3 +78,10 @@ export interface DatabaseSession extends DefaultSessionAttributes {
   id: string;
   id_token: string;
 }
+
+declare module "../index.js" {
+  interface Foo {
+    Session: DefaultSessionAttributes;
+    User: Omit<DatabaseUser<Record<never, never>>, "id">;
+  }
+}
diff --git a/src/lib/index.ts b/src/lib/index.ts
index f35f9de..f065c6b 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -1,6 +1,6 @@
 import { redirect, type Handle, error, type RequestEvent } from "@sveltejs/kit";
 import { sequence } from "@sveltejs/kit/hooks";
-import { generateId, type Session } from "lucia";
+import { generateId, Lucia, type Session } from "lucia";
 import type { Client, TokenSet } from "openid-client";
 import { Issuer, errors, generators } from "openid-client";
 import { SEE_OTHER } from "readable-http-codes";
@@ -15,7 +15,7 @@ import type { Config, CookieNames, Paths } from "./types.js";
 import type {
   DefaultSessionAttributes,
   DefaultUserAttributes,
-  LuciaAdapter,
+  // LuciaAdapter,
 } from "./lucia.js";
 
 interface InternalUser {
@@ -29,9 +29,22 @@ export interface DatabaseSession extends DefaultSessionAttributes {
   id_token: string;
 }
 
+// eslint-disable-next-line @typescript-eslint/no-empty-object-type
+export interface Foo {}
+
+interface Bar<
+  User extends Record<never, never>,
+  Session extends Record<never, never>,
+> {
+  User: User;
+  Session: Session;
+}
+
 declare module "lucia" {
   interface Register {
-    Lucia: LuciaAdapter;
+    Lucia: Foo extends Bar<infer _User, infer _Session>
+      ? Lucia<_Session, _User>
+      : never;
     DatabaseUserAttributes: Omit<InternalUser, "id">;
     DatabaseSessionAttributes: Omit<DatabaseSession, "id">;
   }
diff --git a/src/lib/types.ts b/src/lib/types.ts
index 275ca43..3b4cd25 100644
--- a/src/lib/types.ts
+++ b/src/lib/types.ts
@@ -5,8 +5,6 @@ import type {
   DefaultUserAttributes,
   LuciaAdapter,
 } from "./lucia.js";
-import { AriseIdConnect } from "./index.js";
-import type { Session, User } from "lucia";
 
 export interface Config<
   Session extends DefaultSessionAttributes,
@@ -38,15 +36,6 @@ export type CookieNames = {
   oauthCodeVerifier: string;
 };
 
-type Extract<T> =
-  T extends AriseIdConnect<infer Session, infer User>
-    ? { session: Session; user: User }
-    : never;
-
-export interface Locals<
-  T extends AriseIdConnect<DefaultSessionAttributes, DefaultUserAttributes>,
-> {
-  user: (Extract<T>["user"] & User) | null;
-  session: (Extract<T>["session"] & Session) | null;
+export interface Locals {
   authPaths: Paths;
 }
diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts
index c465c92..0cc8fd1 100644
--- a/src/routes/login/+page.server.ts
+++ b/src/routes/login/+page.server.ts
@@ -1,6 +1,7 @@
 import { redirect } from "@sveltejs/kit";
-
+type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
 export async function load(event) {
+  type User = Expand<import("lucia").User>;
   if (event.locals.user) {
     return redirect(302, "/");
   }
-- 
GitLab