@mesob/auth-hono 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/db/index.ts","../src/db/relations.ts","../src/db/schema.ts","../src/db/orm/iam/sessions/find-session-by-token.ts","../src/db/orm/iam/users/find-user-by-id.ts","../src/handler.ts","../src/lib/crypto.ts","../src/routes/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/handler/account-change-pending.ts","../src/db/orm/iam/account-changes/expire-pending-account-changes.ts","../src/db/orm/iam/account-changes/find-pending-account-change.ts","../src/db/orm/iam/verifications/find-active-verification-id.ts","../src/errors.ts","../src/lib/tenant.ts","../src/db/orm/iam/users/find-user-by-email.ts","../src/db/orm/iam/users/find-user-by-phone.ts","../src/db/orm/iam/users/find-user-by-identifier.ts","../src/routes/handler/check-user.ts","../src/routes/handler/email-verification-confirm.ts","../src/db/orm/iam/sessions/insert-session.ts","../src/db/orm/iam/users/update-user-verified.ts","../src/db/orm/iam/verifications/consume-verification.ts","../src/db/orm/iam/verifications/find-verification-by-id.ts","../src/db/orm/iam/verifications/update-verification-attempt.ts","../src/lib/session.ts","../src/routes/handler/email-verification-request.ts","../src/db/orm/iam/account-changes/cancel-pending-account-changes.ts","../src/db/orm/iam/account-changes/insert-pending-email-change.ts","../src/db/orm/iam/verifications/delete-verifications-by-user-and-type.ts","../src/db/orm/iam/verifications/insert-verification.ts","../src/lib/send-email.ts","../src/providers/resend-email.ts","../src/routes/handler/me.ts","../src/routes/handler/password-change.ts","../src/db/orm/iam/accounts/find-account-by-provider.ts","../src/db/orm/iam/accounts/update-account-password.ts","../src/db/orm/iam/sessions/delete-session-by-id.ts","../src/db/orm/iam/sessions/list-sessions-for-user.ts","../src/providers/afro-sms.ts","../src/routes/handler/password-forgot.ts","../src/routes/handler/password-reset.ts","../src/routes/handler/password-verify.ts","../src/routes/handler/phone-verification-confirm.ts","../src/routes/handler/phone-verification-request.ts","../src/db/orm/iam/account-changes/insert-pending-phone-change.ts","../src/routes/handler/session.ts","../src/routes/handler/sign-in.ts","../src/db/orm/iam/sessions/delete-oldest-sessions.ts","../src/db/orm/iam/users/update-last-sign-in.ts","../src/routes/handler/sign-out.ts","../src/routes/handler/sign-up.ts","../src/db/orm/iam/accounts/insert-credentials-account.ts","../src/db/orm/iam/users/find-user-by-handle.ts","../src/db/orm/iam/users/insert-user.ts","../src/routes/handler/update-email.ts","../src/db/orm/iam/account-changes/mark-pending-account-change-applied.ts","../src/db/orm/iam/accounts/update-credentials-provider-account-id.ts","../src/db/orm/iam/sessions/delete-other-sessions.ts","../src/db/orm/iam/users/update-user-email.ts","../src/routes/handler/update-phone.ts","../src/db/orm/iam/users/update-user-phone.ts","../src/routes/handler/update-profile.ts","../src/db/orm/iam/users/update-user-profile.ts","../src/index.ts"],"sourcesContent":["import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, usersInIam, sessionsInIam, verificationsInIam, accountChangesInIam, rolesInIam, rolePermissionsInIam, permissionsInIam, userRolesInIam, accountsInIam, domainsInIam } from \"./schema\";\n\nexport const usersInIamRelations = relations(usersInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [usersInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n}));\n\nexport const tenantsInIamRelations = relations(tenantsInIam, ({many}) => ({\n\tusersInIam: many(usersInIam),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\trolesInIam: many(rolesInIam),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n\tdomainsInIam: many(domainsInIam),\n}));\n\nexport const sessionsInIamRelations = relations(sessionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [sessionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [sessionsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const verificationsInIamRelations = relations(verificationsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [verificationsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [verificationsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountChangesInIamRelations = relations(accountChangesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountChangesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountChangesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const rolesInIamRelations = relations(rolesInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const rolePermissionsInIamRelations = relations(rolePermissionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n}));\n\nexport const accountsInIamRelations = relations(accountsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const domainsInIamRelations = relations(domainsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [domainsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));","import { pgTable, pgSchema, uniqueIndex, foreignKey, unique, pgPolicy, check, uuid, varchar, timestamp, text, boolean, smallint, index, inet, jsonb } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\n\n\nexport const usersInIam = iam.table(\"users\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tfullName: text(\"full_name\").notNull(),\n\timage: text(),\n\tphone: text(),\n\temail: text(),\n\thandle: text().notNull(),\n\temailVerified: boolean(\"email_verified\").default(false).notNull(),\n\tphoneVerified: boolean(\"phone_verified\").default(false).notNull(),\n\tbannedUntil: timestamp(\"banned_until\", { withTimezone: true, mode: 'string' }),\n\tlastSignInAt: timestamp(\"last_sign_in_at\", { withTimezone: true, mode: 'string' }),\n\tloginAttempt: smallint(\"login_attempt\").default(0).notNull(),\n}, (table) => [\n\tuniqueIndex(\"users_tenant_lower_email_idx\").using(\"btree\", sql`tenant_id`, sql`lower(email)`),\n\tuniqueIndex(\"users_tenant_lower_handle_idx\").using(\"btree\", sql`tenant_id`, sql`lower(handle)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"users_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"users_tenant_phone_key\").on(table.tenantId, table.phone),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\n\tcheck(\"users_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n]);\n\nexport const sessionsInIam = iam.table(\"sessions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tuserAgent: text(\"user_agent\"),\n\tip: inet(),\n\tmeta: jsonb(),\n\ttoken: text().notNull(),\n\trotatedAt: timestamp(\"rotated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),\n}, (table) => [\n\tindex(\"sessions_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"sessions_tenant_user_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"sessions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"sessions_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"sessions_token_key\").on(table.token),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"sessions_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const verificationsInIam = iam.table(\"verifications\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcode: text().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\ttype: text(),\n\tattempt: smallint().default(0),\n\tto: text(),\n}, (table) => [\n\tindex(\"verifications_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"verifications_lookup_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.type.asc().nullsLast().op(\"uuid_ops\"), table.to.asc().nullsLast().op(\"text_ops\"), table.code.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"verifications_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"verifications_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"verifications_attempt_nonnegative_check\", sql`attempt >= 0`),\n\tcheck(\"verifications_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const accountChangesInIam = iam.table(\"account_changes\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tchangeType: text(\"change_type\").notNull(),\n\toldEmail: varchar(\"old_email\"),\n\tnewEmail: varchar(\"new_email\"),\n\toldPhone: text(\"old_phone\"),\n\tnewPhone: text(\"new_phone\"),\n\tstatus: varchar().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tconfirmedAt: timestamp(\"confirmed_at\", { withTimezone: true, mode: 'string' }),\n\tcancelledAt: timestamp(\"cancelled_at\", { withTimezone: true, mode: 'string' }),\n\treason: text(),\n}, (table) => [\n\tindex(\"account_changes_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"account_changes_tenant_user_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"account_changes_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"account_changes_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'applied'::character varying, 'cancelled'::character varying, 'expired'::character varying])::text[])`),\n\tcheck(\"account_changes_change_type_check\", sql`((change_type = 'email'::text) AND (old_email IS NOT NULL) AND (new_email IS NOT NULL) AND (old_phone IS NULL) AND (new_phone IS NULL)) OR ((change_type = 'phone'::text) AND (old_phone IS NOT NULL) AND (new_phone IS NOT NULL) AND (old_email IS NULL) AND (new_email IS NULL))`),\n\tcheck(\"account_changes_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const tenantsInIam = iam.table(\"tenants\", {\n\tid: varchar({ length: 30 }).primaryKey().notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb(),\n\ttheme: jsonb(),\n\tsupportedLanguages: jsonb(\"supported_languages\"),\n\tdefaultLanguage: text(\"default_language\"),\n\tsupportedCurrency: jsonb(\"supported_currency\"),\n\tdefaultCurrency: text(\"default_currency\"),\n\ttimezone: text(),\n\tisActive: boolean(\"is_active\").default(true).notNull(),\n\tlocale: jsonb(),\n\tsettings: jsonb(),\n\tseo: jsonb(),\n}, (table) => [\n\tindex(\"tenants_is_active_idx\").using(\"btree\", table.isActive.asc().nullsLast().op(\"bool_ops\")),\n]);\n\nexport const rolesInIam = iam.table(\"roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"roles_tenant_code_unique\").on(table.tenantId, table.code),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const permissionsInIam = iam.table(\"permissions\", {\n\tid: text().primaryKey().notNull(),\n\tdescription: jsonb().notNull(),\n\tactivity: text().notNull(),\n\tapplication: text().notNull(),\n\tfeature: text().notNull(),\n}, (table) => [\n\tunique(\"permissions_activity_application_feature_key\").on(table.activity, table.application, table.feature),\n]);\n\nexport const rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"role_permissions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"role_permissions_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.permissionId],\n\t\t\tforeignColumns: [permissionsInIam.id],\n\t\t\tname: \"role_permissions_permission_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"role_permissions_unique\").on(table.roleId, table.permissionId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const userRolesInIam = iam.table(\"user_roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"user_roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"user_roles_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"user_roles_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"user_roles_unique\").on(table.userId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const accountsInIam = iam.table(\"accounts\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tprovider: text().notNull(),\n\tproviderAccountId: text(\"provider_account_id\").notNull(),\n\tpassword: text(),\n\tpasswordLastChangedAt: timestamp(\"password_last_changed_at\", { withTimezone: true, mode: 'string' }),\n\tidToken: text(\"id_token\"),\n\taccessToken: text(\"access_token\"),\n\taccessTokenExpiresAt: timestamp(\"access_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\trefreshToken: text(\"refresh_token\"),\n\trefreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\tscope: text(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }),\n\tmeta: jsonb(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"accounts_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"accounts_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"accounts_provider_account_unique\").on(table.provider, table.providerAccountId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const domainsInIam = iam.table(\"domains\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tdomain: text().notNull(),\n\tstatus: text().default('pending').notNull(),\n\tmeta: jsonb(),\n\tisPrimary: boolean(\"is_primary\").default(false).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tcreatedBy: uuid(\"created_by\"),\n\tupdatedBy: uuid(\"updated_by\"),\n}, (table) => [\n\tuniqueIndex(\"domains_domain_unique_idx\").using(\"btree\", sql`lower(domain)`),\n\tuniqueIndex(\"domains_primary_per_tenant_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(is_primary = true)`),\n\tindex(\"domains_tenant_id_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"domains_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"domains_status_check\", sql`status = ANY (ARRAY['pending'::text, 'active'::text, 'disabled'::text, 'deleted'::text])`),\n\tcheck(\"domains_domain_format_check\", sql`domain ~ '^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$'::text`),\n]);\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const findSessionByToken = (db: Database, hashedToken: string) => {\n return db\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1)\n .then(([session]) => (session as Session) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserById = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport { getCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { createDatabase } from './db';\nimport { findSessionByToken } from './db/orm/iam/sessions/find-session-by-token';\nimport { findUserById } from './db/orm/iam/users/find-user-by-id';\nimport { hashToken } from './lib/crypto';\nimport { createAuthRoutes as createRoutes } from './routes/auth.route';\nimport type { AuthConfig } from './types';\n\nconst createAuthMiddleware = (\n config: AuthConfig,\n database: ReturnType<typeof createDatabase>,\n getTenantId: (c: any) => string | undefined,\n) => {\n const enableTenant = config.enableTenant ?? true;\n\n return async (c: any, next: () => Promise<void>) => {\n const sessionToken = getCookie(c, 'session_token') || undefined;\n let tenantId = getTenantId(c);\n\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n } else {\n tenantId = config.tenantId;\n if (!tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n }\n\n c.set('config', config);\n c.set('database', database);\n c.set('tenantId', tenantId);\n c.set('userId', undefined);\n c.set('user', undefined);\n c.set('session', undefined);\n\n if (sessionToken) {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (session) {\n const user = await findUserById(\n database,\n session.tenantId,\n session.userId,\n );\n if (user) {\n c.set('tenantId', enableTenant ? session.tenantId : tenantId);\n c.set('userId', user.id);\n c.set('user', user);\n c.set('session', session);\n }\n }\n } catch {\n // Invalid session, continue without user\n }\n }\n\n await next();\n };\n};\n\n// For fetch-based usage (standalone handler)\nexport const createAuthHandler = (config: AuthConfig) => {\n // biome-ignore lint/suspicious/noExplicitAny: OpenAPIHono context type\n const app = new OpenAPIHono<any>();\n const database = createDatabase(config.connectionString);\n\n // Get tenantId from x-tenant-id header\n app.use(\n '*',\n createAuthMiddleware(\n config,\n database,\n (c) => c.req.header('x-tenant-id') || config.tenantId,\n ),\n );\n\n app.route('/', createRoutes());\n return app;\n};\n\n// For route-based usage (mounted as sub-route, shares parent context)\nexport const createAuthRoutes = (config: AuthConfig) => {\n // biome-ignore lint/suspicious/noExplicitAny: OpenAPIHono context type\n const app = new OpenAPIHono<any>();\n const database = createDatabase(config.connectionString);\n\n // Get tenantId from parent context\n app.use(\n '*',\n createAuthMiddleware(\n config,\n database,\n (c) => c.get('tenantId') || config.tenantId,\n ),\n );\n\n app.route('/', createRoutes());\n return app;\n};\n","import { scrypt } from '@noble/hashes/scrypt.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\n\nconst encoder = new TextEncoder();\n\nconst randomHex = (bytes: number) => {\n const arr = randomBytes(bytes);\n return Array.from(arr, (b: number) => b.toString(16).padStart(2, '0')).join(\n '',\n );\n};\n\nconst toHex = (buffer: Uint8Array) => {\n return Array.from(buffer, (b: number) =>\n b.toString(16).padStart(2, '0'),\n ).join('');\n};\n\nconst hexToBytes = (hex: string): Uint8Array => {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst SCRYPT_KEYLEN = 64;\nconst SCRYPT_COST = 16384;\nconst SCRYPT_BLOCK_SIZE = 8;\nconst SCRYPT_PARALLELISM = 1;\n\nexport const hashPassword = async (password: string) => {\n const salt = randomBytes(16);\n const saltHex = toHex(salt);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n return `${saltHex}:${toHex(derivedKey)}`;\n};\n\nexport const verifyPassword = async (\n password: string,\n hashed?: string | null,\n) => {\n if (!hashed) {\n return false;\n }\n const [saltHex, keyHex] = hashed.split(':');\n if (!(saltHex && keyHex)) {\n return false;\n }\n\n const salt = hexToBytes(saltHex);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n const derived = toHex(derivedKey);\n\n if (derived.length !== keyHex.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < derived.length; i++) {\n result |= derived.charCodeAt(i) ^ keyHex.charCodeAt(i);\n }\n return result === 0;\n};\n\nexport const hashToken = async (token: string, secret: string) => {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(token),\n );\n return toHex(new Uint8Array(signature));\n};\n\nexport const generateToken = (bytes = 48) => randomHex(bytes);\n\nexport const hashVerificationCode = (code: string, secret: string) =>\n hashToken(code, secret);\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport {\n authSuccessSchema,\n changePasswordSchema,\n checkUserResponseSchema,\n checkUserSchema,\n emailVerificationConfirmSchema,\n emailVerificationRequestSchema,\n errorResponseSchema,\n forgotPasswordSchema,\n messageSchema,\n messageWithVerificationIdSchema,\n pendingAccountChangeResponseSchema,\n phoneVerificationConfirmSchema,\n phoneVerificationRequestSchema,\n profileResponseSchema,\n resetPasswordSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n verifyPasswordSchema,\n} from './auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { checkUserHandler } from './handler/check-user';\nimport { emailVerificationConfirmHandler } from './handler/email-verification-confirm';\nimport { emailVerificationRequestHandler } from './handler/email-verification-request';\nimport { meHandler } from './handler/me';\nimport { changePasswordHandler } from './handler/password-change';\nimport { forgotPasswordHandler } from './handler/password-forgot';\nimport { resetPasswordHandler } from './handler/password-reset';\nimport { verifyPasswordHandler } from './handler/password-verify';\nimport { phoneVerificationConfirmHandler } from './handler/phone-verification-confirm';\nimport { phoneVerificationRequestHandler } from './handler/phone-verification-request';\nimport { sessionHandler } from './handler/session';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\nimport { updateProfileHandler } from './handler/update-profile';\n\nconst signUpRoute = createRoute({\n method: 'post',\n path: '/sign-up',\n tags: ['Auth'],\n summary: 'Sign up with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signUpSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: signUpResponseSchema,\n },\n },\n description: 'Account created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nconst signInRoute = createRoute({\n method: 'post',\n path: '/sign-in',\n tags: ['Auth'],\n summary: 'Sign in with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signInSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: signInResponseSchema,\n },\n },\n description: 'Signed in',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid credentials',\n },\n },\n});\n\nconst checkUserRoute = createRoute({\n method: 'post',\n path: '/check-user',\n tags: ['Auth'],\n summary: 'Check if user exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkUserResponseSchema,\n },\n },\n description: 'User check result',\n },\n },\n});\n\nconst signOutRoute = createRoute({\n method: 'post',\n path: '/sign-out',\n tags: ['Auth'],\n summary: 'Sign out current session',\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Signed out',\n },\n },\n});\n\nconst meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Auth'],\n summary: 'Get current user',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({ user: userSchema }),\n },\n },\n description: 'Current user',\n },\n },\n});\n\nconst sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Auth'],\n summary: 'Get current session',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n user: userSchema.nullable(),\n session: z\n .object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime(),\n userAgent: z.string().nullable(),\n ip: z.string().nullable(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Current session',\n },\n },\n});\n\nconst accountChangePendingRoute = createRoute({\n method: 'get',\n path: '/account-change/pending',\n tags: ['Profile'],\n summary: 'Get pending account change (email/phone)',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: pendingAccountChangeResponseSchema,\n },\n },\n description: 'Pending account change',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Unauthorized',\n },\n },\n});\n\nconst emailVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/email/verification/request',\n tags: ['Email'],\n summary: 'Request email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Verification code sent',\n },\n },\n});\n\nconst emailVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/email/verification/confirm',\n tags: ['Email'],\n summary: 'Confirm email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Email verified',\n },\n },\n});\n\nconst phoneVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/phone/verification/request',\n tags: ['Phone'],\n summary: 'Request phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'OTP sent',\n },\n },\n});\n\nconst phoneVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/phone/verification/confirm',\n tags: ['Phone'],\n summary: 'Confirm phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Phone verified',\n },\n },\n});\n\nconst forgotPasswordRoute = createRoute({\n method: 'post',\n path: '/password/forgot',\n tags: ['Password'],\n summary: 'Request password reset',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: forgotPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Reset code sent if account exists',\n },\n },\n});\n\nconst resetPasswordRoute = createRoute({\n method: 'post',\n path: '/password/reset',\n tags: ['Password'],\n summary: 'Reset password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: resetPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password reset and new session',\n },\n },\n});\n\nconst verifyPasswordRoute = createRoute({\n method: 'post',\n path: '/password/verify',\n tags: ['Password'],\n summary: 'Verify password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: verifyPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password verified',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nconst changePasswordRoute = createRoute({\n method: 'post',\n path: '/password/change',\n tags: ['Password'],\n summary: 'Change password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: changePasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password updated',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nconst updateProfileRoute = createRoute({\n method: 'put',\n path: '/profile',\n tags: ['Profile'],\n summary: 'Update user profile',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateProfileSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Profile updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst updateEmailRoute = createRoute({\n method: 'put',\n path: '/profile/email',\n tags: ['Profile'],\n summary: 'Update user email',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateEmailSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Email updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst updatePhoneRoute = createRoute({\n method: 'put',\n path: '/profile/phone',\n tags: ['Profile'],\n summary: 'Update user phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updatePhoneSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Phone updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const createAuthRoutes = () => {\n const authRoutes = new OpenAPIHono()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkUserRoute, checkUserHandler)\n .openapi(signOutRoute, signOutHandler)\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler)\n .openapi(emailVerificationRequestRoute, emailVerificationRequestHandler)\n .openapi(emailVerificationConfirmRoute, emailVerificationConfirmHandler)\n .openapi(phoneVerificationRequestRoute, phoneVerificationRequestHandler)\n .openapi(phoneVerificationConfirmRoute, phoneVerificationConfirmHandler)\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler);\n\n return authRoutes;\n};\n","import { z } from 'zod';\n\nconst emailField = z\n .string()\n .trim()\n .email('Invalid email address')\n .max(255, 'Email too long');\n\nconst phoneField = z\n .string()\n .trim()\n .min(6, 'Phone too short')\n .max(30, 'Phone too long')\n .regex(/^[+()\\d\\s-]+$/, 'Invalid phone number format');\n\nconst passwordField = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long');\n\nexport const userSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n handle: z.string(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n lastSignInAt: z.string().datetime().nullable(),\n});\n\nexport const sessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime().optional(),\n userAgent: z.string().nullable().optional(),\n ip: z.string().nullable().optional(),\n});\n\nexport const authSuccessSchema = z.object({\n user: userSchema,\n session: sessionSchema,\n sessionToken: z.string(),\n sessionExpiresAt: z.string().datetime(),\n});\n\nexport const messageSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string().describe('Error message'),\n code: z.string().optional().describe('Error code'),\n details: z.record(z.string(), z.any()).optional(),\n});\n\nexport const signUpSchema = z\n .object({\n email: emailField.optional(),\n phone: phoneField.optional(),\n password: passwordField,\n fullName: z.string().min(2),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const signInSchema = z.object({\n identifier: z.string(),\n password: passwordField,\n});\n\nexport const signUpResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n debugCode: z.string().optional(),\n});\n\nexport const signInResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n});\n\nexport const emailVerificationRequestSchema = z.object({\n email: emailField.optional(),\n});\n\nexport const emailVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string().length(6),\n});\n\nexport const phoneVerificationRequestSchema = z.object({\n phone: phoneField,\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const phoneVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const forgotPasswordSchema = z.object({\n identifier: z.string(),\n});\n\nexport const resetPasswordSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n password: passwordField,\n});\n\nexport const changePasswordSchema = z.object({\n currentPassword: passwordField,\n newPassword: passwordField,\n});\n\nexport const verifyPasswordSchema = z.object({\n password: passwordField,\n});\n\nexport const messageWithVerificationIdSchema = messageSchema.extend({\n verificationId: z.string().uuid().optional(),\n});\n\nexport const checkUserSchema = z.object({\n identifier: z.string(),\n});\n\nexport const checkUserResponseSchema = z.object({\n exists: z.boolean(),\n});\n\nexport const updateProfileSchema = z.object({\n fullName: z.string().min(1).max(255).optional().describe('User full name'),\n});\n\nexport const updateEmailSchema = z.object({\n email: z.string().email().describe('New email address'),\n});\n\nexport const updatePhoneSchema = z.object({\n phone: z.string().min(6).max(30).describe('New phone number'),\n});\n\nexport const profileResponseSchema = z.object({\n user: userSchema.describe('Updated user'),\n});\n\nexport const pendingAccountChangeSchema = z.object({\n changeType: z.enum(['email', 'phone']),\n newEmail: z.string().email().nullable(),\n newPhone: z.string().nullable(),\n expiresAt: z.string().datetime(),\n});\n\nexport const pendingAccountChangeResponseSchema = z.object({\n accountChange: pendingAccountChangeSchema.nullable(),\n verificationId: z.string().uuid().nullable(),\n});\n","import { HTTPException } from 'hono/http-exception';\nimport { expirePendingAccountChanges } from '../../db/orm/iam/account-changes/expire-pending-account-changes';\nimport {\n findPendingAccountChange,\n type PendingAccountChange,\n} from '../../db/orm/iam/account-changes/find-pending-account-change';\nimport { findActiveVerificationId } from '../../db/orm/iam/verifications/find-active-verification-id';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const accountChangePendingHandler = async (c: any) => {\n const { config, database, tenantId, userId } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await expirePendingAccountChanges(database, resolvedTenantId, userId);\n const accountChange: PendingAccountChange | null =\n await findPendingAccountChange(database, resolvedTenantId, userId);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null });\n }\n\n let verification: { verificationId: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n verification = await findActiveVerificationId(\n database,\n resolvedTenantId,\n userId,\n 'email-verification',\n accountChange.newEmail,\n );\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n verification = await findActiveVerificationId(\n database,\n resolvedTenantId,\n userId,\n 'phone-otp-change-phone',\n accountChange.newPhone,\n );\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null });\n }\n\n return c.json({\n accountChange,\n verificationId: verification.verificationId,\n });\n};\n","import { and, eq, lte } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const expirePendingAccountChanges = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n const now = new Date().toISOString();\n return db\n .update(accountChangesInIam)\n .set({\n status: 'expired',\n updatedAt: now,\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n lte(accountChangesInIam.expiresAt, now),\n ),\n );\n};\n","import { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport type PendingAccountChange = {\n changeType: 'email' | 'phone';\n newEmail: string | null;\n newPhone: string | null;\n expiresAt: string;\n};\n\nexport const findPendingAccountChange = async (\n db: Database,\n tenantId: string,\n userId: string,\n): Promise<PendingAccountChange | null> => {\n const now = new Date().toISOString();\n return await db\n .select({\n changeType: accountChangesInIam.changeType,\n newEmail: accountChangesInIam.newEmail,\n newPhone: accountChangesInIam.newPhone,\n expiresAt: accountChangesInIam.expiresAt,\n })\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n gt(accountChangesInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(accountChangesInIam.createdAt))\n .limit(1)\n .then(([row]) => {\n if (!row) {\n return null;\n }\n if (row.changeType !== 'email' && row.changeType !== 'phone') {\n return null;\n }\n return {\n changeType: row.changeType,\n newEmail: row.newEmail ?? null,\n newPhone: row.newPhone ?? null,\n expiresAt: row.expiresAt,\n };\n });\n};\n","import { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport type ActiveVerification = {\n verificationId: string;\n expiresAt: string;\n};\n\nexport const findActiveVerificationId = async (\n db: Database,\n tenantId: string,\n userId: string,\n type: string,\n to: string,\n): Promise<ActiveVerification | null> => {\n const now = new Date().toISOString();\n return await db\n .select({\n verificationId: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n eq(verificationsInIam.to, to),\n gt(verificationsInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1)\n .then(([row]) => (row ? row : null));\n};\n","export const AUTH_ERRORS = {\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INVALID_PASSWORD: 'INVALID_PASSWORD',\n USER_EXISTS: 'USER_EXISTS',\n VERIFICATION_EXPIRED: 'VERIFICATION_EXPIRED',\n VERIFICATION_MISMATCH: 'VERIFICATION_MISMATCH',\n VERIFICATION_NOT_FOUND: 'VERIFICATION_NOT_FOUND',\n TOO_MANY_ATTEMPTS: 'TOO_MANY_ATTEMPTS',\n REQUIRES_VERIFICATION: 'REQUIRES_VERIFICATION',\n UNAUTHORIZED: 'UNAUTHORIZED',\n ACCESS_DENIED: 'ACCESS_DENIED',\n HAS_NO_PASSWORD: 'HAS_NO_PASSWORD',\n} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n if (config.enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n return config.tenantId;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByEmail = (\n db: Database,\n tenantId: string,\n email: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${email})`,\n ),\n )\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByPhone = (\n db: Database,\n tenantId: string,\n phone: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, phone)))\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import type { Database, User } from '../../../../types';\nimport { findUserByEmail } from './find-user-by-email';\nimport { findUserByPhone } from './find-user-by-phone';\n\nexport const findUserByIdentifier = async (\n db: Database,\n tenantId: string,\n identifier: string,\n): Promise<{ user: User | null; type: 'email' | 'phone' }> => {\n const isEmail = identifier.includes('@');\n if (isEmail) {\n const user = await findUserByEmail(db, tenantId, identifier);\n return { user, type: 'email' };\n }\n const user = await findUserByPhone(db, tenantId, identifier);\n return { user, type: 'phone' };\n};\n","import { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const checkUserHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n return c.json({ exists: !!lookup.user });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { updateUserVerified } from '../../db/orm/iam/users/update-user-verified';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const emailVerificationConfirmHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_EXPIRED,\n });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Mark email as verified\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'email',\n );\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Create session if user doesn't have one\n const user = await findUserById(\n database,\n resolvedTenantId,\n verification.userId,\n );\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'email-verification' },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const insertSession = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n token: string;\n expiresAt: string;\n userAgent?: string | null;\n ip?: string | null;\n meta?: Record<string, unknown> | null;\n },\n) => {\n return db\n .insert(sessionsInIam)\n .values({\n tenantId: data.tenantId,\n userId: data.userId,\n token: data.token,\n expiresAt: data.expiresAt,\n userAgent: data.userAgent || null,\n ip: data.ip || null,\n meta: data.meta || null,\n })\n .returning({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .then(([session]) => session as Session);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserVerified = (\n db: Database,\n tenantId: string,\n userId: string,\n type: 'email' | 'phone',\n) => {\n return db\n .update(usersInIam)\n .set({\n [type === 'email' ? 'emailVerified' : 'phoneVerified']: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const consumeVerification = (db: Database, verificationId: string) => {\n return db\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database, Verification } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const findVerificationById = (db: Database, verificationId: string) => {\n return db\n .select({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n })\n .from(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId))\n .limit(1)\n .then(([verification]) => (verification as Verification) || null);\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\nimport { findVerificationById } from './find-verification-by-id';\n\nexport const updateVerificationAttempt = async (\n db: Database,\n verificationId: string,\n): Promise<void> => {\n const verification = await findVerificationById(db, verificationId);\n if (!verification) {\n return;\n }\n\n await db\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n};\n","import { dayjs } from '@mesob/common';\n\nexport const SESSION_COOKIE_NAME = 'session_token';\n\nexport type SessionMeta = Record<string, unknown>;\n\nexport type BuildSessionPayloadOptions = {\n id: string;\n expiresAt: string;\n createdAt?: string;\n userAgent?: string | null;\n ip?: string | null;\n};\n\nexport const buildSessionPayload = ({\n id,\n expiresAt,\n createdAt,\n userAgent,\n ip,\n}: BuildSessionPayloadOptions) => ({\n id,\n expiresAt,\n createdAt,\n userAgent: userAgent || null,\n ip: ip || null,\n});\n\nexport const generateHandle = (seed?: string | null) => {\n const base =\n seed?.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() ||\n `user${Math.random().toString(36).slice(2, 8)}`;\n return `${base}-${Math.random().toString(36).slice(2, 6)}`;\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1]!, 10);\n const unit = match[2]!;\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n let code = '';\n for (let i = 0; i < length; i++) {\n code += digits[Math.floor(Math.random() * digits.length)]!;\n }\n return code;\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { cancelPendingAccountChanges } from '../../db/orm/iam/account-changes/cancel-pending-account-changes';\nimport { insertPendingEmailChange } from '../../db/orm/iam/account-changes/insert-pending-email-change';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { deleteVerificationsByUserAndType } from '../../db/orm/iam/verifications/delete-verifications-by-user-and-type';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const emailVerificationRequestHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, user } = c.var as AuthContext;\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const email = body.email || user?.email;\n\n if (!email) {\n throw new HTTPException(400, { message: 'Email required' });\n }\n\n // Try to get userId from session first, otherwise find by email\n let userId = user?.id;\n if (!userId) {\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n email,\n );\n if (!lookup.user) {\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n userId = lookup.user.id;\n }\n\n // Delete any existing email verifications for this user\n await deleteVerificationsByUserAndType(\n database,\n resolvedTenantId,\n userId,\n 'email-verification',\n );\n\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n });\n\n if (user?.id && body.email) {\n await cancelPendingAccountChanges(\n database,\n resolvedTenantId,\n user.id,\n 'email',\n );\n await insertPendingEmailChange(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n oldEmail: user.email ?? '',\n newEmail: body.email,\n expiresAt: verification.expiresAt,\n });\n }\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(email, code);\n\n return c.json({ verificationId: verification.id });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const cancelPendingAccountChanges = (\n db: Database,\n tenantId: string,\n userId: string,\n changeType: 'email' | 'phone',\n) => {\n const now = new Date().toISOString();\n return db\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: now,\n updatedAt: now,\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, changeType),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n};\n","import type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const insertPendingEmailChange = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n oldEmail: string;\n newEmail: string;\n expiresAt: string;\n },\n) => {\n const now = new Date().toISOString();\n return db.insert(accountChangesInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n changeType: 'email',\n oldEmail: data.oldEmail,\n newEmail: data.newEmail,\n oldPhone: null,\n newPhone: null,\n status: 'pending',\n expiresAt: data.expiresAt,\n updatedAt: now,\n });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const deleteVerificationsByUserAndType = (\n db: Database,\n tenantId: string,\n userId: string,\n type: string,\n) => {\n return db\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n );\n};\n","import type { Database, Verification } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const insertVerification = async (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n type: string;\n code: string;\n expiresAt: string;\n to?: string | null;\n },\n) => {\n return await db\n .insert(verificationsInIam)\n .values({\n tenantId: data.tenantId,\n userId: data.userId,\n type: data.type,\n code: data.code,\n expiresAt: data.expiresAt,\n to: data.to || null,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n })\n .then(([verification]) => verification as Verification);\n};\n","import { Resend } from 'resend';\n\ntype SendEmailProps = {\n key: string;\n provider: 'resend';\n to: string[];\n subject: string;\n html: string;\n text: string;\n from: string;\n};\n\nexport const SendEmail = async ({\n key,\n provider,\n to,\n subject,\n html,\n text,\n from,\n}: SendEmailProps) => {\n switch (provider) {\n case 'resend':\n return await sendEmailWithResend(key, to, subject, html, text, from);\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n};\n\nconst sendEmailWithResend = async (\n key: string,\n to: string[],\n subject: string,\n html: string,\n text: string,\n from: string,\n) => {\n const resend = new Resend(key);\n\n return await resend.emails.send({\n from,\n to,\n subject,\n html,\n text,\n });\n};\n","import { SendEmail } from '../lib/send-email';\nimport type { ResendConfig } from '../types';\n\nexport class ResendEmailProvider {\n private config: ResendConfig;\n\n constructor(config: ResendConfig) {\n this.config = config;\n }\n\n async sendVerificationEmail(\n email: string,\n code: string,\n tenantName?: string,\n ): Promise<void> {\n const subject =\n this.config.verificationSubject ||\n `Verify your email${tenantName ? ` for ${tenantName}` : ''}`;\n\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${subject}</title>\n </head>\n <body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <h1 style=\"color: #2563eb;\">Verify Your Email</h1>\n <p>Your verification code is:</p>\n <div style=\"background: #f3f4f6; padding: 20px; text-align: center; font-size: 32px; font-weight: bold; letter-spacing: 8px; margin: 20px 0;\">\n ${code}\n </div>\n\n <p style=\"color: #6b7280; font-size: 14px; margin-top: 30px;\">\n This code will expire in 1 hour. If you didn't request this, please ignore this email.\n </p>\n </div>\n </body>\n </html>\n `;\n\n const text = `Your verification code is: ${code}\\n\\nThis code will expire in 1 hour.`;\n\n await this.sendEmail({\n to: [email],\n subject,\n html,\n text,\n });\n }\n\n async sendPasswordResetEmail(\n email: string,\n code: string,\n tenantName?: string,\n ): Promise<void> {\n const subject =\n this.config.resetPasswordSubject ||\n `Reset your password${tenantName ? ` for ${tenantName}` : ''}`;\n\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${subject}</title>\n </head>\n <body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <h1 style=\"color: #2563eb;\">Reset Your Password</h1>\n <p>Your password reset code is:</p>\n <div style=\"background: #f3f4f6; padding: 20px; text-align: center; font-size: 32px; font-weight: bold; letter-spacing: 8px; margin: 20px 0;\">\n ${code}\n </div>\n <p style=\"color: #6b7280; font-size: 14px; margin-top: 30px;\">\n This code will expire in 1 hour. If you didn't request this, please ignore this email.\n </p>\n </div>\n </body>\n </html>\n `;\n\n const text = `Your password reset code is: ${code}\\n\\nThis code will expire in 1 hour.`;\n\n await this.sendEmail({\n to: [email],\n subject,\n html,\n text,\n });\n }\n\n private async sendEmail(data: {\n to: string[];\n subject: string;\n html: string;\n text: string;\n }): Promise<void> {\n const res = await SendEmail({\n key: this.config.apiKey,\n provider: 'resend',\n to: data.to,\n subject: data.subject,\n html: data.html,\n text: data.text,\n from: this.config.from,\n });\n\n if (res.error) {\n throw new Error(res.error.message);\n }\n }\n}\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const meHandler = (c: any) => {\n const { user } = c.var as AuthContext;\n\n if (!user) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n\n return c.json({ user });\n};\n","import { getCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { updateAccountPassword } from '../../db/orm/iam/accounts/update-account-password';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { findSessionByToken } from '../../db/orm/iam/sessions/find-session-by-token';\nimport { listSessionsForUser } from '../../db/orm/iam/sessions/list-sessions-for-user';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken, verifyPassword } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const changePasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { currentPassword, newPassword } = body;\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n userId,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(currentPassword, account.password);\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n // Update password\n const passwordHash = await hashPassword(newPassword);\n await updateAccountPassword(database, resolvedTenantId, userId, passwordHash);\n\n // Optionally revoke other sessions (keep current)\n const sessions = await listSessionsForUser(\n database,\n resolvedTenantId,\n userId,\n );\n const currentSessionToken = getCookie(c, 'session_token');\n if (currentSessionToken) {\n const hashedToken = await hashToken(currentSessionToken, config.secret);\n const currentSession = await findSessionByToken(database, hashedToken);\n if (currentSession) {\n // Delete all sessions except current\n for (const session of sessions) {\n if (session.id !== currentSession.id) {\n await deleteSessionById(database, session.id);\n }\n }\n }\n }\n\n return c.json({ message: 'Password updated' });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Account, Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const findAccountByProvider = (\n db: Database,\n tenantId: string,\n userId: string,\n provider: string,\n) => {\n return db\n .select({\n id: accountsInIam.id,\n tenantId: accountsInIam.tenantId,\n userId: accountsInIam.userId,\n provider: accountsInIam.provider,\n providerAccountId: accountsInIam.providerAccountId,\n password: accountsInIam.password,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, provider),\n ),\n )\n .limit(1)\n .then(([account]) => (account as Account) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const updateAccountPassword = (\n db: Database,\n tenantId: string,\n userId: string,\n password: string,\n) => {\n return db\n .update(accountsInIam)\n .set({ password })\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const deleteSessionById = (db: Database, sessionId: string) => {\n return db.delete(sessionsInIam).where(eq(sessionsInIam.id, sessionId));\n};\n","import { and, asc, eq, gt } from 'drizzle-orm';\nimport type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const listSessionsForUser = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .then((sessions) => sessions as Session[]);\n};\n","import type { SMSConfig } from '../types';\n\ntype SMSInput = {\n to: string;\n message: string;\n callback?: string;\n};\n\ntype SMSRequest = {\n from: string;\n sender: string;\n to: string;\n message: string;\n callback?: string;\n};\nexport class AfroSmsProvider {\n private config: SMSConfig;\n\n constructor(config: SMSConfig) {\n this.config = config;\n }\n\n async sendVerificationSms(phone: string, code: string): Promise<void> {\n const template =\n this.config.templateVerification || 'Your verification code is {{code}}';\n const message = template.replace('{{code}}', code);\n const sms = {\n to: phone,\n message,\n };\n\n await this.sendSms(this.config, sms);\n }\n\n async sendLoginSms(phone: string, code: string): Promise<void> {\n const template = this.config.templateLogin || 'Your login code is {{code}}';\n const message = template.replace('{{code}}', code);\n const sms = {\n to: phone,\n message,\n };\n\n await this.sendSms(this.config, sms);\n }\n\n private async sendSms(config: SMSConfig, sms: SMSInput): Promise<Response> {\n const baseUrl = `${config.baseUrl}/send`;\n\n const identifierId = config?.identifierId;\n\n const senderName = config?.senderName;\n\n const key = config?.apiKey;\n\n if (!(baseUrl && identifierId && senderName && key)) {\n throw new Error('SMS configuration is not set');\n }\n\n const myHeaders = new Headers();\n myHeaders.append('Authorization', `Bearer ${key}`);\n myHeaders.append('Content-Type', 'application/json');\n\n const sendSMS: SMSRequest = {\n from: identifierId,\n sender: '',\n to: sms.to,\n message: sms.message,\n callback: sms?.callback,\n };\n\n const requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: JSON.stringify(sendSMS),\n };\n\n const response = await fetch(baseUrl, requestOptions);\n if (!response.ok) {\n throw new Error(`Failed to send SMS: ${response.statusText}`);\n }\n return response;\n }\n}\n","import { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const forgotPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n // Always return 200 to prevent user enumeration\n if (!lookup.user) {\n return c.json({ message: 'If account exists, reset code sent' });\n }\n\n const isEmail = lookup.type === 'email';\n\n let verificationId: string | undefined;\n\n if (isEmail) {\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.resetPasswordExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'password-reset',\n code: hashedCode,\n expiresAt,\n to: lookup.user.email!,\n });\n verificationId = verification.id;\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendPasswordResetEmail(lookup.user.email!, code);\n } else {\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'password-reset-otp',\n code: hashedCode,\n expiresAt,\n to: lookup.user.phone!,\n });\n verificationId = verification.id;\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(lookup.user.phone!, code);\n }\n\n return c.json({\n message: 'If account exists, reset code sent',\n verificationId,\n });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { updateAccountPassword } from '../../db/orm/iam/accounts/update-account-password';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { listSessionsForUser } from '../../db/orm/iam/sessions/list-sessions-for-user';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const resetPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, password } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, { message: AUTH_ERRORS.VERIFICATION_EXPIRED });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Update password\n const passwordHash = await hashPassword(password);\n await updateAccountPassword(\n database,\n resolvedTenantId,\n verification.userId,\n passwordHash,\n );\n\n // Revoke all sessions\n const sessions = await listSessionsForUser(\n database,\n resolvedTenantId,\n verification.userId,\n );\n for (const session of sessions) {\n await deleteSessionById(database, session.id);\n }\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Create new session\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: verification.userId,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'password-reset' },\n });\n\n const user = await findUserById(\n database,\n resolvedTenantId,\n verification.userId,\n );\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { AUTH_ERRORS } from '../../errors';\nimport { verifyPassword } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const verifyPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { password } = body;\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n userId,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n return c.json({ message: 'Password verified' });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { updateUserVerified } from '../../db/orm/iam/users/update-user-verified';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const phoneVerificationConfirmHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, context } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, { message: AUTH_ERRORS.VERIFICATION_EXPIRED });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Handle by context\n if (context === 'change-phone' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n } else if (context === 'sign-in' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n } else if (context === 'sign-up' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n }\n\n const user = verification.userId\n ? await findUserById(database, resolvedTenantId, verification.userId)\n : null;\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n // Create session if applicable\n if (\n context === 'sign-in' ||\n context === 'change-phone' ||\n context === 'sign-up'\n ) {\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: {\n action:\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`,\n },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n }\n\n return c.json({\n user: user || null,\n session: null,\n verified: true,\n });\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { cancelPendingAccountChanges } from '../../db/orm/iam/account-changes/cancel-pending-account-changes';\nimport { insertPendingPhoneChange } from '../../db/orm/iam/account-changes/insert-pending-phone-change';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { deleteVerificationsByUserAndType } from '../../db/orm/iam/verifications/delete-verifications-by-user-and-type';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport type { AuthContext } from '../../types';\n\nexport const phoneVerificationRequestHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, user } = c.var as AuthContext;\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { phone, context } = body;\n\n if (!phone) {\n throw new HTTPException(400, { message: 'Phone required' });\n }\n\n // Try to get userId from session first, otherwise find by phone\n let userId: string | undefined = user?.id;\n if (!userId) {\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n phone,\n );\n if (!lookup.user) {\n // For sign-up, user should exist (created during sign-up flow)\n // For other contexts, user must exist\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n userId = lookup.user.id;\n }\n\n if (!userId) {\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n\n // Delete any existing phone verifications for this user and context\n await deleteVerificationsByUserAndType(\n database,\n resolvedTenantId,\n userId,\n `phone-otp-${context}`,\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId,\n type: `phone-otp-${context}`,\n code: hashedCode,\n expiresAt,\n to: phone,\n });\n\n if (context === 'change-phone' && user?.id) {\n await cancelPendingAccountChanges(\n database,\n resolvedTenantId,\n user.id,\n 'phone',\n );\n await insertPendingPhoneChange(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n oldPhone: user.phone ?? '',\n newPhone: phone,\n expiresAt: verification.expiresAt,\n });\n }\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(phone, code);\n\n return c.json({ verificationId: verification.id });\n};\n","import type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const insertPendingPhoneChange = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n oldPhone: string;\n newPhone: string;\n expiresAt: string;\n },\n) => {\n const now = new Date().toISOString();\n return db.insert(accountChangesInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n changeType: 'phone',\n oldPhone: data.oldPhone,\n newPhone: data.newPhone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: data.expiresAt,\n updatedAt: now,\n });\n};\n","import type { AuthContext } from '../../types';\n\nexport const sessionHandler = (c: any) => {\n const { user, session } = c.var as AuthContext;\n\n return c.json({\n user: user || null,\n session: session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n }\n : null,\n });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { deleteOldestSessions } from '../../db/orm/iam/sessions/delete-oldest-sessions';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { updateLastSignIn } from '../../db/orm/iam/users/update-last-sign-in';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken, verifyPassword } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const signInHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier, password } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n if (!lookup.user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n lookup.user.id,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n // Check verification status\n const isEmail = lookup.type === 'email';\n const isPhone = lookup.type === 'phone';\n const isVerified = isEmail\n ? lookup.user.emailVerified\n : lookup.user.phoneVerified;\n\n if (isEmail && config.email.verificationRequired && !isVerified) {\n // Send verification code\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: lookup.user.email!,\n });\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(lookup.user.email!, code);\n\n return c.json({\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n if (isPhone && config.phone.verificationRequired && !isVerified) {\n // Send OTP\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'phone-otp',\n code: hashedCode,\n expiresAt,\n to: lookup.user.phone!,\n });\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(lookup.user.phone!, code);\n\n return c.json({\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Enforce session limit\n if (config.session.maxPerUser) {\n await deleteOldestSessions(\n database,\n resolvedTenantId,\n lookup.user.id,\n config.session.maxPerUser,\n );\n }\n\n // Update last sign in\n await updateLastSignIn(database, resolvedTenantId, lookup.user.id);\n\n // Create session\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-in' },\n });\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user: lookup.user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database } from '../../../../types';\nimport { deleteSessionById } from './delete-session-by-id';\nimport { listSessionsForUser } from './list-sessions-for-user';\n\nexport const deleteOldestSessions = async (\n db: Database,\n tenantId: string,\n userId: string,\n keepCount: number,\n): Promise<void> => {\n const sessions = await listSessionsForUser(db, tenantId, userId);\n\n if (sessions.length <= keepCount) {\n return;\n }\n\n const toDelete = sessions.slice(0, sessions.length - keepCount);\n\n for (const session of toDelete) {\n await deleteSessionById(db, session.id);\n }\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateLastSignIn = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n","import { deleteCookie, getCookie } from 'hono/cookie';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { findSessionByToken } from '../../db/orm/iam/sessions/find-session-by-token';\nimport { hashToken } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const signOutHandler = async (c: any) => {\n const { config, database, tenantId } = c.var as AuthContext;\n ensureTenantId(config, tenantId); // Ensure tenantId is valid, but not used in this handler\n\n const sessionToken = getCookie(c, 'session_token');\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' });\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (session) {\n await deleteSessionById(database, session.id);\n }\n // Clear cookie\n deleteCookie(c, 'session_token', {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(0),\n });\n\n return c.json({ message: 'Signed out' });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertCredentialsAccount } from '../../db/orm/iam/accounts/insert-credentials-account';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserByHandle } from '../../db/orm/iam/users/find-user-by-handle';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { insertUser } from '../../db/orm/iam/users/insert-user';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken } from '../../lib/crypto';\nimport {\n addDuration,\n generateHandle,\n generateOtpCode,\n} from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const signUpHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { email, phone, password, fullName, handle } = body;\n\n if (!(email || phone)) {\n throw new HTTPException(400, {\n message: 'Either email or phone is required',\n });\n }\n\n const identifier = email || phone!;\n const existing = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n if (existing.user) {\n throw new HTTPException(409, { message: AUTH_ERRORS.USER_EXISTS });\n }\n // Create user\n const userHandle = handle || generateHandle(email || phone!);\n\n // Check handle uniqueness\n const existingHandle = await findUserByHandle(\n database,\n resolvedTenantId,\n userHandle,\n );\n if (existingHandle) {\n throw new HTTPException(409, { message: 'Handle already taken' });\n }\n\n const user = await insertUser(database, {\n tenantId: resolvedTenantId,\n fullName,\n handle: userHandle,\n email: email || null,\n phone: phone || null,\n emailVerified: email ? !config.email.verificationRequired : false,\n phoneVerified: phone ? !config.phone.verificationRequired : false,\n });\n\n // Create credentials account\n const passwordHash = await hashPassword(password);\n await insertCredentialsAccount(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n providerAccountId: identifier,\n password: passwordHash,\n });\n\n // Phone mode: send verification if required\n if (phone && config.phone.verificationRequired) {\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'phone-otp-sign-up',\n code: hashedCode,\n expiresAt,\n to: phone,\n });\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(phone, code);\n\n return c.json({\n user: { id: user.id, phone: phone },\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Email mode: send verification if required\n if (email && config.email.verificationRequired) {\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n });\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(email, code);\n\n return c.json({\n user: { id: user.id, email: email },\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Create session if verification not required\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-up' },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const insertCredentialsAccount = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n providerAccountId: string;\n password: string;\n },\n) => {\n return db.insert(accountsInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n provider: 'credentials',\n providerAccountId: data.providerAccountId,\n password: data.password,\n });\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByHandle = (\n db: Database,\n tenantId: string,\n handle: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const insertUser = (\n db: Database,\n data: {\n tenantId: string;\n fullName: string;\n handle: string;\n email?: string | null;\n phone?: string | null;\n image?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n },\n) => {\n return db\n .insert(usersInIam)\n .values({\n tenantId: data.tenantId,\n fullName: data.fullName,\n handle: data.handle,\n email: data.email || null,\n phone: data.phone || null,\n image: data.image || null,\n emailVerified: Boolean(data.emailVerified),\n phoneVerified: Boolean(data.phoneVerified),\n })\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => user as User);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { markPendingAccountChangeApplied } from '../../db/orm/iam/account-changes/mark-pending-account-change-applied';\nimport { updateCredentialsProviderAccountId } from '../../db/orm/iam/accounts/update-credentials-provider-account-id';\nimport { deleteOtherSessions } from '../../db/orm/iam/sessions/delete-other-sessions';\nimport { updateUserEmail } from '../../db/orm/iam/users/update-user-email';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updateEmailHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user, session } =\n c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n // If user is changing (has existing email) and we have a session, delete other sessions\n if (user.email && session?.id) {\n await deleteOtherSessions(database, resolvedTenantId, userId, session.id);\n }\n\n const updatedUser = await updateUserEmail(\n database,\n resolvedTenantId,\n userId,\n body.email,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n await markPendingAccountChangeApplied(\n database,\n resolvedTenantId,\n userId,\n 'email',\n body.email,\n );\n\n await updateCredentialsProviderAccountId(\n database,\n resolvedTenantId,\n userId,\n body.email,\n );\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const markPendingAccountChangeApplied = (\n db: Database,\n tenantId: string,\n userId: string,\n changeType: 'email' | 'phone',\n newValue: string,\n) => {\n const now = new Date().toISOString();\n const valueCondition =\n changeType === 'email'\n ? eq(accountChangesInIam.newEmail, newValue)\n : eq(accountChangesInIam.newPhone, newValue);\n\n return db\n .update(accountChangesInIam)\n .set({\n status: 'applied',\n confirmedAt: now,\n updatedAt: now,\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, changeType),\n eq(accountChangesInIam.status, 'pending'),\n valueCondition,\n ),\n );\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const updateCredentialsProviderAccountId = async (\n db: Database,\n tenantId: string,\n userId: string,\n providerAccountId: string,\n): Promise<boolean> => {\n const updated = await db\n .update(accountsInIam)\n .set({ providerAccountId })\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .returning({ id: accountsInIam.id })\n .then(([row]) => row?.id);\n\n return Boolean(updated);\n};\n","import { and, eq, ne } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const deleteOtherSessions = (\n db: Database,\n tenantId: string,\n userId: string,\n currentSessionId: string,\n) => {\n return db\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, currentSessionId),\n ),\n );\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserEmail = (\n db: Database,\n tenantId: string,\n userId: string,\n email: string,\n) => {\n return db\n .update(usersInIam)\n .set({\n email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => (user as User) || null);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { markPendingAccountChangeApplied } from '../../db/orm/iam/account-changes/mark-pending-account-change-applied';\nimport { updateCredentialsProviderAccountId } from '../../db/orm/iam/accounts/update-credentials-provider-account-id';\nimport { deleteOtherSessions } from '../../db/orm/iam/sessions/delete-other-sessions';\nimport { updateUserPhone } from '../../db/orm/iam/users/update-user-phone';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updatePhoneHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user, session } =\n c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n // If user is changing (has existing phone) and we have a session, delete other sessions\n if (user.phone && session?.id) {\n await deleteOtherSessions(database, resolvedTenantId, userId, session.id);\n }\n\n const updatedUser = await updateUserPhone(\n database,\n resolvedTenantId,\n userId,\n body.phone,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n await markPendingAccountChangeApplied(\n database,\n resolvedTenantId,\n userId,\n 'phone',\n body.phone,\n );\n\n await updateCredentialsProviderAccountId(\n database,\n resolvedTenantId,\n userId,\n body.phone,\n );\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserPhone = (\n db: Database,\n tenantId: string,\n userId: string,\n phone: string,\n) => {\n return db\n .update(usersInIam)\n .set({\n phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => (user as User) || null);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { updateUserProfile } from '../../db/orm/iam/users/update-user-profile';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updateProfileHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const updatedUser = await updateUserProfile(\n database,\n resolvedTenantId,\n userId,\n body,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\ntype UpdateUserProfileData = {\n fullName?: string;\n};\n\nexport const updateUserProfile = async (\n db: Database,\n tenantId: string,\n userId: string,\n data: UpdateUserProfileData,\n) => {\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n\n if (data.fullName !== undefined) {\n updateData.fullName = data.fullName;\n }\n\n return await db\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => (user as User) || null);\n};\n","import { createDatabase } from './db';\nimport { findSessionByToken } from './db/orm/iam/sessions/find-session-by-token';\nimport { findUserById } from './db/orm/iam/users/find-user-by-id';\nimport { createAuthHandler, createAuthRoutes } from './handler';\nimport { hashToken } from './lib/crypto';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type { AuthConfig, Session, User } from './types';\n\nexport type JiretAuth = {\n handler: ReturnType<typeof createAuthHandler>;\n routes: ReturnType<typeof createAuthRoutes>;\n getSession: (headers: Headers) => Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }>;\n};\n\nexport const jiretAuth = (config: AuthConfig): JiretAuth => {\n const handler = createAuthHandler(config);\n const routes = createAuthRoutes(config);\n const database = createDatabase(config.connectionString);\n\n const getSession = async (\n headers: Headers,\n ): Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }> => {\n const cookieHeader = headers.get('cookie');\n if (!cookieHeader) {\n return { session: null, user: null, sessionToken: null };\n }\n\n const cookies = Object.fromEntries(\n cookieHeader.split('; ').map((c) => {\n const [key, ...rest] = c.split('=');\n return [key, rest.join('=')];\n }),\n );\n\n const sessionToken = cookies.session_token;\n if (!sessionToken) {\n return { session: null, user: null, sessionToken: null };\n }\n\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (!session) {\n return { session: null, user: null, sessionToken: null };\n }\n\n const user = await findUserById(\n database,\n session.tenantId,\n session.userId,\n );\n\n if (!user) {\n return { session: null, user: null, sessionToken: null };\n }\n\n return { session, user, sessionToken };\n } catch {\n return { session: null, user: null, sessionToken: null };\n }\n };\n\n return {\n handler,\n routes,\n getSession,\n };\n};\n"],"mappings":"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","names":["and","eq","and","eq","OpenAPIHono","getCookie","HTTPException","z","HTTPException","and","eq","and","eq","and","eq","gt","and","eq","gt","and","desc","eq","gt","and","eq","gt","desc","HTTPException","and","eq","sql","and","eq","sql","and","eq","and","eq","user","HTTPException","and","eq","and","eq","eq","eq","eq","eq","eq","eq","HTTPException","HTTPException","and","eq","and","eq","and","eq","and","eq","text","text","HTTPException","HTTPException","HTTPException","and","eq","and","eq","and","eq","and","eq","eq","eq","and","eq","gt","and","eq","gt","HTTPException","setCookie","HTTPException","HTTPException","session","setCookie","HTTPException","HTTPException","setCookie","HTTPException","HTTPException","setCookie","HTTPException","HTTPException","setCookie","HTTPException","and","eq","and","eq","HTTPException","expiresAt","setCookie","getCookie","getCookie","setCookie","HTTPException","and","eq","sql","and","eq","sql","HTTPException","expiresAt","setCookie","HTTPException","and","eq","eq","and","and","eq","and","eq","and","eq","and","eq","and","eq","sql","sql","and","eq","HTTPException","HTTPException","and","eq","sql","sql","and","eq","HTTPException","HTTPException","and","eq","sql","sql","and","eq","HTTPException","z","getCookie","HTTPException","OpenAPIHono","createAuthRoutes","createAuthRoutes"]}
1
+ {"version":3,"sources":["../src/db/index.ts","../src/db/relations.ts","../src/db/schema.ts","../src/db/orm/iam/sessions/find-session-by-token.ts","../src/db/orm/iam/users/find-user-by-id.ts","../src/handler.ts","../src/db/orm/iam/users/find-user-roles.ts","../src/lib/crypto.ts","../src/routes/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/handler/account-change-pending.ts","../src/db/orm/iam/account-changes/expire-pending-account-changes.ts","../src/db/orm/iam/account-changes/find-pending-account-change.ts","../src/db/orm/iam/verifications/find-active-verification-id.ts","../src/errors.ts","../src/lib/tenant.ts","../src/db/orm/iam/users/find-user-by-email.ts","../src/db/orm/iam/users/find-user-by-phone.ts","../src/db/orm/iam/users/find-user-by-identifier.ts","../src/routes/handler/check-user.ts","../src/routes/handler/email-verification-confirm.ts","../src/db/orm/iam/sessions/insert-session.ts","../src/db/orm/iam/users/update-user-verified.ts","../src/db/orm/iam/verifications/consume-verification.ts","../src/db/orm/iam/verifications/find-verification-by-id.ts","../src/db/orm/iam/verifications/update-verification-attempt.ts","../src/lib/session.ts","../src/routes/handler/email-verification-request.ts","../src/db/orm/iam/account-changes/cancel-pending-account-changes.ts","../src/db/orm/iam/account-changes/insert-pending-email-change.ts","../src/db/orm/iam/verifications/delete-verifications-by-user-and-type.ts","../src/db/orm/iam/verifications/insert-verification.ts","../src/lib/send-email.ts","../src/providers/resend-email.ts","../src/routes/handler/me.ts","../src/routes/handler/password-change.ts","../src/db/orm/iam/accounts/find-account-by-provider.ts","../src/db/orm/iam/accounts/update-account-password.ts","../src/db/orm/iam/sessions/delete-session-by-id.ts","../src/db/orm/iam/sessions/list-sessions-for-user.ts","../src/providers/afro-sms.ts","../src/routes/handler/password-forgot.ts","../src/routes/handler/password-reset.ts","../src/routes/handler/password-verify.ts","../src/routes/handler/phone-verification-confirm.ts","../src/routes/handler/phone-verification-request.ts","../src/db/orm/iam/account-changes/insert-pending-phone-change.ts","../src/routes/handler/session.ts","../src/routes/handler/sign-in.ts","../src/db/orm/iam/sessions/delete-oldest-sessions.ts","../src/db/orm/iam/users/update-last-sign-in.ts","../src/routes/handler/sign-out.ts","../src/routes/handler/sign-up.ts","../src/db/orm/iam/accounts/insert-credentials-account.ts","../src/db/orm/iam/users/find-user-by-handle.ts","../src/db/orm/iam/users/insert-user.ts","../src/routes/handler/update-email.ts","../src/db/orm/iam/account-changes/mark-pending-account-change-applied.ts","../src/db/orm/iam/accounts/update-credentials-provider-account-id.ts","../src/db/orm/iam/sessions/delete-other-sessions.ts","../src/db/orm/iam/users/update-user-email.ts","../src/routes/handler/update-phone.ts","../src/db/orm/iam/users/update-user-phone.ts","../src/routes/handler/update-profile.ts","../src/db/orm/iam/users/update-user-profile.ts","../src/index.ts"],"sourcesContent":["import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, usersInIam, sessionsInIam, verificationsInIam, accountChangesInIam, rolesInIam, rolePermissionsInIam, permissionsInIam, userRolesInIam, accountsInIam, domainsInIam } from \"./schema\";\n\nexport const usersInIamRelations = relations(usersInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [usersInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n}));\n\nexport const tenantsInIamRelations = relations(tenantsInIam, ({many}) => ({\n\tusersInIam: many(usersInIam),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\trolesInIam: many(rolesInIam),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n\tdomainsInIam: many(domainsInIam),\n}));\n\nexport const sessionsInIamRelations = relations(sessionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [sessionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [sessionsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const verificationsInIamRelations = relations(verificationsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [verificationsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [verificationsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountChangesInIamRelations = relations(accountChangesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountChangesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountChangesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const rolesInIamRelations = relations(rolesInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const rolePermissionsInIamRelations = relations(rolePermissionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n}));\n\nexport const accountsInIamRelations = relations(accountsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const domainsInIamRelations = relations(domainsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [domainsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));","import { pgTable, pgSchema, uniqueIndex, foreignKey, unique, pgPolicy, check, uuid, varchar, timestamp, text, boolean, smallint, index, inet, jsonb } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\n\n\nexport const usersInIam = iam.table(\"users\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tfullName: text(\"full_name\").notNull(),\n\timage: text(),\n\tphone: text(),\n\temail: text(),\n\thandle: text().notNull(),\n\temailVerified: boolean(\"email_verified\").default(false).notNull(),\n\tphoneVerified: boolean(\"phone_verified\").default(false).notNull(),\n\tbannedUntil: timestamp(\"banned_until\", { withTimezone: true, mode: 'string' }),\n\tlastSignInAt: timestamp(\"last_sign_in_at\", { withTimezone: true, mode: 'string' }),\n\tloginAttempt: smallint(\"login_attempt\").default(0).notNull(),\n}, (table) => [\n\tuniqueIndex(\"users_tenant_lower_email_idx\").using(\"btree\", sql`tenant_id`, sql`lower(email)`),\n\tuniqueIndex(\"users_tenant_lower_handle_idx\").using(\"btree\", sql`tenant_id`, sql`lower(handle)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"users_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"users_tenant_phone_key\").on(table.tenantId, table.phone),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\n\tcheck(\"users_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n]);\n\nexport const sessionsInIam = iam.table(\"sessions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tuserAgent: text(\"user_agent\"),\n\tip: inet(),\n\tmeta: jsonb(),\n\ttoken: text().notNull(),\n\trotatedAt: timestamp(\"rotated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),\n}, (table) => [\n\tindex(\"sessions_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"sessions_tenant_user_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"sessions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"sessions_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"sessions_token_key\").on(table.token),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"sessions_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const verificationsInIam = iam.table(\"verifications\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcode: text().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\ttype: text(),\n\tattempt: smallint().default(0),\n\tto: text(),\n}, (table) => [\n\tindex(\"verifications_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"verifications_lookup_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.type.asc().nullsLast().op(\"uuid_ops\"), table.to.asc().nullsLast().op(\"text_ops\"), table.code.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"verifications_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"verifications_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"verifications_attempt_nonnegative_check\", sql`attempt >= 0`),\n\tcheck(\"verifications_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const accountChangesInIam = iam.table(\"account_changes\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tchangeType: text(\"change_type\").notNull(),\n\toldEmail: varchar(\"old_email\"),\n\tnewEmail: varchar(\"new_email\"),\n\toldPhone: text(\"old_phone\"),\n\tnewPhone: text(\"new_phone\"),\n\tstatus: varchar().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tconfirmedAt: timestamp(\"confirmed_at\", { withTimezone: true, mode: 'string' }),\n\tcancelledAt: timestamp(\"cancelled_at\", { withTimezone: true, mode: 'string' }),\n\treason: text(),\n}, (table) => [\n\tindex(\"account_changes_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"account_changes_tenant_user_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"account_changes_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"account_changes_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'applied'::character varying, 'cancelled'::character varying, 'expired'::character varying])::text[])`),\n\tcheck(\"account_changes_change_type_check\", sql`((change_type = 'email'::text) AND (old_email IS NOT NULL) AND (new_email IS NOT NULL) AND (old_phone IS NULL) AND (new_phone IS NULL)) OR ((change_type = 'phone'::text) AND (old_phone IS NOT NULL) AND (new_phone IS NOT NULL) AND (old_email IS NULL) AND (new_email IS NULL))`),\n\tcheck(\"account_changes_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const tenantsInIam = iam.table(\"tenants\", {\n\tid: varchar({ length: 30 }).primaryKey().notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb(),\n\ttheme: jsonb(),\n\tsupportedLanguages: jsonb(\"supported_languages\"),\n\tdefaultLanguage: text(\"default_language\"),\n\tsupportedCurrency: jsonb(\"supported_currency\"),\n\tdefaultCurrency: text(\"default_currency\"),\n\ttimezone: text(),\n\tisActive: boolean(\"is_active\").default(true).notNull(),\n\tlocale: jsonb(),\n\tsettings: jsonb(),\n\tseo: jsonb(),\n}, (table) => [\n\tindex(\"tenants_is_active_idx\").using(\"btree\", table.isActive.asc().nullsLast().op(\"bool_ops\")),\n]);\n\nexport const rolesInIam = iam.table(\"roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"roles_tenant_code_unique\").on(table.tenantId, table.code),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const permissionsInIam = iam.table(\"permissions\", {\n\tid: text().primaryKey().notNull(),\n\tdescription: jsonb().notNull(),\n\tactivity: text().notNull(),\n\tapplication: text().notNull(),\n\tfeature: text().notNull(),\n}, (table) => [\n\tunique(\"permissions_activity_application_feature_key\").on(table.activity, table.application, table.feature),\n]);\n\nexport const rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"role_permissions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"role_permissions_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.permissionId],\n\t\t\tforeignColumns: [permissionsInIam.id],\n\t\t\tname: \"role_permissions_permission_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"role_permissions_unique\").on(table.roleId, table.permissionId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const userRolesInIam = iam.table(\"user_roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"user_roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"user_roles_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"user_roles_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"user_roles_unique\").on(table.userId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const accountsInIam = iam.table(\"accounts\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tprovider: text().notNull(),\n\tproviderAccountId: text(\"provider_account_id\").notNull(),\n\tpassword: text(),\n\tpasswordLastChangedAt: timestamp(\"password_last_changed_at\", { withTimezone: true, mode: 'string' }),\n\tidToken: text(\"id_token\"),\n\taccessToken: text(\"access_token\"),\n\taccessTokenExpiresAt: timestamp(\"access_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\trefreshToken: text(\"refresh_token\"),\n\trefreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\tscope: text(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }),\n\tmeta: jsonb(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"accounts_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"accounts_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"accounts_provider_account_unique\").on(table.provider, table.providerAccountId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const domainsInIam = iam.table(\"domains\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tdomain: text().notNull(),\n\tstatus: text().default('pending').notNull(),\n\tmeta: jsonb(),\n\tisPrimary: boolean(\"is_primary\").default(false).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tcreatedBy: uuid(\"created_by\"),\n\tupdatedBy: uuid(\"updated_by\"),\n}, (table) => [\n\tuniqueIndex(\"domains_domain_unique_idx\").using(\"btree\", sql`lower(domain)`),\n\tuniqueIndex(\"domains_primary_per_tenant_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(is_primary = true)`),\n\tindex(\"domains_tenant_id_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"domains_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"domains_status_check\", sql`status = ANY (ARRAY['pending'::text, 'active'::text, 'disabled'::text, 'deleted'::text])`),\n\tcheck(\"domains_domain_format_check\", sql`domain ~ '^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$'::text`),\n]);\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const findSessionByToken = (db: Database, hashedToken: string) => {\n return db\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1)\n .then(([session]) => (session as Session) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserById = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport { getCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { createDatabase } from './db';\nimport { findSessionByToken } from './db/orm/iam/sessions/find-session-by-token';\nimport { findUserById } from './db/orm/iam/users/find-user-by-id';\nimport { findUserRoles } from './db/orm/iam/users/find-user-roles';\nimport { hashToken } from './lib/crypto';\nimport { createAuthRoutes as createRoutes } from './routes/auth.route';\nimport type { AuthConfig } from './types';\n\nconst createAuthMiddleware = (\n config: AuthConfig,\n database: ReturnType<typeof createDatabase>,\n getTenantId: (c: any) => string | undefined,\n) => {\n const enableTenant = config.enableTenant ?? true;\n\n return async (c: any, next: () => Promise<void>) => {\n const sessionToken = getCookie(c, 'session_token') || undefined;\n let tenantId = getTenantId(c);\n\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n } else {\n tenantId = config.tenantId;\n if (!tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n }\n\n c.set('config', config);\n c.set('database', database);\n c.set('tenantId', tenantId);\n c.set('userId', undefined);\n c.set('user', undefined);\n c.set('session', undefined);\n\n if (sessionToken) {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (session) {\n const user = await findUserById(\n database,\n session.tenantId,\n session.userId,\n );\n if (user) {\n const userRoles = await findUserRoles(\n database,\n session.tenantId,\n session.userId,\n );\n c.set('tenantId', enableTenant ? session.tenantId : tenantId);\n c.set('userId', user.id);\n c.set('user', { ...user, userRoles: userRoles || [] });\n c.set('session', session);\n }\n }\n } catch {\n // Invalid session, continue without user\n }\n }\n\n await next();\n };\n};\n\n// For fetch-based usage (standalone handler)\nexport const createAuthHandler = (config: AuthConfig) => {\n // biome-ignore lint/suspicious/noExplicitAny: OpenAPIHono context type\n const app = new OpenAPIHono<any>();\n const database = createDatabase(config.connectionString);\n\n // Get tenantId from x-tenant-id header\n app.use(\n '*',\n createAuthMiddleware(\n config,\n database,\n (c) => c.req.header('x-tenant-id') || config.tenantId,\n ),\n );\n\n app.route('/', createRoutes());\n return app;\n};\n\n// For route-based usage (mounted as sub-route, shares parent context)\nexport const createAuthRoutes = (config: AuthConfig) => {\n // biome-ignore lint/suspicious/noExplicitAny: OpenAPIHono context type\n const app = new OpenAPIHono<any>();\n const database = createDatabase(config.connectionString);\n\n // Get tenantId from parent context\n app.use(\n '*',\n createAuthMiddleware(\n config,\n database,\n (c) => c.get('tenantId') || config.tenantId,\n ),\n );\n\n app.route('/', createRoutes());\n return app;\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database, UserRole } from '../../../../types';\nimport { rolesInIam, userRolesInIam } from '../../../schema';\n\nexport const findUserRoles = (\n db: Database,\n tenantId: string,\n userId: string,\n): Promise<UserRole[]> => {\n return db\n .select({\n id: userRolesInIam.id,\n roleId: rolesInIam.id,\n code: rolesInIam.code,\n name: rolesInIam.name,\n description: rolesInIam.description,\n })\n .from(userRolesInIam)\n .innerJoin(rolesInIam, eq(userRolesInIam.roleId, rolesInIam.id))\n .where(\n and(\n eq(userRolesInIam.userId, userId),\n eq(userRolesInIam.tenantId, tenantId),\n eq(rolesInIam.tenantId, tenantId),\n ),\n );\n};\n","import { scrypt } from '@noble/hashes/scrypt.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\n\nconst encoder = new TextEncoder();\n\nconst randomHex = (bytes: number) => {\n const arr = randomBytes(bytes);\n return Array.from(arr, (b: number) => b.toString(16).padStart(2, '0')).join(\n '',\n );\n};\n\nconst toHex = (buffer: Uint8Array) => {\n return Array.from(buffer, (b: number) =>\n b.toString(16).padStart(2, '0'),\n ).join('');\n};\n\nconst hexToBytes = (hex: string): Uint8Array => {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst SCRYPT_KEYLEN = 64;\nconst SCRYPT_COST = 16384;\nconst SCRYPT_BLOCK_SIZE = 8;\nconst SCRYPT_PARALLELISM = 1;\n\nexport const hashPassword = async (password: string) => {\n const salt = randomBytes(16);\n const saltHex = toHex(salt);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n return `${saltHex}:${toHex(derivedKey)}`;\n};\n\nexport const verifyPassword = async (\n password: string,\n hashed?: string | null,\n) => {\n if (!hashed) {\n return false;\n }\n const [saltHex, keyHex] = hashed.split(':');\n if (!(saltHex && keyHex)) {\n return false;\n }\n\n const salt = hexToBytes(saltHex);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n const derived = toHex(derivedKey);\n\n if (derived.length !== keyHex.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < derived.length; i++) {\n result |= derived.charCodeAt(i) ^ keyHex.charCodeAt(i);\n }\n return result === 0;\n};\n\nexport const hashToken = async (token: string, secret: string) => {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(token),\n );\n return toHex(new Uint8Array(signature));\n};\n\nexport const generateToken = (bytes = 48) => randomHex(bytes);\n\nexport const hashVerificationCode = (code: string, secret: string) =>\n hashToken(code, secret);\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport {\n authSuccessSchema,\n changePasswordSchema,\n checkUserResponseSchema,\n checkUserSchema,\n emailVerificationConfirmSchema,\n emailVerificationRequestSchema,\n errorResponseSchema,\n forgotPasswordSchema,\n messageSchema,\n messageWithVerificationIdSchema,\n pendingAccountChangeResponseSchema,\n phoneVerificationConfirmSchema,\n phoneVerificationRequestSchema,\n profileResponseSchema,\n resetPasswordSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n verifyPasswordSchema,\n} from './auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { checkUserHandler } from './handler/check-user';\nimport { emailVerificationConfirmHandler } from './handler/email-verification-confirm';\nimport { emailVerificationRequestHandler } from './handler/email-verification-request';\nimport { meHandler } from './handler/me';\nimport { changePasswordHandler } from './handler/password-change';\nimport { forgotPasswordHandler } from './handler/password-forgot';\nimport { resetPasswordHandler } from './handler/password-reset';\nimport { verifyPasswordHandler } from './handler/password-verify';\nimport { phoneVerificationConfirmHandler } from './handler/phone-verification-confirm';\nimport { phoneVerificationRequestHandler } from './handler/phone-verification-request';\nimport { sessionHandler } from './handler/session';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\nimport { updateProfileHandler } from './handler/update-profile';\n\nconst signUpRoute = createRoute({\n method: 'post',\n path: '/sign-up',\n tags: ['Auth'],\n summary: 'Sign up with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signUpSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: signUpResponseSchema,\n },\n },\n description: 'Account created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nconst signInRoute = createRoute({\n method: 'post',\n path: '/sign-in',\n tags: ['Auth'],\n summary: 'Sign in with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signInSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: signInResponseSchema,\n },\n },\n description: 'Signed in',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid credentials',\n },\n },\n});\n\nconst checkUserRoute = createRoute({\n method: 'post',\n path: '/check-user',\n tags: ['Auth'],\n summary: 'Check if user exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkUserResponseSchema,\n },\n },\n description: 'User check result',\n },\n },\n});\n\nconst signOutRoute = createRoute({\n method: 'post',\n path: '/sign-out',\n tags: ['Auth'],\n summary: 'Sign out current session',\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Signed out',\n },\n },\n});\n\nconst meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Auth'],\n summary: 'Get current user',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({ user: userSchema }),\n },\n },\n description: 'Current user',\n },\n },\n});\n\nconst sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Auth'],\n summary: 'Get current session',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n user: userSchema.nullable(),\n session: z\n .object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime(),\n userAgent: z.string().nullable(),\n ip: z.string().nullable(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Current session',\n },\n },\n});\n\nconst accountChangePendingRoute = createRoute({\n method: 'get',\n path: '/account-change/pending',\n tags: ['Profile'],\n summary: 'Get pending account change (email/phone)',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: pendingAccountChangeResponseSchema,\n },\n },\n description: 'Pending account change',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Unauthorized',\n },\n },\n});\n\nconst emailVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/email/verification/request',\n tags: ['Email'],\n summary: 'Request email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Verification code sent',\n },\n },\n});\n\nconst emailVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/email/verification/confirm',\n tags: ['Email'],\n summary: 'Confirm email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Email verified',\n },\n },\n});\n\nconst phoneVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/phone/verification/request',\n tags: ['Phone'],\n summary: 'Request phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'OTP sent',\n },\n },\n});\n\nconst phoneVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/phone/verification/confirm',\n tags: ['Phone'],\n summary: 'Confirm phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Phone verified',\n },\n },\n});\n\nconst forgotPasswordRoute = createRoute({\n method: 'post',\n path: '/password/forgot',\n tags: ['Password'],\n summary: 'Request password reset',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: forgotPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Reset code sent if account exists',\n },\n },\n});\n\nconst resetPasswordRoute = createRoute({\n method: 'post',\n path: '/password/reset',\n tags: ['Password'],\n summary: 'Reset password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: resetPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password reset and new session',\n },\n },\n});\n\nconst verifyPasswordRoute = createRoute({\n method: 'post',\n path: '/password/verify',\n tags: ['Password'],\n summary: 'Verify password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: verifyPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password verified',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nconst changePasswordRoute = createRoute({\n method: 'post',\n path: '/password/change',\n tags: ['Password'],\n summary: 'Change password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: changePasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password updated',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nconst updateProfileRoute = createRoute({\n method: 'put',\n path: '/profile',\n tags: ['Profile'],\n summary: 'Update user profile',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateProfileSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Profile updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst updateEmailRoute = createRoute({\n method: 'put',\n path: '/profile/email',\n tags: ['Profile'],\n summary: 'Update user email',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateEmailSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Email updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst updatePhoneRoute = createRoute({\n method: 'put',\n path: '/profile/phone',\n tags: ['Profile'],\n summary: 'Update user phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updatePhoneSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Phone updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const createAuthRoutes = () => {\n const authRoutes = new OpenAPIHono()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkUserRoute, checkUserHandler)\n .openapi(signOutRoute, signOutHandler)\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler)\n .openapi(emailVerificationRequestRoute, emailVerificationRequestHandler)\n .openapi(emailVerificationConfirmRoute, emailVerificationConfirmHandler)\n .openapi(phoneVerificationRequestRoute, phoneVerificationRequestHandler)\n .openapi(phoneVerificationConfirmRoute, phoneVerificationConfirmHandler)\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler);\n\n return authRoutes;\n};\n","import { z } from 'zod';\n\nconst emailField = z\n .string()\n .trim()\n .email('Invalid email address')\n .max(255, 'Email too long');\n\nconst phoneField = z\n .string()\n .trim()\n .min(6, 'Phone too short')\n .max(30, 'Phone too long')\n .regex(/^[+()\\d\\s-]+$/, 'Invalid phone number format');\n\nconst passwordField = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long');\n\nexport const userSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n handle: z.string(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n lastSignInAt: z.string().datetime().nullable(),\n});\n\nexport const sessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime().optional(),\n userAgent: z.string().nullable().optional(),\n ip: z.string().nullable().optional(),\n});\n\nexport const authSuccessSchema = z.object({\n user: userSchema,\n session: sessionSchema,\n sessionToken: z.string(),\n sessionExpiresAt: z.string().datetime(),\n});\n\nexport const messageSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string().describe('Error message'),\n code: z.string().optional().describe('Error code'),\n details: z.record(z.string(), z.any()).optional(),\n});\n\nexport const signUpSchema = z\n .object({\n email: emailField.optional(),\n phone: phoneField.optional(),\n password: passwordField,\n fullName: z.string().min(2),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const signInSchema = z.object({\n identifier: z.string(),\n password: passwordField,\n});\n\nexport const signUpResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n debugCode: z.string().optional(),\n});\n\nexport const signInResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n});\n\nexport const emailVerificationRequestSchema = z.object({\n email: emailField.optional(),\n});\n\nexport const emailVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string().length(6),\n});\n\nexport const phoneVerificationRequestSchema = z.object({\n phone: phoneField,\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const phoneVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const forgotPasswordSchema = z.object({\n identifier: z.string(),\n});\n\nexport const resetPasswordSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n password: passwordField,\n});\n\nexport const changePasswordSchema = z.object({\n currentPassword: passwordField,\n newPassword: passwordField,\n});\n\nexport const verifyPasswordSchema = z.object({\n password: passwordField,\n});\n\nexport const messageWithVerificationIdSchema = messageSchema.extend({\n verificationId: z.string().uuid().optional(),\n});\n\nexport const checkUserSchema = z.object({\n identifier: z.string(),\n});\n\nexport const checkUserResponseSchema = z.object({\n exists: z.boolean(),\n});\n\nexport const updateProfileSchema = z.object({\n fullName: z.string().min(1).max(255).optional().describe('User full name'),\n});\n\nexport const updateEmailSchema = z.object({\n email: z.string().email().describe('New email address'),\n});\n\nexport const updatePhoneSchema = z.object({\n phone: z.string().min(6).max(30).describe('New phone number'),\n});\n\nexport const profileResponseSchema = z.object({\n user: userSchema.describe('Updated user'),\n});\n\nexport const pendingAccountChangeSchema = z.object({\n changeType: z.enum(['email', 'phone']),\n newEmail: z.string().email().nullable(),\n newPhone: z.string().nullable(),\n expiresAt: z.string().datetime(),\n});\n\nexport const pendingAccountChangeResponseSchema = z.object({\n accountChange: pendingAccountChangeSchema.nullable(),\n verificationId: z.string().uuid().nullable(),\n});\n","import { HTTPException } from 'hono/http-exception';\nimport { expirePendingAccountChanges } from '../../db/orm/iam/account-changes/expire-pending-account-changes';\nimport {\n findPendingAccountChange,\n type PendingAccountChange,\n} from '../../db/orm/iam/account-changes/find-pending-account-change';\nimport { findActiveVerificationId } from '../../db/orm/iam/verifications/find-active-verification-id';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const accountChangePendingHandler = async (c: any) => {\n const { config, database, tenantId, userId } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await expirePendingAccountChanges(database, resolvedTenantId, userId);\n const accountChange: PendingAccountChange | null =\n await findPendingAccountChange(database, resolvedTenantId, userId);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null });\n }\n\n let verification: { verificationId: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n verification = await findActiveVerificationId(\n database,\n resolvedTenantId,\n userId,\n 'email-verification',\n accountChange.newEmail,\n );\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n verification = await findActiveVerificationId(\n database,\n resolvedTenantId,\n userId,\n 'phone-otp-change-phone',\n accountChange.newPhone,\n );\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null });\n }\n\n return c.json({\n accountChange,\n verificationId: verification.verificationId,\n });\n};\n","import { and, eq, lte } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const expirePendingAccountChanges = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n const now = new Date().toISOString();\n return db\n .update(accountChangesInIam)\n .set({\n status: 'expired',\n updatedAt: now,\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n lte(accountChangesInIam.expiresAt, now),\n ),\n );\n};\n","import { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport type PendingAccountChange = {\n changeType: 'email' | 'phone';\n newEmail: string | null;\n newPhone: string | null;\n expiresAt: string;\n};\n\nexport const findPendingAccountChange = async (\n db: Database,\n tenantId: string,\n userId: string,\n): Promise<PendingAccountChange | null> => {\n const now = new Date().toISOString();\n return await db\n .select({\n changeType: accountChangesInIam.changeType,\n newEmail: accountChangesInIam.newEmail,\n newPhone: accountChangesInIam.newPhone,\n expiresAt: accountChangesInIam.expiresAt,\n })\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n gt(accountChangesInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(accountChangesInIam.createdAt))\n .limit(1)\n .then(([row]) => {\n if (!row) {\n return null;\n }\n if (row.changeType !== 'email' && row.changeType !== 'phone') {\n return null;\n }\n return {\n changeType: row.changeType,\n newEmail: row.newEmail ?? null,\n newPhone: row.newPhone ?? null,\n expiresAt: row.expiresAt,\n };\n });\n};\n","import { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport type ActiveVerification = {\n verificationId: string;\n expiresAt: string;\n};\n\nexport const findActiveVerificationId = async (\n db: Database,\n tenantId: string,\n userId: string,\n type: string,\n to: string,\n): Promise<ActiveVerification | null> => {\n const now = new Date().toISOString();\n return await db\n .select({\n verificationId: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n eq(verificationsInIam.to, to),\n gt(verificationsInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1)\n .then(([row]) => (row ? row : null));\n};\n","export const AUTH_ERRORS = {\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INVALID_PASSWORD: 'INVALID_PASSWORD',\n USER_EXISTS: 'USER_EXISTS',\n VERIFICATION_EXPIRED: 'VERIFICATION_EXPIRED',\n VERIFICATION_MISMATCH: 'VERIFICATION_MISMATCH',\n VERIFICATION_NOT_FOUND: 'VERIFICATION_NOT_FOUND',\n TOO_MANY_ATTEMPTS: 'TOO_MANY_ATTEMPTS',\n REQUIRES_VERIFICATION: 'REQUIRES_VERIFICATION',\n UNAUTHORIZED: 'UNAUTHORIZED',\n ACCESS_DENIED: 'ACCESS_DENIED',\n HAS_NO_PASSWORD: 'HAS_NO_PASSWORD',\n} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n if (config.enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n return config.tenantId;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByEmail = (\n db: Database,\n tenantId: string,\n email: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${email})`,\n ),\n )\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByPhone = (\n db: Database,\n tenantId: string,\n phone: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, phone)))\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import type { Database, User } from '../../../../types';\nimport { findUserByEmail } from './find-user-by-email';\nimport { findUserByPhone } from './find-user-by-phone';\n\nexport const findUserByIdentifier = async (\n db: Database,\n tenantId: string,\n identifier: string,\n): Promise<{ user: User | null; type: 'email' | 'phone' }> => {\n const isEmail = identifier.includes('@');\n if (isEmail) {\n const user = await findUserByEmail(db, tenantId, identifier);\n return { user, type: 'email' };\n }\n const user = await findUserByPhone(db, tenantId, identifier);\n return { user, type: 'phone' };\n};\n","import { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const checkUserHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n return c.json({ exists: !!lookup.user });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { updateUserVerified } from '../../db/orm/iam/users/update-user-verified';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const emailVerificationConfirmHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_EXPIRED,\n });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Mark email as verified\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'email',\n );\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Create session if user doesn't have one\n const user = await findUserById(\n database,\n resolvedTenantId,\n verification.userId,\n );\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'email-verification' },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const insertSession = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n token: string;\n expiresAt: string;\n userAgent?: string | null;\n ip?: string | null;\n meta?: Record<string, unknown> | null;\n },\n) => {\n return db\n .insert(sessionsInIam)\n .values({\n tenantId: data.tenantId,\n userId: data.userId,\n token: data.token,\n expiresAt: data.expiresAt,\n userAgent: data.userAgent || null,\n ip: data.ip || null,\n meta: data.meta || null,\n })\n .returning({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .then(([session]) => session as Session);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserVerified = (\n db: Database,\n tenantId: string,\n userId: string,\n type: 'email' | 'phone',\n) => {\n return db\n .update(usersInIam)\n .set({\n [type === 'email' ? 'emailVerified' : 'phoneVerified']: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const consumeVerification = (db: Database, verificationId: string) => {\n return db\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database, Verification } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const findVerificationById = (db: Database, verificationId: string) => {\n return db\n .select({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n })\n .from(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId))\n .limit(1)\n .then(([verification]) => (verification as Verification) || null);\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\nimport { findVerificationById } from './find-verification-by-id';\n\nexport const updateVerificationAttempt = async (\n db: Database,\n verificationId: string,\n): Promise<void> => {\n const verification = await findVerificationById(db, verificationId);\n if (!verification) {\n return;\n }\n\n await db\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n};\n","import { dayjs } from '@mesob/common';\n\nexport const SESSION_COOKIE_NAME = 'session_token';\n\nexport type SessionMeta = Record<string, unknown>;\n\nexport type BuildSessionPayloadOptions = {\n id: string;\n expiresAt: string;\n createdAt?: string;\n userAgent?: string | null;\n ip?: string | null;\n};\n\nexport const buildSessionPayload = ({\n id,\n expiresAt,\n createdAt,\n userAgent,\n ip,\n}: BuildSessionPayloadOptions) => ({\n id,\n expiresAt,\n createdAt,\n userAgent: userAgent || null,\n ip: ip || null,\n});\n\nexport const generateHandle = (seed?: string | null) => {\n const base =\n seed?.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() ||\n `user${Math.random().toString(36).slice(2, 8)}`;\n return `${base}-${Math.random().toString(36).slice(2, 6)}`;\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1]!, 10);\n const unit = match[2]!;\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n let code = '';\n for (let i = 0; i < length; i++) {\n code += digits[Math.floor(Math.random() * digits.length)]!;\n }\n return code;\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { cancelPendingAccountChanges } from '../../db/orm/iam/account-changes/cancel-pending-account-changes';\nimport { insertPendingEmailChange } from '../../db/orm/iam/account-changes/insert-pending-email-change';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { deleteVerificationsByUserAndType } from '../../db/orm/iam/verifications/delete-verifications-by-user-and-type';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const emailVerificationRequestHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, user } = c.var as AuthContext;\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const email = body.email || user?.email;\n\n if (!email) {\n throw new HTTPException(400, { message: 'Email required' });\n }\n\n // Try to get userId from session first, otherwise find by email\n let userId = user?.id;\n if (!userId) {\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n email,\n );\n if (!lookup.user) {\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n userId = lookup.user.id;\n }\n\n // Delete any existing email verifications for this user\n await deleteVerificationsByUserAndType(\n database,\n resolvedTenantId,\n userId,\n 'email-verification',\n );\n\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n });\n\n if (user?.id && body.email) {\n await cancelPendingAccountChanges(\n database,\n resolvedTenantId,\n user.id,\n 'email',\n );\n await insertPendingEmailChange(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n oldEmail: user.email ?? '',\n newEmail: body.email,\n expiresAt: verification.expiresAt,\n });\n }\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(email, code);\n\n return c.json({ verificationId: verification.id });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const cancelPendingAccountChanges = (\n db: Database,\n tenantId: string,\n userId: string,\n changeType: 'email' | 'phone',\n) => {\n const now = new Date().toISOString();\n return db\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: now,\n updatedAt: now,\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, changeType),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n};\n","import type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const insertPendingEmailChange = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n oldEmail: string;\n newEmail: string;\n expiresAt: string;\n },\n) => {\n const now = new Date().toISOString();\n return db.insert(accountChangesInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n changeType: 'email',\n oldEmail: data.oldEmail,\n newEmail: data.newEmail,\n oldPhone: null,\n newPhone: null,\n status: 'pending',\n expiresAt: data.expiresAt,\n updatedAt: now,\n });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const deleteVerificationsByUserAndType = (\n db: Database,\n tenantId: string,\n userId: string,\n type: string,\n) => {\n return db\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n );\n};\n","import type { Database, Verification } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const insertVerification = async (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n type: string;\n code: string;\n expiresAt: string;\n to?: string | null;\n },\n) => {\n return await db\n .insert(verificationsInIam)\n .values({\n tenantId: data.tenantId,\n userId: data.userId,\n type: data.type,\n code: data.code,\n expiresAt: data.expiresAt,\n to: data.to || null,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n })\n .then(([verification]) => verification as Verification);\n};\n","import { Resend } from 'resend';\n\ntype SendEmailProps = {\n key: string;\n provider: 'resend';\n to: string[];\n subject: string;\n html: string;\n text: string;\n from: string;\n};\n\nexport const SendEmail = async ({\n key,\n provider,\n to,\n subject,\n html,\n text,\n from,\n}: SendEmailProps) => {\n switch (provider) {\n case 'resend':\n return await sendEmailWithResend(key, to, subject, html, text, from);\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n};\n\nconst sendEmailWithResend = async (\n key: string,\n to: string[],\n subject: string,\n html: string,\n text: string,\n from: string,\n) => {\n const resend = new Resend(key);\n\n return await resend.emails.send({\n from,\n to,\n subject,\n html,\n text,\n });\n};\n","import { SendEmail } from '../lib/send-email';\nimport type { ResendConfig } from '../types';\n\nexport class ResendEmailProvider {\n private config: ResendConfig;\n\n constructor(config: ResendConfig) {\n this.config = config;\n }\n\n async sendVerificationEmail(\n email: string,\n code: string,\n tenantName?: string,\n ): Promise<void> {\n const subject =\n this.config.verificationSubject ||\n `Verify your email${tenantName ? ` for ${tenantName}` : ''}`;\n\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${subject}</title>\n </head>\n <body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <h1 style=\"color: #2563eb;\">Verify Your Email</h1>\n <p>Your verification code is:</p>\n <div style=\"background: #f3f4f6; padding: 20px; text-align: center; font-size: 32px; font-weight: bold; letter-spacing: 8px; margin: 20px 0;\">\n ${code}\n </div>\n\n <p style=\"color: #6b7280; font-size: 14px; margin-top: 30px;\">\n This code will expire in 1 hour. If you didn't request this, please ignore this email.\n </p>\n </div>\n </body>\n </html>\n `;\n\n const text = `Your verification code is: ${code}\\n\\nThis code will expire in 1 hour.`;\n\n await this.sendEmail({\n to: [email],\n subject,\n html,\n text,\n });\n }\n\n async sendPasswordResetEmail(\n email: string,\n code: string,\n tenantName?: string,\n ): Promise<void> {\n const subject =\n this.config.resetPasswordSubject ||\n `Reset your password${tenantName ? ` for ${tenantName}` : ''}`;\n\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${subject}</title>\n </head>\n <body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <h1 style=\"color: #2563eb;\">Reset Your Password</h1>\n <p>Your password reset code is:</p>\n <div style=\"background: #f3f4f6; padding: 20px; text-align: center; font-size: 32px; font-weight: bold; letter-spacing: 8px; margin: 20px 0;\">\n ${code}\n </div>\n <p style=\"color: #6b7280; font-size: 14px; margin-top: 30px;\">\n This code will expire in 1 hour. If you didn't request this, please ignore this email.\n </p>\n </div>\n </body>\n </html>\n `;\n\n const text = `Your password reset code is: ${code}\\n\\nThis code will expire in 1 hour.`;\n\n await this.sendEmail({\n to: [email],\n subject,\n html,\n text,\n });\n }\n\n private async sendEmail(data: {\n to: string[];\n subject: string;\n html: string;\n text: string;\n }): Promise<void> {\n const res = await SendEmail({\n key: this.config.apiKey,\n provider: 'resend',\n to: data.to,\n subject: data.subject,\n html: data.html,\n text: data.text,\n from: this.config.from,\n });\n\n if (res.error) {\n throw new Error(res.error.message);\n }\n }\n}\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const meHandler = (c: any) => {\n const { user } = c.var as AuthContext;\n\n if (!user) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n\n return c.json({ user });\n};\n","import { getCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { updateAccountPassword } from '../../db/orm/iam/accounts/update-account-password';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { findSessionByToken } from '../../db/orm/iam/sessions/find-session-by-token';\nimport { listSessionsForUser } from '../../db/orm/iam/sessions/list-sessions-for-user';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken, verifyPassword } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const changePasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { currentPassword, newPassword } = body;\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n userId,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(currentPassword, account.password);\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n // Update password\n const passwordHash = await hashPassword(newPassword);\n await updateAccountPassword(database, resolvedTenantId, userId, passwordHash);\n\n // Optionally revoke other sessions (keep current)\n const sessions = await listSessionsForUser(\n database,\n resolvedTenantId,\n userId,\n );\n const currentSessionToken = getCookie(c, 'session_token');\n if (currentSessionToken) {\n const hashedToken = await hashToken(currentSessionToken, config.secret);\n const currentSession = await findSessionByToken(database, hashedToken);\n if (currentSession) {\n // Delete all sessions except current\n for (const session of sessions) {\n if (session.id !== currentSession.id) {\n await deleteSessionById(database, session.id);\n }\n }\n }\n }\n\n return c.json({ message: 'Password updated' });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Account, Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const findAccountByProvider = (\n db: Database,\n tenantId: string,\n userId: string,\n provider: string,\n) => {\n return db\n .select({\n id: accountsInIam.id,\n tenantId: accountsInIam.tenantId,\n userId: accountsInIam.userId,\n provider: accountsInIam.provider,\n providerAccountId: accountsInIam.providerAccountId,\n password: accountsInIam.password,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, provider),\n ),\n )\n .limit(1)\n .then(([account]) => (account as Account) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const updateAccountPassword = (\n db: Database,\n tenantId: string,\n userId: string,\n password: string,\n) => {\n return db\n .update(accountsInIam)\n .set({ password })\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const deleteSessionById = (db: Database, sessionId: string) => {\n return db.delete(sessionsInIam).where(eq(sessionsInIam.id, sessionId));\n};\n","import { and, asc, eq, gt } from 'drizzle-orm';\nimport type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const listSessionsForUser = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .then((sessions) => sessions as Session[]);\n};\n","import type { SMSConfig } from '../types';\n\ntype SMSInput = {\n to: string;\n message: string;\n callback?: string;\n};\n\ntype SMSRequest = {\n from: string;\n sender: string;\n to: string;\n message: string;\n callback?: string;\n};\nexport class AfroSmsProvider {\n private config: SMSConfig;\n\n constructor(config: SMSConfig) {\n this.config = config;\n }\n\n async sendVerificationSms(phone: string, code: string): Promise<void> {\n const template =\n this.config.templateVerification || 'Your verification code is {{code}}';\n const message = template.replace('{{code}}', code);\n const sms = {\n to: phone,\n message,\n };\n\n await this.sendSms(this.config, sms);\n }\n\n async sendLoginSms(phone: string, code: string): Promise<void> {\n const template = this.config.templateLogin || 'Your login code is {{code}}';\n const message = template.replace('{{code}}', code);\n const sms = {\n to: phone,\n message,\n };\n\n await this.sendSms(this.config, sms);\n }\n\n private async sendSms(config: SMSConfig, sms: SMSInput): Promise<Response> {\n const baseUrl = `${config.baseUrl}/send`;\n\n const identifierId = config?.identifierId;\n\n const senderName = config?.senderName;\n\n const key = config?.apiKey;\n\n if (!(baseUrl && identifierId && senderName && key)) {\n throw new Error('SMS configuration is not set');\n }\n\n const myHeaders = new Headers();\n myHeaders.append('Authorization', `Bearer ${key}`);\n myHeaders.append('Content-Type', 'application/json');\n\n const sendSMS: SMSRequest = {\n from: identifierId,\n sender: '',\n to: sms.to,\n message: sms.message,\n callback: sms?.callback,\n };\n\n const requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: JSON.stringify(sendSMS),\n };\n\n const response = await fetch(baseUrl, requestOptions);\n if (!response.ok) {\n throw new Error(`Failed to send SMS: ${response.statusText}`);\n }\n return response;\n }\n}\n","import { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const forgotPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n // Always return 200 to prevent user enumeration\n if (!lookup.user) {\n return c.json({ message: 'If account exists, reset code sent' });\n }\n\n const isEmail = lookup.type === 'email';\n\n let verificationId: string | undefined;\n\n if (isEmail) {\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.resetPasswordExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'password-reset',\n code: hashedCode,\n expiresAt,\n to: lookup.user.email!,\n });\n verificationId = verification.id;\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendPasswordResetEmail(lookup.user.email!, code);\n } else {\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'password-reset-otp',\n code: hashedCode,\n expiresAt,\n to: lookup.user.phone!,\n });\n verificationId = verification.id;\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(lookup.user.phone!, code);\n }\n\n return c.json({\n message: 'If account exists, reset code sent',\n verificationId,\n });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { updateAccountPassword } from '../../db/orm/iam/accounts/update-account-password';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { listSessionsForUser } from '../../db/orm/iam/sessions/list-sessions-for-user';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const resetPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, password } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, { message: AUTH_ERRORS.VERIFICATION_EXPIRED });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Update password\n const passwordHash = await hashPassword(password);\n await updateAccountPassword(\n database,\n resolvedTenantId,\n verification.userId,\n passwordHash,\n );\n\n // Revoke all sessions\n const sessions = await listSessionsForUser(\n database,\n resolvedTenantId,\n verification.userId,\n );\n for (const session of sessions) {\n await deleteSessionById(database, session.id);\n }\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Create new session\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: verification.userId,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'password-reset' },\n });\n\n const user = await findUserById(\n database,\n resolvedTenantId,\n verification.userId,\n );\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { AUTH_ERRORS } from '../../errors';\nimport { verifyPassword } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const verifyPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { password } = body;\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n userId,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n return c.json({ message: 'Password verified' });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { updateUserVerified } from '../../db/orm/iam/users/update-user-verified';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const phoneVerificationConfirmHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, context } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, { message: AUTH_ERRORS.VERIFICATION_EXPIRED });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Handle by context\n if (context === 'change-phone' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n } else if (context === 'sign-in' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n } else if (context === 'sign-up' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n }\n\n const user = verification.userId\n ? await findUserById(database, resolvedTenantId, verification.userId)\n : null;\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n // Create session if applicable\n if (\n context === 'sign-in' ||\n context === 'change-phone' ||\n context === 'sign-up'\n ) {\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: {\n action:\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`,\n },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n }\n\n return c.json({\n user: user || null,\n session: null,\n verified: true,\n });\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { cancelPendingAccountChanges } from '../../db/orm/iam/account-changes/cancel-pending-account-changes';\nimport { insertPendingPhoneChange } from '../../db/orm/iam/account-changes/insert-pending-phone-change';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { deleteVerificationsByUserAndType } from '../../db/orm/iam/verifications/delete-verifications-by-user-and-type';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport type { AuthContext } from '../../types';\n\nexport const phoneVerificationRequestHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, user } = c.var as AuthContext;\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { phone, context } = body;\n\n if (!phone) {\n throw new HTTPException(400, { message: 'Phone required' });\n }\n\n // Try to get userId from session first, otherwise find by phone\n let userId: string | undefined = user?.id;\n if (!userId) {\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n phone,\n );\n if (!lookup.user) {\n // For sign-up, user should exist (created during sign-up flow)\n // For other contexts, user must exist\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n userId = lookup.user.id;\n }\n\n if (!userId) {\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n\n // Delete any existing phone verifications for this user and context\n await deleteVerificationsByUserAndType(\n database,\n resolvedTenantId,\n userId,\n `phone-otp-${context}`,\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId,\n type: `phone-otp-${context}`,\n code: hashedCode,\n expiresAt,\n to: phone,\n });\n\n if (context === 'change-phone' && user?.id) {\n await cancelPendingAccountChanges(\n database,\n resolvedTenantId,\n user.id,\n 'phone',\n );\n await insertPendingPhoneChange(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n oldPhone: user.phone ?? '',\n newPhone: phone,\n expiresAt: verification.expiresAt,\n });\n }\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(phone, code);\n\n return c.json({ verificationId: verification.id });\n};\n","import type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const insertPendingPhoneChange = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n oldPhone: string;\n newPhone: string;\n expiresAt: string;\n },\n) => {\n const now = new Date().toISOString();\n return db.insert(accountChangesInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n changeType: 'phone',\n oldPhone: data.oldPhone,\n newPhone: data.newPhone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: data.expiresAt,\n updatedAt: now,\n });\n};\n","import type { AuthContext } from '../../types';\n\nexport const sessionHandler = (c: any) => {\n const { user, session } = c.var as AuthContext;\n\n return c.json({\n user: user || null,\n session: session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n }\n : null,\n });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { deleteOldestSessions } from '../../db/orm/iam/sessions/delete-oldest-sessions';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { updateLastSignIn } from '../../db/orm/iam/users/update-last-sign-in';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken, verifyPassword } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const signInHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier, password } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n if (!lookup.user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n lookup.user.id,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n // Check verification status\n const isEmail = lookup.type === 'email';\n const isPhone = lookup.type === 'phone';\n const isVerified = isEmail\n ? lookup.user.emailVerified\n : lookup.user.phoneVerified;\n\n if (isEmail && config.email.verificationRequired && !isVerified) {\n // Send verification code\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: lookup.user.email!,\n });\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(lookup.user.email!, code);\n\n return c.json({\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n if (isPhone && config.phone.verificationRequired && !isVerified) {\n // Send OTP\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'phone-otp',\n code: hashedCode,\n expiresAt,\n to: lookup.user.phone!,\n });\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(lookup.user.phone!, code);\n\n return c.json({\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Enforce session limit\n if (config.session.maxPerUser) {\n await deleteOldestSessions(\n database,\n resolvedTenantId,\n lookup.user.id,\n config.session.maxPerUser,\n );\n }\n\n // Update last sign in\n await updateLastSignIn(database, resolvedTenantId, lookup.user.id);\n\n // Create session\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-in' },\n });\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user: lookup.user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database } from '../../../../types';\nimport { deleteSessionById } from './delete-session-by-id';\nimport { listSessionsForUser } from './list-sessions-for-user';\n\nexport const deleteOldestSessions = async (\n db: Database,\n tenantId: string,\n userId: string,\n keepCount: number,\n): Promise<void> => {\n const sessions = await listSessionsForUser(db, tenantId, userId);\n\n if (sessions.length <= keepCount) {\n return;\n }\n\n const toDelete = sessions.slice(0, sessions.length - keepCount);\n\n for (const session of toDelete) {\n await deleteSessionById(db, session.id);\n }\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateLastSignIn = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n","import { deleteCookie, getCookie } from 'hono/cookie';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { findSessionByToken } from '../../db/orm/iam/sessions/find-session-by-token';\nimport { hashToken } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const signOutHandler = async (c: any) => {\n const { config, database, tenantId } = c.var as AuthContext;\n ensureTenantId(config, tenantId); // Ensure tenantId is valid, but not used in this handler\n\n const sessionToken = getCookie(c, 'session_token');\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' });\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (session) {\n await deleteSessionById(database, session.id);\n }\n // Clear cookie\n deleteCookie(c, 'session_token', {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(0),\n });\n\n return c.json({ message: 'Signed out' });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertCredentialsAccount } from '../../db/orm/iam/accounts/insert-credentials-account';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserByHandle } from '../../db/orm/iam/users/find-user-by-handle';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { insertUser } from '../../db/orm/iam/users/insert-user';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken } from '../../lib/crypto';\nimport {\n addDuration,\n generateHandle,\n generateOtpCode,\n} from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const signUpHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { email, phone, password, fullName, handle } = body;\n\n if (!(email || phone)) {\n throw new HTTPException(400, {\n message: 'Either email or phone is required',\n });\n }\n\n const identifier = email || phone!;\n const existing = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n if (existing.user) {\n throw new HTTPException(409, { message: AUTH_ERRORS.USER_EXISTS });\n }\n // Create user\n const userHandle = handle || generateHandle(email || phone!);\n\n // Check handle uniqueness\n const existingHandle = await findUserByHandle(\n database,\n resolvedTenantId,\n userHandle,\n );\n if (existingHandle) {\n throw new HTTPException(409, { message: 'Handle already taken' });\n }\n\n const user = await insertUser(database, {\n tenantId: resolvedTenantId,\n fullName,\n handle: userHandle,\n email: email || null,\n phone: phone || null,\n emailVerified: email ? !config.email.verificationRequired : false,\n phoneVerified: phone ? !config.phone.verificationRequired : false,\n });\n\n // Create credentials account\n const passwordHash = await hashPassword(password);\n await insertCredentialsAccount(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n providerAccountId: identifier,\n password: passwordHash,\n });\n\n // Phone mode: send verification if required\n if (phone && config.phone.verificationRequired) {\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'phone-otp-sign-up',\n code: hashedCode,\n expiresAt,\n to: phone,\n });\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(phone, code);\n\n return c.json({\n user: { id: user.id, phone: phone },\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Email mode: send verification if required\n if (email && config.email.verificationRequired) {\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n });\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(email, code);\n\n return c.json({\n user: { id: user.id, email: email },\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Create session if verification not required\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-up' },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user,\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const insertCredentialsAccount = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n providerAccountId: string;\n password: string;\n },\n) => {\n return db.insert(accountsInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n provider: 'credentials',\n providerAccountId: data.providerAccountId,\n password: data.password,\n });\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByHandle = (\n db: Database,\n tenantId: string,\n handle: string,\n) => {\n return db\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const insertUser = (\n db: Database,\n data: {\n tenantId: string;\n fullName: string;\n handle: string;\n email?: string | null;\n phone?: string | null;\n image?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n },\n) => {\n return db\n .insert(usersInIam)\n .values({\n tenantId: data.tenantId,\n fullName: data.fullName,\n handle: data.handle,\n email: data.email || null,\n phone: data.phone || null,\n image: data.image || null,\n emailVerified: Boolean(data.emailVerified),\n phoneVerified: Boolean(data.phoneVerified),\n })\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => user as User);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { markPendingAccountChangeApplied } from '../../db/orm/iam/account-changes/mark-pending-account-change-applied';\nimport { updateCredentialsProviderAccountId } from '../../db/orm/iam/accounts/update-credentials-provider-account-id';\nimport { deleteOtherSessions } from '../../db/orm/iam/sessions/delete-other-sessions';\nimport { updateUserEmail } from '../../db/orm/iam/users/update-user-email';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updateEmailHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user, session } =\n c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n // If user is changing (has existing email) and we have a session, delete other sessions\n if (user.email && session?.id) {\n await deleteOtherSessions(database, resolvedTenantId, userId, session.id);\n }\n\n const updatedUser = await updateUserEmail(\n database,\n resolvedTenantId,\n userId,\n body.email,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n await markPendingAccountChangeApplied(\n database,\n resolvedTenantId,\n userId,\n 'email',\n body.email,\n );\n\n await updateCredentialsProviderAccountId(\n database,\n resolvedTenantId,\n userId,\n body.email,\n );\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const markPendingAccountChangeApplied = (\n db: Database,\n tenantId: string,\n userId: string,\n changeType: 'email' | 'phone',\n newValue: string,\n) => {\n const now = new Date().toISOString();\n const valueCondition =\n changeType === 'email'\n ? eq(accountChangesInIam.newEmail, newValue)\n : eq(accountChangesInIam.newPhone, newValue);\n\n return db\n .update(accountChangesInIam)\n .set({\n status: 'applied',\n confirmedAt: now,\n updatedAt: now,\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, changeType),\n eq(accountChangesInIam.status, 'pending'),\n valueCondition,\n ),\n );\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const updateCredentialsProviderAccountId = async (\n db: Database,\n tenantId: string,\n userId: string,\n providerAccountId: string,\n): Promise<boolean> => {\n const updated = await db\n .update(accountsInIam)\n .set({ providerAccountId })\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .returning({ id: accountsInIam.id })\n .then(([row]) => row?.id);\n\n return Boolean(updated);\n};\n","import { and, eq, ne } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const deleteOtherSessions = (\n db: Database,\n tenantId: string,\n userId: string,\n currentSessionId: string,\n) => {\n return db\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, currentSessionId),\n ),\n );\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserEmail = (\n db: Database,\n tenantId: string,\n userId: string,\n email: string,\n) => {\n return db\n .update(usersInIam)\n .set({\n email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => (user as User) || null);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { markPendingAccountChangeApplied } from '../../db/orm/iam/account-changes/mark-pending-account-change-applied';\nimport { updateCredentialsProviderAccountId } from '../../db/orm/iam/accounts/update-credentials-provider-account-id';\nimport { deleteOtherSessions } from '../../db/orm/iam/sessions/delete-other-sessions';\nimport { updateUserPhone } from '../../db/orm/iam/users/update-user-phone';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updatePhoneHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user, session } =\n c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n // If user is changing (has existing phone) and we have a session, delete other sessions\n if (user.phone && session?.id) {\n await deleteOtherSessions(database, resolvedTenantId, userId, session.id);\n }\n\n const updatedUser = await updateUserPhone(\n database,\n resolvedTenantId,\n userId,\n body.phone,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n await markPendingAccountChangeApplied(\n database,\n resolvedTenantId,\n userId,\n 'phone',\n body.phone,\n );\n\n await updateCredentialsProviderAccountId(\n database,\n resolvedTenantId,\n userId,\n body.phone,\n );\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserPhone = (\n db: Database,\n tenantId: string,\n userId: string,\n phone: string,\n) => {\n return db\n .update(usersInIam)\n .set({\n phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => (user as User) || null);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { updateUserProfile } from '../../db/orm/iam/users/update-user-profile';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updateProfileHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const updatedUser = await updateUserProfile(\n database,\n resolvedTenantId,\n userId,\n body,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\ntype UpdateUserProfileData = {\n fullName?: string;\n};\n\nexport const updateUserProfile = async (\n db: Database,\n tenantId: string,\n userId: string,\n data: UpdateUserProfileData,\n) => {\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n\n if (data.fullName !== undefined) {\n updateData.fullName = data.fullName;\n }\n\n return await db\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .then(([user]) => (user as User) || null);\n};\n","import { createDatabase } from './db';\nimport { findSessionByToken } from './db/orm/iam/sessions/find-session-by-token';\nimport { findUserById } from './db/orm/iam/users/find-user-by-id';\nimport { createAuthHandler, createAuthRoutes } from './handler';\nimport { hashToken } from './lib/crypto';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type { AuthConfig, Session, User } from './types';\n\nexport type JiretAuth = {\n handler: ReturnType<typeof createAuthHandler>;\n routes: ReturnType<typeof createAuthRoutes>;\n getSession: (headers: Headers) => Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }>;\n};\n\nexport const jiretAuth = (config: AuthConfig): JiretAuth => {\n const handler = createAuthHandler(config);\n const routes = createAuthRoutes(config);\n const database = createDatabase(config.connectionString);\n\n const getSession = async (\n headers: Headers,\n ): Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }> => {\n const cookieHeader = headers.get('cookie');\n if (!cookieHeader) {\n return { session: null, user: null, sessionToken: null };\n }\n\n const cookies = Object.fromEntries(\n cookieHeader.split('; ').map((c) => {\n const [key, ...rest] = c.split('=');\n return [key, rest.join('=')];\n }),\n );\n\n const sessionToken = cookies.session_token;\n if (!sessionToken) {\n return { session: null, user: null, sessionToken: null };\n }\n\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (!session) {\n return { session: null, user: null, sessionToken: null };\n }\n\n const user = await findUserById(\n database,\n session.tenantId,\n session.userId,\n );\n\n if (!user) {\n return { session: null, user: null, sessionToken: null };\n }\n\n return { session, user, sessionToken };\n } catch {\n return { session: null, user: null, sessionToken: null };\n }\n };\n\n return {\n handler,\n routes,\n getSession,\n };\n};\n"],"mappings":"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","names":["and","eq","and","eq","OpenAPIHono","getCookie","HTTPException","and","eq","eq","and","z","HTTPException","and","eq","and","eq","and","eq","gt","and","eq","gt","and","desc","eq","gt","and","eq","gt","desc","HTTPException","and","eq","sql","and","eq","sql","and","eq","and","eq","user","HTTPException","and","eq","and","eq","eq","eq","eq","eq","eq","eq","HTTPException","HTTPException","and","eq","and","eq","and","eq","and","eq","text","text","HTTPException","HTTPException","HTTPException","and","eq","and","eq","and","eq","and","eq","eq","eq","and","eq","gt","and","eq","gt","HTTPException","setCookie","HTTPException","HTTPException","session","setCookie","HTTPException","HTTPException","setCookie","HTTPException","HTTPException","setCookie","HTTPException","HTTPException","setCookie","HTTPException","and","eq","and","eq","HTTPException","expiresAt","setCookie","getCookie","getCookie","setCookie","HTTPException","and","eq","sql","and","eq","sql","HTTPException","expiresAt","setCookie","HTTPException","and","eq","eq","and","and","eq","and","eq","and","eq","and","eq","and","eq","sql","sql","and","eq","HTTPException","HTTPException","and","eq","sql","sql","and","eq","HTTPException","HTTPException","and","eq","sql","sql","and","eq","HTTPException","z","getCookie","HTTPException","OpenAPIHono","createAuthRoutes","createAuthRoutes"]}