@sqrzro/server 4.0.0-alpha.7 → 4.0.0-alpha.9

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.
@@ -1,2 +1,2 @@
1
- import {a,e as e$1,g,b as b$1,h,d,c as c$2,f as f$1}from'../chunk-QE347FVL.js';export{k as ensureSessionUser,j as getSessionUser,i as validateSession}from'../chunk-QE347FVL.js';import {a as a$1}from'../chunk-AGS5PPG2.js';import'../chunk-37TYQL5Y.js';import {c as c$1}from'../chunk-XSJ4OEIH.js';import {e,f}from'../chunk-JI2U2EMD.js';import {eq,and,isNull,gte}from'drizzle-orm';import V from'bcryptjs';import {cookies}from'next/headers';function _(){throw new Error("Function not implemented.")}var b=_;function O(){throw new Error("Function not implemented.")}var N=O;async function W(e,t){await a.delete(f).where(and(eq(f.userID,t),eq(f.type,e)));}var l=W;var F={INVITE:c$2,MFA:d,PASSWORD:d};async function M(e$2,t){let r=e$1(),o=new Date;o.setHours(o.getHours()-F[e$2]);let n=await a.select().from(f).innerJoin(e,and(eq(e.id,f.userID),eq(e.role,r),isNull(e.deletedAt))).where(and(eq(f.id,t),eq(f.type,e$2),gte(f.createdAt,o))).limit(1);return n[0]?{...n[0].resets,user:n[0].user_credentials}:null}var c=M;var q=12;async function K(e){return V.hash(e,q)}var m=K;async function X(e$1,t){let r=await c("PASSWORD",e$1);if(!r)throw new Error("RESET_TOKEN_INVALID");await a.update(e).set({password:await m(t)}).where(eq(e.id,r.userID)),await l("PASSWORD",r.userID);}var C=X;async function Y(e){return f$1("email",e)}var w=Y;var $=48;async function j(e,t){let r=await w(t);if(!r)return null;await l(e,r.id);let o=c$1(null,$);return await a.insert(f).values({createdAt:new Date,id:o,type:e,userID:r.id}),o}var z=j;async function G(e,t){return !!await c(e,t)}var J=G;function Q(){let e="abcdefghijkmnpqrstuvwxyz23456789",t=new Uint8Array(24);crypto.getRandomValues(t);let r="";for(let o=0;o<t.length;o++)r+=e[t[o]>>3];return r}var y=Q;var ee=24,te=3600*1e3;async function re(e,t=ee){let r=e$1(),o=y(),n=y(),P=`${o}.${n}`,R=new Date(Date.now()+t*te);await g.setItem("session",o,{expires:R,role:r,secret:await m(n),userID:e}),(await cookies()).set(b$1,P,{expires:R,httpOnly:true,path:"/",sameSite:"lax",secure:true});}var oe=re;async function ie(){let e=await h();e&&(await g.removeItem("session",e.id),(await cookies()).delete(b$1));}var ae=ie;function ne(){throw new Error("Function not implemented.")}var me=ne;async function ue(e$1){let[t]=await a.insert(e).values({...e$1,password:e$1.password?await m(e$1.password):null}).returning();return t??null}var fe=ue;function pe(){throw new Error("Function not implemented.")}var le=pe;async function ce(e,t){let r=await w(e);if(!r?.password||!await V.compare(t,r.password))throw new a$1({email:"",password:""});return r.id}var we=ce;export{b as createMFA,z as createReset,oe as createSession,fe as createUser,ae as deleteSession,le as deleteUser,me as deleteUserSessions,N as updatePasswordWithPassword,C as updatePasswordWithToken,J as validateReset,we as validateUser};//# sourceMappingURL=index.js.map
1
+ import {a,e as e$1,g as g$1,b as b$1,h as h$1,d,c as c$2,f as f$2}from'../chunk-QE347FVL.js';export{k as ensureSessionUser,j as getSessionUser,i as validateSession}from'../chunk-QE347FVL.js';import {a as a$1}from'../chunk-AGS5PPG2.js';import'../chunk-37TYQL5Y.js';import {c as c$1}from'../chunk-XSJ4OEIH.js';import {e,f as f$1}from'../chunk-JI2U2EMD.js';import {eq,and,isNull,gte}from'drizzle-orm';import M from'bcryptjs';import {cookies}from'next/headers';function b(){throw new Error("Function not implemented.")}var O=b;function $(){throw new Error("Function not implemented.")}var N=$;async function H(e,t){await a.delete(f$1).where(and(eq(f$1.userID,t),eq(f$1.type,e)));}var c=H;var F={INVITE:c$2,MFA:d,PASSWORD:d};async function L(e$2,t){let r=e$1(),o=new Date;o.setHours(o.getHours()-F[e$2]);let a$1=await a.select().from(f$1).innerJoin(e,and(eq(e.id,f$1.userID),eq(e.role,r),isNull(e.deletedAt))).where(and(eq(f$1.id,t),eq(f$1.type,e$2),gte(f$1.createdAt,o))).limit(1);return a$1[0]?{...a$1[0].resets,user:a$1[0].user_credentials}:null}var h=L;var V=12;async function q(e){return M.hash(e,V)}var m=q;async function G(e$1,t){let r=await h("PASSWORD",e$1);if(!r)throw new Error("RESET_TOKEN_INVALID");await a.update(e).set({password:await m(t)}).where(eq(e.id,r.userID)),await c("PASSWORD",r.userID);}var K=G;async function X(e){return f$2("email",e)}var g=X;var Z=48;async function Y(e,t){let r=await g(t);if(!r)return null;await c(e,r.id);let o=c$1(null,Z);return await a.insert(f$1).values({createdAt:new Date,id:o,type:e,userID:r.id}),o}var j=Y;async function z(e,t){return !!await h(e,t)}var J=z;function Q(e){return process.env.SZ_LOG==="true"?true:typeof process.env.SZ_LOG=="string"?process.env.SZ_LOG.split(",").includes(e):false}function ee(e,t,r){Q(e)&&console.log(`[${e}] ${t}: ${r}`);}var f=ee;function te(){let e="abcdefghijkmnpqrstuvwxyz23456789",t=new Uint8Array(24);crypto.getRandomValues(t);let r="";for(let o=0;o<t.length;o++)r+=e[t[o]>>3];return r}var y=te;var oe=24,se=3600*1e3;async function ie(e,t=oe){f("auth:session","createSession",`Creating session for user ${e} with expiration of ${t} hours`);let r=e$1();f("auth:session","createSession",`Assigned role ${r} to session for user ${e}`);let o=y(),a=y(),R=`${o}.${a}`,p=new Date(Date.now()+t*se);await g$1.setItem("session",o,{expires:p,role:r,secret:await m(a),userID:e}),f("auth:session","createSession",`Set session ID ${o} and secret for user ${e} (role ${r}) in storage with expiration at ${p.toISOString()}`),(await cookies()).set(b$1,R,{expires:p,httpOnly:true,path:"/",sameSite:"lax",secure:true}),f("auth:session","createSession",`Set cookie '${b$1}' for user ${e} with token ${R} and expiration at ${p.toISOString()}`);}var ne=ie;async function me(){let e=await h$1();e&&(await g$1.removeItem("session",e.id),(await cookies()).delete(b$1));}var ue=me;function fe(){throw new Error("Function not implemented.")}var pe=fe;async function le(e$1){let[t]=await a.insert(e).values({...e$1,password:e$1.password?await m(e$1.password):null}).returning();return t??null}var de=le;function ce(){throw new Error("Function not implemented.")}var we=ce;async function ge(e,t){let r=await g(e);if(!r?.password||!await M.compare(t,r.password))throw new a$1({email:"",password:""});return r.id}var Se=ge;export{O as createMFA,j as createReset,ne as createSession,de as createUser,ue as deleteSession,we as deleteUser,pe as deleteUserSessions,N as updatePasswordWithPassword,K as updatePasswordWithToken,J as validateReset,Se as validateUser};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/auth/mfas/create-mfa.ts","../../src/auth/passwords/update-password-with-password.ts","../../src/auth/resets/utility/delete-user-resets.ts","../../src/auth/resets/utility/get-reset-by-id.ts","../../src/auth/utility/hash-secret.ts","../../src/auth/passwords/update-password-with-token.ts","../../src/auth/users/utility/get-user-by-email.ts","../../src/auth/resets/create-reset.ts","../../src/auth/resets/validate-reset.ts","../../src/auth/utility/create-secure-random-string.ts","../../src/auth/sessions/create-session.ts","../../src/auth/sessions/delete-session.ts","../../src/auth/sessions/delete-user-sessions.ts","../../src/auth/users/create-user.ts","../../src/auth/users/delete-user.ts","../../src/auth/users/validate-user.ts"],"names":["createMFA","create_mfa_default","updatePasswordWithPassword","update_password_with_password_default","deleteUserResets","type","userID","db_default","authResetTable","and","eq","delete_user_resets_default","EXPIRIES","AUTH_INVITE_EXPIRY_HOURS","AUTH_RESET_EXPIRY_HOURS","getResetByID","id","role","ensure_role_default","expiry","results","authUserTable","isNull","gte","get_reset_by_id_default","PW_SALT_ROUNDS","hashSecret","secret","bcrypt","hash_secret_default","updatePasswordWithToken","token","newPassword","reset","update_password_with_token_default","getUserByEmail","email","get_user_by_default","get_user_by_email_default","TOKEN_LENGTH","createReset","user","generate_id_default","create_reset_default","validateReset","validate_reset_default","createSecureRandomString","alphabet","bytes","i","create_secure_random_string_default","DEFAULT_EXPIRES","HOUR_IN_MS","createSession","expiresIn","expires","storage_default","cookies","AUTH_COOKIE_NAME","create_session_default","deleteSession","cookie","get_session_cookie_default","delete_session_default","deleteUserSessions","delete_user_sessions_default","createUser","data","result","create_user_default","deleteUser","delete_user_default","validateUser","password","ValidationError_default","validate_user_default"],"mappings":"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","file":"index.js","sourcesContent":["function createMFA(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default createMFA;\n","function updatePasswordWithPassword(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default updatePasswordWithPassword;\n","import { and, eq } from 'drizzle-orm';\n\nimport db from '../../../utility/db';\n\nimport { authResetTable } from '../../utility/schema';\n\nimport type { ResetType } from './interfaces';\n\nasync function deleteUserResets(type: ResetType, userID: string): Promise<void> {\n await db\n .delete(authResetTable)\n .where(and(eq(authResetTable.userID, userID), eq(authResetTable.type, type)));\n}\n\nexport default deleteUserResets;\n","import { and, eq, gte, isNull } from 'drizzle-orm';\n\nimport db from '../../../utility/db';\n\nimport { AuthUser } from '../../users/utility/interfaces';\nimport { AUTH_INVITE_EXPIRY_HOURS, AUTH_RESET_EXPIRY_HOURS } from '../../utility/config';\nimport ensureRole from '../../utility/ensure-role';\nimport { authResetTable, authUserTable } from '../../utility/schema';\n\nimport type { AuthReset, ResetType } from './interfaces';\n\nconst EXPIRIES: Record<ResetType, number> = {\n INVITE: AUTH_INVITE_EXPIRY_HOURS,\n MFA: AUTH_RESET_EXPIRY_HOURS,\n PASSWORD: AUTH_RESET_EXPIRY_HOURS,\n};\n\nasync function getResetByID(\n type: ResetType,\n id: string\n): Promise<(AuthReset & { user: AuthUser }) | null> {\n const role = ensureRole();\n\n const expiry = new Date();\n expiry.setHours(expiry.getHours() - EXPIRIES[type]);\n\n const results = await db\n .select()\n .from(authResetTable)\n .innerJoin(\n authUserTable,\n and(\n eq(authUserTable.id, authResetTable.userID),\n eq(authUserTable.role, role),\n isNull(authUserTable.deletedAt)\n )\n )\n .where(\n and(\n eq(authResetTable.id, id),\n eq(authResetTable.type, type),\n gte(authResetTable.createdAt, expiry)\n )\n )\n .limit(1);\n\n return results[0] ? { ...results[0].resets, user: results[0].user_credentials } : null;\n}\n\nexport default getResetByID;\n","import bcrypt from 'bcryptjs';\n\nconst PW_SALT_ROUNDS = 12;\n\nasync function hashSecret(secret: string): Promise<string> {\n return bcrypt.hash(secret, PW_SALT_ROUNDS);\n}\n\nexport default hashSecret;\n","import { eq } from 'drizzle-orm';\n\nimport db from '../../utility/db';\n\nimport deleteUserResets from '../resets/utility/delete-user-resets';\nimport getResetByID from '../resets/utility/get-reset-by-id';\nimport hashSecret from '../utility/hash-secret';\nimport { authUserTable } from '../utility/schema';\n\nasync function updatePasswordWithToken(token: string, newPassword: string): Promise<void> {\n const reset = await getResetByID('PASSWORD', token);\n\n if (!reset) {\n throw new Error('RESET_TOKEN_INVALID');\n }\n\n await db\n .update(authUserTable)\n .set({\n password: await hashSecret(newPassword),\n })\n .where(eq(authUserTable.id, reset.userID));\n\n await deleteUserResets('PASSWORD', reset.userID);\n}\n\nexport default updatePasswordWithToken;\n","import getUserBy from './get-user-by';\nimport type { AuthUser } from './interfaces';\n\nasync function getUserByEmail(email: string): Promise<AuthUser | null> {\n return getUserBy('email', email);\n}\n\nexport default getUserByEmail;\n","import db from '../../utility/db';\nimport { generateID } from '../../utility';\n\nimport getUserByEmail from '../users/utility/get-user-by-email';\nimport { authResetTable } from '../utility/schema';\n\nimport deleteUserResets from './utility/delete-user-resets';\nimport type { ResetType } from './utility/interfaces';\n\nconst TOKEN_LENGTH = 48;\n\nasync function createReset(type: ResetType, email: string): Promise<string | null> {\n const user = await getUserByEmail(email);\n\n if (!user) {\n return null;\n }\n\n await deleteUserResets(type, user.id);\n\n const id = generateID(null, TOKEN_LENGTH);\n\n await db.insert(authResetTable).values({\n createdAt: new Date(),\n id,\n type,\n userID: user.id,\n });\n\n return id;\n}\n\nexport default createReset;\n","import type { ResetType } from '../utility/schema';\n\nimport getResetByID from './utility/get-reset-by-id';\n\nasync function validateReset(type: ResetType, token: string): Promise<boolean> {\n return Boolean(await getResetByID(type, token));\n}\n\nexport default validateReset;\n","function createSecureRandomString(): string {\n\t// Human readable alphabet (a-z, 0-9 without l, o, 0, 1 to avoid confusion)\n\tconst alphabet = \"abcdefghijkmnpqrstuvwxyz23456789\";\n\n\t// Generate 24 bytes = 192 bits of entropy.\n\t// We're only going to use 5 bits per byte so the total entropy will be 192 * 5 / 8 = 120 bits\n\tconst bytes = new Uint8Array(24);\n\tcrypto.getRandomValues(bytes);\n\n\tlet id = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\t// >> 3 \"removes\" the right-most 3 bits of the byte\n\t\tid += alphabet[bytes[i] >> 3];\n\t}\n\treturn id;\n}\n\nexport default createSecureRandomString;","import { cookies } from 'next/headers';\n\nimport serverStorage from '../../storage';\n\nimport createSecureRandomString from '../utility/create-secure-random-string';\nimport { AUTH_COOKIE_NAME } from '../utility/config';\nimport ensureRole from '../utility/ensure-role';\nimport hashSecret from '../utility/hash-secret';\n\nconst DEFAULT_EXPIRES = 24;\nconst HOUR_IN_MS = 60 * 60 * 1000;\n\nasync function createSession(userID: string, expiresIn = DEFAULT_EXPIRES): Promise<void> {\n const role = ensureRole();\n\n const id = createSecureRandomString();\n const secret = createSecureRandomString();\n const token = `${id}.${secret}`;\n\n const expires = new Date(Date.now() + expiresIn * HOUR_IN_MS);\n\n await serverStorage.setItem('session', id, {\n expires,\n role,\n secret: await hashSecret(secret),\n userID,\n });\n\n (await cookies()).set(AUTH_COOKIE_NAME, token, {\n expires,\n httpOnly: true,\n path: '/',\n sameSite: 'lax',\n secure: true,\n });\n}\n\nexport default createSession;\n","import { cookies } from 'next/headers';\n\nimport serverStorage from '../../storage';\n\nimport { AUTH_COOKIE_NAME } from '../utility/config';\n\nimport getSessionCookie from './utility/get-session-cookie';\n\nasync function deleteSession(): Promise<void> {\n const cookie = await getSessionCookie();\n\n if (!cookie) {\n return;\n }\n\n await serverStorage.removeItem('session', cookie.id);\n (await cookies()).delete(AUTH_COOKIE_NAME);\n}\n\nexport default deleteSession;\n","function deleteUserSessions(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default deleteUserSessions;\n","import db from '../../utility/db';\n\nimport hashSecret from '../utility/hash-secret';\nimport { authUserTable } from '../utility/schema';\n\nimport type { AuthUser, AuthUserDataWithID } from './utility/interfaces';\n\nasync function createUser(data: AuthUserDataWithID): Promise<AuthUser | null> {\n const [result] = await db\n .insert(authUserTable)\n .values({ ...data, password: data.password ? await hashSecret(data.password) : null })\n .returning();\n\n return result ?? null;\n}\n\nexport default createUser;\n","function deleteUser(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default deleteUser;\n","import bcrypt from 'bcryptjs';\n\nimport ValidationError from '../../forms/utility/ValidationError';\n\nimport getUserByEmail from './utility/get-user-by-email';\n\nasync function validateUser(email: string, password: string): Promise<string> {\n const user = await getUserByEmail(email);\n\n if (!user?.password || !(await bcrypt.compare(password, user.password))) {\n throw new ValidationError({ email: '', password: '' });\n }\n\n return user.id;\n}\n\nexport default validateUser;\n"]}
1
+ {"version":3,"sources":["../../src/auth/mfas/create-mfa.ts","../../src/auth/passwords/update-password-with-password.ts","../../src/auth/resets/utility/delete-user-resets.ts","../../src/auth/resets/utility/get-reset-by-id.ts","../../src/auth/utility/hash-secret.ts","../../src/auth/passwords/update-password-with-token.ts","../../src/auth/users/utility/get-user-by-email.ts","../../src/auth/resets/create-reset.ts","../../src/auth/resets/validate-reset.ts","../../src/utility/log.ts","../../src/auth/utility/create-secure-random-string.ts","../../src/auth/sessions/create-session.ts","../../src/auth/sessions/delete-session.ts","../../src/auth/sessions/delete-user-sessions.ts","../../src/auth/users/create-user.ts","../../src/auth/users/delete-user.ts","../../src/auth/users/validate-user.ts"],"names":["createMFA","create_mfa_default","updatePasswordWithPassword","update_password_with_password_default","deleteUserResets","type","userID","db_default","authResetTable","and","eq","delete_user_resets_default","EXPIRIES","AUTH_INVITE_EXPIRY_HOURS","AUTH_RESET_EXPIRY_HOURS","getResetByID","id","role","ensure_role_default","expiry","results","authUserTable","isNull","gte","get_reset_by_id_default","PW_SALT_ROUNDS","hashSecret","secret","bcrypt","hash_secret_default","updatePasswordWithToken","token","newPassword","reset","update_password_with_token_default","getUserByEmail","email","get_user_by_default","get_user_by_email_default","TOKEN_LENGTH","createReset","user","generate_id_default","create_reset_default","validateReset","validate_reset_default","shouldLog","alias","log","fnName","message","log_default","createSecureRandomString","alphabet","bytes","i","create_secure_random_string_default","DEFAULT_EXPIRES","HOUR_IN_MS","createSession","expiresIn","expires","storage_default","cookies","AUTH_COOKIE_NAME","create_session_default","deleteSession","cookie","get_session_cookie_default","delete_session_default","deleteUserSessions","delete_user_sessions_default","createUser","data","result","create_user_default","deleteUser","delete_user_default","validateUser","password","ValidationError_default","validate_user_default"],"mappings":"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","file":"index.js","sourcesContent":["function createMFA(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default createMFA;\n","function updatePasswordWithPassword(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default updatePasswordWithPassword;\n","import { and, eq } from 'drizzle-orm';\n\nimport db from '../../../utility/db';\n\nimport { authResetTable } from '../../utility/schema';\n\nimport type { ResetType } from './interfaces';\n\nasync function deleteUserResets(type: ResetType, userID: string): Promise<void> {\n await db\n .delete(authResetTable)\n .where(and(eq(authResetTable.userID, userID), eq(authResetTable.type, type)));\n}\n\nexport default deleteUserResets;\n","import { and, eq, gte, isNull } from 'drizzle-orm';\n\nimport db from '../../../utility/db';\n\nimport { AuthUser } from '../../users/utility/interfaces';\nimport { AUTH_INVITE_EXPIRY_HOURS, AUTH_RESET_EXPIRY_HOURS } from '../../utility/config';\nimport ensureRole from '../../utility/ensure-role';\nimport { authResetTable, authUserTable } from '../../utility/schema';\n\nimport type { AuthReset, ResetType } from './interfaces';\n\nconst EXPIRIES: Record<ResetType, number> = {\n INVITE: AUTH_INVITE_EXPIRY_HOURS,\n MFA: AUTH_RESET_EXPIRY_HOURS,\n PASSWORD: AUTH_RESET_EXPIRY_HOURS,\n};\n\nasync function getResetByID(\n type: ResetType,\n id: string\n): Promise<(AuthReset & { user: AuthUser }) | null> {\n const role = ensureRole();\n\n const expiry = new Date();\n expiry.setHours(expiry.getHours() - EXPIRIES[type]);\n\n const results = await db\n .select()\n .from(authResetTable)\n .innerJoin(\n authUserTable,\n and(\n eq(authUserTable.id, authResetTable.userID),\n eq(authUserTable.role, role),\n isNull(authUserTable.deletedAt)\n )\n )\n .where(\n and(\n eq(authResetTable.id, id),\n eq(authResetTable.type, type),\n gte(authResetTable.createdAt, expiry)\n )\n )\n .limit(1);\n\n return results[0] ? { ...results[0].resets, user: results[0].user_credentials } : null;\n}\n\nexport default getResetByID;\n","import bcrypt from 'bcryptjs';\n\nconst PW_SALT_ROUNDS = 12;\n\nasync function hashSecret(secret: string): Promise<string> {\n return bcrypt.hash(secret, PW_SALT_ROUNDS);\n}\n\nexport default hashSecret;\n","import { eq } from 'drizzle-orm';\n\nimport db from '../../utility/db';\n\nimport deleteUserResets from '../resets/utility/delete-user-resets';\nimport getResetByID from '../resets/utility/get-reset-by-id';\nimport hashSecret from '../utility/hash-secret';\nimport { authUserTable } from '../utility/schema';\n\nasync function updatePasswordWithToken(token: string, newPassword: string): Promise<void> {\n const reset = await getResetByID('PASSWORD', token);\n\n if (!reset) {\n throw new Error('RESET_TOKEN_INVALID');\n }\n\n await db\n .update(authUserTable)\n .set({\n password: await hashSecret(newPassword),\n })\n .where(eq(authUserTable.id, reset.userID));\n\n await deleteUserResets('PASSWORD', reset.userID);\n}\n\nexport default updatePasswordWithToken;\n","import getUserBy from './get-user-by';\nimport type { AuthUser } from './interfaces';\n\nasync function getUserByEmail(email: string): Promise<AuthUser | null> {\n return getUserBy('email', email);\n}\n\nexport default getUserByEmail;\n","import db from '../../utility/db';\nimport { generateID } from '../../utility';\n\nimport getUserByEmail from '../users/utility/get-user-by-email';\nimport { authResetTable } from '../utility/schema';\n\nimport deleteUserResets from './utility/delete-user-resets';\nimport type { ResetType } from './utility/interfaces';\n\nconst TOKEN_LENGTH = 48;\n\nasync function createReset(type: ResetType, email: string): Promise<string | null> {\n const user = await getUserByEmail(email);\n\n if (!user) {\n return null;\n }\n\n await deleteUserResets(type, user.id);\n\n const id = generateID(null, TOKEN_LENGTH);\n\n await db.insert(authResetTable).values({\n createdAt: new Date(),\n id,\n type,\n userID: user.id,\n });\n\n return id;\n}\n\nexport default createReset;\n","import type { ResetType } from '../utility/schema';\n\nimport getResetByID from './utility/get-reset-by-id';\n\nasync function validateReset(type: ResetType, token: string): Promise<boolean> {\n return Boolean(await getResetByID(type, token));\n}\n\nexport default validateReset;\n","function shouldLog(alias: string): boolean {\n if (process.env.SZ_LOG === 'true') {\n return true;\n }\n\n if (typeof process.env.SZ_LOG === 'string') {\n const logAliases = process.env.SZ_LOG.split(',');\n return logAliases.includes(alias);\n }\n\n return false;\n}\n\nfunction log(alias: string, fnName: string, message: string): void {\n if (shouldLog(alias)) {\n console.log(`[${alias}] ${fnName}: ${message}`); // eslint-disable-line no-console\n }\n}\n\nexport default log;\n","function createSecureRandomString(): string {\n\t// Human readable alphabet (a-z, 0-9 without l, o, 0, 1 to avoid confusion)\n\tconst alphabet = \"abcdefghijkmnpqrstuvwxyz23456789\";\n\n\t// Generate 24 bytes = 192 bits of entropy.\n\t// We're only going to use 5 bits per byte so the total entropy will be 192 * 5 / 8 = 120 bits\n\tconst bytes = new Uint8Array(24);\n\tcrypto.getRandomValues(bytes);\n\n\tlet id = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\t// >> 3 \"removes\" the right-most 3 bits of the byte\n\t\tid += alphabet[bytes[i] >> 3];\n\t}\n\treturn id;\n}\n\nexport default createSecureRandomString;","import { cookies } from 'next/headers';\n\nimport serverStorage from '../../storage';\nimport log from '../../utility/log';\n\nimport { AUTH_COOKIE_NAME } from '../utility/config';\nimport createSecureRandomString from '../utility/create-secure-random-string';\nimport ensureRole from '../utility/ensure-role';\nimport hashSecret from '../utility/hash-secret';\n\nconst DEFAULT_EXPIRES = 24;\nconst HOUR_IN_MS = 60 * 60 * 1000;\n\nasync function createSession(userID: string, expiresIn = DEFAULT_EXPIRES): Promise<void> {\n log(\n 'auth:session',\n 'createSession',\n `Creating session for user ${userID} with expiration of ${expiresIn} hours`\n );\n\n const role = ensureRole();\n\n log('auth:session', 'createSession', `Assigned role ${role} to session for user ${userID}`);\n\n const id = createSecureRandomString();\n const secret = createSecureRandomString();\n const token = `${id}.${secret}`;\n\n const expires = new Date(Date.now() + expiresIn * HOUR_IN_MS);\n\n await serverStorage.setItem('session', id, {\n expires,\n role,\n secret: await hashSecret(secret),\n userID,\n });\n\n log(\n 'auth:session',\n 'createSession',\n `Set session ID ${id} and secret for user ${userID} (role ${role}) in storage with expiration at ${expires.toISOString()}`\n );\n\n (await cookies()).set(AUTH_COOKIE_NAME, token, {\n expires,\n httpOnly: true,\n path: '/',\n sameSite: 'lax',\n secure: true,\n });\n\n log(\n 'auth:session',\n 'createSession',\n `Set cookie '${AUTH_COOKIE_NAME}' for user ${userID} with token ${token} and expiration at ${expires.toISOString()}`\n );\n}\n\nexport default createSession;\n","import { cookies } from 'next/headers';\n\nimport serverStorage from '../../storage';\n\nimport { AUTH_COOKIE_NAME } from '../utility/config';\n\nimport getSessionCookie from './utility/get-session-cookie';\n\nasync function deleteSession(): Promise<void> {\n const cookie = await getSessionCookie();\n\n if (!cookie) {\n return;\n }\n\n await serverStorage.removeItem('session', cookie.id);\n (await cookies()).delete(AUTH_COOKIE_NAME);\n}\n\nexport default deleteSession;\n","function deleteUserSessions(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default deleteUserSessions;\n","import db from '../../utility/db';\n\nimport hashSecret from '../utility/hash-secret';\nimport { authUserTable } from '../utility/schema';\n\nimport type { AuthUser, AuthUserDataWithID } from './utility/interfaces';\n\nasync function createUser(data: AuthUserDataWithID): Promise<AuthUser | null> {\n const [result] = await db\n .insert(authUserTable)\n .values({ ...data, password: data.password ? await hashSecret(data.password) : null })\n .returning();\n\n return result ?? null;\n}\n\nexport default createUser;\n","function deleteUser(): Promise<void> {\n throw new Error('Function not implemented.');\n}\n\nexport default deleteUser;\n","import bcrypt from 'bcryptjs';\n\nimport ValidationError from '../../forms/utility/ValidationError';\n\nimport getUserByEmail from './utility/get-user-by-email';\n\nasync function validateUser(email: string, password: string): Promise<string> {\n const user = await getUserByEmail(email);\n\n if (!user?.password || !(await bcrypt.compare(password, user.password))) {\n throw new ValidationError({ email: '', password: '' });\n }\n\n return user.id;\n}\n\nexport default validateUser;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqrzro/server",
3
- "version": "4.0.0-alpha.7",
3
+ "version": "4.0.0-alpha.9",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -45,25 +45,25 @@
45
45
  "@sendgrid/mail": "^8.1.6",
46
46
  "bcryptjs": "^3.0.3",
47
47
  "commander": "^14.0.2",
48
- "dotenv": "^17.2.3",
49
- "drizzle-kit": "^0.30.6",
50
- "drizzle-orm": "^0.44.7",
48
+ "dotenv": "^17.2.4",
49
+ "drizzle-kit": "^0.31.9",
50
+ "drizzle-orm": "^0.45.1",
51
51
  "joi": "^18.0.2",
52
- "pg": "^8.16.3",
53
- "react-dom": "^19.2.1",
52
+ "pg": "^8.18.0",
53
+ "react-dom": "^19.2.4",
54
54
  "redis": "^5.10.0",
55
55
  "tsx": "^4.21.0",
56
- "zod": "^4.1.13",
56
+ "zod": "^4.3.6",
57
57
  "@sqrzro/utility": "^4.0.0-alpha.1"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/jest": "^29.5.14",
61
61
  "@types/node": "^24.10.2",
62
- "@types/pg": "^8.15.6",
63
- "@types/react": "^19.2.7",
62
+ "@types/pg": "^8.16.0",
63
+ "@types/react": "^19.2.13",
64
64
  "@types/react-dom": "^19.2.3",
65
65
  "jest": "^29.7.0",
66
- "prettier": "^3.7.4",
66
+ "prettier": "^3.8.1",
67
67
  "rimraf": "^4.4.1",
68
68
  "ts-jest": "^29.4.6",
69
69
  "tsup": "^8.5.1",