@insforge/nextjs 0.8.9 → 0.8.11
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 +4 -144
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -34,7 +34,10 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
34
34
|
return (
|
|
35
35
|
<html lang="en">
|
|
36
36
|
<body>
|
|
37
|
-
<InsforgeProvider
|
|
37
|
+
<InsforgeProvider
|
|
38
|
+
baseUrl={process.env.NEXT_PUBLIC_INSFORGE_BASE_URL!}
|
|
39
|
+
afterSignInUrl="/dashboard"
|
|
40
|
+
>
|
|
38
41
|
{children}
|
|
39
42
|
</InsforgeProvider>
|
|
40
43
|
</body>
|
|
@@ -200,149 +203,6 @@ import { ForgotPassword, ResetPassword, VerifyEmail } from '@insforge/nextjs';
|
|
|
200
203
|
<VerifyEmail token={token} />
|
|
201
204
|
```
|
|
202
205
|
|
|
203
|
-
### Hierarchical Appearance System
|
|
204
|
-
|
|
205
|
-
Style any nested component through a hierarchical structure:
|
|
206
|
-
|
|
207
|
-
```tsx
|
|
208
|
-
<SignIn
|
|
209
|
-
appearance={{
|
|
210
|
-
card: "bg-gradient-to-br from-blue-50 to-white shadow-2xl",
|
|
211
|
-
header: {
|
|
212
|
-
title: "text-3xl font-bold text-purple-900",
|
|
213
|
-
subtitle: "text-purple-600"
|
|
214
|
-
},
|
|
215
|
-
form: {
|
|
216
|
-
emailField: {
|
|
217
|
-
label: "text-gray-800 font-semibold",
|
|
218
|
-
input: "border-purple-300 focus:border-purple-500 rounded-lg"
|
|
219
|
-
},
|
|
220
|
-
passwordField: {
|
|
221
|
-
input: "border-purple-300 focus:border-purple-500 rounded-lg",
|
|
222
|
-
forgotPasswordLink: "text-purple-600 hover:text-purple-800"
|
|
223
|
-
}
|
|
224
|
-
},
|
|
225
|
-
button: "bg-purple-600 hover:bg-purple-700 rounded-lg h-12",
|
|
226
|
-
link: {
|
|
227
|
-
text: "text-gray-600",
|
|
228
|
-
link: "text-purple-600 hover:text-purple-800 font-semibold"
|
|
229
|
-
},
|
|
230
|
-
oauth: {
|
|
231
|
-
button: "border-2 hover:bg-gray-50 rounded-xl"
|
|
232
|
-
}
|
|
233
|
-
}}
|
|
234
|
-
/>
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### UserButton Styling
|
|
238
|
-
|
|
239
|
-
```tsx
|
|
240
|
-
<UserButton
|
|
241
|
-
mode="detailed" // or "simple"
|
|
242
|
-
appearance={{
|
|
243
|
-
buttonClassName: "hover:bg-gray-100 rounded-full",
|
|
244
|
-
nameClassName: "text-gray-900 font-semibold",
|
|
245
|
-
emailClassName: "text-gray-500",
|
|
246
|
-
dropdownClassName: "shadow-xl"
|
|
247
|
-
}}
|
|
248
|
-
/>
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### Text Customization
|
|
252
|
-
|
|
253
|
-
```tsx
|
|
254
|
-
<SignIn
|
|
255
|
-
title="Welcome Back!"
|
|
256
|
-
subtitle="Sign in to continue"
|
|
257
|
-
emailLabel="Your Email Address"
|
|
258
|
-
passwordLabel="Your Password"
|
|
259
|
-
submitButtonText="Login Now"
|
|
260
|
-
signUpText="New to our platform?"
|
|
261
|
-
signUpLinkText="Create an account"
|
|
262
|
-
/>
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
## Advanced Usage
|
|
268
|
-
|
|
269
|
-
### Building Custom Auth Forms
|
|
270
|
-
|
|
271
|
-
Use atomic components for complete customization:
|
|
272
|
-
|
|
273
|
-
```tsx
|
|
274
|
-
import {
|
|
275
|
-
AuthContainer,
|
|
276
|
-
AuthHeader,
|
|
277
|
-
AuthFormField,
|
|
278
|
-
AuthPasswordField,
|
|
279
|
-
AuthSubmitButton,
|
|
280
|
-
AuthDivider,
|
|
281
|
-
AuthOAuthProviders,
|
|
282
|
-
AuthLink,
|
|
283
|
-
} from '@insforge/nextjs';
|
|
284
|
-
|
|
285
|
-
function CustomSignIn() {
|
|
286
|
-
return (
|
|
287
|
-
<AuthContainer
|
|
288
|
-
appearance={{
|
|
289
|
-
containerClassName: "max-w-md",
|
|
290
|
-
cardClassName: "bg-white shadow-2xl"
|
|
291
|
-
}}
|
|
292
|
-
>
|
|
293
|
-
<AuthHeader
|
|
294
|
-
title="Welcome Back"
|
|
295
|
-
subtitle="Sign in to continue"
|
|
296
|
-
appearance={{
|
|
297
|
-
titleClassName: "text-3xl text-blue-900"
|
|
298
|
-
}}
|
|
299
|
-
/>
|
|
300
|
-
|
|
301
|
-
<form onSubmit={handleSubmit}>
|
|
302
|
-
<AuthFormField
|
|
303
|
-
id="email"
|
|
304
|
-
type="email"
|
|
305
|
-
label="Email Address"
|
|
306
|
-
placeholder="you@example.com"
|
|
307
|
-
appearance={{
|
|
308
|
-
inputClassName: "border-blue-500 focus:ring-blue-500"
|
|
309
|
-
}}
|
|
310
|
-
/>
|
|
311
|
-
|
|
312
|
-
<AuthPasswordField
|
|
313
|
-
id="password"
|
|
314
|
-
label="Password"
|
|
315
|
-
emailAuthConfig={config}
|
|
316
|
-
appearance={{
|
|
317
|
-
inputClassName: "border-blue-500"
|
|
318
|
-
}}
|
|
319
|
-
/>
|
|
320
|
-
|
|
321
|
-
<AuthSubmitButton
|
|
322
|
-
isLoading={loading}
|
|
323
|
-
className="bg-blue-600 hover:bg-blue-700"
|
|
324
|
-
>
|
|
325
|
-
Sign In
|
|
326
|
-
</AuthSubmitButton>
|
|
327
|
-
</form>
|
|
328
|
-
|
|
329
|
-
<AuthDivider text="or" />
|
|
330
|
-
|
|
331
|
-
<AuthOAuthProviders
|
|
332
|
-
providers={['google', 'github']}
|
|
333
|
-
onClick={handleOAuth}
|
|
334
|
-
loading={oauthLoading}
|
|
335
|
-
/>
|
|
336
|
-
|
|
337
|
-
<AuthLink
|
|
338
|
-
text="Don't have an account?"
|
|
339
|
-
linkText="Sign up"
|
|
340
|
-
href="/sign-up"
|
|
341
|
-
/>
|
|
342
|
-
</AuthContainer>
|
|
343
|
-
);
|
|
344
|
-
}
|
|
345
|
-
```
|
|
346
206
|
|
|
347
207
|
**Available Atomic Components:**
|
|
348
208
|
- `AuthContainer` - Main form container
|
package/dist/index.d.mts
CHANGED
|
@@ -9,9 +9,10 @@ export * from '@insforge/react/components';
|
|
|
9
9
|
interface InsforgeProviderProps {
|
|
10
10
|
children: ReactNode;
|
|
11
11
|
baseUrl: string;
|
|
12
|
+
afterSignInUrl?: string;
|
|
12
13
|
onAuthChange?: (user: InsforgeUser | null) => void;
|
|
13
14
|
}
|
|
14
|
-
declare function InsforgeProvider({ children, baseUrl, onAuthChange, }: InsforgeProviderProps): react_jsx_runtime.JSX.Element;
|
|
15
|
+
declare function InsforgeProvider({ children, baseUrl, afterSignInUrl, onAuthChange, }: InsforgeProviderProps): react_jsx_runtime.JSX.Element;
|
|
15
16
|
declare const useInsforge: typeof useInsforge$1;
|
|
16
17
|
|
|
17
18
|
declare function cn(...inputs: ClassValue[]): string;
|
package/dist/index.d.ts
CHANGED
|
@@ -9,9 +9,10 @@ export * from '@insforge/react/components';
|
|
|
9
9
|
interface InsforgeProviderProps {
|
|
10
10
|
children: ReactNode;
|
|
11
11
|
baseUrl: string;
|
|
12
|
+
afterSignInUrl?: string;
|
|
12
13
|
onAuthChange?: (user: InsforgeUser | null) => void;
|
|
13
14
|
}
|
|
14
|
-
declare function InsforgeProvider({ children, baseUrl, onAuthChange, }: InsforgeProviderProps): react_jsx_runtime.JSX.Element;
|
|
15
|
+
declare function InsforgeProvider({ children, baseUrl, afterSignInUrl, onAuthChange, }: InsforgeProviderProps): react_jsx_runtime.JSX.Element;
|
|
15
16
|
declare const useInsforge: typeof useInsforge$1;
|
|
16
17
|
|
|
17
18
|
declare function cn(...inputs: ClassValue[]): string;
|
package/dist/index.js
CHANGED
|
@@ -57,11 +57,13 @@ async function handleSignOut() {
|
|
|
57
57
|
function InsforgeProvider({
|
|
58
58
|
children,
|
|
59
59
|
baseUrl,
|
|
60
|
+
afterSignInUrl = "/",
|
|
60
61
|
onAuthChange
|
|
61
62
|
}) {
|
|
62
63
|
const providerProps = {
|
|
63
64
|
children,
|
|
64
65
|
baseUrl,
|
|
66
|
+
afterSignInUrl,
|
|
65
67
|
onAuthChange,
|
|
66
68
|
onSignIn: handleSignIn,
|
|
67
69
|
onSignOut: handleSignOut
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider/InsforgeProvider.tsx","../src/lib/utils.ts"],"sourcesContent":["export * from '@insforge/react/types';\n\n// Provider\nexport { InsforgeProvider, useInsforge } from './provider/InsforgeProvider';\nexport { cn } from './lib/utils';\n\n// Hooks\nexport * from '@insforge/react/hooks';\n\n// Components\nexport * from '@insforge/react/components';\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { \n InsforgeProvider as ReactInsforgeProvider, \n useInsforge as useReactInsforge,\n type InsforgeUser\n} from '@insforge/react';\n\nexport interface InsforgeProviderProps {\n children: ReactNode;\n baseUrl: string;\n onAuthChange?: (user: InsforgeUser | null) => void;\n}\n\n// Extended interface for React provider that includes internal handlers\ninterface ExtendedProviderProps extends InsforgeProviderProps {\n onSignIn?: (authToken: string) => Promise<void>;\n onSignOut?: () => Promise<void>;\n}\n\n// Sync token to server-side cookie on sign in\nasync function handleSignIn(token: string): Promise<void> {\n try {\n await fetch('/api/auth', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'sync-token',\n token,\n }),\n });\n } catch (error) {\n console.error('[InsforgeProvider] Failed to sync token to cookie:', error);\n }\n}\n\n// Clear HTTP-only cookie on sign out\nasync function handleSignOut(): Promise<void> {\n try {\n await fetch('/api/auth', { method: 'DELETE' });\n } catch (error) {\n // API route doesn't exist - ignore\n }\n}\n\n/**\n * Insforge Provider for Next.js - wraps @insforge/react provider with Next.js-specific cookie sync\n * \n * Manages user authentication state and provides all necessary context to child components.\n * Automatically syncs authentication tokens to HTTP-only cookies for server-side middleware support.\n * \n * @example\n * ```tsx\n * import { InsforgeProvider } from '@insforge/nextjs';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <InsforgeProvider baseUrl={process.env.NEXT_PUBLIC_INSFORGE_BASE_URL!}>\n * {children}\n * </InsforgeProvider>\n * );\n * }\n * ```\n */\nexport function InsforgeProvider({ \n children, \n baseUrl,\n onAuthChange,\n}: InsforgeProviderProps) {\n const providerProps: ExtendedProviderProps = {\n children,\n baseUrl,\n onAuthChange,\n onSignIn: handleSignIn,\n onSignOut: handleSignOut,\n };\n\n return <ReactInsforgeProvider {...providerProps} />;\n}\n\n/**\n * Hook to access Insforge context\n * \n * Re-exports the hook from @insforge/react for convenience.\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { user, isSignedIn, signOut } = useInsforge();\n * \n * if (!isSignedIn) return <SignIn />;\n * \n * return (\n * <div>\n * <p>Welcome {user.email}</p>\n * <button onClick={signOut}>Sign Out</button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useInsforge = useReactInsforge;\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes with clsx\r\n * Allows users to inject custom className overrides\r\n * \r\n * @example\r\n * ```tsx\r\n * cn(\"text-base\", isDark && \"text-white\", customClassName)\r\n * ```\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAc,kCAAd;;;ACGA,mBAIO;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider/InsforgeProvider.tsx","../src/lib/utils.ts"],"sourcesContent":["export * from '@insforge/react/types';\n\n// Provider\nexport { InsforgeProvider, useInsforge } from './provider/InsforgeProvider';\nexport { cn } from './lib/utils';\n\n// Hooks\nexport * from '@insforge/react/hooks';\n\n// Components\nexport * from '@insforge/react/components';\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { \n InsforgeProvider as ReactInsforgeProvider, \n useInsforge as useReactInsforge,\n type InsforgeUser\n} from '@insforge/react';\n\nexport interface InsforgeProviderProps {\n children: ReactNode;\n baseUrl: string;\n /**\n * URL to redirect to after successful sign in (when token is detected in URL)\n * Note: Middleware handles token storage, but Provider handles the redirect\n * @default '/'\n */\n afterSignInUrl?: string;\n onAuthChange?: (user: InsforgeUser | null) => void;\n}\n\n// Extended interface for React provider that includes internal handlers\ninterface ExtendedProviderProps extends InsforgeProviderProps {\n afterSignInUrl?: string;\n onSignIn?: (authToken: string) => Promise<void>;\n onSignOut?: () => Promise<void>;\n}\n\n// Sync token to server-side cookie on sign in\nasync function handleSignIn(token: string): Promise<void> {\n try {\n await fetch('/api/auth', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'sync-token',\n token,\n }),\n });\n } catch (error) {\n console.error('[InsforgeProvider] Failed to sync token to cookie:', error);\n }\n}\n\n// Clear HTTP-only cookie on sign out\nasync function handleSignOut(): Promise<void> {\n try {\n await fetch('/api/auth', { method: 'DELETE' });\n } catch (error) {\n // API route doesn't exist - ignore\n }\n}\n\n/**\n * Insforge Provider for Next.js - wraps @insforge/react provider with Next.js-specific cookie sync\n * \n * Manages user authentication state and provides all necessary context to child components.\n * Automatically syncs authentication tokens to HTTP-only cookies for server-side middleware support.\n * \n * @example\n * ```tsx\n * import { InsforgeProvider } from '@insforge/nextjs';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <InsforgeProvider \n * baseUrl={process.env.NEXT_PUBLIC_INSFORGE_BASE_URL!}\n * afterSignInUrl=\"/dashboard\"\n * >\n * {children}\n * </InsforgeProvider>\n * );\n * }\n * ```\n */\nexport function InsforgeProvider({ \n children, \n baseUrl,\n afterSignInUrl = '/',\n onAuthChange,\n}: InsforgeProviderProps) {\n const providerProps: ExtendedProviderProps = {\n children,\n baseUrl,\n afterSignInUrl,\n onAuthChange,\n onSignIn: handleSignIn,\n onSignOut: handleSignOut,\n };\n\n return <ReactInsforgeProvider {...providerProps} />;\n}\n\n/**\n * Hook to access Insforge context\n * \n * Re-exports the hook from @insforge/react for convenience.\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { user, isSignedIn, signOut } = useInsforge();\n * \n * if (!isSignedIn) return <SignIn />;\n * \n * return (\n * <div>\n * <p>Welcome {user.email}</p>\n * <button onClick={signOut}>Sign Out</button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useInsforge = useReactInsforge;\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes with clsx\r\n * Allows users to inject custom className overrides\r\n * \r\n * @example\r\n * ```tsx\r\n * cn(\"text-base\", isDark && \"text-white\", customClassName)\r\n * ```\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAc,kCAAd;;;ACGA,mBAIO;AAqFE;AA/DT,eAAe,aAAa,OAA8B;AACxD,MAAI;AACF,UAAM,MAAM,aAAa;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,sDAAsD,KAAK;AAAA,EAC3E;AACF;AAGA,eAAe,gBAA+B;AAC5C,MAAI;AACF,UAAM,MAAM,aAAa,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC/C,SAAS,OAAO;AAAA,EAEhB;AACF;AAwBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAA0B;AACxB,QAAM,gBAAuC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAEA,SAAO,4CAAC,aAAAA,kBAAA,EAAuB,GAAG,eAAe;AACnD;AAuBO,IAAM,cAAc,aAAAC;;;ACpH3B,kBAAsC;AACtC,4BAAwB;AAWjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;AFPA,wBAAc,kCAPd;AAUA,wBAAc,uCAVd;","names":["ReactInsforgeProvider","useReactInsforge"]}
|
package/dist/index.mjs
CHANGED
|
@@ -34,11 +34,13 @@ async function handleSignOut() {
|
|
|
34
34
|
function InsforgeProvider({
|
|
35
35
|
children,
|
|
36
36
|
baseUrl,
|
|
37
|
+
afterSignInUrl = "/",
|
|
37
38
|
onAuthChange
|
|
38
39
|
}) {
|
|
39
40
|
const providerProps = {
|
|
40
41
|
children,
|
|
41
42
|
baseUrl,
|
|
43
|
+
afterSignInUrl,
|
|
42
44
|
onAuthChange,
|
|
43
45
|
onSignIn: handleSignIn,
|
|
44
46
|
onSignOut: handleSignOut
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider/InsforgeProvider.tsx","../src/lib/utils.ts"],"sourcesContent":["export * from '@insforge/react/types';\n\n// Provider\nexport { InsforgeProvider, useInsforge } from './provider/InsforgeProvider';\nexport { cn } from './lib/utils';\n\n// Hooks\nexport * from '@insforge/react/hooks';\n\n// Components\nexport * from '@insforge/react/components';\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { \n InsforgeProvider as ReactInsforgeProvider, \n useInsforge as useReactInsforge,\n type InsforgeUser\n} from '@insforge/react';\n\nexport interface InsforgeProviderProps {\n children: ReactNode;\n baseUrl: string;\n onAuthChange?: (user: InsforgeUser | null) => void;\n}\n\n// Extended interface for React provider that includes internal handlers\ninterface ExtendedProviderProps extends InsforgeProviderProps {\n onSignIn?: (authToken: string) => Promise<void>;\n onSignOut?: () => Promise<void>;\n}\n\n// Sync token to server-side cookie on sign in\nasync function handleSignIn(token: string): Promise<void> {\n try {\n await fetch('/api/auth', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'sync-token',\n token,\n }),\n });\n } catch (error) {\n console.error('[InsforgeProvider] Failed to sync token to cookie:', error);\n }\n}\n\n// Clear HTTP-only cookie on sign out\nasync function handleSignOut(): Promise<void> {\n try {\n await fetch('/api/auth', { method: 'DELETE' });\n } catch (error) {\n // API route doesn't exist - ignore\n }\n}\n\n/**\n * Insforge Provider for Next.js - wraps @insforge/react provider with Next.js-specific cookie sync\n * \n * Manages user authentication state and provides all necessary context to child components.\n * Automatically syncs authentication tokens to HTTP-only cookies for server-side middleware support.\n * \n * @example\n * ```tsx\n * import { InsforgeProvider } from '@insforge/nextjs';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <InsforgeProvider baseUrl={process.env.NEXT_PUBLIC_INSFORGE_BASE_URL!}>\n * {children}\n * </InsforgeProvider>\n * );\n * }\n * ```\n */\nexport function InsforgeProvider({ \n children, \n baseUrl,\n onAuthChange,\n}: InsforgeProviderProps) {\n const providerProps: ExtendedProviderProps = {\n children,\n baseUrl,\n onAuthChange,\n onSignIn: handleSignIn,\n onSignOut: handleSignOut,\n };\n\n return <ReactInsforgeProvider {...providerProps} />;\n}\n\n/**\n * Hook to access Insforge context\n * \n * Re-exports the hook from @insforge/react for convenience.\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { user, isSignedIn, signOut } = useInsforge();\n * \n * if (!isSignedIn) return <SignIn />;\n * \n * return (\n * <div>\n * <p>Welcome {user.email}</p>\n * <button onClick={signOut}>Sign Out</button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useInsforge = useReactInsforge;\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes with clsx\r\n * Allows users to inject custom className overrides\r\n * \r\n * @example\r\n * ```tsx\r\n * cn(\"text-base\", isDark && \"text-white\", customClassName)\r\n * ```\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n"],"mappings":";;;AAAA,cAAc;;;ACGd;AAAA,EACE,oBAAoB;AAAA,EACpB,eAAe;AAAA,OAEV;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider/InsforgeProvider.tsx","../src/lib/utils.ts"],"sourcesContent":["export * from '@insforge/react/types';\n\n// Provider\nexport { InsforgeProvider, useInsforge } from './provider/InsforgeProvider';\nexport { cn } from './lib/utils';\n\n// Hooks\nexport * from '@insforge/react/hooks';\n\n// Components\nexport * from '@insforge/react/components';\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { \n InsforgeProvider as ReactInsforgeProvider, \n useInsforge as useReactInsforge,\n type InsforgeUser\n} from '@insforge/react';\n\nexport interface InsforgeProviderProps {\n children: ReactNode;\n baseUrl: string;\n /**\n * URL to redirect to after successful sign in (when token is detected in URL)\n * Note: Middleware handles token storage, but Provider handles the redirect\n * @default '/'\n */\n afterSignInUrl?: string;\n onAuthChange?: (user: InsforgeUser | null) => void;\n}\n\n// Extended interface for React provider that includes internal handlers\ninterface ExtendedProviderProps extends InsforgeProviderProps {\n afterSignInUrl?: string;\n onSignIn?: (authToken: string) => Promise<void>;\n onSignOut?: () => Promise<void>;\n}\n\n// Sync token to server-side cookie on sign in\nasync function handleSignIn(token: string): Promise<void> {\n try {\n await fetch('/api/auth', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'sync-token',\n token,\n }),\n });\n } catch (error) {\n console.error('[InsforgeProvider] Failed to sync token to cookie:', error);\n }\n}\n\n// Clear HTTP-only cookie on sign out\nasync function handleSignOut(): Promise<void> {\n try {\n await fetch('/api/auth', { method: 'DELETE' });\n } catch (error) {\n // API route doesn't exist - ignore\n }\n}\n\n/**\n * Insforge Provider for Next.js - wraps @insforge/react provider with Next.js-specific cookie sync\n * \n * Manages user authentication state and provides all necessary context to child components.\n * Automatically syncs authentication tokens to HTTP-only cookies for server-side middleware support.\n * \n * @example\n * ```tsx\n * import { InsforgeProvider } from '@insforge/nextjs';\n * \n * export default function RootLayout({ children }) {\n * return (\n * <InsforgeProvider \n * baseUrl={process.env.NEXT_PUBLIC_INSFORGE_BASE_URL!}\n * afterSignInUrl=\"/dashboard\"\n * >\n * {children}\n * </InsforgeProvider>\n * );\n * }\n * ```\n */\nexport function InsforgeProvider({ \n children, \n baseUrl,\n afterSignInUrl = '/',\n onAuthChange,\n}: InsforgeProviderProps) {\n const providerProps: ExtendedProviderProps = {\n children,\n baseUrl,\n afterSignInUrl,\n onAuthChange,\n onSignIn: handleSignIn,\n onSignOut: handleSignOut,\n };\n\n return <ReactInsforgeProvider {...providerProps} />;\n}\n\n/**\n * Hook to access Insforge context\n * \n * Re-exports the hook from @insforge/react for convenience.\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { user, isSignedIn, signOut } = useInsforge();\n * \n * if (!isSignedIn) return <SignIn />;\n * \n * return (\n * <div>\n * <p>Welcome {user.email}</p>\n * <button onClick={signOut}>Sign Out</button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useInsforge = useReactInsforge;\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes with clsx\r\n * Allows users to inject custom className overrides\r\n * \r\n * @example\r\n * ```tsx\r\n * cn(\"text-base\", isDark && \"text-white\", customClassName)\r\n * ```\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n"],"mappings":";;;AAAA,cAAc;;;ACGd;AAAA,EACE,oBAAoB;AAAA,EACpB,eAAe;AAAA,OAEV;AAqFE;AA/DT,eAAe,aAAa,OAA8B;AACxD,MAAI;AACF,UAAM,MAAM,aAAa;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,sDAAsD,KAAK;AAAA,EAC3E;AACF;AAGA,eAAe,gBAA+B;AAC5C,MAAI;AACF,UAAM,MAAM,aAAa,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC/C,SAAS,OAAO;AAAA,EAEhB;AACF;AAwBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAA0B;AACxB,QAAM,gBAAuC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAEA,SAAO,oBAAC,yBAAuB,GAAG,eAAe;AACnD;AAuBO,IAAM,cAAc;;;ACpH3B,SAA0B,YAAY;AACtC,SAAS,eAAe;AAWjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;AFPA,cAAc;AAGd,cAAc;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@insforge/nextjs",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.11",
|
|
4
4
|
"description": "Pre-built authentication UI components for Next.js with Insforge backend - zero configuration required",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"react-dom": "^19.0.0"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@insforge/react": "^0.4.
|
|
53
|
+
"@insforge/react": "^0.4.7",
|
|
54
54
|
"@insforge/sdk": "0.0.58-dev.13",
|
|
55
55
|
"@insforge/shared-schemas": "^1.1.17",
|
|
56
56
|
"clsx": "^2.1.1",
|