@spfn/auth 0.1.0-alpha.1 → 0.1.0-alpha.86

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 (124) hide show
  1. package/README.md +250 -0
  2. package/dist/adapters/nextjs/api.d.ts +446 -0
  3. package/dist/adapters/nextjs/api.js +3279 -0
  4. package/dist/adapters/nextjs/api.js.map +1 -0
  5. package/dist/adapters/nextjs/server.d.ts +246 -0
  6. package/dist/adapters/nextjs/server.js +3645 -0
  7. package/dist/adapters/nextjs/server.js.map +1 -0
  8. package/dist/index.d.ts +3 -46
  9. package/dist/index.js +777 -645
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/api/auth-codes-verify.d.ts +37 -0
  12. package/dist/lib/api/auth-codes-verify.js +2949 -0
  13. package/dist/lib/api/auth-codes-verify.js.map +1 -0
  14. package/dist/lib/api/auth-codes.d.ts +37 -0
  15. package/dist/lib/api/auth-codes.js +2949 -0
  16. package/dist/lib/api/auth-codes.js.map +1 -0
  17. package/dist/lib/api/auth-exists.d.ts +38 -0
  18. package/dist/lib/api/auth-exists.js +2949 -0
  19. package/dist/lib/api/auth-exists.js.map +1 -0
  20. package/dist/lib/api/auth-invitations-accept.d.ts +38 -0
  21. package/dist/lib/api/auth-invitations-accept.js +2883 -0
  22. package/dist/lib/api/auth-invitations-accept.js.map +1 -0
  23. package/dist/lib/api/auth-invitations-cancel.d.ts +37 -0
  24. package/dist/lib/api/auth-invitations-cancel.js +2883 -0
  25. package/dist/lib/api/auth-invitations-cancel.js.map +1 -0
  26. package/dist/lib/api/auth-invitations-delete.d.ts +36 -0
  27. package/dist/lib/api/auth-invitations-delete.js +2883 -0
  28. package/dist/lib/api/auth-invitations-delete.js.map +1 -0
  29. package/dist/lib/api/auth-invitations-resend.d.ts +37 -0
  30. package/dist/lib/api/auth-invitations-resend.js +2883 -0
  31. package/dist/lib/api/auth-invitations-resend.js.map +1 -0
  32. package/dist/lib/api/auth-invitations.d.ts +109 -0
  33. package/dist/lib/api/auth-invitations.js +2887 -0
  34. package/dist/lib/api/auth-invitations.js.map +1 -0
  35. package/dist/lib/api/auth-keys-rotate.d.ts +37 -0
  36. package/dist/lib/api/auth-keys-rotate.js +2949 -0
  37. package/dist/lib/api/auth-keys-rotate.js.map +1 -0
  38. package/dist/lib/api/auth-login.d.ts +39 -0
  39. package/dist/lib/api/auth-login.js +2949 -0
  40. package/dist/lib/api/auth-login.js.map +1 -0
  41. package/dist/lib/api/auth-logout.d.ts +36 -0
  42. package/dist/lib/api/auth-logout.js +2949 -0
  43. package/dist/lib/api/auth-logout.js.map +1 -0
  44. package/dist/lib/api/auth-me.d.ts +50 -0
  45. package/dist/lib/api/auth-me.js +2949 -0
  46. package/dist/lib/api/auth-me.js.map +1 -0
  47. package/dist/lib/api/auth-password.d.ts +36 -0
  48. package/dist/lib/api/auth-password.js +2949 -0
  49. package/dist/lib/api/auth-password.js.map +1 -0
  50. package/dist/lib/api/auth-register.d.ts +38 -0
  51. package/dist/lib/api/auth-register.js +2949 -0
  52. package/dist/lib/api/auth-register.js.map +1 -0
  53. package/dist/lib/api/index.d.ts +356 -0
  54. package/dist/lib/api/index.js +3261 -0
  55. package/dist/lib/api/index.js.map +1 -0
  56. package/dist/lib/config.d.ts +70 -0
  57. package/dist/lib/config.js +64 -0
  58. package/dist/lib/config.js.map +1 -0
  59. package/dist/lib/contracts/auth.d.ts +41 -1
  60. package/dist/lib/contracts/auth.js +28 -0
  61. package/dist/lib/contracts/auth.js.map +1 -1
  62. package/dist/lib/contracts/index.d.ts +1 -1
  63. package/dist/lib/contracts/index.js +28 -0
  64. package/dist/lib/contracts/index.js.map +1 -1
  65. package/dist/lib/crypto.d.ts +76 -0
  66. package/dist/lib/crypto.js +127 -0
  67. package/dist/lib/crypto.js.map +1 -0
  68. package/dist/lib/index.d.ts +4 -0
  69. package/dist/lib/index.js +313 -0
  70. package/dist/lib/index.js.map +1 -0
  71. package/dist/lib/session.d.ts +68 -0
  72. package/dist/lib/session.js +126 -0
  73. package/dist/lib/session.js.map +1 -0
  74. package/dist/{api-BcQM4WKb.d.ts → lib/types/api.d.ts} +2 -2
  75. package/dist/lib/types/api.js +1 -0
  76. package/dist/lib/types/api.js.map +1 -0
  77. package/dist/lib/types/index.d.ts +3 -0
  78. package/dist/lib/types/index.js +2647 -0
  79. package/dist/lib/types/index.js.map +1 -0
  80. package/dist/lib/types/schemas.d.ts +45 -0
  81. package/dist/lib/types/schemas.js +2647 -0
  82. package/dist/lib/types/schemas.js.map +1 -0
  83. package/dist/lib.d.ts +2 -0
  84. package/dist/lib.js +1 -0
  85. package/dist/lib.js.map +1 -0
  86. package/dist/plugin.js +777 -645
  87. package/dist/plugin.js.map +1 -1
  88. package/dist/server/entities/index.d.ts +1 -0
  89. package/dist/server/entities/index.js +23 -27
  90. package/dist/server/entities/index.js.map +1 -1
  91. package/dist/server/entities/invitations.js +12 -9
  92. package/dist/server/entities/invitations.js.map +1 -1
  93. package/dist/server/entities/permissions.js +8 -3
  94. package/dist/server/entities/permissions.js.map +1 -1
  95. package/dist/server/entities/role-permissions.js +12 -9
  96. package/dist/server/entities/role-permissions.js.map +1 -1
  97. package/dist/server/entities/roles.js +8 -3
  98. package/dist/server/entities/roles.js.map +1 -1
  99. package/dist/server/entities/schema.d.ts +14 -0
  100. package/dist/server/entities/schema.js +7 -0
  101. package/dist/server/entities/schema.js.map +1 -0
  102. package/dist/server/entities/user-permissions.js +14 -12
  103. package/dist/server/entities/user-permissions.js.map +1 -1
  104. package/dist/server/entities/user-public-keys.js +12 -9
  105. package/dist/server/entities/user-public-keys.js.map +1 -1
  106. package/dist/server/entities/user-social-accounts.js +12 -9
  107. package/dist/server/entities/user-social-accounts.js.map +1 -1
  108. package/dist/server/entities/users.js +10 -6
  109. package/dist/server/entities/users.js.map +1 -1
  110. package/dist/server/entities/verification-codes.js +8 -3
  111. package/dist/server/entities/verification-codes.js.map +1 -1
  112. package/dist/server/routes/auth/index.js +495 -512
  113. package/dist/server/routes/auth/index.js.map +1 -1
  114. package/dist/server/routes/index.js +775 -545
  115. package/dist/server/routes/index.js.map +1 -1
  116. package/dist/server/routes/invitations/index.js +416 -230
  117. package/dist/server/routes/invitations/index.js.map +1 -1
  118. package/dist/server.d.ts +91 -62
  119. package/dist/server.js +320 -327
  120. package/dist/server.js.map +1 -1
  121. package/migrations/{0000_tired_gambit.sql → 0000_complex_swordsman.sql} +2 -0
  122. package/migrations/meta/0000_snapshot.json +4 -2
  123. package/migrations/meta/_journal.json +2 -2
  124. package/package.json +30 -3
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @spfn/auth - Global Configuration
3
+ *
4
+ * Manages global auth configuration including session TTL
5
+ */
6
+ /**
7
+ * Cookie names used by SPFN Auth
8
+ */
9
+ declare const COOKIE_NAMES: {
10
+ /** Encrypted session data (userId, privateKey, keyId, algorithm) */
11
+ readonly SESSION: "spfn_session";
12
+ /** Current key ID (for key rotation) */
13
+ readonly SESSION_KEY_ID: "spfn_session_key_id";
14
+ };
15
+ /**
16
+ * Parse duration string to seconds
17
+ *
18
+ * Supports: '30d', '12h', '45m', '3600s', or plain number
19
+ *
20
+ * @example
21
+ * parseDuration('30d') // 2592000 (30 days in seconds)
22
+ * parseDuration('12h') // 43200
23
+ * parseDuration('45m') // 2700
24
+ * parseDuration('3600') // 3600
25
+ */
26
+ declare function parseDuration(duration: string | number): number;
27
+ /**
28
+ * Auth configuration
29
+ */
30
+ interface AuthConfig {
31
+ /**
32
+ * Default session TTL in seconds or duration string
33
+ *
34
+ * Supports:
35
+ * - Number: seconds (e.g., 2592000)
36
+ * - String: '30d', '12h', '45m', '3600s'
37
+ *
38
+ * @default 7d (7 days)
39
+ */
40
+ sessionTtl?: string | number;
41
+ }
42
+ /**
43
+ * Configure global auth settings
44
+ *
45
+ * @param config - Auth configuration
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * configureAuth({
50
+ * sessionTtl: '30d', // 30 days
51
+ * });
52
+ * ```
53
+ */
54
+ declare function configureAuth(config: AuthConfig): void;
55
+ /**
56
+ * Get current auth configuration
57
+ */
58
+ declare function getAuthConfig(): AuthConfig;
59
+ /**
60
+ * Get session TTL in seconds
61
+ *
62
+ * Priority:
63
+ * 1. Runtime override (remember parameter)
64
+ * 2. Global config (configureAuth)
65
+ * 3. Environment variable (SPFN_AUTH_SESSION_TTL)
66
+ * 4. Default (7 days)
67
+ */
68
+ declare function getSessionTtl(override?: string | number): number;
69
+
70
+ export { type AuthConfig, COOKIE_NAMES, configureAuth, getAuthConfig, getSessionTtl, parseDuration };
@@ -0,0 +1,64 @@
1
+ // src/lib/config.ts
2
+ var COOKIE_NAMES = {
3
+ /** Encrypted session data (userId, privateKey, keyId, algorithm) */
4
+ SESSION: "spfn_session",
5
+ /** Current key ID (for key rotation) */
6
+ SESSION_KEY_ID: "spfn_session_key_id"
7
+ };
8
+ function parseDuration(duration) {
9
+ if (typeof duration === "number") {
10
+ return duration;
11
+ }
12
+ const match = duration.match(/^(\d+)([dhms]?)$/);
13
+ if (!match) {
14
+ throw new Error(`Invalid duration format: ${duration}. Use format like '30d', '12h', '45m', '3600s', or plain number.`);
15
+ }
16
+ const value = parseInt(match[1], 10);
17
+ const unit = match[2] || "s";
18
+ switch (unit) {
19
+ case "d":
20
+ return value * 24 * 60 * 60;
21
+ case "h":
22
+ return value * 60 * 60;
23
+ case "m":
24
+ return value * 60;
25
+ case "s":
26
+ return value;
27
+ default:
28
+ throw new Error(`Unknown duration unit: ${unit}`);
29
+ }
30
+ }
31
+ var globalConfig = {
32
+ sessionTtl: "7d"
33
+ // Default: 7 days
34
+ };
35
+ function configureAuth(config) {
36
+ globalConfig = {
37
+ ...globalConfig,
38
+ ...config
39
+ };
40
+ }
41
+ function getAuthConfig() {
42
+ return { ...globalConfig };
43
+ }
44
+ function getSessionTtl(override) {
45
+ if (override !== void 0) {
46
+ return parseDuration(override);
47
+ }
48
+ if (globalConfig.sessionTtl !== void 0) {
49
+ return parseDuration(globalConfig.sessionTtl);
50
+ }
51
+ const envTtl = process.env.SPFN_AUTH_SESSION_TTL;
52
+ if (envTtl) {
53
+ return parseDuration(envTtl);
54
+ }
55
+ return 7 * 24 * 60 * 60;
56
+ }
57
+ export {
58
+ COOKIE_NAMES,
59
+ configureAuth,
60
+ getAuthConfig,
61
+ getSessionTtl,
62
+ parseDuration
63
+ };
64
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/config.ts"],"sourcesContent":["/**\n * @spfn/auth - Global Configuration\n *\n * Manages global auth configuration including session TTL\n */\n\n/**\n * Cookie names used by SPFN Auth\n */\nexport const COOKIE_NAMES = {\n /** Encrypted session data (userId, privateKey, keyId, algorithm) */\n SESSION: 'spfn_session',\n /** Current key ID (for key rotation) */\n SESSION_KEY_ID: 'spfn_session_key_id',\n} as const;\n\n/**\n * Parse duration string to seconds\n *\n * Supports: '30d', '12h', '45m', '3600s', or plain number\n *\n * @example\n * parseDuration('30d') // 2592000 (30 days in seconds)\n * parseDuration('12h') // 43200\n * parseDuration('45m') // 2700\n * parseDuration('3600') // 3600\n */\nexport function parseDuration(duration: string | number): number\n{\n if (typeof duration === 'number')\n {\n return duration;\n }\n\n const match = duration.match(/^(\\d+)([dhms]?)$/);\n if (!match)\n {\n throw new Error(`Invalid duration format: ${duration}. Use format like '30d', '12h', '45m', '3600s', or plain number.`);\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2] || 's';\n\n switch (unit)\n {\n case 'd':\n return value * 24 * 60 * 60;\n case 'h':\n return value * 60 * 60;\n case 'm':\n return value * 60;\n case 's':\n return value;\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Auth configuration\n */\nexport interface AuthConfig\n{\n /**\n * Default session TTL in seconds or duration string\n *\n * Supports:\n * - Number: seconds (e.g., 2592000)\n * - String: '30d', '12h', '45m', '3600s'\n *\n * @default 7d (7 days)\n */\n sessionTtl?: string | number;\n}\n\n/**\n * Global auth configuration state\n */\nlet globalConfig: AuthConfig = {\n sessionTtl: '7d', // Default: 7 days\n};\n\n/**\n * Configure global auth settings\n *\n * @param config - Auth configuration\n *\n * @example\n * ```typescript\n * configureAuth({\n * sessionTtl: '30d', // 30 days\n * });\n * ```\n */\nexport function configureAuth(config: AuthConfig): void\n{\n globalConfig = {\n ...globalConfig,\n ...config,\n };\n}\n\n/**\n * Get current auth configuration\n */\nexport function getAuthConfig(): AuthConfig\n{\n return { ...globalConfig };\n}\n\n/**\n * Get session TTL in seconds\n *\n * Priority:\n * 1. Runtime override (remember parameter)\n * 2. Global config (configureAuth)\n * 3. Environment variable (SPFN_AUTH_SESSION_TTL)\n * 4. Default (7 days)\n */\nexport function getSessionTtl(override?: string | number): number\n{\n // 1. Runtime override\n if (override !== undefined)\n {\n return parseDuration(override);\n }\n\n // 2. Global config\n if (globalConfig.sessionTtl !== undefined)\n {\n return parseDuration(globalConfig.sessionTtl);\n }\n\n // 3. Environment variable\n const envTtl = process.env.SPFN_AUTH_SESSION_TTL;\n if (envTtl)\n {\n return parseDuration(envTtl);\n }\n\n // 4. Default: 7 days\n return 7 * 24 * 60 * 60;\n}"],"mappings":";AASO,IAAM,eAAe;AAAA;AAAA,EAExB,SAAS;AAAA;AAAA,EAET,gBAAgB;AACpB;AAaO,SAAS,cAAc,UAC9B;AACI,MAAI,OAAO,aAAa,UACxB;AACI,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,SAAS,MAAM,kBAAkB;AAC/C,MAAI,CAAC,OACL;AACI,UAAM,IAAI,MAAM,4BAA4B,QAAQ,kEAAkE;AAAA,EAC1H;AAEA,QAAM,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AACnC,QAAM,OAAO,MAAM,CAAC,KAAK;AAEzB,UAAQ,MACR;AAAA,IACI,KAAK;AACD,aAAO,QAAQ,KAAK,KAAK;AAAA,IAC7B,KAAK;AACD,aAAO,QAAQ,KAAK;AAAA,IACxB,KAAK;AACD,aAAO,QAAQ;AAAA,IACnB,KAAK;AACD,aAAO;AAAA,IACX;AACI,YAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,EACxD;AACJ;AAsBA,IAAI,eAA2B;AAAA,EAC3B,YAAY;AAAA;AAChB;AAcO,SAAS,cAAc,QAC9B;AACI,iBAAe;AAAA,IACX,GAAG;AAAA,IACH,GAAG;AAAA,EACP;AACJ;AAKO,SAAS,gBAChB;AACI,SAAO,EAAE,GAAG,aAAa;AAC7B;AAWO,SAAS,cAAc,UAC9B;AAEI,MAAI,aAAa,QACjB;AACI,WAAO,cAAc,QAAQ;AAAA,EACjC;AAGA,MAAI,aAAa,eAAe,QAChC;AACI,WAAO,cAAc,aAAa,UAAU;AAAA,EAChD;AAGA,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,QACJ;AACI,WAAO,cAAc,MAAM;AAAA,EAC/B;AAGA,SAAO,IAAI,KAAK,KAAK;AACzB;","names":[]}
@@ -258,5 +258,45 @@ declare const changePasswordContract: {
258
258
  }>;
259
259
  }>]>;
260
260
  };
261
+ /**
262
+ * GET /me - Get current user info
263
+ *
264
+ * Returns authenticated user's information including role and permissions
265
+ * Requires authentication
266
+ * Final path: /_auth/me (prefix added from package.json)
267
+ */
268
+ declare const getMeContract: {
269
+ readonly method: "GET";
270
+ readonly path: "/_auth/me";
271
+ readonly body: _sinclair_typebox.TObject<{}>;
272
+ readonly response: _sinclair_typebox.TUnion<[_sinclair_typebox.TObject<{
273
+ success: _sinclair_typebox.TLiteral<true>;
274
+ data: _sinclair_typebox.TObject<{
275
+ userId: _sinclair_typebox.TString;
276
+ email: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
277
+ phone: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
278
+ role: _sinclair_typebox.TObject<{
279
+ id: _sinclair_typebox.TNumber;
280
+ name: _sinclair_typebox.TString;
281
+ displayName: _sinclair_typebox.TString;
282
+ priority: _sinclair_typebox.TNumber;
283
+ }>;
284
+ permissions: _sinclair_typebox.TArray<_sinclair_typebox.TObject<{
285
+ id: _sinclair_typebox.TNumber;
286
+ name: _sinclair_typebox.TString;
287
+ displayName: _sinclair_typebox.TString;
288
+ category: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
289
+ }>>;
290
+ }>;
291
+ message: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
292
+ }>, _sinclair_typebox.TObject<{
293
+ success: _sinclair_typebox.TLiteral<false>;
294
+ error: _sinclair_typebox.TObject<{
295
+ code: _sinclair_typebox.TString;
296
+ message: _sinclair_typebox.TString;
297
+ details: _sinclair_typebox.TOptional<_sinclair_typebox.TAny>;
298
+ }>;
299
+ }>]>;
300
+ };
261
301
 
262
- export { changePasswordContract, checkAccountExistsContract, loginContract, logoutContract, registerContract, rotateKeyContract, sendVerificationCodeContract, verifyCodeContract };
302
+ export { changePasswordContract, checkAccountExistsContract, getMeContract, loginContract, logoutContract, registerContract, rotateKeyContract, sendVerificationCodeContract, verifyCodeContract };
@@ -2910,9 +2910,37 @@ var changePasswordContract = {
2910
2910
  })
2911
2911
  )
2912
2912
  };
2913
+ var getMeContract = {
2914
+ method: "GET",
2915
+ path: "/_auth/me",
2916
+ body: Type.Object({}),
2917
+ response: ApiResponseSchema(
2918
+ Type.Object({
2919
+ userId: Type.String({ description: "User ID" }),
2920
+ email: Type.Optional(Type.String({ description: "User email address" })),
2921
+ phone: Type.Optional(Type.String({ description: "User phone number" })),
2922
+ role: Type.Object({
2923
+ id: Type.Number({ description: "Role ID" }),
2924
+ name: Type.String({ description: "Role name (e.g., user, admin)" }),
2925
+ displayName: Type.String({ description: "Display name for UI" }),
2926
+ priority: Type.Number({ description: "Role priority level" })
2927
+ }, { description: "User role information" }),
2928
+ permissions: Type.Array(
2929
+ Type.Object({
2930
+ id: Type.Number({ description: "Permission ID" }),
2931
+ name: Type.String({ description: "Permission name (e.g., user:delete)" }),
2932
+ displayName: Type.String({ description: "Display name for UI" }),
2933
+ category: Type.Optional(Type.String({ description: "Permission category" }))
2934
+ }),
2935
+ { description: "List of permissions granted through role" }
2936
+ )
2937
+ })
2938
+ )
2939
+ };
2913
2940
  export {
2914
2941
  changePasswordContract,
2915
2942
  checkAccountExistsContract,
2943
+ getMeContract,
2916
2944
  loginContract,
2917
2945
  logoutContract,
2918
2946
  registerContract,