@artatol-acp/auth-nextjs 0.3.8 → 0.4.0

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.
@@ -3,17 +3,29 @@ import { type ReactNode } from 'react';
3
3
  export type ACPAuthContextValue = {
4
4
  user: User | null;
5
5
  isLoading: boolean;
6
- login: (email: string, password: string) => Promise<void>;
6
+ login: (email: string, password: string) => Promise<{
7
+ requiresTwoFactor?: boolean;
8
+ tempToken?: string;
9
+ }>;
10
+ verify2FA: (tempToken: string, code: string) => Promise<void>;
7
11
  logout: () => Promise<void>;
8
12
  refresh: () => Promise<boolean>;
9
13
  resendVerification: (email: string) => Promise<void>;
10
14
  };
11
15
  export type ACPAuthProviderProps = {
12
16
  children: ReactNode;
13
- baseUrl: string;
17
+ /**
18
+ * Base path for auth API routes in your app.
19
+ * @default "/api/auth"
20
+ */
21
+ apiBasePath?: string;
22
+ /**
23
+ * Initial user data from server-side rendering.
24
+ * If provided, skips initial client-side session fetch.
25
+ */
26
+ initialUser?: User | null;
14
27
  };
15
- export declare function ACPAuthProvider({ children, baseUrl }: ACPAuthProviderProps): import("react/jsx-runtime").JSX.Element;
28
+ export declare function ACPAuthProvider({ children, apiBasePath, initialUser, }: ACPAuthProviderProps): import("react/jsx-runtime").JSX.Element;
16
29
  export declare function useAuth(): ACPAuthContextValue;
17
- export { ACPAuthClient } from '@artatol-acp/auth-js';
18
- export type * from '@artatol-acp/auth-js';
30
+ export type { User } from '@artatol-acp/auth-js';
19
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,EAAuE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5G,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,OAAO,CAAC,CAAC;IAChC,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,2CAuF1E;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAuE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5G,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;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzG,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,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;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B,CAAC;AA6BF,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,WAAyB,EACzB,WAAW,GACZ,EAAE,oBAAoB,2CAmHtB;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,19 +1,28 @@
1
1
  /** @jsxImportSource react */
2
2
  'use client';
3
3
  import { jsx as _jsx } from "react/jsx-runtime";
4
- import { ACPAuthClient } from '@artatol-acp/auth-js';
5
4
  import { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';
6
5
  const ACPAuthContext = createContext(null);
7
- export function ACPAuthProvider({ children, baseUrl }) {
8
- const [user, setUser] = useState(null);
9
- const [isLoading, setIsLoading] = useState(true);
10
- const clientRef = useRef(new ACPAuthClient({
11
- baseUrl,
12
- apiKey: '',
13
- autoRefresh: true,
14
- refreshThresholdSeconds: 60
15
- }));
6
+ async function authFetch(path, options = {}) {
7
+ const response = await fetch(path, {
8
+ ...options,
9
+ headers: {
10
+ 'Content-Type': 'application/json',
11
+ ...options.headers,
12
+ },
13
+ credentials: 'include',
14
+ });
15
+ const data = await response.json();
16
+ if (!data.success) {
17
+ throw new Error(data.error.message);
18
+ }
19
+ return data.data;
20
+ }
21
+ export function ACPAuthProvider({ children, apiBasePath = '/api/auth', initialUser, }) {
22
+ const [user, setUser] = useState(initialUser ?? null);
23
+ const [isLoading, setIsLoading] = useState(initialUser === undefined);
16
24
  const intervalRef = useRef(null);
25
+ const apiBase = apiBasePath.replace(/\/$/, '');
17
26
  const clearRefreshInterval = useCallback(() => {
18
27
  if (intervalRef.current) {
19
28
  clearInterval(intervalRef.current);
@@ -22,43 +31,60 @@ export function ACPAuthProvider({ children, baseUrl }) {
22
31
  }, []);
23
32
  const refresh = useCallback(async () => {
24
33
  try {
25
- await clientRef.current.refresh();
26
- const userData = await clientRef.current.me();
27
- setUser(userData);
34
+ const result = await authFetch(`${apiBase}/session`, {
35
+ method: 'POST',
36
+ });
37
+ setUser(result.user);
28
38
  return true;
29
39
  }
30
40
  catch {
41
+ setUser(null);
31
42
  return false;
32
43
  }
33
- }, []);
44
+ }, [apiBase]);
34
45
  const login = useCallback(async (email, password) => {
35
- const result = await clientRef.current.login({ email, password });
36
- if ('requiresTwoFactor' in result) {
37
- throw new Error('2FA_REQUIRED');
46
+ const result = await authFetch(`${apiBase}/login`, {
47
+ method: 'POST',
48
+ body: JSON.stringify({ email, password }),
49
+ });
50
+ if (result.requiresTwoFactor) {
51
+ return { requiresTwoFactor: true, tempToken: result.tempToken };
52
+ }
53
+ if (result.user) {
54
+ setUser(result.user);
38
55
  }
39
- // User logged in successfully, token is automatically set in client
56
+ return {};
57
+ }, [apiBase]);
58
+ const verify2FA = useCallback(async (tempToken, code) => {
59
+ const result = await authFetch(`${apiBase}/verify-2fa`, {
60
+ method: 'POST',
61
+ body: JSON.stringify({ tempToken, code }),
62
+ });
40
63
  setUser(result.user);
41
- }, []);
64
+ }, [apiBase]);
42
65
  const logout = useCallback(async () => {
43
- // First clear the interval to prevent race conditions
44
66
  clearRefreshInterval();
45
- // Then clear user state
46
67
  setUser(null);
47
- // Finally call logout API
48
68
  try {
49
- await clientRef.current.logout();
69
+ await authFetch(`${apiBase}/logout`, { method: 'POST' });
50
70
  }
51
71
  catch {
52
- // Ignore logout errors, user is already logged out locally
72
+ // Ignore logout errors
53
73
  }
54
- }, [clearRefreshInterval]);
74
+ }, [apiBase, clearRefreshInterval]);
55
75
  const resendVerification = useCallback(async (email) => {
56
- await clientRef.current.resendVerificationEmail({ email });
57
- }, []);
58
- // Initial session restore
76
+ await authFetch(`${apiBase}/resend-verification`, {
77
+ method: 'POST',
78
+ body: JSON.stringify({ email }),
79
+ });
80
+ }, [apiBase]);
81
+ // Initial session restore (skip if initialUser was provided)
59
82
  useEffect(() => {
83
+ if (initialUser !== undefined) {
84
+ return;
85
+ }
60
86
  refresh().finally(() => setIsLoading(false));
61
- }, [refresh]);
87
+ }, [refresh, initialUser]);
62
88
  // Auto-refresh interval
63
89
  useEffect(() => {
64
90
  if (!user) {
@@ -76,7 +102,15 @@ export function ACPAuthProvider({ children, baseUrl }) {
76
102
  }, REFRESH_INTERVAL);
77
103
  return clearRefreshInterval;
78
104
  }, [user, refresh, clearRefreshInterval]);
79
- return (_jsx(ACPAuthContext.Provider, { value: { user, isLoading, login, logout, refresh, resendVerification }, children: children }));
105
+ return (_jsx(ACPAuthContext.Provider, { value: {
106
+ user,
107
+ isLoading,
108
+ login,
109
+ verify2FA,
110
+ logout,
111
+ refresh,
112
+ resendVerification,
113
+ }, children: children }));
80
114
  }
81
115
  export function useAuth() {
82
116
  const context = useContext(ACPAuthContext);
@@ -85,6 +119,4 @@ export function useAuth() {
85
119
  }
86
120
  return context;
87
121
  }
88
- // Re-export client for direct use
89
- export { ACPAuthClient } from '@artatol-acp/auth-js';
90
122
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,YAAY,CAAC;;AAGb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAC;AAY5G,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAwBvE,KAAK,UAAU,SAAS,CAAI,IAAY,EAAE,UAAuB,EAAE;IACjE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE;QACjC,GAAG,OAAO;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,CAAC,OAAO;SACnB;QACD,WAAW,EAAE,SAAS;KACvB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAmB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,WAAW,GAAG,WAAW,EACzB,WAAW,GACU;IACrB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,WAAW,IAAI,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE/C,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAsB,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAiB,GAAG,OAAO,UAAU,EAAE;gBACnE,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;QAClE,MAAM,MAAM,GAAG,MAAM,SAAS,CAI3B,GAAG,OAAO,QAAQ,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,SAAiB,EAAE,IAAY,EAAE,EAAE;QACtE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAiB,GAAG,OAAO,aAAa,EAAE;YACtE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC1C,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,oBAAoB,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,GAAG,OAAO,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEpC,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC7D,MAAM,SAAS,CAAC,GAAG,OAAO,sBAAsB,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,6DAA6D;IAC7D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3B,wBAAwB;IACxB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,oBAAoB,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;QACpD,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBACvB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,oBAAoB,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErB,OAAO,oBAAoB,CAAC;IAC9B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE1C,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE;YAC9B,IAAI;YACJ,SAAS;YACT,KAAK;YACL,SAAS;YACT,MAAM;YACN,OAAO;YACP,kBAAkB;SACnB,YACE,QAAQ,GACe,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"}
@@ -0,0 +1,88 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { ACPAuthClient, type User, type FetchFunction } from '@artatol-acp/auth-js';
3
+ export type ACPAuthHandlerOptions = {
4
+ baseUrl: string;
5
+ apiKey?: string;
6
+ /**
7
+ * Cookie configuration
8
+ */
9
+ cookies?: {
10
+ /**
11
+ * Cookie path
12
+ * @default "/"
13
+ */
14
+ path?: string;
15
+ /**
16
+ * Whether to use secure cookies (HTTPS only)
17
+ * @default process.env.NODE_ENV === "production"
18
+ */
19
+ secure?: boolean;
20
+ /**
21
+ * SameSite cookie attribute
22
+ * @default "lax"
23
+ */
24
+ sameSite?: 'strict' | 'lax' | 'none';
25
+ };
26
+ };
27
+ type ApiSuccess<T> = {
28
+ success: true;
29
+ data: T;
30
+ };
31
+ type ApiError = {
32
+ success: false;
33
+ error: {
34
+ message: string;
35
+ code?: string;
36
+ };
37
+ };
38
+ export declare function createAuthHandlers(options: ACPAuthHandlerOptions): {
39
+ authHandler: (request: NextRequest, context: {
40
+ params: Promise<{
41
+ action: string;
42
+ }>;
43
+ }) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
44
+ requiresTwoFactor: boolean;
45
+ tempToken: string;
46
+ }>> | NextResponse<ApiSuccess<{
47
+ user: User;
48
+ }>> | NextResponse<ApiSuccess<{
49
+ message: string;
50
+ }>>>;
51
+ loginHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
52
+ requiresTwoFactor: boolean;
53
+ tempToken: string;
54
+ }>> | NextResponse<ApiSuccess<{
55
+ user: User;
56
+ }>>>;
57
+ verify2FAHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
58
+ user: User;
59
+ }>>>;
60
+ logoutHandler: (_request: NextRequest) => Promise<NextResponse<ApiSuccess<{
61
+ message: string;
62
+ }>>>;
63
+ sessionHandler: (_request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
64
+ user: User;
65
+ }>>>;
66
+ registerHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
67
+ user: User;
68
+ }>>>;
69
+ resendVerificationHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
70
+ message: string;
71
+ }>>>;
72
+ forgotPasswordHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
73
+ message: string;
74
+ }>>>;
75
+ resetPasswordHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
76
+ message: string;
77
+ }>>>;
78
+ setAuthCookies: (accessToken: string, refreshToken?: string) => Promise<void>;
79
+ clearAuthCookies: () => Promise<void>;
80
+ getStoredTokens: () => Promise<{
81
+ accessToken: string | undefined;
82
+ refreshToken: string | undefined;
83
+ }>;
84
+ createClient: (customFetch?: FetchFunction) => ACPAuthClient;
85
+ };
86
+ export type AuthHandlers = ReturnType<typeof createAuthHandlers>;
87
+ export {};
88
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAgB,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAElG,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE;QACR;;;WAGG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QACd;;;WAGG;QACH,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB;;;WAGG;QACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;KACtC,CAAC;CACH,CAAC;AAEF,KAAK,UAAU,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC;AAChD,KAAK,QAAQ,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAc9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB;2BAyTpD,WAAW,WACX;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;;;;;;;;4BA5Pb,WAAW;;;;;;gCAkCP,WAAW;;;8BA0Bb,WAAW;;;+BAqCV,WAAW;;;+BAsDX,WAAW;;;yCAyBD,WAAW;;;qCAyBf,WAAW;;;oCAyBZ,WAAW;;;kCA1Qb,MAAM,iBAAiB,MAAM;;;;;;iCATpC,aAAa;EAyVlD;AAGD,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,321 @@
1
+ import { cookies } from 'next/headers';
2
+ import { NextResponse } from 'next/server';
3
+ import { ACPAuthClient, ACPAuthError } from '@artatol-acp/auth-js';
4
+ function jsonResponse(data, status = 200) {
5
+ return NextResponse.json({ success: true, data }, { status });
6
+ }
7
+ function errorResponse(message, status = 400, code) {
8
+ return NextResponse.json({ success: false, error: { message, code } }, { status });
9
+ }
10
+ export function createAuthHandlers(options) {
11
+ const { baseUrl, apiKey = '', cookies: cookieConfig = {}, } = options;
12
+ const { path: cookiePath = '/', secure = process.env.NODE_ENV === 'production', sameSite = 'lax', } = cookieConfig;
13
+ function createClient(customFetch) {
14
+ return new ACPAuthClient({
15
+ baseUrl,
16
+ apiKey,
17
+ fetch: customFetch,
18
+ autoRefresh: false,
19
+ });
20
+ }
21
+ async function setAuthCookies(accessToken, refreshToken) {
22
+ const cookieStore = await cookies();
23
+ cookieStore.set('access_token', accessToken, {
24
+ httpOnly: true,
25
+ secure,
26
+ sameSite,
27
+ path: cookiePath,
28
+ maxAge: 60 * 5, // 5 minutes
29
+ });
30
+ if (refreshToken) {
31
+ cookieStore.set('refresh_token', refreshToken, {
32
+ httpOnly: true,
33
+ secure,
34
+ sameSite,
35
+ path: cookiePath,
36
+ maxAge: 60 * 60 * 24 * 30, // 30 days
37
+ });
38
+ }
39
+ }
40
+ async function clearAuthCookies() {
41
+ const cookieStore = await cookies();
42
+ cookieStore.delete('access_token');
43
+ cookieStore.delete('refresh_token');
44
+ }
45
+ async function getStoredTokens() {
46
+ const cookieStore = await cookies();
47
+ return {
48
+ accessToken: cookieStore.get('access_token')?.value,
49
+ refreshToken: cookieStore.get('refresh_token')?.value,
50
+ };
51
+ }
52
+ /**
53
+ * POST /api/auth/login
54
+ * Body: { email: string, password: string }
55
+ */
56
+ async function loginHandler(request) {
57
+ try {
58
+ const body = await request.json();
59
+ const { email, password } = body;
60
+ if (!email || !password) {
61
+ return errorResponse('Email and password are required', 400);
62
+ }
63
+ const client = createClient();
64
+ const result = await client.login({ email, password });
65
+ if ('requiresTwoFactor' in result) {
66
+ return jsonResponse({
67
+ requiresTwoFactor: true,
68
+ tempToken: result.tempToken,
69
+ });
70
+ }
71
+ await setAuthCookies(result.accessToken, result.refreshToken);
72
+ return jsonResponse({ user: result.user });
73
+ }
74
+ catch (error) {
75
+ if (error instanceof ACPAuthError) {
76
+ return errorResponse(error.message, error.statusCode, error.code);
77
+ }
78
+ return errorResponse('Login failed', 500);
79
+ }
80
+ }
81
+ /**
82
+ * POST /api/auth/verify-2fa
83
+ * Body: { tempToken: string, code: string }
84
+ */
85
+ async function verify2FAHandler(request) {
86
+ try {
87
+ const body = await request.json();
88
+ const { tempToken, code } = body;
89
+ if (!tempToken || !code) {
90
+ return errorResponse('Temp token and code are required', 400);
91
+ }
92
+ const client = createClient();
93
+ const result = await client.verify2FALogin({ tempToken, code });
94
+ await setAuthCookies(result.accessToken, result.refreshToken);
95
+ return jsonResponse({ user: result.user });
96
+ }
97
+ catch (error) {
98
+ if (error instanceof ACPAuthError) {
99
+ return errorResponse(error.message, error.statusCode, error.code);
100
+ }
101
+ return errorResponse('2FA verification failed', 500);
102
+ }
103
+ }
104
+ /**
105
+ * POST /api/auth/logout
106
+ */
107
+ async function logoutHandler(_request) {
108
+ try {
109
+ const { refreshToken } = await getStoredTokens();
110
+ if (refreshToken) {
111
+ // Create a custom fetch that includes the refresh token cookie
112
+ const customFetch = async (url, init) => {
113
+ return fetch(url, {
114
+ ...init,
115
+ headers: {
116
+ ...init?.headers,
117
+ Cookie: `refresh_token=${refreshToken}`,
118
+ },
119
+ });
120
+ };
121
+ const client = createClient(customFetch);
122
+ try {
123
+ await client.logout();
124
+ }
125
+ catch {
126
+ // Ignore logout API errors
127
+ }
128
+ }
129
+ await clearAuthCookies();
130
+ return jsonResponse({ message: 'Logged out' });
131
+ }
132
+ catch {
133
+ await clearAuthCookies();
134
+ return jsonResponse({ message: 'Logged out' });
135
+ }
136
+ }
137
+ /**
138
+ * POST /api/auth/session
139
+ * Refreshes the session and returns current user
140
+ */
141
+ async function sessionHandler(_request) {
142
+ try {
143
+ const { accessToken, refreshToken } = await getStoredTokens();
144
+ if (!accessToken && !refreshToken) {
145
+ return errorResponse('No session', 401);
146
+ }
147
+ const customFetch = async (url, init) => {
148
+ return fetch(url, {
149
+ ...init,
150
+ headers: {
151
+ ...init?.headers,
152
+ Cookie: `refresh_token=${refreshToken}`,
153
+ },
154
+ });
155
+ };
156
+ const client = createClient(customFetch);
157
+ // Try to refresh the token
158
+ try {
159
+ const refreshResult = await client.refresh();
160
+ await setAuthCookies(refreshResult.accessToken);
161
+ // Get user data with new token
162
+ const user = await client.me(refreshResult.accessToken);
163
+ return jsonResponse({ user });
164
+ }
165
+ catch {
166
+ // Refresh failed, try to use existing access token
167
+ if (accessToken) {
168
+ try {
169
+ const user = await client.me(accessToken);
170
+ return jsonResponse({ user });
171
+ }
172
+ catch {
173
+ await clearAuthCookies();
174
+ return errorResponse('Session expired', 401);
175
+ }
176
+ }
177
+ await clearAuthCookies();
178
+ return errorResponse('Session expired', 401);
179
+ }
180
+ }
181
+ catch (error) {
182
+ if (error instanceof ACPAuthError) {
183
+ return errorResponse(error.message, error.statusCode, error.code);
184
+ }
185
+ return errorResponse('Session check failed', 500);
186
+ }
187
+ }
188
+ /**
189
+ * POST /api/auth/register
190
+ * Body: { email: string, password: string }
191
+ */
192
+ async function registerHandler(request) {
193
+ try {
194
+ const body = await request.json();
195
+ const { email, password } = body;
196
+ if (!email || !password) {
197
+ return errorResponse('Email and password are required', 400);
198
+ }
199
+ const client = createClient();
200
+ const user = await client.register({ email, password });
201
+ return jsonResponse({ user });
202
+ }
203
+ catch (error) {
204
+ if (error instanceof ACPAuthError) {
205
+ return errorResponse(error.message, error.statusCode, error.code);
206
+ }
207
+ return errorResponse('Registration failed', 500);
208
+ }
209
+ }
210
+ /**
211
+ * POST /api/auth/resend-verification
212
+ * Body: { email: string }
213
+ */
214
+ async function resendVerificationHandler(request) {
215
+ try {
216
+ const body = await request.json();
217
+ const { email } = body;
218
+ if (!email) {
219
+ return errorResponse('Email is required', 400);
220
+ }
221
+ const client = createClient();
222
+ await client.resendVerificationEmail({ email });
223
+ return jsonResponse({ message: 'Verification email sent' });
224
+ }
225
+ catch (error) {
226
+ if (error instanceof ACPAuthError) {
227
+ return errorResponse(error.message, error.statusCode, error.code);
228
+ }
229
+ return errorResponse('Failed to send verification email', 500);
230
+ }
231
+ }
232
+ /**
233
+ * POST /api/auth/forgot-password
234
+ * Body: { email: string }
235
+ */
236
+ async function forgotPasswordHandler(request) {
237
+ try {
238
+ const body = await request.json();
239
+ const { email } = body;
240
+ if (!email) {
241
+ return errorResponse('Email is required', 400);
242
+ }
243
+ const client = createClient();
244
+ await client.forgotPassword({ email });
245
+ return jsonResponse({ message: 'Password reset email sent' });
246
+ }
247
+ catch (error) {
248
+ if (error instanceof ACPAuthError) {
249
+ return errorResponse(error.message, error.statusCode, error.code);
250
+ }
251
+ return errorResponse('Failed to send reset email', 500);
252
+ }
253
+ }
254
+ /**
255
+ * POST /api/auth/reset-password
256
+ * Body: { token: string, newPassword: string }
257
+ */
258
+ async function resetPasswordHandler(request) {
259
+ try {
260
+ const body = await request.json();
261
+ const { token, newPassword } = body;
262
+ if (!token || !newPassword) {
263
+ return errorResponse('Token and new password are required', 400);
264
+ }
265
+ const client = createClient();
266
+ await client.resetPassword({ token, newPassword });
267
+ return jsonResponse({ message: 'Password reset successful' });
268
+ }
269
+ catch (error) {
270
+ if (error instanceof ACPAuthError) {
271
+ return errorResponse(error.message, error.statusCode, error.code);
272
+ }
273
+ return errorResponse('Password reset failed', 500);
274
+ }
275
+ }
276
+ /**
277
+ * Main route handler that dispatches to individual handlers
278
+ */
279
+ async function authHandler(request, context) {
280
+ const { action } = await context.params;
281
+ switch (action) {
282
+ case 'login':
283
+ return loginHandler(request);
284
+ case 'verify-2fa':
285
+ return verify2FAHandler(request);
286
+ case 'logout':
287
+ return logoutHandler(request);
288
+ case 'session':
289
+ return sessionHandler(request);
290
+ case 'register':
291
+ return registerHandler(request);
292
+ case 'resend-verification':
293
+ return resendVerificationHandler(request);
294
+ case 'forgot-password':
295
+ return forgotPasswordHandler(request);
296
+ case 'reset-password':
297
+ return resetPasswordHandler(request);
298
+ default:
299
+ return errorResponse('Not found', 404);
300
+ }
301
+ }
302
+ return {
303
+ // Main combined handler
304
+ authHandler,
305
+ // Individual handlers for custom routing
306
+ loginHandler,
307
+ verify2FAHandler,
308
+ logoutHandler,
309
+ sessionHandler,
310
+ registerHandler,
311
+ resendVerificationHandler,
312
+ forgotPasswordHandler,
313
+ resetPasswordHandler,
314
+ // Utility functions
315
+ setAuthCookies,
316
+ clearAuthCookies,
317
+ getStoredTokens,
318
+ createClient,
319
+ };
320
+ }
321
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"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"}