@artatol-acp/auth-nextjs 0.2.0 → 0.3.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.
package/README.md CHANGED
@@ -334,6 +334,9 @@ NEXT_PUBLIC_ACP_AUTH_URL=https://sso.artatol.com
334
334
  - `register(email, password)` - Register new user (sends verification email)
335
335
  - `verifyEmail(token)` - Verify user's email address
336
336
  - `resendVerificationEmail(email)` - Resend verification email
337
+ - `forgotPassword(email)` - Request password reset email
338
+ - `resetPassword(token, newPassword)` - Reset password using token from email
339
+ - `deleteAccount(password, confirmation)` - Delete authenticated user's account
337
340
 
338
341
  ### Client Hooks
339
342
 
@@ -343,6 +346,245 @@ NEXT_PUBLIC_ACP_AUTH_URL=https://sso.artatol.com
343
346
 
344
347
  - `createACPAuthMiddleware(options)` - Create middleware for route protection
345
348
 
349
+ ## 2FA (Two-Factor Authentication)
350
+
351
+ ### Setup 2FA
352
+
353
+ ```typescript
354
+ 'use server';
355
+
356
+ import { ACPAuthClient } from '@artatol-acp/auth-nextjs/server';
357
+
358
+ export async function setup2FAAction(password: string) {
359
+ const client = new ACPAuthClient({
360
+ baseUrl: process.env.ACP_AUTH_URL!,
361
+ apiKey: process.env.ACP_AUTH_API_KEY!,
362
+ });
363
+
364
+ const accessToken = // ... get from session/cookie
365
+
366
+ const { secret, qrCodeUrl, recoveryCodes } = await client.setup2FA(
367
+ { password },
368
+ accessToken
369
+ );
370
+
371
+ return { qrCodeUrl, recoveryCodes };
372
+ }
373
+ ```
374
+
375
+ ### Verify 2FA Setup
376
+
377
+ ```typescript
378
+ 'use server';
379
+
380
+ export async function verify2FAAction(code: string) {
381
+ const client = new ACPAuthClient({
382
+ baseUrl: process.env.ACP_AUTH_URL!,
383
+ apiKey: process.env.ACP_AUTH_API_KEY!,
384
+ });
385
+
386
+ const accessToken = // ... get from session/cookie
387
+
388
+ await client.verify2FA({ code }, accessToken);
389
+ }
390
+ ```
391
+
392
+ ### Complete 2FA Login Flow
393
+
394
+ ```typescript
395
+ 'use server';
396
+
397
+ import { login } from '@artatol-acp/auth-nextjs/server';
398
+
399
+ export async function loginAction(email: string, password: string) {
400
+ const result = await login(email, password);
401
+
402
+ if ('requiresTwoFactor' in result) {
403
+ // User has 2FA enabled
404
+ return {
405
+ requires2FA: true,
406
+ tempToken: result.tempToken,
407
+ };
408
+ }
409
+
410
+ // Regular login successful
411
+ return { success: true };
412
+ }
413
+
414
+ export async function complete2FALogin(tempToken: string, code: string) {
415
+ const client = new ACPAuthClient({
416
+ baseUrl: process.env.ACP_AUTH_URL!,
417
+ apiKey: process.env.ACP_AUTH_API_KEY!,
418
+ });
419
+
420
+ const result = await client.verify2FALogin({ tempToken, code });
421
+ // Set cookies, etc.
422
+ return result;
423
+ }
424
+ ```
425
+
426
+ ### Disable 2FA
427
+
428
+ ```typescript
429
+ 'use server';
430
+
431
+ export async function disable2FAAction(password: string, code: string) {
432
+ const client = new ACPAuthClient({
433
+ baseUrl: process.env.ACP_AUTH_URL!,
434
+ apiKey: process.env.ACP_AUTH_API_KEY!,
435
+ });
436
+
437
+ const accessToken = // ... get from session/cookie
438
+
439
+ await client.disable2FA({ password, code }, accessToken);
440
+ }
441
+ ```
442
+
443
+ ## Password Reset
444
+
445
+ ### Forgot Password
446
+
447
+ Request a password reset email:
448
+
449
+ ```typescript
450
+ 'use server';
451
+
452
+ import { forgotPassword } from '@artatol-acp/auth-nextjs/server';
453
+
454
+ export async function forgotPasswordAction(formData: FormData) {
455
+ const email = formData.get('email') as string;
456
+
457
+ await forgotPassword(email);
458
+ // Always succeeds to prevent email enumeration
459
+ return { message: 'If the email exists, a reset link has been sent' };
460
+ }
461
+ ```
462
+
463
+ ### Reset Password
464
+
465
+ Reset password using the token from the email:
466
+
467
+ ```typescript
468
+ 'use server';
469
+
470
+ import { resetPassword } from '@artatol-acp/auth-nextjs/server';
471
+ import { redirect } from 'next/navigation';
472
+
473
+ export async function resetPasswordAction(formData: FormData) {
474
+ const token = formData.get('token') as string;
475
+ const newPassword = formData.get('password') as string;
476
+
477
+ try {
478
+ await resetPassword(token, newPassword);
479
+ redirect('/login?reset=success');
480
+ } catch (error) {
481
+ return { error: 'Invalid or expired reset token' };
482
+ }
483
+ }
484
+ ```
485
+
486
+ ### Client Component Example
487
+
488
+ ```typescript
489
+ 'use client';
490
+
491
+ import { useState } from 'react';
492
+ import { forgotPasswordAction } from './actions';
493
+
494
+ export function ForgotPasswordForm() {
495
+ const [submitted, setSubmitted] = useState(false);
496
+
497
+ const handleSubmit = async (formData: FormData) => {
498
+ await forgotPasswordAction(formData);
499
+ setSubmitted(true);
500
+ };
501
+
502
+ if (submitted) {
503
+ return <p>Check your email for a password reset link.</p>;
504
+ }
505
+
506
+ return (
507
+ <form action={handleSubmit}>
508
+ <input name="email" type="email" placeholder="Email" required />
509
+ <button type="submit">Send Reset Link</button>
510
+ </form>
511
+ );
512
+ }
513
+ ```
514
+
515
+ ## Delete Account
516
+
517
+ Delete the authenticated user's account:
518
+
519
+ ```typescript
520
+ 'use server';
521
+
522
+ import { deleteAccount } from '@artatol-acp/auth-nextjs/server';
523
+ import { redirect } from 'next/navigation';
524
+
525
+ export async function deleteAccountAction(formData: FormData) {
526
+ const password = formData.get('password') as string;
527
+ const confirmation = formData.get('confirmation') as string;
528
+
529
+ try {
530
+ await deleteAccount(password, confirmation);
531
+ redirect('/goodbye');
532
+ } catch (error) {
533
+ return { error: 'Failed to delete account. Check your password.' };
534
+ }
535
+ }
536
+ ```
537
+
538
+ **Note:** The `confirmation` parameter must be the string `"DELETE"` to confirm account deletion.
539
+
540
+ ## Health Check
541
+
542
+ To check if the auth service is available:
543
+
544
+ ```typescript
545
+ import { ACPAuthClient } from '@artatol-acp/auth-nextjs/server';
546
+
547
+ const client = new ACPAuthClient({
548
+ baseUrl: process.env.ACP_AUTH_URL!,
549
+ apiKey: process.env.ACP_AUTH_API_KEY!,
550
+ });
551
+
552
+ const health = await client.health();
553
+ console.log(health); // { status: 'ok', timestamp: '...' }
554
+ ```
555
+
556
+ ## Error Handling
557
+
558
+ ```typescript
559
+ import { ACPAuthError } from '@artatol-acp/auth-js';
560
+
561
+ try {
562
+ await login(email, password);
563
+ } catch (error) {
564
+ if (error instanceof ACPAuthError) {
565
+ console.error('Auth error:', error.message);
566
+ console.error('Status code:', error.statusCode);
567
+
568
+ if (error.statusCode === 401) {
569
+ // Invalid credentials
570
+ } else if (error.statusCode === 429) {
571
+ // Rate limited
572
+ }
573
+ } else {
574
+ console.error('Unexpected error:', error);
575
+ }
576
+ }
577
+ ```
578
+
579
+ ### Common Error Codes
580
+
581
+ | Status Code | Meaning |
582
+ |-------------|---------|
583
+ | 401 | Unauthorized (invalid credentials or token) |
584
+ | 403 | Forbidden (email not verified, account locked) |
585
+ | 429 | Too Many Requests (rate limited) |
586
+ | 500 | Internal Server Error |
587
+
346
588
  ## License
347
589
 
348
590
  MIT
@@ -1,4 +1,4 @@
1
- import type { User } from '@artatol-acp/auth-js';
1
+ import { type User } from '@artatol-acp/auth-js';
2
2
  import { type ReactNode } from 'react';
3
3
  export type ACPAuthContextValue = {
4
4
  user: User | null;
@@ -6,6 +6,7 @@ export type ACPAuthContextValue = {
6
6
  login: (email: string, password: string) => Promise<void>;
7
7
  logout: () => Promise<void>;
8
8
  refresh: () => Promise<void>;
9
+ resendVerification: (email: string) => Promise<void>;
9
10
  };
10
11
  export type ACPAuthProviderProps = {
11
12
  children: ReactNode;
@@ -15,3 +16,4 @@ export declare function ACPAuthProvider({ children, baseUrl }: ACPAuthProviderPr
15
16
  export declare function useAuth(): ACPAuthContextValue;
16
17
  export { ACPAuthClient } from '@artatol-acp/auth-js';
17
18
  export type * from '@artatol-acp/auth-js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAkD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAIF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,oBAAoB,2CA8C1E;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
@@ -30,11 +30,14 @@ export function ACPAuthProvider({ children, baseUrl }) {
30
30
  await client.logout();
31
31
  setUser(null);
32
32
  };
33
+ const resendVerification = async (email) => {
34
+ await client.resendVerificationEmail({ email });
35
+ };
33
36
  useEffect(() => {
34
37
  // Try to restore session on mount
35
38
  refresh().finally(() => setIsLoading(false));
36
39
  }, []);
37
- return (<ACPAuthContext.Provider value={{ user, isLoading, login, logout, refresh }}>
40
+ return (<ACPAuthContext.Provider value={{ user, isLoading, login, logout, refresh, resendVerification }}>
38
41
  {children}
39
42
  </ACPAuthContext.Provider>);
40
43
  }
@@ -47,3 +50,4 @@ export function useAuth() {
47
50
  }
48
51
  // Re-export client for direct use
49
52
  export { ACPAuthClient } from '@artatol-acp/auth-js';
53
+ //# sourceMappingURL=index.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAa,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAWvF,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAOvE,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAwB;IACzE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,iDAAiD;YACjD,kDAAkD;YAClD,4CAA4C;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEvD,IAAI,mBAAmB,IAAI,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QACjD,MAAM,MAAM,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAC9F;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,cAAc,CAAC,QAAQ,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from './server/index.js';
2
- export * from './client/index.js';
3
- export * from './middleware.js';
1
+ export { ACPAuthClient } from '@artatol-acp/auth-js';
2
+ export type * from '@artatol-acp/auth-js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export * from './server/index.js';
2
- export * from './client/index.js';
3
- export * from './middleware.js';
1
+ // This is the main entry point, but most users will import from /server, /client, or /middleware
2
+ export { ACPAuthClient } from '@artatol-acp/auth-js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -5,3 +5,4 @@ export type ACPAuthMiddlewareOptions = {
5
5
  loginPath?: string;
6
6
  };
7
7
  export declare function createACPAuthMiddleware(options: ACPAuthMiddlewareOptions): (request: NextRequest) => Promise<NextResponse<unknown>>;
8
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,IAO/B,SAAS,WAAW,oCAuC7D"}
@@ -6,7 +6,7 @@ export function createACPAuthMiddleware(options) {
6
6
  return async function acpAuthMiddleware(request) {
7
7
  const { pathname } = request.nextUrl;
8
8
  // Allow public paths
9
- if (publicPaths.some(path => pathname.startsWith(path))) {
9
+ if (publicPaths.some((path) => pathname.startsWith(path))) {
10
10
  return NextResponse.next();
11
11
  }
12
12
  // Check for access token
@@ -38,3 +38,4 @@ export function createACPAuthMiddleware(options) {
38
38
  }
39
39
  };
40
40
  }
41
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAgB,MAAM,MAAM,CAAC;AAQ3D,IAAI,SAAS,GAAmB,IAAI,CAAC;AAErC,MAAM,UAAU,uBAAuB,CAAC,OAAiC;IACvE,MAAM,EACJ,YAAY,EACZ,WAAW,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,EAC5E,SAAS,GAAG,QAAQ,GACrB,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,UAAU,iBAAiB,CAAC,OAAoB;QAC1D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;QAErC,qBAAqB;QACrB,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,yBAAyB;QACzB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC;QAE/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,oBAAoB;YACpB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;YACzB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE;gBACtC,UAAU,EAAE,CAAC,OAAO,CAAC;aACtB,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gCAAgC;YAChC,6BAA6B;YAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;YACzB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -11,6 +11,22 @@ export declare function refreshAccessToken(): Promise<string | null>;
11
11
  export declare function login(email: string, password: string): Promise<LoginResult>;
12
12
  export declare function logout(): Promise<void>;
13
13
  export declare function register(email: string, password: string): Promise<User>;
14
+ export declare function verifyEmail(token: string): Promise<{
15
+ message: string;
16
+ }>;
17
+ export declare function resendVerificationEmail(email: string): Promise<{
18
+ message: string;
19
+ }>;
14
20
  export declare function me(): Promise<User | null>;
21
+ export declare function forgotPassword(email: string): Promise<{
22
+ message: string;
23
+ }>;
24
+ export declare function resetPassword(token: string, newPassword: string): Promise<{
25
+ message: string;
26
+ }>;
27
+ export declare function deleteAccount(password: string, confirmation: string): Promise<{
28
+ message: string;
29
+ }>;
15
30
  export { ACPAuthClient } from '@artatol-acp/auth-js';
16
31
  export type * from '@artatol-acp/auth-js';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGlF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAMF,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAOxE;AAqBD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepE;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAapD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBjE;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBjF;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAW5C;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAG7E;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGzF;AAED,wBAAsB,EAAE,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAe/C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGpG;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBxG;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
@@ -106,6 +106,14 @@ export async function register(email, password) {
106
106
  const client = getClient();
107
107
  return await client.register({ email, password });
108
108
  }
109
+ export async function verifyEmail(token) {
110
+ const client = getClient();
111
+ return await client.verifyEmail({ token });
112
+ }
113
+ export async function resendVerificationEmail(email) {
114
+ const client = getClient();
115
+ return await client.resendVerificationEmail({ email });
116
+ }
109
117
  export async function me() {
110
118
  const cookieStore = await cookies();
111
119
  const accessToken = cookieStore.get('access_token')?.value;
@@ -120,5 +128,27 @@ export async function me() {
120
128
  return null;
121
129
  }
122
130
  }
131
+ export async function forgotPassword(email) {
132
+ const client = getClient();
133
+ return await client.forgotPassword({ email });
134
+ }
135
+ export async function resetPassword(token, newPassword) {
136
+ const client = getClient();
137
+ return await client.resetPassword({ token, newPassword });
138
+ }
139
+ export async function deleteAccount(password, confirmation) {
140
+ const cookieStore = await cookies();
141
+ const accessToken = cookieStore.get('access_token')?.value;
142
+ if (!accessToken) {
143
+ throw new Error('Not authenticated');
144
+ }
145
+ const client = getClient();
146
+ const result = await client.deleteAccount({ password, confirmation }, accessToken);
147
+ // Clear cookies after account deletion
148
+ cookieStore.delete('access_token');
149
+ cookieStore.delete('refresh_token');
150
+ return result;
151
+ }
123
152
  // Re-export client for direct use if needed
124
153
  export { ACPAuthClient } from '@artatol-acp/auth-js';
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "@artatol-acp/auth-nextjs",
3
- "version": "0.2.0",
4
- "description": "Next.js SDK for Artatol Cloud Platform Authentication",
3
+ "version": "0.3.2",
4
+ "description": "Next.js SDK for Artatol Cloud Platform Authentication with support for App Router, Server Actions, and Middleware",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
7
  "types": "./dist/index.d.ts",
9
8
  "exports": {
10
9
  ".": {
@@ -16,7 +15,7 @@
16
15
  "types": "./dist/server/index.d.ts"
17
16
  },
18
17
  "./client": {
19
- "import": "./dist/client/index.js",
18
+ "import": "./dist/client/index.jsx",
20
19
  "types": "./dist/client/index.d.ts"
21
20
  },
22
21
  "./middleware": {
@@ -30,29 +29,24 @@
30
29
  "keywords": [
31
30
  "acp",
32
31
  "auth",
33
- "authentication",
34
- "artatol",
35
- "jwt",
36
- "2fa",
37
32
  "nextjs",
38
- "next.js"
33
+ "next",
34
+ "authentication",
35
+ "artatol"
39
36
  ],
40
37
  "author": "Artatol",
41
38
  "license": "MIT",
42
- "dependencies": {
43
- "jose": "^6.1.3",
44
- "@artatol-acp/auth-js": "0.2.0"
45
- },
46
39
  "peerDependencies": {
47
- "next": ">=15.0.0",
48
- "react": ">=18.0.0"
40
+ "next": "^14.0.0 || ^15.0.0",
41
+ "react": "^18.0.0 || ^19.0.0"
42
+ },
43
+ "dependencies": {
44
+ "@artatol-acp/auth-js": "^0.3.2",
45
+ "jose": "^5.9.6"
49
46
  },
50
47
  "devDependencies": {
51
- "@types/node": "^24.10.1",
52
- "@types/react": "^18.3.18",
53
- "next": "^15.1.6",
54
- "react": "^18.3.1",
55
- "typescript": "^5.7.2"
48
+ "@types/react": "^18.3.0",
49
+ "typescript": "^5.6.3"
56
50
  },
57
51
  "publishConfig": {
58
52
  "access": "public"
@@ -62,4 +56,4 @@
62
56
  "dev": "tsc --watch",
63
57
  "typecheck": "tsc --noEmit"
64
58
  }
65
- }
59
+ }