diff --git a/package.json b/package.json index 4440b79d1212cb86219befca037cafa5f933c933..c2c3521960940c6339a54cc6b620476214a1edbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arise/aidc-sveltekit", - "version": "0.2.3", + "version": "0.3.0", "type": "module", "scripts": { "dev": "vite dev", diff --git a/src/lib/default.ts b/src/lib/default.ts index 3386c2d091e265b174d94a2770238e477d7cf5fe..b23e776d06800a612fb3e59209566a8f44e33fe7 100644 --- a/src/lib/default.ts +++ b/src/lib/default.ts @@ -1,10 +1,16 @@ import { BetterSqlite3Adapter } from "@lucia-auth/adapter-sqlite"; import sqlite from "better-sqlite3"; import type { Database as SqLiteConnection } from "better-sqlite3"; -import { LuciaWrapper } from "./lucia.js"; +import { + LuciaWrapper, + type DefaultSessionAttributes, + type DefaultUserAttributes, +} from "./lucia.js"; import type { IdTokenClaims, UserinfoResponse } from "openid-client"; -class DefaultLucia extends LuciaWrapper<DatabaseUser> { +class DefaultLucia< + UserInfo extends {} = Record<string, unknown>, +> extends LuciaWrapper<Omit<DatabaseUser<UserInfo>, "id">> { db: SqLiteConnection; constructor() { @@ -14,6 +20,14 @@ class DefaultLucia extends LuciaWrapper<DatabaseUser> { user: "user", session: "session", }), + { + getUserAttributes(attributes) { + return { + subject: attributes.subject, + claims: JSON.parse(attributes.claims), + }; + }, + }, ); this.db = db; } @@ -34,7 +48,7 @@ class DefaultLucia extends LuciaWrapper<DatabaseUser> { )`); } - getUser(subject: string): DatabaseUser | undefined { + getUser(subject: string): DatabaseUser<UserInfo> | undefined { const user = this.db .prepare("SELECT * FROM user WHERE subject = ?") .get(subject) as InternalUser | undefined; @@ -58,7 +72,7 @@ export const defaultLucia = new DefaultLucia(); declare module "lucia" { interface Register { Lucia: typeof defaultLucia.lucia; - DatabaseUserAttributes: Omit<DatabaseUser, "id">; + DatabaseUserAttributes: Omit<InternalUser, "id">; DatabaseSessionAttributes: Omit<DatabaseSession, "id">; } } @@ -68,12 +82,12 @@ interface InternalUser { subject: string; claims: string; } -export interface DatabaseUser { +export interface DatabaseUser<T extends {}> extends DefaultUserAttributes { id: string; subject: string; - claims: UserinfoResponse; + claims: UserinfoResponse<T>; } -export interface DatabaseSession { +export interface DatabaseSession extends DefaultSessionAttributes { id: string; id_token: string; } diff --git a/src/lib/index.ts b/src/lib/index.ts index 83b3088ceef9c4014c3792cd368efe0586a53b95..8530c8b8d220d17feea02acf3cb2aab8b08ab689 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -20,7 +20,7 @@ export class AriseIdConnect<DbUser extends DatabaseUser> { protected cookieNames: CookieNames; constructor( - readonly config: Config<DbUser>, + readonly config: Config, issuer: Issuer, ) { this.client = new issuer.Client({ @@ -45,7 +45,7 @@ export class AriseIdConnect<DbUser extends DatabaseUser> { } static async init<DbUser extends DatabaseUser>( - config: Config<DbUser>, + config: Config, ): Promise<AriseIdConnect<DbUser>> { const issuer = await Issuer.discover( config.issuer || diff --git a/src/lib/lucia.ts b/src/lib/lucia.ts index 44b85ca9f9234fabf6250154e388c9d8a1fc9762..e4c54d92feb703bf13d0fed0a1c4e4759b4548eb 100644 --- a/src/lib/lucia.ts +++ b/src/lib/lucia.ts @@ -19,10 +19,17 @@ export interface DatabaseSession { id_token: string; } +export interface DefaultUserAttributes { + subject: string; +} +export interface DefaultSessionAttributes { + id_token: string; +} + export abstract class LuciaWrapper< - DbUser extends DatabaseUser, - _SessionAttributes extends { id_token: string } = { id_token: string }, - _UserAttributes extends { subject: string } = { subject: string }, + _UserAttributes extends DefaultUserAttributes = DefaultUserAttributes, + _SessionAttributes extends + DefaultSessionAttributes = DefaultSessionAttributes, > { lucia: Lucia<_SessionAttributes, _UserAttributes>; @@ -61,7 +68,9 @@ export abstract class LuciaWrapper< } abstract initDatabase(): MaybePromise<void>; - abstract getUser(subject: string): MaybePromise<DbUser | undefined>; + abstract getUser( + subject: string, + ): MaybePromise<(_UserAttributes & { id: string }) | undefined>; abstract createUser( subject: string, userId: string, diff --git a/src/lib/types.ts b/src/lib/types.ts index 21958949ea942020dac623218fa124380876fa06..d664534c3311f6bcfc8b0d098e975acc66d310a0 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,8 +1,8 @@ import type { MaybePromise, RequestEvent } from "@sveltejs/kit"; import type { ClientMetadata, UserinfoResponse, errors } from "openid-client"; -import type { DatabaseUser, LuciaWrapper } from "./lucia.js"; +import type { LuciaWrapper } from "./lucia.js"; -export interface Config<DbUser extends DatabaseUser> extends ClientMetadata { +export interface Config extends ClientMetadata { client_secret: string; scope: string; issuer?: string; @@ -11,7 +11,7 @@ export interface Config<DbUser extends DatabaseUser> extends ClientMetadata { login?: (event: RequestEvent, userInfo: UserinfoResponse) => never; logout?: (event: RequestEvent) => MaybePromise<void>; }; - wrapper: LuciaWrapper<DbUser>; + wrapper: LuciaWrapper; cookieNames?: Partial<CookieNames>; paths?: Partial<Paths>; }