@arch-cadre/core 0.0.33 → 0.0.35

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.
Files changed (90) hide show
  1. package/dist/core/auth/email-verification.d.mts +1 -1
  2. package/dist/core/auth/logic.d.mts +6 -6
  3. package/dist/core/auth/rbac.d.mts +2 -2
  4. package/dist/core/notifications/actions.d.mts +1 -1
  5. package/package.json +5 -15
  6. package/dist/_virtual/_rolldown/runtime.cjs +0 -1
  7. package/dist/core/auth/augment.cjs +0 -1
  8. package/dist/core/auth/augment.d.cts +0 -20
  9. package/dist/core/auth/augment.d.cts.map +0 -1
  10. package/dist/core/auth/email-verification.cjs +0 -1
  11. package/dist/core/auth/email-verification.d.cts +0 -62
  12. package/dist/core/auth/email-verification.d.cts.map +0 -1
  13. package/dist/core/auth/logic.cjs +0 -1
  14. package/dist/core/auth/logic.d.cts +0 -110
  15. package/dist/core/auth/logic.d.cts.map +0 -1
  16. package/dist/core/auth/password-reset.cjs +0 -1
  17. package/dist/core/auth/password-reset.d.cts +0 -39
  18. package/dist/core/auth/password-reset.d.cts.map +0 -1
  19. package/dist/core/auth/rbac.cjs +0 -1
  20. package/dist/core/auth/rbac.d.cts +0 -61
  21. package/dist/core/auth/rbac.d.cts.map +0 -1
  22. package/dist/core/auth/session.cjs +0 -1
  23. package/dist/core/auth/session.d.cts +0 -54
  24. package/dist/core/auth/session.d.cts.map +0 -1
  25. package/dist/core/auth/types.d.cts +0 -55
  26. package/dist/core/auth/types.d.cts.map +0 -1
  27. package/dist/core/auth/utils/encode.cjs +0 -1
  28. package/dist/core/auth/utils/encode.d.cts +0 -15
  29. package/dist/core/auth/utils/encode.d.cts.map +0 -1
  30. package/dist/core/auth/utils/encryption.cjs +0 -1
  31. package/dist/core/auth/utils/encryption.d.cts +0 -28
  32. package/dist/core/auth/utils/encryption.d.cts.map +0 -1
  33. package/dist/core/auth/validation.cjs +0 -1
  34. package/dist/core/auth/validation.d.cts +0 -48
  35. package/dist/core/auth/validation.d.cts.map +0 -1
  36. package/dist/core/bootstrap.cjs +0 -1
  37. package/dist/core/bootstrap.d.cts +0 -5
  38. package/dist/core/bootstrap.d.cts.map +0 -1
  39. package/dist/core/config.cjs +0 -1
  40. package/dist/core/config.d.cts +0 -11
  41. package/dist/core/config.d.cts.map +0 -1
  42. package/dist/core/config.server.cjs +0 -1
  43. package/dist/core/config.server.d.cts +0 -16
  44. package/dist/core/config.server.d.cts.map +0 -1
  45. package/dist/core/event-bus.cjs +0 -1
  46. package/dist/core/event-bus.d.cts +0 -17
  47. package/dist/core/event-bus.d.cts.map +0 -1
  48. package/dist/core/filesystem/index.cjs +0 -1
  49. package/dist/core/filesystem/providers/local.cjs +0 -1
  50. package/dist/core/filesystem/service.cjs +0 -1
  51. package/dist/core/filesystem/service.d.cts +0 -19
  52. package/dist/core/filesystem/service.d.cts.map +0 -1
  53. package/dist/core/filesystem/types.d.cts +0 -22
  54. package/dist/core/filesystem/types.d.cts.map +0 -1
  55. package/dist/core/notifications/actions.cjs +0 -1
  56. package/dist/core/notifications/actions.d.cts +0 -58
  57. package/dist/core/notifications/actions.d.cts.map +0 -1
  58. package/dist/core/notifications/index.cjs +0 -1
  59. package/dist/core/notifications/service.cjs +0 -1
  60. package/dist/core/notifications/service.d.cts +0 -9
  61. package/dist/core/notifications/service.d.cts.map +0 -1
  62. package/dist/core/notifications/types.d.cts +0 -21
  63. package/dist/core/notifications/types.d.cts.map +0 -1
  64. package/dist/core/setup.cjs +0 -1
  65. package/dist/core/setup.d.cts +0 -9
  66. package/dist/core/setup.d.cts.map +0 -1
  67. package/dist/core/types.d.cts +0 -13
  68. package/dist/core/types.d.cts.map +0 -1
  69. package/dist/index.cjs +0 -1
  70. package/dist/index.d.cts +0 -8
  71. package/dist/server/auth/email.cjs +0 -1
  72. package/dist/server/auth/email.d.cts +0 -13
  73. package/dist/server/auth/email.d.cts.map +0 -1
  74. package/dist/server/auth/password.cjs +0 -1
  75. package/dist/server/auth/password.d.cts +0 -23
  76. package/dist/server/auth/password.d.cts.map +0 -1
  77. package/dist/server/auth/user.cjs +0 -1
  78. package/dist/server/auth/user.d.cts +0 -58
  79. package/dist/server/auth/user.d.cts.map +0 -1
  80. package/dist/server/database/inject.cjs +0 -1
  81. package/dist/server/database/inject.d.cts +0 -15
  82. package/dist/server/database/inject.d.cts.map +0 -1
  83. package/dist/server/database/schema.cjs +0 -1
  84. package/dist/server/database/schema.d.cts +0 -2962
  85. package/dist/server/database/schema.d.cts.map +0 -1
  86. package/dist/server/emails/index.cjs +0 -1
  87. package/dist/server/emails/index.d.cts +0 -26
  88. package/dist/server/emails/index.d.cts.map +0 -1
  89. package/dist/server.cjs +0 -1
  90. package/dist/server.d.cts +0 -26
@@ -21,9 +21,9 @@ declare function getUserEmailVerificationRequest(userId: string, id: string): Pr
21
21
  * Creates a new email verification request, deleting any existing one for the user.
22
22
  */
23
23
  declare function createEmailVerificationRequest(userId: string, email: string): Promise<{
24
- id: string;
25
24
  email: string;
26
25
  code: string;
26
+ id: string;
27
27
  createdAt: Date;
28
28
  updatedAt: Date | null;
29
29
  userId: string;
@@ -58,15 +58,15 @@ declare function signUp(data: RegisterInput): Promise<{
58
58
  createdAt: Date;
59
59
  updatedAt: Date | null;
60
60
  userId: string;
61
- expiresAt: Date;
62
61
  active_organization_id: string | null;
62
+ expiresAt: Date;
63
63
  };
64
64
  user: {
65
65
  [x: string]: any;
66
- id: string;
67
66
  email: string;
68
- name: string;
69
67
  password: string | null;
68
+ name: string;
69
+ id: string;
70
70
  image: string | null;
71
71
  recovery_code: Buffer<ArrayBufferLike>;
72
72
  emailVerifiedAt: Date | null;
@@ -86,14 +86,14 @@ declare function finalizeLogin(userId: string, flags: SessionFlags): Promise<{
86
86
  createdAt: Date;
87
87
  updatedAt: Date | null;
88
88
  userId: string;
89
- expiresAt: Date;
90
89
  active_organization_id: string | null;
90
+ expiresAt: Date;
91
91
  } | null;
92
92
  user: {
93
- id: string;
94
93
  email: string;
95
- name: string;
96
94
  password: string | null;
95
+ name: string;
96
+ id: string;
97
97
  image: string | null;
98
98
  recovery_code: Buffer<ArrayBufferLike>;
99
99
  emailVerifiedAt: Date | null;
@@ -16,8 +16,8 @@ declare function getRoleById(roleId: string): Promise<{
16
16
  description: string | null;
17
17
  }>;
18
18
  declare function createRole(name: string, description?: string): Promise<{
19
- id: string;
20
19
  name: string;
20
+ id: string;
21
21
  description: string | null;
22
22
  }[]>;
23
23
  declare function deleteRole(roleId: string): Promise<pg.QueryResult<never>>;
@@ -27,8 +27,8 @@ declare function getPermissions(): Promise<{
27
27
  description: string | null;
28
28
  }[]>;
29
29
  declare function createPermission(name: string, description?: string): Promise<{
30
- id: string;
31
30
  name: string;
31
+ id: string;
32
32
  description: string | null;
33
33
  }[]>;
34
34
  declare function deletePermission(permissionId: string): Promise<pg.QueryResult<never>>;
@@ -15,11 +15,11 @@ declare function getUserNotifications(): Promise<{
15
15
  updatedAt: Date | null;
16
16
  }[] | null>;
17
17
  declare function createNotification(data: CreateNotificationPayload): Promise<{
18
+ type: string | null;
18
19
  id: string;
19
20
  createdAt: Date;
20
21
  updatedAt: Date | null;
21
22
  userId: string;
22
- type: string | null;
23
23
  title: string;
24
24
  content: string | null;
25
25
  target: string | null;
package/package.json CHANGED
@@ -1,17 +1,11 @@
1
1
  {
2
2
  "name": "@arch-cadre/core",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
4
4
  "type": "module",
5
5
  "description": "Core logic for Kryo framework",
6
6
  "exports": {
7
- ".": {
8
- "import": "./dist/index.mjs",
9
- "require": "./dist/index.cjs"
10
- },
11
- "./server": {
12
- "import": "./dist/server.mjs",
13
- "require": "./dist/server.cjs"
14
- },
7
+ ".": "./dist/index.mjs",
8
+ "./server": "./dist/server.mjs",
15
9
  "./package.json": "./package.json"
16
10
  },
17
11
  "files": [
@@ -53,11 +47,7 @@
53
47
  "@types/react-dom": "^19",
54
48
  "swr": "^2.3.8",
55
49
  "tsdown": "^0.20.3",
56
- "tsup": "^8.5.1",
57
- "typescript": "^5",
58
- "unbuild": "^3.6.1"
50
+ "typescript": "^5"
59
51
  },
60
- "types": "./dist/index.d.cts",
61
- "main": "./dist/index.cjs",
62
- "module": "./dist/index.mjs"
52
+ "types": "./dist/index.d.cts"
63
53
  }
@@ -1 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s;
@@ -1 +0,0 @@
1
- const e=globalThis,t=e.__KRYO_IDENTITY_AUGMENTERS__??new Set,n=e.__KRYO_SESSION_AUGMENTERS__??new Set,r=e.__KRYO_PASSWORD_RESET_SESSION_AUGMENTERS__??new Set;e.__KRYO_IDENTITY_AUGMENTERS__=t,e.__KRYO_SESSION_AUGMENTERS__=n,e.__KRYO_PASSWORD_RESET_SESSION_AUGMENTERS__=r;function i(e){t.add(e)}function a(e){n.add(e)}function o(e){r.add(e)}async function s(e,n){let r=n||{};for(let n of t){let t=await n(e);r={...r,...t}}return{...e,...r}}async function c(e){let t={};for(let r of n){let n=await r(e);t={...t,...n}}return{...e,...t}}async function l(e){let t={};for(let n of r){let r=await n(e);t={...t,...r}}return{...e,...t}}exports.augmentPasswordResetSession=l,exports.augmentSession=c,exports.augmentUser=s,exports.registerIdentityAugmenter=i,exports.registerPasswordResetSessionAugmenter=o,exports.registerSessionAugmenter=a;
@@ -1,20 +0,0 @@
1
- import { FullUser, PasswordResetSession, Session, User } from "./types.cjs";
2
-
3
- //#region src/core/auth/augment.d.ts
4
- /**
5
- * REGISTRIES FOR MODULAR EXTENSIONS
6
- */
7
- type IdentityAugmenter = (user: User) => Promise<Partial<FullUser>>;
8
- type SessionAugmenter = (session: Session) => Promise<Partial<Session>>;
9
- type PasswordResetSessionAugmenter = (session: PasswordResetSession) => Promise<Partial<PasswordResetSession>>;
10
- declare function registerIdentityAugmenter(augmenter: IdentityAugmenter): void;
11
- declare function registerSessionAugmenter(augmenter: SessionAugmenter): void;
12
- declare function registerPasswordResetSessionAugmenter(augmenter: PasswordResetSessionAugmenter): void;
13
- /**
14
- * EXECUTION FUNCTIONS
15
- */
16
- declare function augmentUser(user: User, coreRbacData?: Record<string, any>): Promise<FullUser>;
17
- declare function augmentSession(session: Session): Promise<Session>;
18
- //#endregion
19
- export { augmentSession, augmentUser, registerIdentityAugmenter, registerPasswordResetSessionAugmenter, registerSessionAugmenter };
20
- //# sourceMappingURL=augment.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"augment.d.cts","names":[],"sources":["../../../src/core/auth/augment.ts"],"mappings":";;;;;AAA6E;KAMxE,iBAAA,IAAqB,IAAA,EAAM,IAAA,KAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA;AAAA,KACpD,gBAAA,IAAoB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAAA,KACzD,6BAAA,IACH,OAAA,EAAS,oBAAA,KACN,OAAA,CAAQ,OAAA,CAAQ,oBAAA;AAAA,iBAuBL,yBAAA,CAA0B,SAAA,EAAW,iBAAA;AAAA,iBAIrC,wBAAA,CAAyB,SAAA,EAAW,gBAAA;AAAA,iBAIpC,qCAAA,CACd,SAAA,EAAW,6BAAA;;;;iBAQS,WAAA,CACpB,IAAA,EAAM,IAAA,EACN,YAAA,GAAe,MAAA,gBACd,OAAA,CAAQ,QAAA;AAAA,iBASW,cAAA,CAAe,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA"}
@@ -1 +0,0 @@
1
- "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../server/database/inject.cjs`),t=require(`../../server/database/schema.cjs`),n=require(`./utils/encode.cjs`),r=require(`../../server/emails/index.cjs`),i=require(`./logic.cjs`),a=require(`./session.cjs`);let o=require(`drizzle-orm`),s=require(`date-fns`),c=require(`next/headers`);async function l(){i.registerSecurityRequirement(async(e,t)=>t.emailVerifiedAt?{satisfied:!0}:{satisfied:!1,redirect:`/verify-email?unverified`})}async function u(n,r){let[i]=await e.db.select().from(t.emailVerificationTable).where((0,o.and)((0,o.eq)(t.emailVerificationTable.id,r),(0,o.eq)(t.emailVerificationTable.userId,n)));return i}async function d(r,i){await f(r);let a=n.generateRandomOTP(),[o]=await e.db.insert(t.emailVerificationTable).values({userId:r,code:a,email:i,expiresAt:new Date((0,s.addHours)(new Date,1))}).returning();return o}async function f(n){await e.db.delete(t.emailVerificationTable).where((0,o.eq)(t.emailVerificationTable.userId,n))}async function p(e,t){await r.sendVerifyEmail(e,t)}async function m(e){(await(0,c.cookies)()).set(`email_verification`,e.id,{httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`,sameSite:`lax`,expires:e.expiresAt})}async function h(){(await(0,c.cookies)()).delete(`email_verification`)}async function g(){let{user:e}=await a.getCurrentSession();if(!e)return null;let t=(await(0,c.cookies)()).get(`email_verification`)?.value??null;if(!t)return null;let n=await u(e.id,t);return n||await h(),n}exports.createEmailVerificationRequest=d,exports.deleteEmailVerificationRequestCookie=h,exports.deleteUserEmailVerificationRequest=f,exports.getUserEmailVerificationRequest=u,exports.getUserEmailVerificationRequestFromRequest=g,exports.initEmailVerification=l,exports.sendVerificationEmail=p,exports.setEmailVerificationRequestCookie=m;
@@ -1,62 +0,0 @@
1
- import { emailVerificationTable } from "../../server/database/schema.cjs";
2
-
3
- //#region src/core/auth/email-verification.d.ts
4
- /**
5
- * Register Email Verification as a Core Security Requirement.
6
- */
7
- declare function initEmailVerification(): Promise<void>;
8
- /**
9
- * Retrieves a specific email verification request for a user.
10
- */
11
- declare function getUserEmailVerificationRequest(userId: string, id: string): Promise<{
12
- id: string;
13
- email: string;
14
- code: string;
15
- userId: string;
16
- expiresAt: Date;
17
- createdAt: Date;
18
- updatedAt: Date | null;
19
- }>;
20
- /**
21
- * Creates a new email verification request, deleting any existing one for the user.
22
- */
23
- declare function createEmailVerificationRequest(userId: string, email: string): Promise<{
24
- id: string;
25
- email: string;
26
- code: string;
27
- createdAt: Date;
28
- updatedAt: Date | null;
29
- userId: string;
30
- expiresAt: Date;
31
- }>;
32
- /**
33
- * Deletes all email verification requests for a user.
34
- */
35
- declare function deleteUserEmailVerificationRequest(userId: string): Promise<void>;
36
- /**
37
- * Sends a verification email with the OTP code.
38
- */
39
- declare function sendVerificationEmail(email: string, code: string): Promise<void>;
40
- /**
41
- * Sets the email verification request ID in a cookie.
42
- */
43
- declare function setEmailVerificationRequestCookie(request: typeof emailVerificationTable.$inferSelect): Promise<void>;
44
- /**
45
- * Removes the email verification request cookie.
46
- */
47
- declare function deleteEmailVerificationRequestCookie(): Promise<void>;
48
- /**
49
- * Retrieves the current email verification request based on session and cookie.
50
- */
51
- declare function getUserEmailVerificationRequestFromRequest(): Promise<{
52
- id: string;
53
- email: string;
54
- code: string;
55
- userId: string;
56
- expiresAt: Date;
57
- createdAt: Date;
58
- updatedAt: Date | null;
59
- } | null>;
60
- //#endregion
61
- export { createEmailVerificationRequest, deleteEmailVerificationRequestCookie, deleteUserEmailVerificationRequest, getUserEmailVerificationRequest, getUserEmailVerificationRequestFromRequest, initEmailVerification, sendVerificationEmail, setEmailVerificationRequestCookie };
62
- //# sourceMappingURL=email-verification.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-verification.d.cts","names":[],"sources":["../../../src/core/auth/email-verification.ts"],"mappings":";;;;;AAeA;iBAAsB,qBAAA,CAAA,GAAqB,OAAA;;;;iBAerB,+BAAA,CACpB,MAAA,UACA,EAAA,WAAU,OAAA;;;;;;;;;;;;iBAkBU,8BAAA,CACpB,MAAA,UACA,KAAA,WAAa,OAAA;;;;;;;;;;;;iBAsBO,kCAAA,CACpB,MAAA,WACC,OAAA;;;;iBASmB,qBAAA,CACpB,KAAA,UACA,IAAA,WACC,OAAA;;;;iBAOmB,iCAAA,CACpB,OAAA,SAAgB,sBAAA,CAAuB,YAAA,GACtC,OAAA;;;;iBAemB,oCAAA,CAAA,GAAwC,OAAA;;;;iBAQxC,0CAAA,CAAA,GAA0C,OAAA"}
@@ -1 +0,0 @@
1
- "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./validation.cjs`),t=require(`../event-bus.cjs`),n=require(`../../server/database/inject.cjs`),r=require(`../../server/database/schema.cjs`),i=require(`./augment.cjs`),a=require(`../../server/auth/password.cjs`),o=require(`../../server/auth/user.cjs`),s=require(`./email-verification.cjs`),c=require(`./session.cjs`);let l=require(`drizzle-orm`);async function u(e){try{let t=(await n.db.select({name:r.rolesTable.name}).from(r.usersToRolesTable).innerJoin(r.rolesTable,(0,l.eq)(r.usersToRolesTable.roleId,r.rolesTable.id)).where((0,l.eq)(r.usersToRolesTable.userId,e.id))).map(e=>e.name),i=(await n.db.select({name:r.permissionsTable.name}).from(r.usersToPermissionsTable).innerJoin(r.permissionsTable,(0,l.eq)(r.usersToPermissionsTable.permissionId,r.permissionsTable.id)).where((0,l.eq)(r.usersToPermissionsTable.userId,e.id))).map(e=>e.name),a=[];if(t.length>0){let e=(await n.db.select({id:r.rolesTable.id}).from(r.rolesTable).where((0,l.inArray)(r.rolesTable.name,t))).map(e=>e.id);e.length>0&&(a=(await n.db.select({name:r.permissionsTable.name}).from(r.rolesToPermissionsTable).innerJoin(r.permissionsTable,(0,l.eq)(r.rolesToPermissionsTable.permissionId,r.permissionsTable.id)).where((0,l.inArray)(r.rolesToPermissionsTable.roleId,e))).map(e=>e.name))}return{roles:t,permissions:Array.from(new Set([...i,...a]))}}catch(e){return console.error(`[Auth:RBAC] Failed to augment user:`,e),{roles:[],permissions:[]}}}const d=globalThis,f=d.__KRYO_AUTH_VALIDATORS__??new Set,p=d.__KRYO_SECURITY_REQUIREMENTS__??new Set,m=d.__KRYO_PASSWORD_RESET_VALIDATORS__??new Set,h=d.__KRYO_EMAIL_VERIFICATION_VALIDATORS__??new Set;d.__KRYO_AUTH_VALIDATORS__=f,d.__KRYO_SECURITY_REQUIREMENTS__=p,d.__KRYO_PASSWORD_RESET_VALIDATORS__=m,d.__KRYO_EMAIL_VERIFICATION_VALIDATORS__=h;async function g(e){f.add(e)}async function _(e){m.add(e)}async function v(e){h.add(e)}async function y(e){p.add(e)}async function b(e){for(let t of m){let n=await t(e);if(n)return n}return null}async function x(e){for(let t of h){let n=await t(e);if(n)return n}return null}async function S(e){return await i.augmentUser(e,await u(e))}async function C(e,t,n,r,i){if(!t)return console.warn(`User is required for security check`),{satisfied:!1,redirect:i??`/signin`};let a=Array.isArray(t.roles)?t.roles:[],o=Array.isArray(t.permissions)?t.permissions:[];if(n&&n.length>0&&!n.some(e=>a.includes(e)))return console.warn(`User lacks required roles: ${n.join(`, `)}`),{satisfied:!1,redirect:i};if(r&&r.length>0&&!r.every(e=>o.includes(e)))return console.warn(`User lacks required permissions: ${r.join(`, `)}`),{satisfied:!1,redirect:i};if(p)for(let n of p)try{let r=await n(e,t);if(r&&!r.satisfied)return{...r,redirect:r.redirect??i}}catch(e){console.error(`[Auth:Security] Requirement failed:`,e)}return{satisfied:!0}}async function w(n){let{email:r,password:i}=await e.loginSchema.parseAsync(n),s=await o.getUserFromEmail(r);if(!s)return{status:`ERROR`,message:`Invalid email or password`};let l=await o.getUserPasswordHash(s.id);if(!l||!await a.verifyPasswordHash(l,i))return{status:`ERROR`,message:`Invalid email or password`};for(let e of f){let t=await e(s.id);if(t)return t}let u={},d=await c.generateSessionToken(),p=await c.createSession(d,s.id,u);await c.setSessionTokenCookie(d,p.expiresAt);let m=await S(s);return await t.eventBus.publish(`auth:session-created`,{session:p,user:m}),{status:`SUCCESS`,session:{...p},user:{...m}}}async function T(n){let{email:r,username:i,password:l}=e.registerSchema.parse(n);if(!await o.verifyUsernameInput(i))throw Error(`Invalid username`);if(!await a.verifyPasswordStrength(l))throw Error(`Weak password`);let u=await o.createUser(r,i,l),d=await s.createEmailVerificationRequest(u.id,u.email);await s.sendVerificationEmail(d.email,d.code),await s.setEmailVerificationRequestCookie(d);let f={},p=await c.generateSessionToken(),m=await c.createSession(p,u.id,f);await c.setSessionTokenCookie(p,m.expiresAt);let h=await S(u);return await t.eventBus.publish(`auth:session-created`,{session:m,user:h}),{session:{...m},user:{...h}}}async function E(e,n){let r=await c.generateSessionToken(),i=await c.createSession(r,e,n);await c.setSessionTokenCookie(r,i.expiresAt);let a=await o.getUserById(e);return a&&await t.eventBus.publish(`auth:session-created`,{session:i,user:a}),{session:i?{...i}:null,user:a?{...a}:null}}async function D(){let{session:e,user:n}=await c.getCurrentSession();e&&(n&&await t.eventBus.publish(`auth:signed-out`,{userId:n.id}),await c.invalidateSession(e.id),await c.deleteSessionTokenCookie())}exports.checkSecurity=C,exports.finalizeLogin=E,exports.performFullUserAugmentation=S,exports.registerAuthValidator=g,exports.registerEmailVerificationValidator=v,exports.registerPasswordResetValidator=_,exports.registerSecurityRequirement=y,exports.runEmailVerificationValidators=x,exports.runPasswordResetValidators=b,exports.signIn=w,exports.signOut=D,exports.signUp=T;
@@ -1,110 +0,0 @@
1
- import { UserPermission, UserRole } from "../types.cjs";
2
- import { AuthResponse, FullUser, Session, SessionFlags, User } from "./types.cjs";
3
- import { LoginInput, RegisterInput } from "./validation.cjs";
4
- import { augmentSession, augmentUser, registerIdentityAugmenter, registerPasswordResetSessionAugmenter, registerSessionAugmenter } from "./augment.cjs";
5
-
6
- //#region src/core/auth/logic.d.ts
7
- /**
8
- * Registry for login validators (e.g. 2FA module)
9
- */
10
- type AuthValidator = (userId: string) => Promise<AuthResponse | null>;
11
- /**
12
- * Registry for Security Requirements (e.g. checking if 2FA is needed for a session)
13
- */
14
- type SecurityRequirement = (session: Session, user: FullUser) => Promise<{
15
- satisfied: boolean;
16
- redirect?: string;
17
- } | null>;
18
- /**
19
- * Registry for password reset validators (e.g. 2FA module requiring check during reset)
20
- */
21
- type PasswordResetValidator = (userId: string) => Promise<AuthResponse | null>;
22
- /**
23
- * Registry for email verification validators
24
- */
25
- type EmailVerificationValidator = (userId: string) => Promise<AuthResponse | null>;
26
- declare function registerAuthValidator(validator: AuthValidator): Promise<void>;
27
- declare function registerPasswordResetValidator(validator: PasswordResetValidator): Promise<void>;
28
- declare function registerEmailVerificationValidator(validator: EmailVerificationValidator): Promise<void>;
29
- declare function registerSecurityRequirement(requirement: SecurityRequirement): Promise<void>;
30
- declare function runPasswordResetValidators(userId: string): Promise<AuthResponse | null>;
31
- declare function runEmailVerificationValidators(userId: string): Promise<AuthResponse | null>;
32
- /**
33
- * Augments a base user with data from all registered modules.
34
- * This is now just a wrapper that includes core RBAC data.
35
- */
36
- declare function performFullUserAugmentation(user: User): Promise<FullUser>;
37
- /**
38
- * Checks if the current session satisfies all registered security requirements.
39
- */
40
- declare function checkSecurity(session: Session, user: FullUser, requiredRoles?: UserRole[], requiredPermissions?: UserPermission[], fallbackRedirect?: string): Promise<{
41
- satisfied: boolean;
42
- redirect: string | undefined;
43
- } | {
44
- satisfied: boolean;
45
- redirect?: undefined;
46
- }>;
47
- /**
48
- * Sign In Logic
49
- */
50
- declare function signIn(data: LoginInput): Promise<AuthResponse>;
51
- /**
52
- * Sign Up Logic
53
- */
54
- declare function signUp(data: RegisterInput): Promise<{
55
- session: {
56
- [x: string]: any;
57
- id: string;
58
- createdAt: Date;
59
- updatedAt: Date | null;
60
- userId: string;
61
- expiresAt: Date;
62
- active_organization_id: string | null;
63
- };
64
- user: {
65
- [x: string]: any;
66
- id: string;
67
- email: string;
68
- name: string;
69
- password: string | null;
70
- image: string | null;
71
- recovery_code: Buffer<ArrayBufferLike>;
72
- emailVerifiedAt: Date | null;
73
- createdAt: Date;
74
- updatedAt: Date | null;
75
- roles: UserRole[];
76
- permissions: UserPermission[];
77
- };
78
- }>;
79
- /**
80
- * Finalizes login after a challenge
81
- */
82
- declare function finalizeLogin(userId: string, flags: SessionFlags): Promise<{
83
- session: {
84
- [x: string]: any;
85
- id: string;
86
- createdAt: Date;
87
- updatedAt: Date | null;
88
- userId: string;
89
- expiresAt: Date;
90
- active_organization_id: string | null;
91
- } | null;
92
- user: {
93
- id: string;
94
- email: string;
95
- name: string;
96
- password: string | null;
97
- image: string | null;
98
- recovery_code: Buffer<ArrayBufferLike>;
99
- emailVerifiedAt: Date | null;
100
- createdAt: Date;
101
- updatedAt: Date | null;
102
- } | null;
103
- }>;
104
- /**
105
- * Sign Out
106
- */
107
- declare function signOut(): Promise<void>;
108
- //#endregion
109
- export { checkSecurity, finalizeLogin, performFullUserAugmentation, registerAuthValidator, registerEmailVerificationValidator, registerPasswordResetValidator, registerSecurityRequirement, runEmailVerificationValidators, runPasswordResetValidators, signIn, signOut, signUp };
110
- //# sourceMappingURL=logic.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logic.d.cts","names":[],"sources":["../../../src/core/auth/logic.ts"],"mappings":";;;;;;;;;KAyHK,aAAA,IAAiB,MAAA,aAAmB,OAAA,CAAQ,YAAA;;;;KAK5C,mBAAA,IACH,OAAA,EAAS,OAAA,EACT,IAAA,EAAM,QAAA,KACH,OAAA;EAAU,SAAA;EAAoB,QAAA;AAAA;;AAR0B;;KAaxD,sBAAA,IAA0B,MAAA,aAAmB,OAAA,CAAQ,YAAA;;;;KAKrD,0BAAA,IACH,MAAA,aACG,OAAA,CAAQ,YAAA;AAAA,iBA6BS,qBAAA,CAAsB,SAAA,EAAW,aAAA,GAAa,OAAA;AAAA,iBAI9C,8BAAA,CACpB,SAAA,EAAW,sBAAA,GAAsB,OAAA;AAAA,iBAKb,kCAAA,CACpB,SAAA,EAAW,0BAAA,GAA0B,OAAA;AAAA,iBAajB,2BAAA,CACpB,WAAA,EAAa,mBAAA,GAAmB,OAAA;AAAA,iBAKZ,0BAAA,CACpB,MAAA,WACC,OAAA,CAAQ,YAAA;AAAA,iBAQW,8BAAA,CACpB,MAAA,WACC,OAAA,CAAQ,YAAA;;;;AAnFgC;iBA+FrB,2BAAA,CACpB,IAAA,EAAM,IAAA,GACL,OAAA,CAAQ,QAAA;;;;iBAQW,aAAA,CACpB,OAAA,EAAS,OAAA,EACT,IAAA,EAAM,QAAA,EACN,aAAA,GAAgB,QAAA,IAChB,mBAAA,GAAsB,cAAA,IACtB,gBAAA,YAAyB,OAAA;;;;;;;;;;iBA+DL,MAAA,CAAO,IAAA,EAAM,UAAA,GAAa,OAAA,CAAQ,YAAA;;;AApIxD;iBAyKsB,MAAA,CAAO,IAAA,EAAM,aAAA,GAAa,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAjJhD;;iBAyLsB,aAAA,CAAc,MAAA,UAAgB,KAAA,EAAO,YAAA,GAAY,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBjD,OAAA,CAAA,GAAO,OAAA"}
@@ -1 +0,0 @@
1
- "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../server/database/inject.cjs`),t=require(`../../server/database/schema.cjs`),n=require(`./augment.cjs`),r=require(`./utils/encode.cjs`),i=require(`../../server/emails/index.cjs`),a=require(`./logic.cjs`);let o=require(`drizzle-orm`),s=require(`@oslojs/crypto/sha2`),c=require(`@oslojs/encoding`),l=require(`date-fns`),u=require(`next/headers`);async function d(n,i,a){let o=(0,c.encodeHexLowerCase)((0,s.sha256)(new TextEncoder().encode(n))),[u]=await e.db.insert(t.passwordResetSessionTable).values({id:o,email:a,code:r.generateRandomOTP(),expiresAt:new Date((0,l.addHours)(new Date,1)),userId:i}).returning();return u}async function f(r){let i=(0,c.encodeHexLowerCase)((0,s.sha256)(new TextEncoder().encode(r))),[l]=await e.db.select({session:t.passwordResetSessionTable,user:t.userTable}).from(t.passwordResetSessionTable).innerJoin(t.userTable,(0,o.eq)(t.passwordResetSessionTable.userId,t.userTable.id)).where((0,o.eq)(t.passwordResetSessionTable.id,i));if(!l||!l.user)return{session:null,user:null};let{session:u,user:d}=l;if(new Date>u.expiresAt)return await e.db.delete(t.passwordResetSessionTable).where((0,o.eq)(t.passwordResetSessionTable.id,u.id)),{session:null,user:null};let{password:f,recovery_code:p,...m}=d,h=await a.performFullUserAugmentation(m);return{session:await n.augmentPasswordResetSession(u),user:h}}async function p(n){await e.db.update(t.passwordResetSessionTable).set({emailVerified:!0}).where((0,o.eq)(t.passwordResetSessionTable.id,n))}async function m(n){await e.db.delete(t.passwordResetSessionTable).where((0,o.eq)(t.passwordResetSessionTable.userId,n))}async function h(){let e=(await(0,u.cookies)()).get(`password_reset_session`)?.value??null;if(e===null)return{session:null,user:null};let t=await f(e);return t.session===null&&await _(),t}async function g(e,t){(await(0,u.cookies)()).set(`password_reset_session`,e,{expires:t,sameSite:`lax`,httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`})}async function _(){(await(0,u.cookies)()).delete(`password_reset_session`)}async function v(e,t){await i.sendResetPassword(e,t)}exports.createPasswordResetSession=d,exports.deletePasswordResetSessionTokenCookie=_,exports.getCurrentPasswordResetSession=h,exports.invalidateUserPasswordResetSessions=m,exports.sendPasswordResetEmail=v,exports.setPasswordResetSessionAsEmailVerified=p,exports.setPasswordResetSessionTokenCookie=g,exports.validatePasswordResetSessionToken=f;
@@ -1,39 +0,0 @@
1
- import { PasswordResetAuthSession, PasswordResetSession } from "./types.cjs";
2
-
3
- //#region src/core/auth/password-reset.d.ts
4
- /**
5
- * Creates a new password reset session.
6
- */
7
- declare function createPasswordResetSession(token: string, userId: string, email: string): Promise<PasswordResetSession>;
8
- /**
9
- * Validates the password reset session token and retrieves user data.
10
- * The user data is augmented by registered modules (e.g. 2FA).
11
- */
12
- declare function validatePasswordResetSessionToken(token: string): Promise<PasswordResetAuthSession>;
13
- /**
14
- * Marks the password reset session as email verified.
15
- */
16
- declare function setPasswordResetSessionAsEmailVerified(sessionId: string): Promise<void>;
17
- /**
18
- * Invalidates all password reset sessions for a user.
19
- */
20
- declare function invalidateUserPasswordResetSessions(userId: string): Promise<void>;
21
- /**
22
- * Validates the current password reset session from cookies.
23
- */
24
- declare function getCurrentPasswordResetSession(): Promise<PasswordResetAuthSession>;
25
- /**
26
- * Sets the password reset session token cookie.
27
- */
28
- declare function setPasswordResetSessionTokenCookie(token: string, expiresAt: Date): Promise<void>;
29
- /**
30
- * Deletes the password reset session token cookie.
31
- */
32
- declare function deletePasswordResetSessionTokenCookie(): Promise<void>;
33
- /**
34
- * Sends a password reset email with the OTP code.
35
- */
36
- declare function sendPasswordResetEmail(email: string, code: string): Promise<void>;
37
- //#endregion
38
- export { createPasswordResetSession, deletePasswordResetSessionTokenCookie, getCurrentPasswordResetSession, invalidateUserPasswordResetSessions, sendPasswordResetEmail, setPasswordResetSessionAsEmailVerified, setPasswordResetSessionTokenCookie, validatePasswordResetSessionToken };
39
- //# sourceMappingURL=password-reset.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"password-reset.d.cts","names":[],"sources":["../../../src/core/auth/password-reset.ts"],"mappings":";;;;;AAqBA;iBAAsB,0BAAA,CACpB,KAAA,UACA,MAAA,UACA,KAAA,WACC,OAAA,CAAQ,oBAAA;;;;;iBAqBW,iCAAA,CACpB,KAAA,WACC,OAAA,CAAQ,wBAAA;;;;iBAyCW,sCAAA,CACpB,SAAA,WACC,OAAA;AA7CH;;;AAAA,iBAyDsB,mCAAA,CACpB,MAAA,WACC,OAAA;;;;iBASmB,8BAAA,CAAA,GAAkC,OAAA,CAAQ,wBAAA;;AAzBhE;;iBA6CsB,kCAAA,CACpB,KAAA,UACA,SAAA,EAAW,IAAA,GACV,OAAA;;;AAlCH;iBAiDsB,qCAAA,CAAA,GAAyC,OAAA;;;;iBAQzC,sBAAA,CACpB,KAAA,UACA,IAAA,WACC,OAAA"}
@@ -1 +0,0 @@
1
- "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../server/database/inject.cjs`),t=require(`../../server/database/schema.cjs`),n=require(`../notifications/service.cjs`);require(`../notifications/index.cjs`);let r=require(`drizzle-orm`);typeof window>`u`&&n.notificationService.init();async function i(){return await e.db.select().from(t.rolesTable).orderBy(t.rolesTable.name)}async function a(n){let[i]=await e.db.select().from(t.rolesTable).where((0,r.eq)(t.rolesTable.id,n));return i}async function o(n,r){return await e.db.insert(t.rolesTable).values({name:n,description:r}).returning()}async function s(n){return await e.db.delete(t.rolesTable).where((0,r.eq)(t.rolesTable.id,n))}async function c(){return await e.db.select().from(t.permissionsTable).orderBy(t.permissionsTable.name)}async function l(n,r){return await e.db.insert(t.permissionsTable).values({name:n,description:r}).returning()}async function u(n){return await e.db.delete(t.permissionsTable).where((0,r.eq)(t.permissionsTable.id,n))}async function d(n){return await e.db.select({id:t.permissionsTable.id,name:t.permissionsTable.name}).from(t.rolesToPermissionsTable).innerJoin(t.permissionsTable,(0,r.eq)(t.rolesToPermissionsTable.permissionId,t.permissionsTable.id)).where((0,r.eq)(t.rolesToPermissionsTable.roleId,n))}async function f(n,r){return await e.db.insert(t.rolesToPermissionsTable).values({roleId:n,permissionId:r}).onConflictDoNothing()}async function p(n,i){return await e.db.delete(t.rolesToPermissionsTable).where((0,r.and)((0,r.eq)(t.rolesToPermissionsTable.roleId,n),(0,r.eq)(t.rolesToPermissionsTable.permissionId,i)))}async function m(n,r){return await e.db.insert(t.usersToRolesTable).values({userId:n,roleId:r}).onConflictDoNothing()}async function h(n,i){return await e.db.delete(t.usersToRolesTable).where((0,r.and)((0,r.eq)(t.usersToRolesTable.userId,n),(0,r.eq)(t.usersToRolesTable.roleId,i)))}async function g(n,r){return await e.db.insert(t.usersToPermissionsTable).values({userId:n,permissionId:r}).onConflictDoNothing()}async function _(n,i){return await e.db.delete(t.usersToPermissionsTable).where((0,r.and)((0,r.eq)(t.usersToPermissionsTable.userId,n),(0,r.eq)(t.usersToPermissionsTable.permissionId,i)))}async function v(n){let i=await e.db.select({id:t.rolesTable.id,name:t.rolesTable.name}).from(t.usersToRolesTable).innerJoin(t.rolesTable,(0,r.eq)(t.usersToRolesTable.roleId,t.rolesTable.id)).where((0,r.eq)(t.usersToRolesTable.userId,n)),a=await e.db.select({id:t.permissionsTable.id,name:t.permissionsTable.name}).from(t.usersToPermissionsTable).innerJoin(t.permissionsTable,(0,r.eq)(t.usersToPermissionsTable.permissionId,t.permissionsTable.id)).where((0,r.eq)(t.usersToPermissionsTable.userId,n)),o=[];if(i.length>0){let n=i.map(e=>e.id);o=await e.db.select({id:t.permissionsTable.id,name:t.permissionsTable.name}).from(t.rolesToPermissionsTable).innerJoin(t.permissionsTable,(0,r.eq)(t.rolesToPermissionsTable.permissionId,t.permissionsTable.id)).where((0,r.inArray)(t.rolesToPermissionsTable.roleId,n))}let s=new Map;for(let e of[...a,...o])s.set(e.id,e);return{roles:i,directPermissions:a,effectivePermissions:Array.from(s.values())}}exports.assignPermissionToRole=f,exports.assignPermissionToUser=g,exports.assignRoleToUser=m,exports.createPermission=l,exports.createRole=o,exports.deletePermission=u,exports.deleteRole=s,exports.getPermissions=c,exports.getRoleById=a,exports.getRolePermissions=d,exports.getRoles=i,exports.getUserRbacData=v,exports.revokePermissionFromRole=p,exports.revokePermissionFromUser=_,exports.revokeRoleFromUser=h;
@@ -1,61 +0,0 @@
1
- import * as pg from "pg";
2
-
3
- //#region src/core/auth/rbac.d.ts
4
- /**
5
- * CORE RBAC LOGIC
6
- * This file handles all database operations for Roles and Permissions.
7
- */
8
- declare function getRoles(): Promise<{
9
- id: string;
10
- name: string;
11
- description: string | null;
12
- }[]>;
13
- declare function getRoleById(roleId: string): Promise<{
14
- id: string;
15
- name: string;
16
- description: string | null;
17
- }>;
18
- declare function createRole(name: string, description?: string): Promise<{
19
- id: string;
20
- name: string;
21
- description: string | null;
22
- }[]>;
23
- declare function deleteRole(roleId: string): Promise<pg.QueryResult<never>>;
24
- declare function getPermissions(): Promise<{
25
- id: string;
26
- name: string;
27
- description: string | null;
28
- }[]>;
29
- declare function createPermission(name: string, description?: string): Promise<{
30
- id: string;
31
- name: string;
32
- description: string | null;
33
- }[]>;
34
- declare function deletePermission(permissionId: string): Promise<pg.QueryResult<never>>;
35
- declare function getRolePermissions(roleId: string): Promise<{
36
- id: string;
37
- name: string;
38
- }[]>;
39
- declare function assignPermissionToRole(roleId: string, permissionId: string): Promise<pg.QueryResult<never>>;
40
- declare function revokePermissionFromRole(roleId: string, permissionId: string): Promise<pg.QueryResult<never>>;
41
- declare function assignRoleToUser(userId: string, roleId: string): Promise<pg.QueryResult<never>>;
42
- declare function revokeRoleFromUser(userId: string, roleId: string): Promise<pg.QueryResult<never>>;
43
- declare function assignPermissionToUser(userId: string, permissionId: string): Promise<pg.QueryResult<never>>;
44
- declare function revokePermissionFromUser(userId: string, permissionId: string): Promise<pg.QueryResult<never>>;
45
- declare function getUserRbacData(userId: string): Promise<{
46
- roles: {
47
- id: string;
48
- name: string;
49
- }[];
50
- directPermissions: {
51
- id: string;
52
- name: string;
53
- }[];
54
- effectivePermissions: {
55
- id: string;
56
- name: string;
57
- }[];
58
- }>;
59
- //#endregion
60
- export { assignPermissionToRole, assignPermissionToUser, assignRoleToUser, createPermission, createRole, deletePermission, deleteRole, getPermissions, getRoleById, getRolePermissions, getRoles, getUserRbacData, revokePermissionFromRole, revokePermissionFromUser, revokeRoleFromUser };
61
- //# sourceMappingURL=rbac.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rbac.d.cts","names":[],"sources":["../../../src/core/auth/rbac.ts"],"mappings":";;;;;;AAyBA;iBAAsB,QAAA,CAAA,GAAQ,OAAA;;;;;iBAIR,WAAA,CAAY,MAAA,WAAc,OAAA;;;;;iBAQ1B,UAAA,CAAW,IAAA,UAAc,WAAA,YAAoB,OAAA;;;;;iBAI7C,UAAA,CAAW,MAAA,WAAc,OAAA,CAAf,EAAA,CAAe,WAAA;AAAA,iBAMzB,cAAA,CAAA,GAAc,OAAA;;;;;iBAOd,gBAAA,CAAiB,IAAA,UAAc,WAAA,YAAoB,OAAA;;;;;iBAOnD,gBAAA,CAAiB,YAAA,WAAoB,OAAA,CAArB,EAAA,CAAqB,WAAA;AAAA,iBAQrC,kBAAA,CAAmB,MAAA,WAAc,OAAA;;;;iBAcjC,sBAAA,CACpB,MAAA,UACA,YAAA,WAAoB,OAAA,CAFsB,EAAA,CAEtB,WAAA;AAAA,iBAQA,wBAAA,CACpB,MAAA,UACA,YAAA,WAAoB,OAAA,CAFwB,EAAA,CAExB,WAAA;AAAA,iBAcA,gBAAA,CAAiB,MAAA,UAAgB,MAAA,WAAc,OAAA,CAA/B,EAAA,CAA+B,WAAA;AAAA,iBAO/C,kBAAA,CAAmB,MAAA,UAAgB,MAAA,WAAc,OAAA,CAA/B,EAAA,CAA+B,WAAA;AAAA,iBAWjD,sBAAA,CACpB,MAAA,UACA,YAAA,WAAoB,OAAA,CAFsB,EAAA,CAEtB,WAAA;AAAA,iBAQA,wBAAA,CACpB,MAAA,UACA,YAAA,WAAoB,OAAA,CAFwB,EAAA,CAExB,WAAA;AAAA,iBAYA,eAAA,CAAgB,MAAA,WAAc,OAAA"}
@@ -1 +0,0 @@
1
- "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../server/database/inject.cjs`),t=require(`../../server/database/schema.cjs`),n=require(`./augment.cjs`),r=require(`./logic.cjs`);let i=require(`drizzle-orm`),a=require(`@oslojs/crypto/sha2`),o=require(`@oslojs/encoding`),s=require(`date-fns`),c=require(`next/headers`),l=require(`next/navigation`);async function u(){return(await(0,c.headers)()).get(`x-forwarded-for`)}async function d(s){let c=(0,o.encodeHexLowerCase)((0,a.sha256)(new TextEncoder().encode(s))),[l]=await e.db.select({session:t.sessionTable,user:t.userTable}).from(t.sessionTable).innerJoin(t.userTable,(0,i.eq)(t.sessionTable.userId,t.userTable.id)).where((0,i.eq)(t.sessionTable.id,c));if(!l||!l.user)return{session:null,user:null};let{session:u,user:d}=l,{password:f,recovery_code:p,...m}=d;if(new Date>u.expiresAt)return await e.db.delete(t.sessionTable).where((0,i.eq)(t.sessionTable.id,u.id)),{session:null,user:null};let h=await r.performFullUserAugmentation(m),g=await n.augmentSession(u);return{session:g?{...g}:null,user:h?{...h}:null}}const f=async()=>{let e=(await(0,c.cookies)()).get(`session`)?.value??null;return e===null?{session:null,user:null}:await d(e)};async function p(n){await e.db.delete(t.sessionTable).where((0,i.eq)(t.sessionTable.id,n))}async function m(n){await e.db.delete(t.sessionTable).where((0,i.eq)(t.sessionTable.userId,n))}async function h(e,t){(await(0,c.cookies)()).set(`session`,e,{httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`,sameSite:`lax`,expires:t})}async function g(){(await(0,c.cookies)()).delete(`session`)}async function _(){let e=new Uint8Array(20);return crypto.getRandomValues(e),(0,o.encodeBase32LowerCaseNoPadding)(e).toLowerCase()}async function v(n,r,i){let c=(0,o.encodeHexLowerCase)((0,a.sha256)(new TextEncoder().encode(n))),[l]=await e.db.insert(t.sessionTable).values({id:c,expiresAt:new Date((0,s.addDays)(new Date,7)),active_organization_id:i.activeOrganizationId,userId:r}).returning();return l}async function y(){let{session:e}=await f();e&&(await p(e.id),await g()),(0,l.redirect)(`/signin`)}async function b(n,r){return(await e.db.select().from(t.sessionTable).where((0,i.eq)(t.sessionTable.userId,n))).map(e=>({id:e.id,createdAt:e.createdAt,expiresAt:e.expiresAt,isCurrent:e.id===r}))}async function x(n,r){await e.db.delete(t.sessionTable).where((0,i.and)((0,i.eq)(t.sessionTable.userId,n),(0,i.ne)(t.sessionTable.id,r)))}exports.createSession=v,exports.deleteSessionTokenCookie=g,exports.generateSessionToken=_,exports.getCurrentSession=f,exports.getIPAddress=u,exports.getUserSessions=b,exports.invalidateOtherSessions=x,exports.invalidateSession=p,exports.invalidateUserSessions=m,exports.sessionSignOut=y,exports.setSessionTokenCookie=h,exports.validateSessionToken=d;
@@ -1,54 +0,0 @@
1
- import { AuthSession, Session, SessionFlags, UserSession } from "./types.cjs";
2
-
3
- //#region src/core/auth/session.d.ts
4
- /**
5
- * Returns the user's IP address.
6
- */
7
- declare function getIPAddress(): Promise<string | null>;
8
- /**
9
- * Validates the session token.
10
- */
11
- declare function validateSessionToken(token: string): Promise<AuthSession>;
12
- /**
13
- * Returns the current user session from cookies.
14
- */
15
- declare const getCurrentSession: () => Promise<AuthSession>;
16
- /**
17
- * Invalidates a single session.
18
- */
19
- declare function invalidateSession(sessionId: string): Promise<void>;
20
- /**
21
- * Invalidates all user sessions.
22
- */
23
- declare function invalidateUserSessions(userId: string): Promise<void>;
24
- /**
25
- * Sets the session token in a cookie.
26
- */
27
- declare function setSessionTokenCookie(token: string, expiresAt: Date): Promise<void>;
28
- /**
29
- * Removes the session token cookie.
30
- */
31
- declare function deleteSessionTokenCookie(): Promise<void>;
32
- /**
33
- * Generates a new random session token.
34
- */
35
- declare function generateSessionToken(): Promise<string>;
36
- /**
37
- * Creates a new session in the database.
38
- */
39
- declare function createSession(token: string, userId: string, flags: SessionFlags): Promise<Session>;
40
- /**
41
- * Signs the user out and redirects to the sign-in page.
42
- */
43
- declare function sessionSignOut(): Promise<void>;
44
- /**
45
- * Get all active sessions for a user.
46
- */
47
- declare function getUserSessions(userId: string, currentSessionId: string): Promise<UserSession[]>;
48
- /**
49
- * Invalidate all sessions for a user except the specified current one.
50
- */
51
- declare function invalidateOtherSessions(userId: string, currentSessionId: string): Promise<void>;
52
- //#endregion
53
- export { createSession, deleteSessionTokenCookie, generateSessionToken, getCurrentSession, getIPAddress, getUserSessions, invalidateOtherSessions, invalidateSession, invalidateUserSessions, sessionSignOut, setSessionTokenCookie, validateSessionToken };
54
- //# sourceMappingURL=session.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.cts","names":[],"sources":["../../../src/core/auth/session.ts"],"mappings":";;;;;AA2BA;iBAAsB,YAAA,CAAA,GAAgB,OAAA;;;;iBAOhB,oBAAA,CACpB,KAAA,WACC,OAAA,CAAQ,WAAA;;;;cAyCE,iBAAA,QAA8B,OAAA,CAAQ,WAAA;;;;iBAc7B,iBAAA,CAAkB,SAAA,WAAoB,OAAA;AAd5D;;;AAAA,iBAqBsB,sBAAA,CAAuB,MAAA,WAAiB,OAAA;;AAP9D;;iBAcsB,qBAAA,CACpB,KAAA,UACA,SAAA,EAAW,IAAA,GACV,OAAA;;;AAVH;iBAwBsB,wBAAA,CAAA,GAA4B,OAAA;;;;iBAQ5B,oBAAA,CAAA,GAAwB,OAAA;;;;iBASxB,aAAA,CACpB,KAAA,UACA,MAAA,UACA,KAAA,EAAO,YAAA,GACN,OAAA,CAAQ,OAAA;;;;iBAmBW,cAAA,CAAA,GAAc,OAAA;;AAxCpC;;iBAsDsB,eAAA,CACpB,MAAA,UACA,gBAAA,WACC,OAAA,CAAQ,WAAA;;;AAjDX;iBAkEsB,uBAAA,CACpB,MAAA,UACA,gBAAA,WACC,OAAA"}
@@ -1,55 +0,0 @@
1
- import { passwordResetSessionTable, sessionTable, userTable } from "../../server/database/schema.cjs";
2
- import { UserPermission, UserRole } from "../types.cjs";
3
-
4
- //#region src/core/auth/types.d.ts
5
- type User = typeof userTable.$inferSelect;
6
- type Session = typeof sessionTable.$inferSelect & Record<string, any>;
7
- type PasswordResetSession = typeof passwordResetSessionTable.$inferSelect & Record<string, any>;
8
- /**
9
- * Represents a user with all potential extensions.
10
- * Use this type in UI components that require data added by modules.
11
- */
12
- type FullUser = User & Record<string, any> & {
13
- roles: UserRole[];
14
- permissions: UserPermission[];
15
- };
16
- /**
17
- * Basic session context.
18
- */
19
- interface AuthSession {
20
- session: Session | null;
21
- user: FullUser | null;
22
- }
23
- interface SessionFlags {
24
- [key: string]: any;
25
- }
26
- type UserSession = {
27
- id: string;
28
- createdAt: Date;
29
- expiresAt: Date;
30
- isCurrent: boolean;
31
- [key: string]: any;
32
- };
33
- type AuthResponse = {
34
- status: "SUCCESS";
35
- session: Session;
36
- user: FullUser;
37
- redirect?: string;
38
- } | {
39
- status: "CHALLENGE_REQUIRED";
40
- type: string;
41
- userId: string;
42
- tempToken?: string;
43
- redirect?: string;
44
- } | {
45
- status: "ERROR";
46
- message: string;
47
- redirect?: string;
48
- };
49
- interface PasswordResetAuthSession {
50
- session: PasswordResetSession | null;
51
- user: FullUser | null;
52
- }
53
- //#endregion
54
- export { AuthResponse, AuthSession, FullUser, PasswordResetAuthSession, PasswordResetSession, Session, SessionFlags, User, UserSession };
55
- //# sourceMappingURL=types.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/core/auth/types.ts"],"mappings":";;;;KASY,IAAA,UAAc,SAAA,CAAU,YAAA;AAAA,KACxB,OAAA,UAAiB,YAAA,CAAa,YAAA,GAAe,MAAA;AAAA,KAC7C,oBAAA,UACH,yBAAA,CAA0B,YAAA,GAAe,MAAA;;;;AAFlD;KAQY,QAAA,GAAW,IAAA,GACrB,MAAA;EACE,KAAA,EAAO,QAAA;EACP,WAAA,EAAa,cAAA;AAAA;;;;UAMA,WAAA;EACf,OAAA,EAAS,OAAA;EACT,IAAA,EAAM,QAAA;AAAA;AAAA,UAGS,YAAA;EAAA,CACd,GAAA;AAAA;AAAA,KAGS,WAAA;EACV,EAAA;EACA,SAAA,EAAW,IAAA;EACX,SAAA,EAAW,IAAA;EACX,SAAA;EAAA,CACC,GAAA;AAAA;AAAA,KAGS,YAAA;EACN,MAAA;EAAmB,OAAA,EAAS,OAAA;EAAS,IAAA,EAAM,QAAA;EAAU,QAAA;AAAA;EAEvD,MAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;AAAA;EAEE,MAAA;EAAiB,OAAA;EAAiB,QAAA;AAAA;AAAA,UAEvB,wBAAA;EACf,OAAA,EAAS,oBAAA;EACT,IAAA,EAAM,QAAA;AAAA"}
@@ -1 +0,0 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);let e=require(`@oslojs/encoding`);function t(t=6){let n=new Uint8Array(5);return crypto.getRandomValues(n),(0,e.encodeBase32UpperCaseNoPadding)(n).substring(0,t)}function n(){let t=new Uint8Array(10);return crypto.getRandomValues(t),(0,e.encodeBase32UpperCaseNoPadding)(t)}exports.generateRandomOTP=t,exports.generateRandomRecoveryCode=n;
@@ -1,15 +0,0 @@
1
- //#region src/core/auth/utils/encode.d.ts
2
- /**
3
- * Generates a random one-time code (OTP).
4
- * @param length Length of the generated code (default 6).
5
- * @returns A random uppercase base32 string.
6
- */
7
- declare function generateRandomOTP(length?: number): string;
8
- /**
9
- * Generates a random recovery code.
10
- * @returns A random uppercase base32 string.
11
- */
12
- declare function generateRandomRecoveryCode(): string;
13
- //#endregion
14
- export { generateRandomOTP, generateRandomRecoveryCode };
15
- //# sourceMappingURL=encode.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encode.d.cts","names":[],"sources":["../../../../src/core/auth/utils/encode.ts"],"mappings":";;AAOA;;;;iBAAgB,iBAAA,CAAkB,MAAA;AAUlC;;;;AAAA,iBAAgB,0BAAA,CAAA"}
@@ -1 +0,0 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);let e=require(`@oslojs/encoding`),t=require(`node:crypto`),n=require(`@oslojs/binary`);const r=process.env.ENCRYPTION_KEY;if(!r)throw Error(`ENCRYPTION_KEY environment variable is not set`);const i=(0,e.decodeBase64)(r);function a(e){let r=new Uint8Array(16);crypto.getRandomValues(r);let a=(0,t.createCipheriv)(`aes-128-gcm`,i,r),o=new n.DynamicBuffer(0);return o.write(r),o.write(a.update(e)),o.write(a.final()),o.write(a.getAuthTag()),o.bytes()}function o(e){return a(new TextEncoder().encode(e))}function s(e){if(e.byteLength<33)throw Error(`Invalid encrypted data length`);let r=e.slice(0,16),a=e.slice(e.byteLength-16),o=e.slice(16,e.byteLength-16),s=(0,t.createDecipheriv)(`aes-128-gcm`,i,r);s.setAuthTag(a);let c=new n.DynamicBuffer(0);return c.write(s.update(o)),c.write(s.final()),c.bytes()}function c(e){return new TextDecoder().decode(s(e))}exports.decrypt=s,exports.decryptToString=c,exports.encrypt=a,exports.encryptString=o;