@cairs-npm/express-auth-2fa 0.1.4 → 0.1.6

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/dist/index.d.cts CHANGED
@@ -35,6 +35,9 @@ interface MethodDoc {
35
35
  lastUsedStep?: number;
36
36
  /** SMS confirm-code hash while pending. */
37
37
  pendingCodeHash?: string;
38
+ /** When the pending SMS code was last sent, and how many were sent (resend cooldown + cap). */
39
+ pendingCodeSentAt?: Date;
40
+ pendingSendCount?: number;
38
41
  /** Expiry for pending methods (TTL). */
39
42
  pendingExpiresAt?: Date;
40
43
  /** Passkey: WebAuthn credential id (base64url). */
@@ -161,150 +164,67 @@ interface Logger {
161
164
  error: (obj: object, msg?: string) => void;
162
165
  }
163
166
  declare const configSchema: z.ZodObject<{
164
- db: z.ZodType<Db, z.ZodTypeDef, Db>;
167
+ db: z.ZodCustom<Db, Db>;
165
168
  issuer: z.ZodString;
166
- /** PEM PKCS8 private key (Ed25519 or RSA). Required, min 32 bytes. */
167
169
  jwtPrivateKey: z.ZodString;
168
- /** 32-byte AES key, raw string or base64. Required. */
169
170
  encryptionKey: z.ZodString;
170
171
  keyId: z.ZodDefault<z.ZodString>;
171
- userAdapter: z.ZodType<UserAdapter, z.ZodTypeDef, UserAdapter>;
172
- smsProvider: z.ZodType<SmsProvider, z.ZodTypeDef, SmsProvider>;
173
- /** Enables the always-present EMAIL method (default for new users). */
174
- emailProvider: z.ZodOptional<z.ZodType<EmailProvider, z.ZodTypeDef, EmailProvider>>;
175
- /** MongoClient for transactions; defaults to the client behind `db`. */
176
- client: z.ZodOptional<z.ZodType<MongoClient, z.ZodTypeDef, MongoClient>>;
177
- logger: z.ZodOptional<z.ZodType<Logger, z.ZodTypeDef, Logger>>;
178
- hooks: z.ZodOptional<z.ZodType<Hooks, z.ZodTypeDef, Hooks>>;
179
- clock: z.ZodOptional<z.ZodType<Clock, z.ZodTypeDef, Clock>>;
172
+ userAdapter: z.ZodCustom<UserAdapter, UserAdapter>;
173
+ smsProvider: z.ZodCustom<SmsProvider, SmsProvider>;
174
+ emailProvider: z.ZodOptional<z.ZodCustom<EmailProvider, EmailProvider>>;
175
+ client: z.ZodOptional<z.ZodCustom<MongoClient, MongoClient>>;
176
+ logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
177
+ hooks: z.ZodOptional<z.ZodCustom<Hooks, Hooks>>;
178
+ clock: z.ZodOptional<z.ZodCustom<Clock, Clock>>;
180
179
  collectionPrefix: z.ZodDefault<z.ZodString>;
181
- /**
182
- * Passkeys (WebAuthn) as a second step. `rpID` is the site's domain (e.g. "childmatch.com",
183
- * "localhost"); `origins` are the exact browser origins allowed (e.g. "https://app.childmatch.com").
184
- * Omit to turn passkeys off.
185
- */
186
180
  passkeys: z.ZodOptional<z.ZodObject<{
187
181
  rpID: z.ZodString;
188
182
  rpName: z.ZodString;
189
- origins: z.ZodArray<z.ZodString, "many">;
190
- }, "strip", z.ZodTypeAny, {
191
- rpID: string;
192
- rpName: string;
193
- origins: string[];
194
- }, {
195
- rpID: string;
196
- rpName: string;
197
- origins: string[];
198
- }>>;
199
- /**
200
- * Allow POST /auth/login/start: sign in with the identifier and a verification method only
201
- * (no password). Single-factor — enable only for apps that already sign in by code. Pass a
202
- * function to allow it per request, e.g. only for `type: "badge"`.
203
- */
204
- passwordlessLogin: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
183
+ origins: z.ZodArray<z.ZodString>;
184
+ }, z.core.$strip>>;
185
+ passwordlessLogin: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
205
186
  username: string;
206
187
  type?: string;
207
- }) => boolean | Promise<boolean>, z.ZodTypeDef, (input: {
188
+ }) => boolean | Promise<boolean>, (input: {
208
189
  username: string;
209
190
  type?: string;
210
191
  }) => boolean | Promise<boolean>>]>>;
211
- /**
212
- * 2-Step Verification switch above each user's own choice. False: password sign-in never
213
- * asks for a code and the two-step setting can't be turned on. Passwordless sign-in still
214
- * sends a code — it's the only factor there. Pass a function to decide per user, e.g. from
215
- * an organization setting.
216
- */
217
- twoStepEnabled: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
192
+ twoStepEnabled: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
218
193
  userId: string;
219
- }) => boolean | Promise<boolean>, z.ZodTypeDef, (input: {
194
+ }) => boolean | Promise<boolean>, (input: {
220
195
  userId: string;
221
196
  }) => boolean | Promise<boolean>>]>>;
222
- /** 2-Step Verification state for users who have not chosen one yet. */
223
197
  twoStepDefault: z.ZodDefault<z.ZodBoolean>;
224
- limits: z.ZodDefault<z.ZodObject<{
225
- /** Failed passwords before lockout (BR-2). */
198
+ limits: z.ZodPrefault<z.ZodObject<{
226
199
  loginMaxAttempts: z.ZodDefault<z.ZodNumber>;
227
- /** Window for failed-login counting, minutes (BR-2). */
228
200
  loginWindowMin: z.ZodDefault<z.ZodNumber>;
229
- /** Lockout duration, minutes (BR-2, BR-9). */
230
201
  lockMinutes: z.ZodDefault<z.ZodNumber>;
231
- /** Min seconds between SMS sends on one challenge (BR-6). */
232
202
  smsResendSec: z.ZodDefault<z.ZodNumber>;
233
- /** Max SMS sends per challenge (BR-6). */
234
203
  smsMaxPerChallenge: z.ZodDefault<z.ZodNumber>;
235
- /** Max SMS sends per user per hour (BR-6). */
236
204
  smsMaxPerUserHour: z.ZodDefault<z.ZodNumber>;
237
- /** Wrong codes per challenge before lockout (BR-9). */
238
205
  mfaMaxAttempts: z.ZodDefault<z.ZodNumber>;
239
- /** Max verification methods per user (BR-16). */
240
206
  maxMethods: z.ZodDefault<z.ZodNumber>;
241
- /** Per-IP login requests per minute (NFR-B4). */
242
207
  loginIpPerMin: z.ZodDefault<z.ZodNumber>;
243
- /** Per-IP MFA verify requests per minute (NFR-B4). */
244
208
  verifyIpPerMin: z.ZodDefault<z.ZodNumber>;
245
- /** Per-IP step-up requests per minute (NFR-B4). */
246
209
  stepUpIpPerMin: z.ZodDefault<z.ZodNumber>;
247
- }, "strip", z.ZodTypeAny, {
248
- loginMaxAttempts: number;
249
- loginWindowMin: number;
250
- lockMinutes: number;
251
- smsResendSec: number;
252
- smsMaxPerChallenge: number;
253
- smsMaxPerUserHour: number;
254
- mfaMaxAttempts: number;
255
- maxMethods: number;
256
- loginIpPerMin: number;
257
- verifyIpPerMin: number;
258
- stepUpIpPerMin: number;
259
- }, {
260
- loginMaxAttempts?: number | undefined;
261
- loginWindowMin?: number | undefined;
262
- lockMinutes?: number | undefined;
263
- smsResendSec?: number | undefined;
264
- smsMaxPerChallenge?: number | undefined;
265
- smsMaxPerUserHour?: number | undefined;
266
- mfaMaxAttempts?: number | undefined;
267
- maxMethods?: number | undefined;
268
- loginIpPerMin?: number | undefined;
269
- verifyIpPerMin?: number | undefined;
270
- stepUpIpPerMin?: number | undefined;
271
- }>>;
272
- /**
273
- * Set false to turn off every RATE_LIMITED check: the per-IP limits on login / code
274
- * verify / send / step-up and the code-send cooldown and caps. Account lockouts after
275
- * failed passwords or codes (LOCKED) still apply.
276
- */
210
+ }, z.core.$strip>>;
277
211
  rateLimits: z.ZodDefault<z.ZodBoolean>;
278
- argon2: z.ZodDefault<z.ZodObject<{
212
+ argon2: z.ZodPrefault<z.ZodObject<{
279
213
  memoryKiB: z.ZodDefault<z.ZodNumber>;
280
214
  iterations: z.ZodDefault<z.ZodNumber>;
281
215
  parallelism: z.ZodDefault<z.ZodNumber>;
282
- }, "strip", z.ZodTypeAny, {
283
- memoryKiB: number;
284
- iterations: number;
285
- parallelism: number;
286
- }, {
287
- memoryKiB?: number | undefined;
288
- iterations?: number | undefined;
289
- parallelism?: number | undefined;
290
- }>>;
291
- cookies: z.ZodDefault<z.ZodObject<{
216
+ }, z.core.$strip>>;
217
+ cookies: z.ZodPrefault<z.ZodObject<{
292
218
  secure: z.ZodDefault<z.ZodBoolean>;
293
219
  domain: z.ZodOptional<z.ZodString>;
294
- sameSite: z.ZodDefault<z.ZodEnum<["lax", "strict", "none"]>>;
220
+ sameSite: z.ZodDefault<z.ZodEnum<{
221
+ lax: "lax";
222
+ strict: "strict";
223
+ none: "none";
224
+ }>>;
295
225
  path: z.ZodDefault<z.ZodString>;
296
- }, "strip", z.ZodTypeAny, {
297
- path: string;
298
- secure: boolean;
299
- sameSite: "lax" | "strict" | "none";
300
- domain?: string | undefined;
301
- }, {
302
- path?: string | undefined;
303
- secure?: boolean | undefined;
304
- domain?: string | undefined;
305
- sameSite?: "lax" | "strict" | "none" | undefined;
306
- }>>;
307
- ttl: z.ZodDefault<z.ZodObject<{
226
+ }, z.core.$strip>>;
227
+ ttl: z.ZodPrefault<z.ZodObject<{
308
228
  accessTokenSec: z.ZodDefault<z.ZodNumber>;
309
229
  refreshTokenDays: z.ZodDefault<z.ZodNumber>;
310
230
  trustedDeviceDays: z.ZodDefault<z.ZodNumber>;
@@ -312,150 +232,9 @@ declare const configSchema: z.ZodObject<{
312
232
  stepUpSec: z.ZodDefault<z.ZodNumber>;
313
233
  pendingMethodMin: z.ZodDefault<z.ZodNumber>;
314
234
  auditDays: z.ZodDefault<z.ZodNumber>;
315
- }, "strip", z.ZodTypeAny, {
316
- accessTokenSec: number;
317
- refreshTokenDays: number;
318
- trustedDeviceDays: number;
319
- challengeSec: number;
320
- stepUpSec: number;
321
- pendingMethodMin: number;
322
- auditDays: number;
323
- }, {
324
- accessTokenSec?: number | undefined;
325
- refreshTokenDays?: number | undefined;
326
- trustedDeviceDays?: number | undefined;
327
- challengeSec?: number | undefined;
328
- stepUpSec?: number | undefined;
329
- pendingMethodMin?: number | undefined;
330
- auditDays?: number | undefined;
331
- }>>;
332
- /** Serve GET /auth/openapi.json (A.7 docs). */
235
+ }, z.core.$strip>>;
333
236
  exposeDocs: z.ZodDefault<z.ZodBoolean>;
334
- }, "strip", z.ZodTypeAny, {
335
- db: Db;
336
- issuer: string;
337
- jwtPrivateKey: string;
338
- encryptionKey: string;
339
- keyId: string;
340
- userAdapter: UserAdapter;
341
- smsProvider: SmsProvider;
342
- collectionPrefix: string;
343
- passwordlessLogin: boolean | ((input: {
344
- username: string;
345
- type?: string;
346
- }) => boolean | Promise<boolean>);
347
- twoStepEnabled: boolean | ((input: {
348
- userId: string;
349
- }) => boolean | Promise<boolean>);
350
- twoStepDefault: boolean;
351
- limits: {
352
- loginMaxAttempts: number;
353
- loginWindowMin: number;
354
- lockMinutes: number;
355
- smsResendSec: number;
356
- smsMaxPerChallenge: number;
357
- smsMaxPerUserHour: number;
358
- mfaMaxAttempts: number;
359
- maxMethods: number;
360
- loginIpPerMin: number;
361
- verifyIpPerMin: number;
362
- stepUpIpPerMin: number;
363
- };
364
- rateLimits: boolean;
365
- argon2: {
366
- memoryKiB: number;
367
- iterations: number;
368
- parallelism: number;
369
- };
370
- cookies: {
371
- path: string;
372
- secure: boolean;
373
- sameSite: "lax" | "strict" | "none";
374
- domain?: string | undefined;
375
- };
376
- ttl: {
377
- accessTokenSec: number;
378
- refreshTokenDays: number;
379
- trustedDeviceDays: number;
380
- challengeSec: number;
381
- stepUpSec: number;
382
- pendingMethodMin: number;
383
- auditDays: number;
384
- };
385
- exposeDocs: boolean;
386
- emailProvider?: EmailProvider | undefined;
387
- client?: MongoClient | undefined;
388
- logger?: Logger | undefined;
389
- hooks?: Hooks | undefined;
390
- clock?: Clock | undefined;
391
- passkeys?: {
392
- rpID: string;
393
- rpName: string;
394
- origins: string[];
395
- } | undefined;
396
- }, {
397
- db: Db;
398
- issuer: string;
399
- jwtPrivateKey: string;
400
- encryptionKey: string;
401
- userAdapter: UserAdapter;
402
- smsProvider: SmsProvider;
403
- keyId?: string | undefined;
404
- emailProvider?: EmailProvider | undefined;
405
- client?: MongoClient | undefined;
406
- logger?: Logger | undefined;
407
- hooks?: Hooks | undefined;
408
- clock?: Clock | undefined;
409
- collectionPrefix?: string | undefined;
410
- passkeys?: {
411
- rpID: string;
412
- rpName: string;
413
- origins: string[];
414
- } | undefined;
415
- passwordlessLogin?: boolean | ((input: {
416
- username: string;
417
- type?: string;
418
- }) => boolean | Promise<boolean>) | undefined;
419
- twoStepEnabled?: boolean | ((input: {
420
- userId: string;
421
- }) => boolean | Promise<boolean>) | undefined;
422
- twoStepDefault?: boolean | undefined;
423
- limits?: {
424
- loginMaxAttempts?: number | undefined;
425
- loginWindowMin?: number | undefined;
426
- lockMinutes?: number | undefined;
427
- smsResendSec?: number | undefined;
428
- smsMaxPerChallenge?: number | undefined;
429
- smsMaxPerUserHour?: number | undefined;
430
- mfaMaxAttempts?: number | undefined;
431
- maxMethods?: number | undefined;
432
- loginIpPerMin?: number | undefined;
433
- verifyIpPerMin?: number | undefined;
434
- stepUpIpPerMin?: number | undefined;
435
- } | undefined;
436
- rateLimits?: boolean | undefined;
437
- argon2?: {
438
- memoryKiB?: number | undefined;
439
- iterations?: number | undefined;
440
- parallelism?: number | undefined;
441
- } | undefined;
442
- cookies?: {
443
- path?: string | undefined;
444
- secure?: boolean | undefined;
445
- domain?: string | undefined;
446
- sameSite?: "lax" | "strict" | "none" | undefined;
447
- } | undefined;
448
- ttl?: {
449
- accessTokenSec?: number | undefined;
450
- refreshTokenDays?: number | undefined;
451
- trustedDeviceDays?: number | undefined;
452
- challengeSec?: number | undefined;
453
- stepUpSec?: number | undefined;
454
- pendingMethodMin?: number | undefined;
455
- auditDays?: number | undefined;
456
- } | undefined;
457
- exposeDocs?: boolean | undefined;
458
- }>;
237
+ }, z.core.$strip>;
459
238
  type AuthConfigInput = z.input<typeof configSchema>;
460
239
  type AuthConfig = z.output<typeof configSchema> & {
461
240
  clock: Clock;
package/dist/index.d.ts CHANGED
@@ -35,6 +35,9 @@ interface MethodDoc {
35
35
  lastUsedStep?: number;
36
36
  /** SMS confirm-code hash while pending. */
37
37
  pendingCodeHash?: string;
38
+ /** When the pending SMS code was last sent, and how many were sent (resend cooldown + cap). */
39
+ pendingCodeSentAt?: Date;
40
+ pendingSendCount?: number;
38
41
  /** Expiry for pending methods (TTL). */
39
42
  pendingExpiresAt?: Date;
40
43
  /** Passkey: WebAuthn credential id (base64url). */
@@ -161,150 +164,67 @@ interface Logger {
161
164
  error: (obj: object, msg?: string) => void;
162
165
  }
163
166
  declare const configSchema: z.ZodObject<{
164
- db: z.ZodType<Db, z.ZodTypeDef, Db>;
167
+ db: z.ZodCustom<Db, Db>;
165
168
  issuer: z.ZodString;
166
- /** PEM PKCS8 private key (Ed25519 or RSA). Required, min 32 bytes. */
167
169
  jwtPrivateKey: z.ZodString;
168
- /** 32-byte AES key, raw string or base64. Required. */
169
170
  encryptionKey: z.ZodString;
170
171
  keyId: z.ZodDefault<z.ZodString>;
171
- userAdapter: z.ZodType<UserAdapter, z.ZodTypeDef, UserAdapter>;
172
- smsProvider: z.ZodType<SmsProvider, z.ZodTypeDef, SmsProvider>;
173
- /** Enables the always-present EMAIL method (default for new users). */
174
- emailProvider: z.ZodOptional<z.ZodType<EmailProvider, z.ZodTypeDef, EmailProvider>>;
175
- /** MongoClient for transactions; defaults to the client behind `db`. */
176
- client: z.ZodOptional<z.ZodType<MongoClient, z.ZodTypeDef, MongoClient>>;
177
- logger: z.ZodOptional<z.ZodType<Logger, z.ZodTypeDef, Logger>>;
178
- hooks: z.ZodOptional<z.ZodType<Hooks, z.ZodTypeDef, Hooks>>;
179
- clock: z.ZodOptional<z.ZodType<Clock, z.ZodTypeDef, Clock>>;
172
+ userAdapter: z.ZodCustom<UserAdapter, UserAdapter>;
173
+ smsProvider: z.ZodCustom<SmsProvider, SmsProvider>;
174
+ emailProvider: z.ZodOptional<z.ZodCustom<EmailProvider, EmailProvider>>;
175
+ client: z.ZodOptional<z.ZodCustom<MongoClient, MongoClient>>;
176
+ logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
177
+ hooks: z.ZodOptional<z.ZodCustom<Hooks, Hooks>>;
178
+ clock: z.ZodOptional<z.ZodCustom<Clock, Clock>>;
180
179
  collectionPrefix: z.ZodDefault<z.ZodString>;
181
- /**
182
- * Passkeys (WebAuthn) as a second step. `rpID` is the site's domain (e.g. "childmatch.com",
183
- * "localhost"); `origins` are the exact browser origins allowed (e.g. "https://app.childmatch.com").
184
- * Omit to turn passkeys off.
185
- */
186
180
  passkeys: z.ZodOptional<z.ZodObject<{
187
181
  rpID: z.ZodString;
188
182
  rpName: z.ZodString;
189
- origins: z.ZodArray<z.ZodString, "many">;
190
- }, "strip", z.ZodTypeAny, {
191
- rpID: string;
192
- rpName: string;
193
- origins: string[];
194
- }, {
195
- rpID: string;
196
- rpName: string;
197
- origins: string[];
198
- }>>;
199
- /**
200
- * Allow POST /auth/login/start: sign in with the identifier and a verification method only
201
- * (no password). Single-factor — enable only for apps that already sign in by code. Pass a
202
- * function to allow it per request, e.g. only for `type: "badge"`.
203
- */
204
- passwordlessLogin: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
183
+ origins: z.ZodArray<z.ZodString>;
184
+ }, z.core.$strip>>;
185
+ passwordlessLogin: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
205
186
  username: string;
206
187
  type?: string;
207
- }) => boolean | Promise<boolean>, z.ZodTypeDef, (input: {
188
+ }) => boolean | Promise<boolean>, (input: {
208
189
  username: string;
209
190
  type?: string;
210
191
  }) => boolean | Promise<boolean>>]>>;
211
- /**
212
- * 2-Step Verification switch above each user's own choice. False: password sign-in never
213
- * asks for a code and the two-step setting can't be turned on. Passwordless sign-in still
214
- * sends a code — it's the only factor there. Pass a function to decide per user, e.g. from
215
- * an organization setting.
216
- */
217
- twoStepEnabled: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
192
+ twoStepEnabled: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
218
193
  userId: string;
219
- }) => boolean | Promise<boolean>, z.ZodTypeDef, (input: {
194
+ }) => boolean | Promise<boolean>, (input: {
220
195
  userId: string;
221
196
  }) => boolean | Promise<boolean>>]>>;
222
- /** 2-Step Verification state for users who have not chosen one yet. */
223
197
  twoStepDefault: z.ZodDefault<z.ZodBoolean>;
224
- limits: z.ZodDefault<z.ZodObject<{
225
- /** Failed passwords before lockout (BR-2). */
198
+ limits: z.ZodPrefault<z.ZodObject<{
226
199
  loginMaxAttempts: z.ZodDefault<z.ZodNumber>;
227
- /** Window for failed-login counting, minutes (BR-2). */
228
200
  loginWindowMin: z.ZodDefault<z.ZodNumber>;
229
- /** Lockout duration, minutes (BR-2, BR-9). */
230
201
  lockMinutes: z.ZodDefault<z.ZodNumber>;
231
- /** Min seconds between SMS sends on one challenge (BR-6). */
232
202
  smsResendSec: z.ZodDefault<z.ZodNumber>;
233
- /** Max SMS sends per challenge (BR-6). */
234
203
  smsMaxPerChallenge: z.ZodDefault<z.ZodNumber>;
235
- /** Max SMS sends per user per hour (BR-6). */
236
204
  smsMaxPerUserHour: z.ZodDefault<z.ZodNumber>;
237
- /** Wrong codes per challenge before lockout (BR-9). */
238
205
  mfaMaxAttempts: z.ZodDefault<z.ZodNumber>;
239
- /** Max verification methods per user (BR-16). */
240
206
  maxMethods: z.ZodDefault<z.ZodNumber>;
241
- /** Per-IP login requests per minute (NFR-B4). */
242
207
  loginIpPerMin: z.ZodDefault<z.ZodNumber>;
243
- /** Per-IP MFA verify requests per minute (NFR-B4). */
244
208
  verifyIpPerMin: z.ZodDefault<z.ZodNumber>;
245
- /** Per-IP step-up requests per minute (NFR-B4). */
246
209
  stepUpIpPerMin: z.ZodDefault<z.ZodNumber>;
247
- }, "strip", z.ZodTypeAny, {
248
- loginMaxAttempts: number;
249
- loginWindowMin: number;
250
- lockMinutes: number;
251
- smsResendSec: number;
252
- smsMaxPerChallenge: number;
253
- smsMaxPerUserHour: number;
254
- mfaMaxAttempts: number;
255
- maxMethods: number;
256
- loginIpPerMin: number;
257
- verifyIpPerMin: number;
258
- stepUpIpPerMin: number;
259
- }, {
260
- loginMaxAttempts?: number | undefined;
261
- loginWindowMin?: number | undefined;
262
- lockMinutes?: number | undefined;
263
- smsResendSec?: number | undefined;
264
- smsMaxPerChallenge?: number | undefined;
265
- smsMaxPerUserHour?: number | undefined;
266
- mfaMaxAttempts?: number | undefined;
267
- maxMethods?: number | undefined;
268
- loginIpPerMin?: number | undefined;
269
- verifyIpPerMin?: number | undefined;
270
- stepUpIpPerMin?: number | undefined;
271
- }>>;
272
- /**
273
- * Set false to turn off every RATE_LIMITED check: the per-IP limits on login / code
274
- * verify / send / step-up and the code-send cooldown and caps. Account lockouts after
275
- * failed passwords or codes (LOCKED) still apply.
276
- */
210
+ }, z.core.$strip>>;
277
211
  rateLimits: z.ZodDefault<z.ZodBoolean>;
278
- argon2: z.ZodDefault<z.ZodObject<{
212
+ argon2: z.ZodPrefault<z.ZodObject<{
279
213
  memoryKiB: z.ZodDefault<z.ZodNumber>;
280
214
  iterations: z.ZodDefault<z.ZodNumber>;
281
215
  parallelism: z.ZodDefault<z.ZodNumber>;
282
- }, "strip", z.ZodTypeAny, {
283
- memoryKiB: number;
284
- iterations: number;
285
- parallelism: number;
286
- }, {
287
- memoryKiB?: number | undefined;
288
- iterations?: number | undefined;
289
- parallelism?: number | undefined;
290
- }>>;
291
- cookies: z.ZodDefault<z.ZodObject<{
216
+ }, z.core.$strip>>;
217
+ cookies: z.ZodPrefault<z.ZodObject<{
292
218
  secure: z.ZodDefault<z.ZodBoolean>;
293
219
  domain: z.ZodOptional<z.ZodString>;
294
- sameSite: z.ZodDefault<z.ZodEnum<["lax", "strict", "none"]>>;
220
+ sameSite: z.ZodDefault<z.ZodEnum<{
221
+ lax: "lax";
222
+ strict: "strict";
223
+ none: "none";
224
+ }>>;
295
225
  path: z.ZodDefault<z.ZodString>;
296
- }, "strip", z.ZodTypeAny, {
297
- path: string;
298
- secure: boolean;
299
- sameSite: "lax" | "strict" | "none";
300
- domain?: string | undefined;
301
- }, {
302
- path?: string | undefined;
303
- secure?: boolean | undefined;
304
- domain?: string | undefined;
305
- sameSite?: "lax" | "strict" | "none" | undefined;
306
- }>>;
307
- ttl: z.ZodDefault<z.ZodObject<{
226
+ }, z.core.$strip>>;
227
+ ttl: z.ZodPrefault<z.ZodObject<{
308
228
  accessTokenSec: z.ZodDefault<z.ZodNumber>;
309
229
  refreshTokenDays: z.ZodDefault<z.ZodNumber>;
310
230
  trustedDeviceDays: z.ZodDefault<z.ZodNumber>;
@@ -312,150 +232,9 @@ declare const configSchema: z.ZodObject<{
312
232
  stepUpSec: z.ZodDefault<z.ZodNumber>;
313
233
  pendingMethodMin: z.ZodDefault<z.ZodNumber>;
314
234
  auditDays: z.ZodDefault<z.ZodNumber>;
315
- }, "strip", z.ZodTypeAny, {
316
- accessTokenSec: number;
317
- refreshTokenDays: number;
318
- trustedDeviceDays: number;
319
- challengeSec: number;
320
- stepUpSec: number;
321
- pendingMethodMin: number;
322
- auditDays: number;
323
- }, {
324
- accessTokenSec?: number | undefined;
325
- refreshTokenDays?: number | undefined;
326
- trustedDeviceDays?: number | undefined;
327
- challengeSec?: number | undefined;
328
- stepUpSec?: number | undefined;
329
- pendingMethodMin?: number | undefined;
330
- auditDays?: number | undefined;
331
- }>>;
332
- /** Serve GET /auth/openapi.json (A.7 docs). */
235
+ }, z.core.$strip>>;
333
236
  exposeDocs: z.ZodDefault<z.ZodBoolean>;
334
- }, "strip", z.ZodTypeAny, {
335
- db: Db;
336
- issuer: string;
337
- jwtPrivateKey: string;
338
- encryptionKey: string;
339
- keyId: string;
340
- userAdapter: UserAdapter;
341
- smsProvider: SmsProvider;
342
- collectionPrefix: string;
343
- passwordlessLogin: boolean | ((input: {
344
- username: string;
345
- type?: string;
346
- }) => boolean | Promise<boolean>);
347
- twoStepEnabled: boolean | ((input: {
348
- userId: string;
349
- }) => boolean | Promise<boolean>);
350
- twoStepDefault: boolean;
351
- limits: {
352
- loginMaxAttempts: number;
353
- loginWindowMin: number;
354
- lockMinutes: number;
355
- smsResendSec: number;
356
- smsMaxPerChallenge: number;
357
- smsMaxPerUserHour: number;
358
- mfaMaxAttempts: number;
359
- maxMethods: number;
360
- loginIpPerMin: number;
361
- verifyIpPerMin: number;
362
- stepUpIpPerMin: number;
363
- };
364
- rateLimits: boolean;
365
- argon2: {
366
- memoryKiB: number;
367
- iterations: number;
368
- parallelism: number;
369
- };
370
- cookies: {
371
- path: string;
372
- secure: boolean;
373
- sameSite: "lax" | "strict" | "none";
374
- domain?: string | undefined;
375
- };
376
- ttl: {
377
- accessTokenSec: number;
378
- refreshTokenDays: number;
379
- trustedDeviceDays: number;
380
- challengeSec: number;
381
- stepUpSec: number;
382
- pendingMethodMin: number;
383
- auditDays: number;
384
- };
385
- exposeDocs: boolean;
386
- emailProvider?: EmailProvider | undefined;
387
- client?: MongoClient | undefined;
388
- logger?: Logger | undefined;
389
- hooks?: Hooks | undefined;
390
- clock?: Clock | undefined;
391
- passkeys?: {
392
- rpID: string;
393
- rpName: string;
394
- origins: string[];
395
- } | undefined;
396
- }, {
397
- db: Db;
398
- issuer: string;
399
- jwtPrivateKey: string;
400
- encryptionKey: string;
401
- userAdapter: UserAdapter;
402
- smsProvider: SmsProvider;
403
- keyId?: string | undefined;
404
- emailProvider?: EmailProvider | undefined;
405
- client?: MongoClient | undefined;
406
- logger?: Logger | undefined;
407
- hooks?: Hooks | undefined;
408
- clock?: Clock | undefined;
409
- collectionPrefix?: string | undefined;
410
- passkeys?: {
411
- rpID: string;
412
- rpName: string;
413
- origins: string[];
414
- } | undefined;
415
- passwordlessLogin?: boolean | ((input: {
416
- username: string;
417
- type?: string;
418
- }) => boolean | Promise<boolean>) | undefined;
419
- twoStepEnabled?: boolean | ((input: {
420
- userId: string;
421
- }) => boolean | Promise<boolean>) | undefined;
422
- twoStepDefault?: boolean | undefined;
423
- limits?: {
424
- loginMaxAttempts?: number | undefined;
425
- loginWindowMin?: number | undefined;
426
- lockMinutes?: number | undefined;
427
- smsResendSec?: number | undefined;
428
- smsMaxPerChallenge?: number | undefined;
429
- smsMaxPerUserHour?: number | undefined;
430
- mfaMaxAttempts?: number | undefined;
431
- maxMethods?: number | undefined;
432
- loginIpPerMin?: number | undefined;
433
- verifyIpPerMin?: number | undefined;
434
- stepUpIpPerMin?: number | undefined;
435
- } | undefined;
436
- rateLimits?: boolean | undefined;
437
- argon2?: {
438
- memoryKiB?: number | undefined;
439
- iterations?: number | undefined;
440
- parallelism?: number | undefined;
441
- } | undefined;
442
- cookies?: {
443
- path?: string | undefined;
444
- secure?: boolean | undefined;
445
- domain?: string | undefined;
446
- sameSite?: "lax" | "strict" | "none" | undefined;
447
- } | undefined;
448
- ttl?: {
449
- accessTokenSec?: number | undefined;
450
- refreshTokenDays?: number | undefined;
451
- trustedDeviceDays?: number | undefined;
452
- challengeSec?: number | undefined;
453
- stepUpSec?: number | undefined;
454
- pendingMethodMin?: number | undefined;
455
- auditDays?: number | undefined;
456
- } | undefined;
457
- exposeDocs?: boolean | undefined;
458
- }>;
237
+ }, z.core.$strip>;
459
238
  type AuthConfigInput = z.input<typeof configSchema>;
460
239
  type AuthConfig = z.output<typeof configSchema> & {
461
240
  clock: Clock;