@spfn/auth 0.1.0-alpha.88 → 0.2.0-beta.2

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 (151) hide show
  1. package/README.md +1385 -1199
  2. package/dist/config.d.ts +405 -0
  3. package/dist/config.js +240 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/dto-CLYtuAom.d.ts +630 -0
  6. package/dist/errors.d.ts +196 -0
  7. package/dist/errors.js +173 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/index.d.ts +273 -14
  10. package/dist/index.js +511 -6665
  11. package/dist/index.js.map +1 -1
  12. package/dist/nextjs/api.js +345 -0
  13. package/dist/nextjs/api.js.map +1 -0
  14. package/dist/{adapters/nextjs → nextjs}/server.d.ts +47 -65
  15. package/dist/nextjs/server.js +179 -0
  16. package/dist/nextjs/server.js.map +1 -0
  17. package/dist/server.d.ts +4328 -529
  18. package/dist/server.js +7841 -1247
  19. package/dist/server.js.map +1 -1
  20. package/migrations/{0000_skinny_christian_walker.sql → 0000_marvelous_justice.sql} +53 -23
  21. package/migrations/meta/0000_snapshot.json +281 -46
  22. package/migrations/meta/_journal.json +2 -2
  23. package/package.json +31 -31
  24. package/dist/adapters/nextjs/api.d.ts +0 -446
  25. package/dist/adapters/nextjs/api.js +0 -3279
  26. package/dist/adapters/nextjs/api.js.map +0 -1
  27. package/dist/adapters/nextjs/server.js +0 -3645
  28. package/dist/adapters/nextjs/server.js.map +0 -1
  29. package/dist/lib/api/auth-codes-verify.d.ts +0 -37
  30. package/dist/lib/api/auth-codes-verify.js +0 -2949
  31. package/dist/lib/api/auth-codes-verify.js.map +0 -1
  32. package/dist/lib/api/auth-codes.d.ts +0 -37
  33. package/dist/lib/api/auth-codes.js +0 -2949
  34. package/dist/lib/api/auth-codes.js.map +0 -1
  35. package/dist/lib/api/auth-exists.d.ts +0 -38
  36. package/dist/lib/api/auth-exists.js +0 -2949
  37. package/dist/lib/api/auth-exists.js.map +0 -1
  38. package/dist/lib/api/auth-invitations-accept.d.ts +0 -38
  39. package/dist/lib/api/auth-invitations-accept.js +0 -2883
  40. package/dist/lib/api/auth-invitations-accept.js.map +0 -1
  41. package/dist/lib/api/auth-invitations-cancel.d.ts +0 -37
  42. package/dist/lib/api/auth-invitations-cancel.js +0 -2883
  43. package/dist/lib/api/auth-invitations-cancel.js.map +0 -1
  44. package/dist/lib/api/auth-invitations-delete.d.ts +0 -36
  45. package/dist/lib/api/auth-invitations-delete.js +0 -2883
  46. package/dist/lib/api/auth-invitations-delete.js.map +0 -1
  47. package/dist/lib/api/auth-invitations-resend.d.ts +0 -37
  48. package/dist/lib/api/auth-invitations-resend.js +0 -2883
  49. package/dist/lib/api/auth-invitations-resend.js.map +0 -1
  50. package/dist/lib/api/auth-invitations.d.ts +0 -109
  51. package/dist/lib/api/auth-invitations.js +0 -2887
  52. package/dist/lib/api/auth-invitations.js.map +0 -1
  53. package/dist/lib/api/auth-keys-rotate.d.ts +0 -37
  54. package/dist/lib/api/auth-keys-rotate.js +0 -2949
  55. package/dist/lib/api/auth-keys-rotate.js.map +0 -1
  56. package/dist/lib/api/auth-login.d.ts +0 -39
  57. package/dist/lib/api/auth-login.js +0 -2949
  58. package/dist/lib/api/auth-login.js.map +0 -1
  59. package/dist/lib/api/auth-logout.d.ts +0 -36
  60. package/dist/lib/api/auth-logout.js +0 -2949
  61. package/dist/lib/api/auth-logout.js.map +0 -1
  62. package/dist/lib/api/auth-me.d.ts +0 -50
  63. package/dist/lib/api/auth-me.js +0 -2949
  64. package/dist/lib/api/auth-me.js.map +0 -1
  65. package/dist/lib/api/auth-password.d.ts +0 -36
  66. package/dist/lib/api/auth-password.js +0 -2949
  67. package/dist/lib/api/auth-password.js.map +0 -1
  68. package/dist/lib/api/auth-register.d.ts +0 -38
  69. package/dist/lib/api/auth-register.js +0 -2949
  70. package/dist/lib/api/auth-register.js.map +0 -1
  71. package/dist/lib/api/index.d.ts +0 -356
  72. package/dist/lib/api/index.js +0 -3261
  73. package/dist/lib/api/index.js.map +0 -1
  74. package/dist/lib/config.d.ts +0 -70
  75. package/dist/lib/config.js +0 -64
  76. package/dist/lib/config.js.map +0 -1
  77. package/dist/lib/contracts/auth.d.ts +0 -302
  78. package/dist/lib/contracts/auth.js +0 -2951
  79. package/dist/lib/contracts/auth.js.map +0 -1
  80. package/dist/lib/contracts/index.d.ts +0 -3
  81. package/dist/lib/contracts/index.js +0 -3190
  82. package/dist/lib/contracts/index.js.map +0 -1
  83. package/dist/lib/contracts/invitation.d.ts +0 -243
  84. package/dist/lib/contracts/invitation.js +0 -2883
  85. package/dist/lib/contracts/invitation.js.map +0 -1
  86. package/dist/lib/crypto.d.ts +0 -76
  87. package/dist/lib/crypto.js +0 -127
  88. package/dist/lib/crypto.js.map +0 -1
  89. package/dist/lib/index.d.ts +0 -4
  90. package/dist/lib/index.js +0 -313
  91. package/dist/lib/index.js.map +0 -1
  92. package/dist/lib/session.d.ts +0 -68
  93. package/dist/lib/session.js +0 -126
  94. package/dist/lib/session.js.map +0 -1
  95. package/dist/lib/types/api.d.ts +0 -45
  96. package/dist/lib/types/api.js +0 -1
  97. package/dist/lib/types/api.js.map +0 -1
  98. package/dist/lib/types/index.d.ts +0 -3
  99. package/dist/lib/types/index.js +0 -2647
  100. package/dist/lib/types/index.js.map +0 -1
  101. package/dist/lib/types/schemas.d.ts +0 -45
  102. package/dist/lib/types/schemas.js +0 -2647
  103. package/dist/lib/types/schemas.js.map +0 -1
  104. package/dist/lib.js +0 -1
  105. package/dist/lib.js.map +0 -1
  106. package/dist/plugin.d.ts +0 -12
  107. package/dist/plugin.js +0 -9083
  108. package/dist/plugin.js.map +0 -1
  109. package/dist/server/entities/index.d.ts +0 -11
  110. package/dist/server/entities/index.js +0 -395
  111. package/dist/server/entities/index.js.map +0 -1
  112. package/dist/server/entities/invitations.d.ts +0 -241
  113. package/dist/server/entities/invitations.js +0 -184
  114. package/dist/server/entities/invitations.js.map +0 -1
  115. package/dist/server/entities/permissions.d.ts +0 -196
  116. package/dist/server/entities/permissions.js +0 -49
  117. package/dist/server/entities/permissions.js.map +0 -1
  118. package/dist/server/entities/role-permissions.d.ts +0 -107
  119. package/dist/server/entities/role-permissions.js +0 -115
  120. package/dist/server/entities/role-permissions.js.map +0 -1
  121. package/dist/server/entities/roles.d.ts +0 -196
  122. package/dist/server/entities/roles.js +0 -50
  123. package/dist/server/entities/roles.js.map +0 -1
  124. package/dist/server/entities/schema.d.ts +0 -14
  125. package/dist/server/entities/schema.js +0 -7
  126. package/dist/server/entities/schema.js.map +0 -1
  127. package/dist/server/entities/user-permissions.d.ts +0 -163
  128. package/dist/server/entities/user-permissions.js +0 -193
  129. package/dist/server/entities/user-permissions.js.map +0 -1
  130. package/dist/server/entities/user-public-keys.d.ts +0 -227
  131. package/dist/server/entities/user-public-keys.js +0 -156
  132. package/dist/server/entities/user-public-keys.js.map +0 -1
  133. package/dist/server/entities/user-social-accounts.d.ts +0 -189
  134. package/dist/server/entities/user-social-accounts.js +0 -149
  135. package/dist/server/entities/user-social-accounts.js.map +0 -1
  136. package/dist/server/entities/users.d.ts +0 -235
  137. package/dist/server/entities/users.js +0 -117
  138. package/dist/server/entities/users.js.map +0 -1
  139. package/dist/server/entities/verification-codes.d.ts +0 -191
  140. package/dist/server/entities/verification-codes.js +0 -49
  141. package/dist/server/entities/verification-codes.js.map +0 -1
  142. package/dist/server/routes/auth/index.d.ts +0 -10
  143. package/dist/server/routes/auth/index.js +0 -4460
  144. package/dist/server/routes/auth/index.js.map +0 -1
  145. package/dist/server/routes/index.d.ts +0 -6
  146. package/dist/server/routes/index.js +0 -6584
  147. package/dist/server/routes/index.js.map +0 -1
  148. package/dist/server/routes/invitations/index.d.ts +0 -10
  149. package/dist/server/routes/invitations/index.js +0 -4395
  150. package/dist/server/routes/invitations/index.js.map +0 -1
  151. /package/dist/{lib.d.ts → nextjs/api.d.ts} +0 -0
@@ -0,0 +1,405 @@
1
+ import * as _spfn_core_env from '@spfn/core/env';
2
+
3
+ /**
4
+ * Auth Environment Variable Schema
5
+ *
6
+ * Centralized schema definition for all environment variables used in @spfn/auth.
7
+ * This provides type safety, validation, and documentation for Auth configuration.
8
+ *
9
+ * @module config/schema
10
+ */
11
+ /**
12
+ * Auth environment variable schema
13
+ *
14
+ * Defines all Auth environment variables with:
15
+ * - Type information
16
+ * - Default values
17
+ * - Validation rules
18
+ * - Documentation
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { authEnvSchema } from '@spfn/auth/config';
23
+ *
24
+ * // Access schema information
25
+ * console.log(authEnvSchema.SPFN_AUTH_SESSION_SECRET.description);
26
+ * console.log(authEnvSchema.SPFN_AUTH_JWT_EXPIRES_IN.default);
27
+ * ```
28
+ */
29
+ declare const authEnvSchema: {
30
+ SPFN_AUTH_SESSION_SECRET: {
31
+ description: string;
32
+ required: boolean;
33
+ fallbackKeys: string[];
34
+ validator: _spfn_core_env.Parser<string>;
35
+ sensitive: boolean;
36
+ examples: string[];
37
+ type: "string";
38
+ } & {
39
+ key: "SPFN_AUTH_SESSION_SECRET";
40
+ };
41
+ SPFN_AUTH_SESSION_TTL: {
42
+ description: string;
43
+ default: string;
44
+ required: boolean;
45
+ examples: string[];
46
+ type: "string";
47
+ } & {
48
+ key: "SPFN_AUTH_SESSION_TTL";
49
+ };
50
+ SPFN_AUTH_JWT_SECRET: {
51
+ description: string;
52
+ default: string;
53
+ required: boolean;
54
+ examples: string[];
55
+ type: "string";
56
+ } & {
57
+ key: "SPFN_AUTH_JWT_SECRET";
58
+ };
59
+ SPFN_AUTH_JWT_EXPIRES_IN: {
60
+ description: string;
61
+ default: string;
62
+ required: boolean;
63
+ examples: string[];
64
+ type: "string";
65
+ } & {
66
+ key: "SPFN_AUTH_JWT_EXPIRES_IN";
67
+ };
68
+ SPFN_AUTH_BCRYPT_SALT_ROUNDS: {
69
+ key: string;
70
+ description: string;
71
+ default: number;
72
+ required: boolean;
73
+ examples: number[];
74
+ type: "number";
75
+ validator: (value: string) => number;
76
+ } & {
77
+ key: "SPFN_AUTH_BCRYPT_SALT_ROUNDS";
78
+ };
79
+ SPFN_AUTH_VERIFICATION_TOKEN_SECRET: {
80
+ description: string;
81
+ required: boolean;
82
+ examples: string[];
83
+ type: "string";
84
+ } & {
85
+ key: "SPFN_AUTH_VERIFICATION_TOKEN_SECRET";
86
+ };
87
+ SPFN_AUTH_ADMIN_ACCOUNTS: {
88
+ description: string;
89
+ required: boolean;
90
+ examples: string[];
91
+ type: "string";
92
+ } & {
93
+ key: "SPFN_AUTH_ADMIN_ACCOUNTS";
94
+ };
95
+ SPFN_AUTH_ADMIN_EMAILS: {
96
+ description: string;
97
+ required: boolean;
98
+ examples: string[];
99
+ type: "string";
100
+ } & {
101
+ key: "SPFN_AUTH_ADMIN_EMAILS";
102
+ };
103
+ SPFN_AUTH_ADMIN_PASSWORDS: {
104
+ description: string;
105
+ required: boolean;
106
+ examples: string[];
107
+ type: "string";
108
+ } & {
109
+ key: "SPFN_AUTH_ADMIN_PASSWORDS";
110
+ };
111
+ SPFN_AUTH_ADMIN_ROLES: {
112
+ description: string;
113
+ required: boolean;
114
+ examples: string[];
115
+ type: "string";
116
+ } & {
117
+ key: "SPFN_AUTH_ADMIN_ROLES";
118
+ };
119
+ SPFN_AUTH_ADMIN_EMAIL: {
120
+ description: string;
121
+ required: boolean;
122
+ examples: string[];
123
+ type: "string";
124
+ } & {
125
+ key: "SPFN_AUTH_ADMIN_EMAIL";
126
+ };
127
+ SPFN_AUTH_ADMIN_PASSWORD: {
128
+ description: string;
129
+ required: boolean;
130
+ validator: _spfn_core_env.Parser<string>;
131
+ sensitive: boolean;
132
+ examples: string[];
133
+ type: "string";
134
+ } & {
135
+ key: "SPFN_AUTH_ADMIN_PASSWORD";
136
+ };
137
+ SPFN_API_URL: {
138
+ description: string;
139
+ default: string;
140
+ required: boolean;
141
+ examples: string[];
142
+ type: "string";
143
+ } & {
144
+ key: "SPFN_API_URL";
145
+ };
146
+ SPFN_AUTH_AWS_REGION: {
147
+ description: string;
148
+ default: string;
149
+ required: boolean;
150
+ examples: string[];
151
+ type: "string";
152
+ } & {
153
+ key: "SPFN_AUTH_AWS_REGION";
154
+ };
155
+ SPFN_AUTH_AWS_SNS_ACCESS_KEY_ID: {
156
+ description: string;
157
+ required: boolean;
158
+ sensitive: boolean;
159
+ examples: string[];
160
+ type: "string";
161
+ } & {
162
+ key: "SPFN_AUTH_AWS_SNS_ACCESS_KEY_ID";
163
+ };
164
+ SPFN_AUTH_AWS_SNS_SECRET_ACCESS_KEY: {
165
+ description: string;
166
+ required: boolean;
167
+ sensitive: boolean;
168
+ examples: string[];
169
+ type: "string";
170
+ } & {
171
+ key: "SPFN_AUTH_AWS_SNS_SECRET_ACCESS_KEY";
172
+ };
173
+ SPFN_AUTH_AWS_SNS_SENDER_ID: {
174
+ description: string;
175
+ required: boolean;
176
+ examples: string[];
177
+ type: "string";
178
+ } & {
179
+ key: "SPFN_AUTH_AWS_SNS_SENDER_ID";
180
+ };
181
+ SPFN_AUTH_AWS_SES_ACCESS_KEY_ID: {
182
+ description: string;
183
+ required: boolean;
184
+ sensitive: boolean;
185
+ examples: string[];
186
+ type: "string";
187
+ } & {
188
+ key: "SPFN_AUTH_AWS_SES_ACCESS_KEY_ID";
189
+ };
190
+ SPFN_AUTH_AWS_SES_SECRET_ACCESS_KEY: {
191
+ description: string;
192
+ required: boolean;
193
+ sensitive: boolean;
194
+ examples: string[];
195
+ type: "string";
196
+ } & {
197
+ key: "SPFN_AUTH_AWS_SES_SECRET_ACCESS_KEY";
198
+ };
199
+ SPFN_AUTH_AWS_SES_FROM_EMAIL: {
200
+ description: string;
201
+ required: boolean;
202
+ examples: string[];
203
+ type: "string";
204
+ } & {
205
+ key: "SPFN_AUTH_AWS_SES_FROM_EMAIL";
206
+ };
207
+ SPFN_AUTH_AWS_SES_FROM_NAME: {
208
+ description: string;
209
+ required: boolean;
210
+ examples: string[];
211
+ type: "string";
212
+ } & {
213
+ key: "SPFN_AUTH_AWS_SES_FROM_NAME";
214
+ };
215
+ };
216
+
217
+ declare const env: _spfn_core_env.InferEnvType<{
218
+ SPFN_AUTH_SESSION_SECRET: {
219
+ description: string;
220
+ required: boolean;
221
+ fallbackKeys: string[];
222
+ validator: _spfn_core_env.Parser<string>;
223
+ sensitive: boolean;
224
+ examples: string[];
225
+ type: "string";
226
+ } & {
227
+ key: "SPFN_AUTH_SESSION_SECRET";
228
+ };
229
+ SPFN_AUTH_SESSION_TTL: {
230
+ description: string;
231
+ default: string;
232
+ required: boolean;
233
+ examples: string[];
234
+ type: "string";
235
+ } & {
236
+ key: "SPFN_AUTH_SESSION_TTL";
237
+ };
238
+ SPFN_AUTH_JWT_SECRET: {
239
+ description: string;
240
+ default: string;
241
+ required: boolean;
242
+ examples: string[];
243
+ type: "string";
244
+ } & {
245
+ key: "SPFN_AUTH_JWT_SECRET";
246
+ };
247
+ SPFN_AUTH_JWT_EXPIRES_IN: {
248
+ description: string;
249
+ default: string;
250
+ required: boolean;
251
+ examples: string[];
252
+ type: "string";
253
+ } & {
254
+ key: "SPFN_AUTH_JWT_EXPIRES_IN";
255
+ };
256
+ SPFN_AUTH_BCRYPT_SALT_ROUNDS: {
257
+ key: string;
258
+ description: string;
259
+ default: number;
260
+ required: boolean;
261
+ examples: number[];
262
+ type: "number";
263
+ validator: (value: string) => number;
264
+ } & {
265
+ key: "SPFN_AUTH_BCRYPT_SALT_ROUNDS";
266
+ };
267
+ SPFN_AUTH_VERIFICATION_TOKEN_SECRET: {
268
+ description: string;
269
+ required: boolean;
270
+ examples: string[];
271
+ type: "string";
272
+ } & {
273
+ key: "SPFN_AUTH_VERIFICATION_TOKEN_SECRET";
274
+ };
275
+ SPFN_AUTH_ADMIN_ACCOUNTS: {
276
+ description: string;
277
+ required: boolean;
278
+ examples: string[];
279
+ type: "string";
280
+ } & {
281
+ key: "SPFN_AUTH_ADMIN_ACCOUNTS";
282
+ };
283
+ SPFN_AUTH_ADMIN_EMAILS: {
284
+ description: string;
285
+ required: boolean;
286
+ examples: string[];
287
+ type: "string";
288
+ } & {
289
+ key: "SPFN_AUTH_ADMIN_EMAILS";
290
+ };
291
+ SPFN_AUTH_ADMIN_PASSWORDS: {
292
+ description: string;
293
+ required: boolean;
294
+ examples: string[];
295
+ type: "string";
296
+ } & {
297
+ key: "SPFN_AUTH_ADMIN_PASSWORDS";
298
+ };
299
+ SPFN_AUTH_ADMIN_ROLES: {
300
+ description: string;
301
+ required: boolean;
302
+ examples: string[];
303
+ type: "string";
304
+ } & {
305
+ key: "SPFN_AUTH_ADMIN_ROLES";
306
+ };
307
+ SPFN_AUTH_ADMIN_EMAIL: {
308
+ description: string;
309
+ required: boolean;
310
+ examples: string[];
311
+ type: "string";
312
+ } & {
313
+ key: "SPFN_AUTH_ADMIN_EMAIL";
314
+ };
315
+ SPFN_AUTH_ADMIN_PASSWORD: {
316
+ description: string;
317
+ required: boolean;
318
+ validator: _spfn_core_env.Parser<string>;
319
+ sensitive: boolean;
320
+ examples: string[];
321
+ type: "string";
322
+ } & {
323
+ key: "SPFN_AUTH_ADMIN_PASSWORD";
324
+ };
325
+ SPFN_API_URL: {
326
+ description: string;
327
+ default: string;
328
+ required: boolean;
329
+ examples: string[];
330
+ type: "string";
331
+ } & {
332
+ key: "SPFN_API_URL";
333
+ };
334
+ SPFN_AUTH_AWS_REGION: {
335
+ description: string;
336
+ default: string;
337
+ required: boolean;
338
+ examples: string[];
339
+ type: "string";
340
+ } & {
341
+ key: "SPFN_AUTH_AWS_REGION";
342
+ };
343
+ SPFN_AUTH_AWS_SNS_ACCESS_KEY_ID: {
344
+ description: string;
345
+ required: boolean;
346
+ sensitive: boolean;
347
+ examples: string[];
348
+ type: "string";
349
+ } & {
350
+ key: "SPFN_AUTH_AWS_SNS_ACCESS_KEY_ID";
351
+ };
352
+ SPFN_AUTH_AWS_SNS_SECRET_ACCESS_KEY: {
353
+ description: string;
354
+ required: boolean;
355
+ sensitive: boolean;
356
+ examples: string[];
357
+ type: "string";
358
+ } & {
359
+ key: "SPFN_AUTH_AWS_SNS_SECRET_ACCESS_KEY";
360
+ };
361
+ SPFN_AUTH_AWS_SNS_SENDER_ID: {
362
+ description: string;
363
+ required: boolean;
364
+ examples: string[];
365
+ type: "string";
366
+ } & {
367
+ key: "SPFN_AUTH_AWS_SNS_SENDER_ID";
368
+ };
369
+ SPFN_AUTH_AWS_SES_ACCESS_KEY_ID: {
370
+ description: string;
371
+ required: boolean;
372
+ sensitive: boolean;
373
+ examples: string[];
374
+ type: "string";
375
+ } & {
376
+ key: "SPFN_AUTH_AWS_SES_ACCESS_KEY_ID";
377
+ };
378
+ SPFN_AUTH_AWS_SES_SECRET_ACCESS_KEY: {
379
+ description: string;
380
+ required: boolean;
381
+ sensitive: boolean;
382
+ examples: string[];
383
+ type: "string";
384
+ } & {
385
+ key: "SPFN_AUTH_AWS_SES_SECRET_ACCESS_KEY";
386
+ };
387
+ SPFN_AUTH_AWS_SES_FROM_EMAIL: {
388
+ description: string;
389
+ required: boolean;
390
+ examples: string[];
391
+ type: "string";
392
+ } & {
393
+ key: "SPFN_AUTH_AWS_SES_FROM_EMAIL";
394
+ };
395
+ SPFN_AUTH_AWS_SES_FROM_NAME: {
396
+ description: string;
397
+ required: boolean;
398
+ examples: string[];
399
+ type: "string";
400
+ } & {
401
+ key: "SPFN_AUTH_AWS_SES_FROM_NAME";
402
+ };
403
+ }>;
404
+
405
+ export { env, authEnvSchema as envSchema };
package/dist/config.js ADDED
@@ -0,0 +1,240 @@
1
+ // src/config/index.ts
2
+ import { createEnvRegistry } from "@spfn/core/env";
3
+
4
+ // src/config/schema.ts
5
+ import {
6
+ defineEnvSchema,
7
+ envString,
8
+ envNumber,
9
+ createSecureSecretParser,
10
+ createPasswordParser
11
+ } from "@spfn/core/env";
12
+ var authEnvSchema = defineEnvSchema({
13
+ // ============================================================================
14
+ // Session Configuration
15
+ // ============================================================================
16
+ SPFN_AUTH_SESSION_SECRET: {
17
+ ...envString({
18
+ description: "Session encryption secret (minimum 32 characters for AES-256)",
19
+ required: true,
20
+ fallbackKeys: ["SESSION_SECRET"],
21
+ validator: createSecureSecretParser({
22
+ minLength: 32,
23
+ minUniqueChars: 16,
24
+ minEntropy: 3.5
25
+ }),
26
+ sensitive: true,
27
+ examples: [
28
+ "my-super-secret-session-key-at-least-32-chars-long",
29
+ "use-a-cryptographically-secure-random-string-here"
30
+ ]
31
+ })
32
+ },
33
+ SPFN_AUTH_SESSION_TTL: {
34
+ ...envString({
35
+ description: "Session TTL (time to live) - supports duration strings like '7d', '12h', '45m'",
36
+ default: "7d",
37
+ required: false,
38
+ examples: ["7d", "30d", "12h", "45m", "3600"]
39
+ })
40
+ },
41
+ // ============================================================================
42
+ // JWT Configuration
43
+ // ============================================================================
44
+ SPFN_AUTH_JWT_SECRET: {
45
+ ...envString({
46
+ description: "JWT signing secret for server-signed tokens (legacy mode)",
47
+ default: "dev-secret-key-change-in-production",
48
+ required: false,
49
+ examples: [
50
+ "your-jwt-secret-key-here",
51
+ "use-different-from-session-secret"
52
+ ]
53
+ })
54
+ },
55
+ SPFN_AUTH_JWT_EXPIRES_IN: {
56
+ ...envString({
57
+ description: "JWT token expiration time (e.g., '7d', '24h', '1h')",
58
+ default: "7d",
59
+ required: false,
60
+ examples: ["7d", "24h", "1h", "30m"]
61
+ })
62
+ },
63
+ // ============================================================================
64
+ // Security Configuration
65
+ // ============================================================================
66
+ SPFN_AUTH_BCRYPT_SALT_ROUNDS: {
67
+ ...envNumber({
68
+ description: "Bcrypt salt rounds (cost factor, higher = more secure but slower)",
69
+ default: 10,
70
+ required: false,
71
+ examples: [10, 12, 14]
72
+ }),
73
+ key: "SPFN_AUTH_BCRYPT_SALT_ROUNDS"
74
+ },
75
+ SPFN_AUTH_VERIFICATION_TOKEN_SECRET: {
76
+ ...envString({
77
+ description: "Verification token secret for email verification, password reset, etc.",
78
+ required: true,
79
+ examples: [
80
+ "your-verification-token-secret",
81
+ "can-be-different-from-jwt-secret"
82
+ ]
83
+ })
84
+ },
85
+ // ============================================================================
86
+ // Admin Account Configuration
87
+ // ============================================================================
88
+ SPFN_AUTH_ADMIN_ACCOUNTS: {
89
+ ...envString({
90
+ description: "JSON array of admin accounts (recommended for multiple admins)",
91
+ required: false,
92
+ examples: [
93
+ '[{"email":"admin@example.com","password":"secure-pass","role":"admin"}]',
94
+ '[{"email":"super@example.com","password":"pass1","role":"superadmin"},{"email":"admin@example.com","password":"pass2","role":"admin"}]'
95
+ ]
96
+ })
97
+ },
98
+ SPFN_AUTH_ADMIN_EMAILS: {
99
+ ...envString({
100
+ description: "Comma-separated list of admin emails (legacy CSV format)",
101
+ required: false,
102
+ examples: [
103
+ "admin@example.com,user@example.com",
104
+ "super@example.com,admin@example.com,user@example.com"
105
+ ]
106
+ })
107
+ },
108
+ SPFN_AUTH_ADMIN_PASSWORDS: {
109
+ ...envString({
110
+ description: "Comma-separated list of admin passwords (legacy CSV format)",
111
+ required: false,
112
+ examples: [
113
+ "admin-pass,user-pass",
114
+ "super-pass,admin-pass,user-pass"
115
+ ]
116
+ })
117
+ },
118
+ SPFN_AUTH_ADMIN_ROLES: {
119
+ ...envString({
120
+ description: "Comma-separated list of admin roles (legacy CSV format)",
121
+ required: false,
122
+ examples: [
123
+ "admin,user",
124
+ "superadmin,admin,user"
125
+ ]
126
+ })
127
+ },
128
+ SPFN_AUTH_ADMIN_EMAIL: {
129
+ ...envString({
130
+ description: "Single admin email (simplest format)",
131
+ required: false,
132
+ examples: ["admin@example.com"]
133
+ })
134
+ },
135
+ SPFN_AUTH_ADMIN_PASSWORD: {
136
+ ...envString({
137
+ description: "Single admin password (simplest format)",
138
+ required: false,
139
+ validator: createPasswordParser({
140
+ minLength: 8,
141
+ requireUppercase: true,
142
+ requireLowercase: true,
143
+ requireNumber: true,
144
+ requireSpecial: true
145
+ }),
146
+ sensitive: true,
147
+ examples: ["SecureAdmin123!"]
148
+ })
149
+ },
150
+ // ============================================================================
151
+ // API Configuration
152
+ // ============================================================================
153
+ SPFN_API_URL: {
154
+ ...envString({
155
+ description: "Base API URL for invitation links and other external-facing URLs",
156
+ default: "http://localhost:8790",
157
+ required: false,
158
+ examples: [
159
+ "https://api.example.com",
160
+ "http://localhost:8790"
161
+ ]
162
+ })
163
+ },
164
+ // ============================================================================
165
+ // AWS SNS Configuration (SMS)
166
+ // ============================================================================
167
+ SPFN_AUTH_AWS_REGION: {
168
+ ...envString({
169
+ description: "AWS region for SNS service",
170
+ default: "ap-northeast-2",
171
+ required: false,
172
+ examples: ["ap-northeast-2", "us-east-1", "eu-west-1"]
173
+ })
174
+ },
175
+ SPFN_AUTH_AWS_SNS_ACCESS_KEY_ID: {
176
+ ...envString({
177
+ description: "AWS SNS access key ID (optional, uses default credentials chain if not provided)",
178
+ required: false,
179
+ sensitive: true,
180
+ examples: ["AKIAIOSFODNN7EXAMPLE"]
181
+ })
182
+ },
183
+ SPFN_AUTH_AWS_SNS_SECRET_ACCESS_KEY: {
184
+ ...envString({
185
+ description: "AWS SNS secret access key (optional, uses default credentials chain if not provided)",
186
+ required: false,
187
+ sensitive: true,
188
+ examples: ["wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"]
189
+ })
190
+ },
191
+ SPFN_AUTH_AWS_SNS_SENDER_ID: {
192
+ ...envString({
193
+ description: "SMS sender ID displayed to recipients (max 11 characters, alphanumeric)",
194
+ required: false,
195
+ examples: ["MyApp", "YourBrand"]
196
+ })
197
+ },
198
+ // ============================================================================
199
+ // AWS SES Configuration (Email)
200
+ // ============================================================================
201
+ SPFN_AUTH_AWS_SES_ACCESS_KEY_ID: {
202
+ ...envString({
203
+ description: "AWS SES access key ID (optional, uses default credentials chain if not provided)",
204
+ required: false,
205
+ sensitive: true,
206
+ examples: ["AKIAIOSFODNN7EXAMPLE"]
207
+ })
208
+ },
209
+ SPFN_AUTH_AWS_SES_SECRET_ACCESS_KEY: {
210
+ ...envString({
211
+ description: "AWS SES secret access key (optional, uses default credentials chain if not provided)",
212
+ required: false,
213
+ sensitive: true,
214
+ examples: ["wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"]
215
+ })
216
+ },
217
+ SPFN_AUTH_AWS_SES_FROM_EMAIL: {
218
+ ...envString({
219
+ description: "Sender email address (must be verified in AWS SES)",
220
+ required: false,
221
+ examples: ["noreply@example.com", "auth@yourdomain.com"]
222
+ })
223
+ },
224
+ SPFN_AUTH_AWS_SES_FROM_NAME: {
225
+ ...envString({
226
+ description: "Sender display name",
227
+ required: false,
228
+ examples: ["MyApp", "Your Company"]
229
+ })
230
+ }
231
+ });
232
+
233
+ // src/config/index.ts
234
+ var registry = createEnvRegistry(authEnvSchema);
235
+ var env = registry.validate();
236
+ export {
237
+ env,
238
+ authEnvSchema as envSchema
239
+ };
240
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/index.ts","../src/config/schema.ts"],"sourcesContent":["/**\n * Core Package Configuration\n *\n * @example\n * ```typescript\n * import { registry } from '@spfn/core/config';\n *\n * const env = registry.validate();\n * console.log(env.DB_POOL_MAX);\n * ```\n *\n * @module config\n */\n\nimport { createEnvRegistry } from '@spfn/core/env';\nimport { authEnvSchema } from './schema';\n\nexport { authEnvSchema as envSchema } from './schema';\n\n/**\n * Environment registry\n */\nconst registry = createEnvRegistry(authEnvSchema);\nexport const env = registry.validate();","/**\n * Auth Environment Variable Schema\n *\n * Centralized schema definition for all environment variables used in @spfn/auth.\n * This provides type safety, validation, and documentation for Auth configuration.\n *\n * @module config/schema\n */\n\nimport {\n defineEnvSchema,\n envString,\n envNumber,\n createSecureSecretParser,\n createPasswordParser,\n} from '@spfn/core/env';\n\n/**\n * Auth environment variable schema\n *\n * Defines all Auth environment variables with:\n * - Type information\n * - Default values\n * - Validation rules\n * - Documentation\n *\n * @example\n * ```typescript\n * import { authEnvSchema } from '@spfn/auth/config';\n *\n * // Access schema information\n * console.log(authEnvSchema.SPFN_AUTH_SESSION_SECRET.description);\n * console.log(authEnvSchema.SPFN_AUTH_JWT_EXPIRES_IN.default);\n * ```\n */\nexport const authEnvSchema = defineEnvSchema({\n // ============================================================================\n // Session Configuration\n // ============================================================================\n SPFN_AUTH_SESSION_SECRET: {\n ...envString({\n description: 'Session encryption secret (minimum 32 characters for AES-256)',\n required: true,\n fallbackKeys: ['SESSION_SECRET'],\n validator: createSecureSecretParser({\n minLength: 32,\n minUniqueChars: 16,\n minEntropy: 3.5,\n }),\n sensitive: true,\n examples: [\n 'my-super-secret-session-key-at-least-32-chars-long',\n 'use-a-cryptographically-secure-random-string-here',\n ],\n }),\n },\n\n SPFN_AUTH_SESSION_TTL: {\n ...envString({\n description: 'Session TTL (time to live) - supports duration strings like \\'7d\\', \\'12h\\', \\'45m\\'',\n default: '7d',\n required: false,\n examples: ['7d', '30d', '12h', '45m', '3600'],\n }),\n },\n\n // ============================================================================\n // JWT Configuration\n // ============================================================================\n SPFN_AUTH_JWT_SECRET: {\n ...envString({\n description: 'JWT signing secret for server-signed tokens (legacy mode)',\n default: 'dev-secret-key-change-in-production',\n required: false,\n examples: [\n 'your-jwt-secret-key-here',\n 'use-different-from-session-secret',\n ],\n }),\n },\n\n SPFN_AUTH_JWT_EXPIRES_IN: {\n ...envString({\n description: 'JWT token expiration time (e.g., \\'7d\\', \\'24h\\', \\'1h\\')',\n default: '7d',\n required: false,\n examples: ['7d', '24h', '1h', '30m'],\n }),\n },\n\n // ============================================================================\n // Security Configuration\n // ============================================================================\n SPFN_AUTH_BCRYPT_SALT_ROUNDS: {\n ...envNumber({\n description: 'Bcrypt salt rounds (cost factor, higher = more secure but slower)',\n default: 10,\n required: false,\n examples: [10, 12, 14],\n }),\n key: 'SPFN_AUTH_BCRYPT_SALT_ROUNDS',\n },\n\n SPFN_AUTH_VERIFICATION_TOKEN_SECRET: {\n ...envString({\n description: 'Verification token secret for email verification, password reset, etc.',\n required: true,\n examples: [\n 'your-verification-token-secret',\n 'can-be-different-from-jwt-secret',\n ],\n }),\n },\n\n // ============================================================================\n // Admin Account Configuration\n // ============================================================================\n SPFN_AUTH_ADMIN_ACCOUNTS: {\n ...envString({\n description: 'JSON array of admin accounts (recommended for multiple admins)',\n required: false,\n examples: [\n '[{\"email\":\"admin@example.com\",\"password\":\"secure-pass\",\"role\":\"admin\"}]',\n '[{\"email\":\"super@example.com\",\"password\":\"pass1\",\"role\":\"superadmin\"},{\"email\":\"admin@example.com\",\"password\":\"pass2\",\"role\":\"admin\"}]',\n ],\n }),\n },\n\n SPFN_AUTH_ADMIN_EMAILS: {\n ...envString({\n description: 'Comma-separated list of admin emails (legacy CSV format)',\n required: false,\n examples: [\n 'admin@example.com,user@example.com',\n 'super@example.com,admin@example.com,user@example.com',\n ],\n }),\n },\n\n SPFN_AUTH_ADMIN_PASSWORDS: {\n ...envString({\n description: 'Comma-separated list of admin passwords (legacy CSV format)',\n required: false,\n examples: [\n 'admin-pass,user-pass',\n 'super-pass,admin-pass,user-pass',\n ],\n }),\n },\n\n SPFN_AUTH_ADMIN_ROLES: {\n ...envString({\n description: 'Comma-separated list of admin roles (legacy CSV format)',\n required: false,\n examples: [\n 'admin,user',\n 'superadmin,admin,user',\n ],\n }),\n },\n\n SPFN_AUTH_ADMIN_EMAIL: {\n ...envString({\n description: 'Single admin email (simplest format)',\n required: false,\n examples: ['admin@example.com'],\n }),\n },\n\n SPFN_AUTH_ADMIN_PASSWORD: {\n ...envString({\n description: 'Single admin password (simplest format)',\n required: false,\n validator: createPasswordParser({\n minLength: 8,\n requireUppercase: true,\n requireLowercase: true,\n requireNumber: true,\n requireSpecial: true,\n }),\n sensitive: true,\n examples: ['SecureAdmin123!'],\n }),\n },\n\n // ============================================================================\n // API Configuration\n // ============================================================================\n SPFN_API_URL: {\n ...envString({\n description: 'Base API URL for invitation links and other external-facing URLs',\n default: 'http://localhost:8790',\n required: false,\n examples: [\n 'https://api.example.com',\n 'http://localhost:8790',\n ],\n }),\n },\n\n // ============================================================================\n // AWS SNS Configuration (SMS)\n // ============================================================================\n SPFN_AUTH_AWS_REGION: {\n ...envString({\n description: 'AWS region for SNS service',\n default: 'ap-northeast-2',\n required: false,\n examples: ['ap-northeast-2', 'us-east-1', 'eu-west-1'],\n }),\n },\n\n SPFN_AUTH_AWS_SNS_ACCESS_KEY_ID: {\n ...envString({\n description: 'AWS SNS access key ID (optional, uses default credentials chain if not provided)',\n required: false,\n sensitive: true,\n examples: ['AKIAIOSFODNN7EXAMPLE'],\n }),\n },\n\n SPFN_AUTH_AWS_SNS_SECRET_ACCESS_KEY: {\n ...envString({\n description: 'AWS SNS secret access key (optional, uses default credentials chain if not provided)',\n required: false,\n sensitive: true,\n examples: ['wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'],\n }),\n },\n\n SPFN_AUTH_AWS_SNS_SENDER_ID: {\n ...envString({\n description: 'SMS sender ID displayed to recipients (max 11 characters, alphanumeric)',\n required: false,\n examples: ['MyApp', 'YourBrand'],\n }),\n },\n\n // ============================================================================\n // AWS SES Configuration (Email)\n // ============================================================================\n SPFN_AUTH_AWS_SES_ACCESS_KEY_ID: {\n ...envString({\n description: 'AWS SES access key ID (optional, uses default credentials chain if not provided)',\n required: false,\n sensitive: true,\n examples: ['AKIAIOSFODNN7EXAMPLE'],\n }),\n },\n\n SPFN_AUTH_AWS_SES_SECRET_ACCESS_KEY: {\n ...envString({\n description: 'AWS SES secret access key (optional, uses default credentials chain if not provided)',\n required: false,\n sensitive: true,\n examples: ['wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'],\n }),\n },\n\n SPFN_AUTH_AWS_SES_FROM_EMAIL: {\n ...envString({\n description: 'Sender email address (must be verified in AWS SES)',\n required: false,\n examples: ['noreply@example.com', 'auth@yourdomain.com'],\n }),\n },\n\n SPFN_AUTH_AWS_SES_FROM_NAME: {\n ...envString({\n description: 'Sender display name',\n required: false,\n examples: ['MyApp', 'Your Company'],\n }),\n },\n});"],"mappings":"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","names":[]}