@spfn/auth 0.2.0-beta.2 → 0.2.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +634 -171
- package/dist/{dto-CLYtuAom.d.ts → authenticate-BmzJ6hTF.d.ts} +364 -154
- package/dist/config.d.ts +156 -0
- package/dist/config.js +97 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +256 -103
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/dist/nextjs/api.js +187 -1
- package/dist/nextjs/api.js.map +1 -1
- package/dist/nextjs/client.d.ts +28 -0
- package/dist/nextjs/client.js +80 -0
- package/dist/nextjs/client.js.map +1 -0
- package/dist/nextjs/server.d.ts +68 -2
- package/dist/nextjs/server.js +125 -4
- package/dist/nextjs/server.js.map +1 -1
- package/dist/server.d.ts +427 -360
- package/dist/server.js +943 -477
- package/dist/server.js.map +1 -1
- package/migrations/0000_premium_famine.sql +292 -0
- package/migrations/meta/0000_snapshot.json +1 -1
- package/migrations/meta/_journal.json +2 -2
- package/package.json +15 -11
- package/migrations/0000_marvelous_justice.sql +0 -197
package/dist/config.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ declare const authEnvSchema: {
|
|
|
33
33
|
fallbackKeys: string[];
|
|
34
34
|
validator: _spfn_core_env.Parser<string>;
|
|
35
35
|
sensitive: boolean;
|
|
36
|
+
nextjs: boolean;
|
|
36
37
|
examples: string[];
|
|
37
38
|
type: "string";
|
|
38
39
|
} & {
|
|
@@ -42,6 +43,7 @@ declare const authEnvSchema: {
|
|
|
42
43
|
description: string;
|
|
43
44
|
default: string;
|
|
44
45
|
required: boolean;
|
|
46
|
+
nextjs: boolean;
|
|
45
47
|
examples: string[];
|
|
46
48
|
type: "string";
|
|
47
49
|
} & {
|
|
@@ -143,6 +145,14 @@ declare const authEnvSchema: {
|
|
|
143
145
|
} & {
|
|
144
146
|
key: "SPFN_API_URL";
|
|
145
147
|
};
|
|
148
|
+
NEXT_PUBLIC_SPFN_API_URL: {
|
|
149
|
+
description: string;
|
|
150
|
+
required: boolean;
|
|
151
|
+
examples: string[];
|
|
152
|
+
type: "string";
|
|
153
|
+
} & {
|
|
154
|
+
key: "NEXT_PUBLIC_SPFN_API_URL";
|
|
155
|
+
};
|
|
146
156
|
SPFN_AUTH_AWS_REGION: {
|
|
147
157
|
description: string;
|
|
148
158
|
default: string;
|
|
@@ -212,6 +222,74 @@ declare const authEnvSchema: {
|
|
|
212
222
|
} & {
|
|
213
223
|
key: "SPFN_AUTH_AWS_SES_FROM_NAME";
|
|
214
224
|
};
|
|
225
|
+
SPFN_APP_URL: {
|
|
226
|
+
description: string;
|
|
227
|
+
default: string;
|
|
228
|
+
required: boolean;
|
|
229
|
+
examples: string[];
|
|
230
|
+
type: "string";
|
|
231
|
+
} & {
|
|
232
|
+
key: "SPFN_APP_URL";
|
|
233
|
+
};
|
|
234
|
+
NEXT_PUBLIC_SPFN_APP_URL: {
|
|
235
|
+
description: string;
|
|
236
|
+
required: boolean;
|
|
237
|
+
examples: string[];
|
|
238
|
+
type: "string";
|
|
239
|
+
} & {
|
|
240
|
+
key: "NEXT_PUBLIC_SPFN_APP_URL";
|
|
241
|
+
};
|
|
242
|
+
SPFN_AUTH_GOOGLE_CLIENT_ID: {
|
|
243
|
+
description: string;
|
|
244
|
+
required: boolean;
|
|
245
|
+
examples: string[];
|
|
246
|
+
type: "string";
|
|
247
|
+
} & {
|
|
248
|
+
key: "SPFN_AUTH_GOOGLE_CLIENT_ID";
|
|
249
|
+
};
|
|
250
|
+
SPFN_AUTH_GOOGLE_CLIENT_SECRET: {
|
|
251
|
+
description: string;
|
|
252
|
+
required: boolean;
|
|
253
|
+
sensitive: boolean;
|
|
254
|
+
examples: string[];
|
|
255
|
+
type: "string";
|
|
256
|
+
} & {
|
|
257
|
+
key: "SPFN_AUTH_GOOGLE_CLIENT_SECRET";
|
|
258
|
+
};
|
|
259
|
+
SPFN_AUTH_GOOGLE_SCOPES: {
|
|
260
|
+
description: string;
|
|
261
|
+
required: boolean;
|
|
262
|
+
examples: string[];
|
|
263
|
+
type: "string";
|
|
264
|
+
} & {
|
|
265
|
+
key: "SPFN_AUTH_GOOGLE_SCOPES";
|
|
266
|
+
};
|
|
267
|
+
SPFN_AUTH_GOOGLE_REDIRECT_URI: {
|
|
268
|
+
description: string;
|
|
269
|
+
required: boolean;
|
|
270
|
+
examples: string[];
|
|
271
|
+
type: "string";
|
|
272
|
+
} & {
|
|
273
|
+
key: "SPFN_AUTH_GOOGLE_REDIRECT_URI";
|
|
274
|
+
};
|
|
275
|
+
SPFN_AUTH_OAUTH_SUCCESS_URL: {
|
|
276
|
+
description: string;
|
|
277
|
+
required: boolean;
|
|
278
|
+
default: string;
|
|
279
|
+
examples: string[];
|
|
280
|
+
type: "string";
|
|
281
|
+
} & {
|
|
282
|
+
key: "SPFN_AUTH_OAUTH_SUCCESS_URL";
|
|
283
|
+
};
|
|
284
|
+
SPFN_AUTH_OAUTH_ERROR_URL: {
|
|
285
|
+
description: string;
|
|
286
|
+
required: boolean;
|
|
287
|
+
default: string;
|
|
288
|
+
examples: string[];
|
|
289
|
+
type: "string";
|
|
290
|
+
} & {
|
|
291
|
+
key: "SPFN_AUTH_OAUTH_ERROR_URL";
|
|
292
|
+
};
|
|
215
293
|
};
|
|
216
294
|
|
|
217
295
|
declare const env: _spfn_core_env.InferEnvType<{
|
|
@@ -221,6 +299,7 @@ declare const env: _spfn_core_env.InferEnvType<{
|
|
|
221
299
|
fallbackKeys: string[];
|
|
222
300
|
validator: _spfn_core_env.Parser<string>;
|
|
223
301
|
sensitive: boolean;
|
|
302
|
+
nextjs: boolean;
|
|
224
303
|
examples: string[];
|
|
225
304
|
type: "string";
|
|
226
305
|
} & {
|
|
@@ -230,6 +309,7 @@ declare const env: _spfn_core_env.InferEnvType<{
|
|
|
230
309
|
description: string;
|
|
231
310
|
default: string;
|
|
232
311
|
required: boolean;
|
|
312
|
+
nextjs: boolean;
|
|
233
313
|
examples: string[];
|
|
234
314
|
type: "string";
|
|
235
315
|
} & {
|
|
@@ -331,6 +411,14 @@ declare const env: _spfn_core_env.InferEnvType<{
|
|
|
331
411
|
} & {
|
|
332
412
|
key: "SPFN_API_URL";
|
|
333
413
|
};
|
|
414
|
+
NEXT_PUBLIC_SPFN_API_URL: {
|
|
415
|
+
description: string;
|
|
416
|
+
required: boolean;
|
|
417
|
+
examples: string[];
|
|
418
|
+
type: "string";
|
|
419
|
+
} & {
|
|
420
|
+
key: "NEXT_PUBLIC_SPFN_API_URL";
|
|
421
|
+
};
|
|
334
422
|
SPFN_AUTH_AWS_REGION: {
|
|
335
423
|
description: string;
|
|
336
424
|
default: string;
|
|
@@ -400,6 +488,74 @@ declare const env: _spfn_core_env.InferEnvType<{
|
|
|
400
488
|
} & {
|
|
401
489
|
key: "SPFN_AUTH_AWS_SES_FROM_NAME";
|
|
402
490
|
};
|
|
491
|
+
SPFN_APP_URL: {
|
|
492
|
+
description: string;
|
|
493
|
+
default: string;
|
|
494
|
+
required: boolean;
|
|
495
|
+
examples: string[];
|
|
496
|
+
type: "string";
|
|
497
|
+
} & {
|
|
498
|
+
key: "SPFN_APP_URL";
|
|
499
|
+
};
|
|
500
|
+
NEXT_PUBLIC_SPFN_APP_URL: {
|
|
501
|
+
description: string;
|
|
502
|
+
required: boolean;
|
|
503
|
+
examples: string[];
|
|
504
|
+
type: "string";
|
|
505
|
+
} & {
|
|
506
|
+
key: "NEXT_PUBLIC_SPFN_APP_URL";
|
|
507
|
+
};
|
|
508
|
+
SPFN_AUTH_GOOGLE_CLIENT_ID: {
|
|
509
|
+
description: string;
|
|
510
|
+
required: boolean;
|
|
511
|
+
examples: string[];
|
|
512
|
+
type: "string";
|
|
513
|
+
} & {
|
|
514
|
+
key: "SPFN_AUTH_GOOGLE_CLIENT_ID";
|
|
515
|
+
};
|
|
516
|
+
SPFN_AUTH_GOOGLE_CLIENT_SECRET: {
|
|
517
|
+
description: string;
|
|
518
|
+
required: boolean;
|
|
519
|
+
sensitive: boolean;
|
|
520
|
+
examples: string[];
|
|
521
|
+
type: "string";
|
|
522
|
+
} & {
|
|
523
|
+
key: "SPFN_AUTH_GOOGLE_CLIENT_SECRET";
|
|
524
|
+
};
|
|
525
|
+
SPFN_AUTH_GOOGLE_SCOPES: {
|
|
526
|
+
description: string;
|
|
527
|
+
required: boolean;
|
|
528
|
+
examples: string[];
|
|
529
|
+
type: "string";
|
|
530
|
+
} & {
|
|
531
|
+
key: "SPFN_AUTH_GOOGLE_SCOPES";
|
|
532
|
+
};
|
|
533
|
+
SPFN_AUTH_GOOGLE_REDIRECT_URI: {
|
|
534
|
+
description: string;
|
|
535
|
+
required: boolean;
|
|
536
|
+
examples: string[];
|
|
537
|
+
type: "string";
|
|
538
|
+
} & {
|
|
539
|
+
key: "SPFN_AUTH_GOOGLE_REDIRECT_URI";
|
|
540
|
+
};
|
|
541
|
+
SPFN_AUTH_OAUTH_SUCCESS_URL: {
|
|
542
|
+
description: string;
|
|
543
|
+
required: boolean;
|
|
544
|
+
default: string;
|
|
545
|
+
examples: string[];
|
|
546
|
+
type: "string";
|
|
547
|
+
} & {
|
|
548
|
+
key: "SPFN_AUTH_OAUTH_SUCCESS_URL";
|
|
549
|
+
};
|
|
550
|
+
SPFN_AUTH_OAUTH_ERROR_URL: {
|
|
551
|
+
description: string;
|
|
552
|
+
required: boolean;
|
|
553
|
+
default: string;
|
|
554
|
+
examples: string[];
|
|
555
|
+
type: "string";
|
|
556
|
+
} & {
|
|
557
|
+
key: "SPFN_AUTH_OAUTH_ERROR_URL";
|
|
558
|
+
};
|
|
403
559
|
}>;
|
|
404
560
|
|
|
405
561
|
export { env, authEnvSchema as envSchema };
|
package/dist/config.js
CHANGED
|
@@ -24,6 +24,8 @@ var authEnvSchema = defineEnvSchema({
|
|
|
24
24
|
minEntropy: 3.5
|
|
25
25
|
}),
|
|
26
26
|
sensitive: true,
|
|
27
|
+
nextjs: true,
|
|
28
|
+
// Required for Next.js RSC session validation
|
|
27
29
|
examples: [
|
|
28
30
|
"my-super-secret-session-key-at-least-32-chars-long",
|
|
29
31
|
"use-a-cryptographically-secure-random-string-here"
|
|
@@ -35,6 +37,8 @@ var authEnvSchema = defineEnvSchema({
|
|
|
35
37
|
description: "Session TTL (time to live) - supports duration strings like '7d', '12h', '45m'",
|
|
36
38
|
default: "7d",
|
|
37
39
|
required: false,
|
|
40
|
+
nextjs: true,
|
|
41
|
+
// May be needed for session validation in Next.js RSC
|
|
38
42
|
examples: ["7d", "30d", "12h", "45m", "3600"]
|
|
39
43
|
})
|
|
40
44
|
},
|
|
@@ -152,7 +156,7 @@ var authEnvSchema = defineEnvSchema({
|
|
|
152
156
|
// ============================================================================
|
|
153
157
|
SPFN_API_URL: {
|
|
154
158
|
...envString({
|
|
155
|
-
description: "
|
|
159
|
+
description: "Internal API URL for server-to-server communication",
|
|
156
160
|
default: "http://localhost:8790",
|
|
157
161
|
required: false,
|
|
158
162
|
examples: [
|
|
@@ -161,6 +165,16 @@ var authEnvSchema = defineEnvSchema({
|
|
|
161
165
|
]
|
|
162
166
|
})
|
|
163
167
|
},
|
|
168
|
+
NEXT_PUBLIC_SPFN_API_URL: {
|
|
169
|
+
...envString({
|
|
170
|
+
description: "Public-facing API URL used for browser-facing redirects (e.g. OAuth callback). Falls back to SPFN_API_URL if not set.",
|
|
171
|
+
required: false,
|
|
172
|
+
examples: [
|
|
173
|
+
"https://api.example.com",
|
|
174
|
+
"http://localhost:8790"
|
|
175
|
+
]
|
|
176
|
+
})
|
|
177
|
+
},
|
|
164
178
|
// ============================================================================
|
|
165
179
|
// AWS SNS Configuration (SMS)
|
|
166
180
|
// ============================================================================
|
|
@@ -227,6 +241,88 @@ var authEnvSchema = defineEnvSchema({
|
|
|
227
241
|
required: false,
|
|
228
242
|
examples: ["MyApp", "Your Company"]
|
|
229
243
|
})
|
|
244
|
+
},
|
|
245
|
+
SPFN_APP_URL: {
|
|
246
|
+
...envString({
|
|
247
|
+
description: "Next.js application URL (internal). Used for server-to-server communication.",
|
|
248
|
+
default: "http://localhost:3000",
|
|
249
|
+
required: false,
|
|
250
|
+
examples: [
|
|
251
|
+
"https://app.example.com",
|
|
252
|
+
"http://localhost:3000"
|
|
253
|
+
]
|
|
254
|
+
})
|
|
255
|
+
},
|
|
256
|
+
NEXT_PUBLIC_SPFN_APP_URL: {
|
|
257
|
+
...envString({
|
|
258
|
+
description: "Public-facing Next.js app URL for browser redirects (e.g. OAuth redirect). Falls back to SPFN_APP_URL if not set.",
|
|
259
|
+
required: false,
|
|
260
|
+
examples: [
|
|
261
|
+
"https://app.example.com",
|
|
262
|
+
"http://localhost:3000"
|
|
263
|
+
]
|
|
264
|
+
})
|
|
265
|
+
},
|
|
266
|
+
// ============================================================================
|
|
267
|
+
// OAuth Configuration - Google
|
|
268
|
+
// ============================================================================
|
|
269
|
+
SPFN_AUTH_GOOGLE_CLIENT_ID: {
|
|
270
|
+
...envString({
|
|
271
|
+
description: "Google OAuth 2.0 Client ID. When set, Google OAuth routes are automatically enabled.",
|
|
272
|
+
required: false,
|
|
273
|
+
examples: ["123456789-abc123.apps.googleusercontent.com"]
|
|
274
|
+
})
|
|
275
|
+
},
|
|
276
|
+
SPFN_AUTH_GOOGLE_CLIENT_SECRET: {
|
|
277
|
+
...envString({
|
|
278
|
+
description: "Google OAuth 2.0 Client Secret",
|
|
279
|
+
required: false,
|
|
280
|
+
sensitive: true,
|
|
281
|
+
examples: ["GOCSPX-abcdefghijklmnop"]
|
|
282
|
+
})
|
|
283
|
+
},
|
|
284
|
+
SPFN_AUTH_GOOGLE_SCOPES: {
|
|
285
|
+
...envString({
|
|
286
|
+
description: 'Comma-separated Google OAuth scopes. Defaults to "email,profile" if not set.',
|
|
287
|
+
required: false,
|
|
288
|
+
examples: [
|
|
289
|
+
"email,profile",
|
|
290
|
+
"email,profile,https://www.googleapis.com/auth/gmail.readonly",
|
|
291
|
+
"email,profile,https://www.googleapis.com/auth/calendar.readonly"
|
|
292
|
+
]
|
|
293
|
+
})
|
|
294
|
+
},
|
|
295
|
+
SPFN_AUTH_GOOGLE_REDIRECT_URI: {
|
|
296
|
+
...envString({
|
|
297
|
+
description: "Google OAuth callback URL. Defaults to {NEXT_PUBLIC_SPFN_API_URL || SPFN_API_URL}/_auth/oauth/google/callback",
|
|
298
|
+
required: false,
|
|
299
|
+
examples: [
|
|
300
|
+
"https://api.example.com/_auth/oauth/google/callback",
|
|
301
|
+
"http://localhost:8790/_auth/oauth/google/callback"
|
|
302
|
+
]
|
|
303
|
+
})
|
|
304
|
+
},
|
|
305
|
+
SPFN_AUTH_OAUTH_SUCCESS_URL: {
|
|
306
|
+
...envString({
|
|
307
|
+
description: "OAuth callback page URL. This page should use OAuthCallback component to finalize session.",
|
|
308
|
+
required: false,
|
|
309
|
+
default: "/auth/callback",
|
|
310
|
+
examples: [
|
|
311
|
+
"/auth/callback",
|
|
312
|
+
"https://app.example.com/auth/callback"
|
|
313
|
+
]
|
|
314
|
+
})
|
|
315
|
+
},
|
|
316
|
+
SPFN_AUTH_OAUTH_ERROR_URL: {
|
|
317
|
+
...envString({
|
|
318
|
+
description: "URL to redirect after OAuth error. Use {error} placeholder for error message.",
|
|
319
|
+
required: false,
|
|
320
|
+
default: "http://localhost:3000/auth/error?error={error}",
|
|
321
|
+
examples: [
|
|
322
|
+
"https://app.example.com/auth/error?error={error}",
|
|
323
|
+
"http://localhost:3000/auth/error?error={error}"
|
|
324
|
+
]
|
|
325
|
+
})
|
|
230
326
|
}
|
|
231
327
|
});
|
|
232
328
|
|
package/dist/config.js.map
CHANGED
|
@@ -1 +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":[]}
|
|
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 nextjs: true, // Required for Next.js RSC session validation\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 nextjs: true, // May be needed for session validation in Next.js RSC\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: 'Internal API URL for server-to-server communication',\n default: 'http://localhost:8790',\n required: false,\n examples: [\n 'https://api.example.com',\n 'http://localhost:8790',\n ],\n }),\n },\n\n NEXT_PUBLIC_SPFN_API_URL: {\n ...envString({\n description: 'Public-facing API URL used for browser-facing redirects (e.g. OAuth callback). Falls back to SPFN_API_URL if not set.',\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\n SPFN_APP_URL: {\n ...envString({\n description: 'Next.js application URL (internal). Used for server-to-server communication.',\n default: 'http://localhost:3000',\n required: false,\n examples: [\n 'https://app.example.com',\n 'http://localhost:3000',\n ],\n }),\n },\n\n NEXT_PUBLIC_SPFN_APP_URL: {\n ...envString({\n description: 'Public-facing Next.js app URL for browser redirects (e.g. OAuth redirect). Falls back to SPFN_APP_URL if not set.',\n required: false,\n examples: [\n 'https://app.example.com',\n 'http://localhost:3000',\n ],\n }),\n },\n\n // ============================================================================\n // OAuth Configuration - Google\n // ============================================================================\n SPFN_AUTH_GOOGLE_CLIENT_ID: {\n ...envString({\n description: 'Google OAuth 2.0 Client ID. When set, Google OAuth routes are automatically enabled.',\n required: false,\n examples: ['123456789-abc123.apps.googleusercontent.com'],\n }),\n },\n\n SPFN_AUTH_GOOGLE_CLIENT_SECRET: {\n ...envString({\n description: 'Google OAuth 2.0 Client Secret',\n required: false,\n sensitive: true,\n examples: ['GOCSPX-abcdefghijklmnop'],\n }),\n },\n\n SPFN_AUTH_GOOGLE_SCOPES: {\n ...envString({\n description: 'Comma-separated Google OAuth scopes. Defaults to \"email,profile\" if not set.',\n required: false,\n examples: [\n 'email,profile',\n 'email,profile,https://www.googleapis.com/auth/gmail.readonly',\n 'email,profile,https://www.googleapis.com/auth/calendar.readonly',\n ],\n }),\n },\n\n SPFN_AUTH_GOOGLE_REDIRECT_URI: {\n ...envString({\n description: 'Google OAuth callback URL. Defaults to {NEXT_PUBLIC_SPFN_API_URL || SPFN_API_URL}/_auth/oauth/google/callback',\n required: false,\n examples: [\n 'https://api.example.com/_auth/oauth/google/callback',\n 'http://localhost:8790/_auth/oauth/google/callback',\n ],\n }),\n },\n\n SPFN_AUTH_OAUTH_SUCCESS_URL: {\n ...envString({\n description: 'OAuth callback page URL. This page should use OAuthCallback component to finalize session.',\n required: false,\n default: '/auth/callback',\n examples: [\n '/auth/callback',\n 'https://app.example.com/auth/callback',\n ],\n }),\n },\n\n SPFN_AUTH_OAUTH_ERROR_URL: {\n ...envString({\n description: 'URL to redirect after OAuth error. Use {error} placeholder for error message.',\n required: false,\n default: 'http://localhost:3000/auth/error?error={error}',\n examples: [\n 'https://app.example.com/auth/error?error={error}',\n 'http://localhost:3000/auth/error?error={error}',\n ],\n }),\n },\n});"],"mappings":"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","names":[]}
|