diff --git a/docs/pages/basics/users.md b/docs/pages/basics/users.md index 68c7cd0b5..5cebd7c5b 100644 --- a/docs/pages/basics/users.md +++ b/docs/pages/basics/users.md @@ -72,3 +72,18 @@ We do not automatically expose all database columns as 1. Each project has its own code styling rules 2. You generally don't want to expose sensitive data such as hashed passwords (even worse if you send the entire user object to the client) + +### Define user ID type + +User IDs are typed as strings by default. You can override this by declaring `Register.UserId`. + +```ts +declare module "lucia" { + interface Register { + Lucia: typeof lucia; + UserId: number; + } +} + +const session = await lucia.createSession(0, {}); +``` diff --git a/docs/pages/database/postgresql.md b/docs/pages/database/postgresql.md index 43a61fad7..305a9fe46 100644 --- a/docs/pages/database/postgresql.md +++ b/docs/pages/database/postgresql.md @@ -4,7 +4,7 @@ title: "PostgreSQL" # PostgreSQL -> If you use Drizzle ORM in your project, use the [Drizzle adapter](https://lucia-auth.com/database/drizzle#postgresql) instead as Drizzle ORM overrides how your database driver handles dates. +> If you use Drizzle ORM in your project, use the [Drizzle adapter](https://lucia-auth.com/database/drizzle#postgresql) instead as Drizzle ORM overrides how your database driver handles dates. `@lucia-auth/adapter-postgresql` package provides adapters for PostgreSQL drivers: diff --git a/docs/pages/getting-started/sveltekit.md b/docs/pages/getting-started/sveltekit.md index 61db85d7b..61441d977 100644 --- a/docs/pages/getting-started/sveltekit.md +++ b/docs/pages/getting-started/sveltekit.md @@ -20,7 +20,6 @@ If you use `@sveltejs/adapter-node`, make sure to install `oslo` as a `dependenc npm install oslo ``` - ## Initialize Lucia Import `Lucia` and initialize it with your adapter. Refer to the [Database](/database) page to learn how to set up your database and initialize the adapter. Make sure to configure the `sessionCookie` option and register your `Lucia` instance type diff --git a/docs/pages/reference/main/Adapter.md b/docs/pages/reference/main/Adapter.md index 1e7621bd3..ba47b34e3 100644 --- a/docs/pages/reference/main/Adapter.md +++ b/docs/pages/reference/main/Adapter.md @@ -11,14 +11,15 @@ Represents a database adapter. ```ts //$ DatabaseSession=/reference/main/DatabaseSession //$ DatabaseUser=/reference/main/DatabaseUser +//$ UserId=/reference/main/UserId interface Adapter { deleteExpiredSessions(): Promise; deleteSession(sessionId: string): Promise; - deleteUserSessions(userId: string): Promise; + deleteUserSessions(userId: $$UserId): Promise; getSessionAndUser( sessionId: string ): Promise<[session: $$DatabaseSession | null, user: $$DatabaseUser | null]>; - getUserSessions(userId: string): Promise<$$DatabaseSession[]>; + getUserSessions(userId: $$UserId): Promise<$$DatabaseSession[]>; setSession(session: $$DatabaseSession): Promise; updateSessionExpiration(sessionId: string, expiresAt: Date): Promise; } diff --git a/docs/pages/reference/main/DatabaseSession.md b/docs/pages/reference/main/DatabaseSession.md index 6445275f1..bad5db771 100644 --- a/docs/pages/reference/main/DatabaseSession.md +++ b/docs/pages/reference/main/DatabaseSession.md @@ -10,9 +10,10 @@ Represents a session stored in a database. ```ts //$ DatabaseSessionAttributes=/reference/main/DatabaseSessionAttributes +//$ UserId=/reference/main/UserId interface DatabaseSession { id: string; - userId: string; + userId: $$UserId; expiresAt: Date; attributes: $$DatabaseSessionAttributes; } diff --git a/docs/pages/reference/main/DatabaseUser.md b/docs/pages/reference/main/DatabaseUser.md index 5aafe7153..e889acbf4 100644 --- a/docs/pages/reference/main/DatabaseUser.md +++ b/docs/pages/reference/main/DatabaseUser.md @@ -10,8 +10,9 @@ Represents a user stored in a database. ```ts //$ DatabaseUserAttributes=/reference/main/DatabaseUserAttributes +//$ UserId=/reference/main/UserId interface DatabaseUser { - id: string; + id: $$UserId; attributes: DatabaseUserAttributes; } ``` diff --git a/docs/pages/reference/main/Lucia/createSession.md b/docs/pages/reference/main/Lucia/createSession.md index 54ddfdbd0..5424a2d92 100644 --- a/docs/pages/reference/main/Lucia/createSession.md +++ b/docs/pages/reference/main/Lucia/createSession.md @@ -11,7 +11,11 @@ Method of [`Lucia`](/reference/main/Lucia). Creates a new session. ```ts //$ DatabaseSessionAttributes=/reference/main/DatabaseSessionAttributes //$ Session=/reference/main/Session -function createSession(userId: string, attributes: $$DatabaseSessionAttributes): Promise<$$Session>; +//$ UserId=/reference/main/UserId +function createSession( + userId: $$UserId, + attributes: $$DatabaseSessionAttributes +): Promise<$$Session>; ``` ### Parameters diff --git a/docs/pages/reference/main/Lucia/getUserSessions.md b/docs/pages/reference/main/Lucia/getUserSessions.md index ef72e5567..31629f3e3 100644 --- a/docs/pages/reference/main/Lucia/getUserSessions.md +++ b/docs/pages/reference/main/Lucia/getUserSessions.md @@ -10,7 +10,8 @@ Method of [`Lucia`](/reference/main/Lucia). Gets all sessions of a user. ```ts //$ Session=/reference/main/Session -function getUserSessions(userId: string): Promise; +//$ UserId=/reference/main/UserId +function getUserSessions(userId: $$UserId): Promise; ``` ### Parameters diff --git a/docs/pages/reference/main/Lucia/invalidateUserSessions.md b/docs/pages/reference/main/Lucia/invalidateUserSessions.md index a2f824609..fd76ccc94 100644 --- a/docs/pages/reference/main/Lucia/invalidateUserSessions.md +++ b/docs/pages/reference/main/Lucia/invalidateUserSessions.md @@ -9,7 +9,8 @@ Method of [`Lucia`](/reference/main/Lucia). Invalidates all sessions of a user. ## Definition ```ts -function invalidateUserSessions(userId: string): Promise; +//$ UserId=/reference/main/UserId +function invalidateUserSessions(userId: $$UserId): Promise; ``` ### Parameters diff --git a/docs/pages/reference/main/Session.md b/docs/pages/reference/main/Session.md index 0d6e80d01..d7b0d8348 100644 --- a/docs/pages/reference/main/Session.md +++ b/docs/pages/reference/main/Session.md @@ -10,11 +10,12 @@ Represents a session. ```ts //$ SessionAttributes=/reference/main/SessionAttributes -interface Session extends SessionAttributes { +//$ UserId=/reference/main/UserId +interface Session extends $$SessionAttributes { id: string; expiresAt: Date; fresh: boolean; - userId: string; + userId: $$UserId; } ``` diff --git a/docs/pages/reference/main/User.md b/docs/pages/reference/main/User.md index 9de9dcc7d..9624a199b 100644 --- a/docs/pages/reference/main/User.md +++ b/docs/pages/reference/main/User.md @@ -10,8 +10,9 @@ Represents a user. ```ts //$ UserAttributes=/reference/main/UserAttributes -interface User extends UserAttributes { - id: string; +//$ UserId=/reference/main/UserId +interface User extends $$UserAttributes { + id: $$UserId; } ``` diff --git a/docs/pages/reference/main/UserId.md b/docs/pages/reference/main/UserId.md new file mode 100644 index 000000000..f292aa3c2 --- /dev/null +++ b/docs/pages/reference/main/UserId.md @@ -0,0 +1,13 @@ +--- +title: "UserId" +--- + +# `UserId` + +User ID. + +## Definition + +```ts +type UserId = string; +``` diff --git a/docs/pages/upgrade-v3/index.md b/docs/pages/upgrade-v3/index.md index 08a91369a..5c8ac1ae4 100644 --- a/docs/pages/upgrade-v3/index.md +++ b/docs/pages/upgrade-v3/index.md @@ -218,6 +218,6 @@ Make sure to install `oslo` as a `dependency`, not as `devDependency` to prevent As per SvelteKit documentation : ->Development dependencies will be bundled into your app using Rollup. To control whether a given package is bundled or externalised, place it in devDependencies or dependencies respectively in your package.json. +> Development dependencies will be bundled into your app using Rollup. To control whether a given package is bundled or externalised, place it in devDependencies or dependencies respectively in your package.json. See [SvelteKit documentation](https://kit.svelte.dev/docs/adapter-node#deploying) for details. diff --git a/packages/adapter-drizzle/CHANGELOG.md b/packages/adapter-drizzle/CHANGELOG.md index 5b52f2648..d20be5fdc 100644 --- a/packages/adapter-drizzle/CHANGELOG.md +++ b/packages/adapter-drizzle/CHANGELOG.md @@ -2,7 +2,7 @@ ## 1.0.2 -- Fix Drizzle type definitions ([#1426](https://github.com/lucia-auth/lucia/pull/1426)) +- Fix Drizzle type definitions ([#1426](https://github.com/lucia-auth/lucia/pull/1426)) ## 1.0.1 diff --git a/packages/adapter-drizzle/tests/db.ts b/packages/adapter-drizzle/tests/db.ts new file mode 100644 index 000000000..5cdbd3a96 --- /dev/null +++ b/packages/adapter-drizzle/tests/db.ts @@ -0,0 +1,9 @@ +declare module "lucia" { + interface Register { + DatabaseUserAttributes: { + username: string; + }; + } +} + +export {}; diff --git a/packages/adapter-mongodb/tests/db.ts b/packages/adapter-mongodb/tests/db.ts new file mode 100644 index 000000000..5cdbd3a96 --- /dev/null +++ b/packages/adapter-mongodb/tests/db.ts @@ -0,0 +1,9 @@ +declare module "lucia" { + interface Register { + DatabaseUserAttributes: { + username: string; + }; + } +} + +export {}; diff --git a/packages/adapter-mongodb/tests/mongodb.ts b/packages/adapter-mongodb/tests/mongodb.ts index 38b136734..d1dbce75a 100644 --- a/packages/adapter-mongodb/tests/mongodb.ts +++ b/packages/adapter-mongodb/tests/mongodb.ts @@ -31,11 +31,3 @@ await User.deleteMany({}); await Session.deleteMany({}); process.exit(0); - -declare module "lucia" { - interface Register { - DatabaseUserAttributes: { - username: string; - }; - } -} diff --git a/packages/adapter-mongodb/tests/mongoose.ts b/packages/adapter-mongodb/tests/mongoose.ts index 7b1ad59cd..ebe00678c 100644 --- a/packages/adapter-mongodb/tests/mongoose.ts +++ b/packages/adapter-mongodb/tests/mongoose.ts @@ -70,11 +70,3 @@ await User.deleteMany(); await Session.deleteMany(); process.exit(0); - -declare module "lucia" { - interface Register { - DatabaseUserAttributes: { - username: string; - }; - } -} diff --git a/packages/adapter-mysql/tests/db.ts b/packages/adapter-mysql/tests/db.ts new file mode 100644 index 000000000..5cdbd3a96 --- /dev/null +++ b/packages/adapter-mysql/tests/db.ts @@ -0,0 +1,9 @@ +declare module "lucia" { + interface Register { + DatabaseUserAttributes: { + username: string; + }; + } +} + +export {}; diff --git a/packages/adapter-postgresql/tests/db.ts b/packages/adapter-postgresql/tests/db.ts new file mode 100644 index 000000000..5cdbd3a96 --- /dev/null +++ b/packages/adapter-postgresql/tests/db.ts @@ -0,0 +1,9 @@ +declare module "lucia" { + interface Register { + DatabaseUserAttributes: { + username: string; + }; + } +} + +export {}; diff --git a/packages/adapter-postgresql/tests/neon-http.ts b/packages/adapter-postgresql/tests/neon-http.ts index 6c1f33c98..c2279a034 100644 --- a/packages/adapter-postgresql/tests/neon-http.ts +++ b/packages/adapter-postgresql/tests/neon-http.ts @@ -43,11 +43,3 @@ await sql("DROP TABLE public.session"); await sql("DROP TABLE public.user"); process.exit(); - -declare module "lucia" { - interface Register { - DatabaseUserAttributes: { - username: string; - }; - } -} diff --git a/packages/adapter-postgresql/tests/node-postgres.ts b/packages/adapter-postgresql/tests/node-postgres.ts index cebbc6540..733d32a85 100644 --- a/packages/adapter-postgresql/tests/node-postgres.ts +++ b/packages/adapter-postgresql/tests/node-postgres.ts @@ -45,11 +45,3 @@ await pool.query("DROP TABLE public.session"); await pool.query("DROP TABLE public.user"); process.exit(); - -declare module "lucia" { - interface Register { - DatabaseUserAttributes: { - username: string; - }; - } -} diff --git a/packages/adapter-postgresql/tests/postgresjs.ts b/packages/adapter-postgresql/tests/postgresjs.ts index 1aa0e01ee..3fb11a78e 100644 --- a/packages/adapter-postgresql/tests/postgresjs.ts +++ b/packages/adapter-postgresql/tests/postgresjs.ts @@ -38,11 +38,3 @@ await sql`DROP TABLE public.session`; await sql`DROP TABLE public.user`; process.exit(); - -declare module "lucia" { - interface Register { - DatabaseUserAttributes: { - username: string; - }; - } -} diff --git a/packages/adapter-sqlite/src/drivers/better-sqlite3.ts b/packages/adapter-sqlite/src/drivers/better-sqlite3.ts index 3d7347266..3a8d741ab 100644 --- a/packages/adapter-sqlite/src/drivers/better-sqlite3.ts +++ b/packages/adapter-sqlite/src/drivers/better-sqlite3.ts @@ -16,14 +16,14 @@ class BetterSqlite3Controller implements Controller { } public async get(sql: string, args: any[]): Promise { - return this.db.prepare(sql).get(...args); + return this.db.prepare(sql).get(...args) as T | null; } public async getAll(sql: string, args: any[]): Promise { - return this.db.prepare(sql).all(...args); + return this.db.prepare(sql).all(...args) as T[]; } public async execute(sql: string, args: any[]): Promise { - await this.db.prepare(sql).run(...args); + this.db.prepare(sql).run(...args); } } diff --git a/packages/adapter-sqlite/tests/db.ts b/packages/adapter-sqlite/tests/db.ts index 1890b1dcc..5cdbd3a96 100644 --- a/packages/adapter-sqlite/tests/db.ts +++ b/packages/adapter-sqlite/tests/db.ts @@ -5,3 +5,5 @@ declare module "lucia" { }; } } + +export {}; diff --git a/packages/lucia/CHANGELOG.md b/packages/lucia/CHANGELOG.md index a56190f15..98a6f86ff 100644 --- a/packages/lucia/CHANGELOG.md +++ b/packages/lucia/CHANGELOG.md @@ -1,8 +1,12 @@ # lucia +## 3.1.0 + +- [#1472](https://github.com/lucia-auth/lucia/pull/1472) : Add option to configure user ID type + ## 3.0.1 -- Fix `LegacyScrypt` generating malformed hash (see [#1370](https://github.com/lucia-auth/lucia/pull/1370)) - no security concerns +- Fix `LegacyScrypt` generating malformed hash (see [#1370](https://github.com/lucia-auth/lucia/pull/1370) - no security concerns) ## 3.0.0 diff --git a/packages/lucia/package.json b/packages/lucia/package.json index 3be519a2e..10d718248 100644 --- a/packages/lucia/package.json +++ b/packages/lucia/package.json @@ -1,6 +1,6 @@ { "name": "lucia", - "version": "3.0.1", + "version": "3.1.0", "description": "A simple and flexible authentication library", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/lucia/src/core.ts b/packages/lucia/src/core.ts index 144412c37..d686f892b 100644 --- a/packages/lucia/src/core.ts +++ b/packages/lucia/src/core.ts @@ -7,7 +7,8 @@ import type { Adapter } from "./database.js"; import type { RegisteredDatabaseSessionAttributes, RegisteredDatabaseUserAttributes, - RegisteredLucia + RegisteredLucia, + UserId } from "./index.js"; import { CookieAttributes } from "oslo/cookie"; @@ -23,11 +24,11 @@ export interface Session extends SessionAttributes { id: string; expiresAt: Date; fresh: boolean; - userId: string; + userId: UserId; } export interface User extends UserAttributes { - id: string; + id: UserId; } export class Lucia< @@ -98,7 +99,7 @@ export class Lucia< ); } - public async getUserSessions(userId: string): Promise { + public async getUserSessions(userId: UserId): Promise { const databaseSessions = await this.adapter.getUserSessions(userId); const sessions: Session[] = []; for (const databaseSession of databaseSessions) { @@ -154,7 +155,7 @@ export class Lucia< } public async createSession( - userId: string, + userId: UserId, attributes: RegisteredDatabaseSessionAttributes, options?: { sessionId?: string; @@ -182,7 +183,7 @@ export class Lucia< await this.adapter.deleteSession(sessionId); } - public async invalidateUserSessions(userId: string): Promise { + public async invalidateUserSessions(userId: UserId): Promise { await this.adapter.deleteUserSessions(userId); } diff --git a/packages/lucia/src/database.ts b/packages/lucia/src/database.ts index bb8221e66..db601fecf 100644 --- a/packages/lucia/src/database.ts +++ b/packages/lucia/src/database.ts @@ -1,28 +1,29 @@ import type { RegisteredDatabaseSessionAttributes, - RegisteredDatabaseUserAttributes + RegisteredDatabaseUserAttributes, + UserId } from "./index.js"; export interface Adapter { getSessionAndUser( sessionId: string ): Promise<[session: DatabaseSession | null, user: DatabaseUser | null]>; - getUserSessions(userId: string): Promise; + getUserSessions(userId: UserId): Promise; setSession(session: DatabaseSession): Promise; updateSessionExpiration(sessionId: string, expiresAt: Date): Promise; deleteSession(sessionId: string): Promise; - deleteUserSessions(userId: string): Promise; + deleteUserSessions(userId: UserId): Promise; deleteExpiredSessions(): Promise; } export interface DatabaseUser { - id: string; + id: UserId; attributes: RegisteredDatabaseUserAttributes; } export interface DatabaseSession { userId: string; expiresAt: Date; - id: string; + id: UserId; attributes: RegisteredDatabaseSessionAttributes; } diff --git a/packages/lucia/src/index.ts b/packages/lucia/src/index.ts index 7fddb567a..563c7f605 100644 --- a/packages/lucia/src/index.ts +++ b/packages/lucia/src/index.ts @@ -18,6 +18,12 @@ import type { Lucia } from "./core.js"; export interface Register {} +export type UserId = Register extends { + UserId: infer _UserId; +} + ? _UserId + : string; + export type RegisteredLucia = Register extends { Lucia: infer _Lucia; }