@insforge/react 0.3.2 → 0.3.4

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/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/lib/validation.ts"],"names":["twMerge","clsx","z"],"mappings":"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","file":"lib.js","sourcesContent":["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 * Handles conditional classes and prevents style conflicts\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n","import { z } from 'zod';\r\n\r\n/**\r\n * Email validation schema\r\n */\r\nexport const emailSchema = z\r\n .string()\r\n .min(1, 'Email is required')\r\n .email('Invalid email address');\r\n\r\n/**\r\n * Password validation schema with configurable requirements\r\n */\r\nexport function createPasswordSchema(options?: {\r\n minLength?: number;\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireNumber?: boolean;\r\n requireSpecialChar?: boolean;\r\n}) {\r\n const {\r\n minLength = 6,\r\n requireUppercase = false,\r\n requireLowercase = false,\r\n requireNumber = false,\r\n requireSpecialChar = false,\r\n } = options || {};\r\n\r\n let schema = z.string().min(minLength, `Password must be at least ${minLength} characters`);\r\n\r\n if (requireUppercase) {\r\n schema = schema.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\r\n }\r\n\r\n if (requireLowercase) {\r\n schema = schema.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\r\n }\r\n\r\n if (requireNumber) {\r\n schema = schema.regex(/\\d/, 'Password must contain at least one number');\r\n }\r\n\r\n if (requireSpecialChar) {\r\n schema = schema.regex(\r\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\r\n 'Password must contain at least one special character'\r\n );\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Default password schema (minimum 6 characters)\r\n */\r\nexport const passwordSchema = createPasswordSchema();\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport function validateEmail(email: string): { valid: boolean; error?: string } {\r\n const result = emailSchema.safeParse(email);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password format\r\n */\r\nexport function validatePassword(\r\n password: string,\r\n options?: Parameters<typeof createPasswordSchema>[0]\r\n): { valid: boolean; error?: string } {\r\n const schema = createPasswordSchema(options);\r\n const result = schema.safeParse(password);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password strength based on multiple criteria\r\n */\r\nexport function checkPasswordStrength(password: string): {\r\n score: number;\r\n feedback: string[];\r\n} {\r\n const feedback: string[] = [];\r\n let score = 0;\r\n\r\n if (password.length >= 8) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use at least 8 characters');\r\n }\r\n\r\n if (password.length >= 12) {\r\n score += 1;\r\n }\r\n\r\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use both uppercase and lowercase letters');\r\n }\r\n\r\n if (/\\d/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one number');\r\n }\r\n\r\n if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one special character');\r\n }\r\n\r\n return { score, feedback };\r\n}\r\n\r\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/lib/validation.ts"],"names":["twMerge","clsx","z"],"mappings":"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","file":"lib.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility function to merge Tailwind CSS classes with clsx\n * Handles conditional classes and prevents style conflicts\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","import { z } from 'zod';\n\n/**\n * Email validation schema\n */\nexport const emailSchema = z\n .string()\n .min(1, 'Email is required')\n .email('Invalid email address');\n\n/**\n * Password validation schema with configurable requirements\n */\nexport function createPasswordSchema(options?: {\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumber?: boolean;\n requireSpecialChar?: boolean;\n}) {\n const {\n minLength = 6,\n requireUppercase = false,\n requireLowercase = false,\n requireNumber = false,\n requireSpecialChar = false,\n } = options || {};\n\n let schema = z.string().min(minLength, `Password must be at least ${minLength} characters`);\n\n if (requireUppercase) {\n schema = schema.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\n }\n\n if (requireLowercase) {\n schema = schema.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\n }\n\n if (requireNumber) {\n schema = schema.regex(/\\d/, 'Password must contain at least one number');\n }\n\n if (requireSpecialChar) {\n schema = schema.regex(\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\n 'Password must contain at least one special character'\n );\n }\n\n return schema;\n}\n\n/**\n * Default password schema (minimum 6 characters)\n */\nexport const passwordSchema = createPasswordSchema();\n\n/**\n * Validate email format\n */\nexport function validateEmail(email: string): { valid: boolean; error?: string } {\n const result = emailSchema.safeParse(email);\n if (result.success) {\n return { valid: true };\n }\n return { valid: false, error: result.error.message };\n}\n\n/**\n * Validate password format\n */\nexport function validatePassword(\n password: string,\n options?: Parameters<typeof createPasswordSchema>[0]\n): { valid: boolean; error?: string } {\n const schema = createPasswordSchema(options);\n const result = schema.safeParse(password);\n if (result.success) {\n return { valid: true };\n }\n return { valid: false, error: result.error.message };\n}\n\n/**\n * Validate password strength based on multiple criteria\n */\nexport function checkPasswordStrength(password: string): {\n score: number;\n feedback: string[];\n} {\n const feedback: string[] = [];\n let score = 0;\n\n if (password.length >= 8) {\n score += 1;\n } else {\n feedback.push('Use at least 8 characters');\n }\n\n if (password.length >= 12) {\n score += 1;\n }\n\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\n score += 1;\n } else {\n feedback.push('Use both uppercase and lowercase letters');\n }\n\n if (/\\d/.test(password)) {\n score += 1;\n } else {\n feedback.push('Include at least one number');\n }\n\n if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n score += 1;\n } else {\n feedback.push('Include at least one special character');\n }\n\n return { score, feedback };\n}\n\n"]}
package/dist/lib.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/lib/validation.ts"],"names":[],"mappings":"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","file":"lib.mjs","sourcesContent":["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 * Handles conditional classes and prevents style conflicts\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n","import { z } from 'zod';\r\n\r\n/**\r\n * Email validation schema\r\n */\r\nexport const emailSchema = z\r\n .string()\r\n .min(1, 'Email is required')\r\n .email('Invalid email address');\r\n\r\n/**\r\n * Password validation schema with configurable requirements\r\n */\r\nexport function createPasswordSchema(options?: {\r\n minLength?: number;\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireNumber?: boolean;\r\n requireSpecialChar?: boolean;\r\n}) {\r\n const {\r\n minLength = 6,\r\n requireUppercase = false,\r\n requireLowercase = false,\r\n requireNumber = false,\r\n requireSpecialChar = false,\r\n } = options || {};\r\n\r\n let schema = z.string().min(minLength, `Password must be at least ${minLength} characters`);\r\n\r\n if (requireUppercase) {\r\n schema = schema.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\r\n }\r\n\r\n if (requireLowercase) {\r\n schema = schema.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\r\n }\r\n\r\n if (requireNumber) {\r\n schema = schema.regex(/\\d/, 'Password must contain at least one number');\r\n }\r\n\r\n if (requireSpecialChar) {\r\n schema = schema.regex(\r\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\r\n 'Password must contain at least one special character'\r\n );\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Default password schema (minimum 6 characters)\r\n */\r\nexport const passwordSchema = createPasswordSchema();\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport function validateEmail(email: string): { valid: boolean; error?: string } {\r\n const result = emailSchema.safeParse(email);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password format\r\n */\r\nexport function validatePassword(\r\n password: string,\r\n options?: Parameters<typeof createPasswordSchema>[0]\r\n): { valid: boolean; error?: string } {\r\n const schema = createPasswordSchema(options);\r\n const result = schema.safeParse(password);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password strength based on multiple criteria\r\n */\r\nexport function checkPasswordStrength(password: string): {\r\n score: number;\r\n feedback: string[];\r\n} {\r\n const feedback: string[] = [];\r\n let score = 0;\r\n\r\n if (password.length >= 8) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use at least 8 characters');\r\n }\r\n\r\n if (password.length >= 12) {\r\n score += 1;\r\n }\r\n\r\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use both uppercase and lowercase letters');\r\n }\r\n\r\n if (/\\d/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one number');\r\n }\r\n\r\n if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one special character');\r\n }\r\n\r\n return { score, feedback };\r\n}\r\n\r\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/lib/validation.ts"],"names":[],"mappings":"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","file":"lib.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility function to merge Tailwind CSS classes with clsx\n * Handles conditional classes and prevents style conflicts\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","import { z } from 'zod';\n\n/**\n * Email validation schema\n */\nexport const emailSchema = z\n .string()\n .min(1, 'Email is required')\n .email('Invalid email address');\n\n/**\n * Password validation schema with configurable requirements\n */\nexport function createPasswordSchema(options?: {\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumber?: boolean;\n requireSpecialChar?: boolean;\n}) {\n const {\n minLength = 6,\n requireUppercase = false,\n requireLowercase = false,\n requireNumber = false,\n requireSpecialChar = false,\n } = options || {};\n\n let schema = z.string().min(minLength, `Password must be at least ${minLength} characters`);\n\n if (requireUppercase) {\n schema = schema.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\n }\n\n if (requireLowercase) {\n schema = schema.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\n }\n\n if (requireNumber) {\n schema = schema.regex(/\\d/, 'Password must contain at least one number');\n }\n\n if (requireSpecialChar) {\n schema = schema.regex(\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\n 'Password must contain at least one special character'\n );\n }\n\n return schema;\n}\n\n/**\n * Default password schema (minimum 6 characters)\n */\nexport const passwordSchema = createPasswordSchema();\n\n/**\n * Validate email format\n */\nexport function validateEmail(email: string): { valid: boolean; error?: string } {\n const result = emailSchema.safeParse(email);\n if (result.success) {\n return { valid: true };\n }\n return { valid: false, error: result.error.message };\n}\n\n/**\n * Validate password format\n */\nexport function validatePassword(\n password: string,\n options?: Parameters<typeof createPasswordSchema>[0]\n): { valid: boolean; error?: string } {\n const schema = createPasswordSchema(options);\n const result = schema.safeParse(password);\n if (result.success) {\n return { valid: true };\n }\n return { valid: false, error: result.error.message };\n}\n\n/**\n * Validate password strength based on multiple criteria\n */\nexport function checkPasswordStrength(password: string): {\n score: number;\n feedback: string[];\n} {\n const feedback: string[] = [];\n let score = 0;\n\n if (password.length >= 8) {\n score += 1;\n } else {\n feedback.push('Use at least 8 characters');\n }\n\n if (password.length >= 12) {\n score += 1;\n }\n\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\n score += 1;\n } else {\n feedback.push('Use both uppercase and lowercase letters');\n }\n\n if (/\\d/.test(password)) {\n score += 1;\n } else {\n feedback.push('Include at least one number');\n }\n\n if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n score += 1;\n } else {\n feedback.push('Include at least one special character');\n }\n\n return { score, feedback };\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/router/getInsforgeRoutes.tsx"],"names":["useEffect","jsx"],"mappings":";;;;;AAyCA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsC;AAC5E,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAElB,EAAA,OAAO,IAAA;AACT;AAwDO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,QAAQ;AAAC,GACX,GAAI,MAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,UAAA;AAAA,IACT,MAAA,GAAS,UAAA;AAAA,IACT,WAAA,GAAc,eAAA;AAAA,IACd,cAAA,GAAiB,kBAAA;AAAA,IACjB,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAwB,EAAC;AAG/B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAASC,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,oBAAA,EAAqB;AAAA,OACvE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,uBAAA,EAAwB;AAAA,OAC1E;AAAA,MACA;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,sBAAA,EAAuB;AAAA;AACzE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"router.js","sourcesContent":["'use client';\r\n\r\nimport { useEffect } from 'react';\r\nimport type { RouteObject } from 'react-router-dom';\r\n\r\ninterface GetInsforgeRoutesConfig {\r\n /**\r\n * Base URL of your Insforge backend\r\n */\r\n baseUrl: string;\r\n \r\n /**\r\n * Whether to use built-in auth (deployed Insforge Auth)\r\n * When true: redirects to baseUrl/auth/* pages\r\n * When false: no redirect routes are added (use your own components)\r\n * @default true\r\n */\r\n builtInAuth?: boolean;\r\n \r\n /**\r\n * Custom paths for auth redirect routes\r\n * @default {\r\n * signIn: '/sign-in',\r\n * signUp: '/sign-up',\r\n * verifyEmail: '/verify-email',\r\n * forgotPassword: '/forgot-password',\r\n * resetPassword: '/reset-password'\r\n * }\r\n */\r\n paths?: {\r\n signIn?: string;\r\n signUp?: string;\r\n verifyEmail?: string;\r\n forgotPassword?: string;\r\n resetPassword?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Helper component for redirecting to external auth\r\n */\r\nfunction RedirectToAuth({ baseUrl, path }: { baseUrl: string; path: string }) {\r\n useEffect(() => {\r\n const callbackUrl = `${window.location.origin}/auth/callback`;\r\n const authUrl = new URL(path, baseUrl);\r\n authUrl.searchParams.set('redirect', callbackUrl);\r\n window.location.replace(authUrl.toString());\r\n }, [baseUrl, path]);\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Generates Insforge authentication redirect routes for React Router.\r\n * \r\n * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.\r\n * \r\n * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router\r\n * to handle authentication callbacks. See documentation for details.\r\n * \r\n * @param config - Configuration for Insforge routes\r\n * @returns Array of RouteObject for React Router (redirect routes only)\r\n * \r\n * @example\r\n * ```tsx\r\n * import { createBrowserRouter } from 'react-router-dom';\r\n * import { getInsforgeRoutes } from '@insforge/react/router';\r\n * import { InsforgeCallback } from '@insforge/react';\r\n * \r\n * const router = createBrowserRouter([\r\n * {\r\n * path: '/',\r\n * element: <Layout />,\r\n * children: [\r\n * { index: true, element: <Home /> },\r\n * // ✅ Required: Manually create callback route\r\n * { path: 'auth/callback', element: <AuthCallback /> },\r\n * { path: 'dashboard', element: <Dashboard /> }\r\n * ]\r\n * },\r\n * // Add redirect routes (sign-in, sign-up, etc.)\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true\r\n * })\r\n * ]);\r\n * \r\n * // src/pages/AuthCallback.tsx\r\n * function AuthCallback() {\r\n * return <InsforgeCallback redirectTo=\"/dashboard\" />;\r\n * }\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // Custom paths for redirect routes\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true,\r\n * paths: {\r\n * signIn: '/login',\r\n * signUp: '/register'\r\n * }\r\n * })\r\n * ```\r\n */\r\nexport function getInsforgeRoutes(config: GetInsforgeRoutesConfig): RouteObject[] {\r\n const {\r\n baseUrl,\r\n builtInAuth = true,\r\n paths = {},\r\n } = config;\r\n\r\n const {\r\n signIn = '/sign-in',\r\n signUp = '/sign-up',\r\n verifyEmail = '/verify-email',\r\n forgotPassword = '/forgot-password',\r\n resetPassword = '/reset-password',\r\n } = paths;\r\n\r\n const routes: RouteObject[] = [];\r\n\r\n // Only add redirect routes if using built-in auth\r\n if (builtInAuth) {\r\n routes.push(\r\n {\r\n path: signIn,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-in\" />,\r\n },\r\n {\r\n path: signUp,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-up\" />,\r\n },\r\n {\r\n path: verifyEmail,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/verify-email\" />,\r\n },\r\n {\r\n path: forgotPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/forgot-password\" />,\r\n },\r\n {\r\n path: resetPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/reset-password\" />,\r\n }\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n"]}
1
+ {"version":3,"sources":["../src/router/getInsforgeRoutes.tsx"],"names":["useEffect","jsx"],"mappings":";;;;;AAyCA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsC;AAC5E,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAElB,EAAA,OAAO,IAAA;AACT;AAwDO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,QAAQ;AAAC,GACX,GAAI,MAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,UAAA;AAAA,IACT,MAAA,GAAS,UAAA;AAAA,IACT,WAAA,GAAc,eAAA;AAAA,IACd,cAAA,GAAiB,kBAAA;AAAA,IACjB,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAwB,EAAC;AAG/B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAASC,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,oBAAA,EAAqB;AAAA,OACvE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,uBAAA,EAAwB;AAAA,OAC1E;AAAA,MACA;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,kBAASA,cAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,sBAAA,EAAuB;AAAA;AACzE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"router.js","sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport type { RouteObject } from 'react-router-dom';\n\ninterface GetInsforgeRoutesConfig {\n /**\n * Base URL of your Insforge backend\n */\n baseUrl: string;\n \n /**\n * Whether to use built-in auth (deployed Insforge Auth)\n * When true: redirects to baseUrl/auth/* pages\n * When false: no redirect routes are added (use your own components)\n * @default true\n */\n builtInAuth?: boolean;\n \n /**\n * Custom paths for auth redirect routes\n * @default {\n * signIn: '/sign-in',\n * signUp: '/sign-up',\n * verifyEmail: '/verify-email',\n * forgotPassword: '/forgot-password',\n * resetPassword: '/reset-password'\n * }\n */\n paths?: {\n signIn?: string;\n signUp?: string;\n verifyEmail?: string;\n forgotPassword?: string;\n resetPassword?: string;\n };\n}\n\n/**\n * Helper component for redirecting to external auth\n */\nfunction RedirectToAuth({ baseUrl, path }: { baseUrl: string; path: string }) {\n useEffect(() => {\n const callbackUrl = `${window.location.origin}/auth/callback`;\n const authUrl = new URL(path, baseUrl);\n authUrl.searchParams.set('redirect', callbackUrl);\n window.location.replace(authUrl.toString());\n }, [baseUrl, path]);\n\n return null;\n}\n\n/**\n * Generates Insforge authentication redirect routes for React Router.\n * \n * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.\n * \n * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router\n * to handle authentication callbacks. See documentation for details.\n * \n * @param config - Configuration for Insforge routes\n * @returns Array of RouteObject for React Router (redirect routes only)\n * \n * @example\n * ```tsx\n * import { createBrowserRouter } from 'react-router-dom';\n * import { getInsforgeRoutes } from '@insforge/react/router';\n * import { InsforgeCallback } from '@insforge/react';\n * \n * const router = createBrowserRouter([\n * {\n * path: '/',\n * element: <Layout />,\n * children: [\n * { index: true, element: <Home /> },\n * // ✅ Required: Manually create callback route\n * { path: 'auth/callback', element: <AuthCallback /> },\n * { path: 'dashboard', element: <Dashboard /> }\n * ]\n * },\n * // Add redirect routes (sign-in, sign-up, etc.)\n * ...getInsforgeRoutes({\n * baseUrl: 'https://your-backend.com',\n * builtInAuth: true\n * })\n * ]);\n * \n * // src/pages/AuthCallback.tsx\n * function AuthCallback() {\n * return <InsforgeCallback redirectTo=\"/dashboard\" />;\n * }\n * ```\n * \n * @example\n * ```tsx\n * // Custom paths for redirect routes\n * ...getInsforgeRoutes({\n * baseUrl: 'https://your-backend.com',\n * builtInAuth: true,\n * paths: {\n * signIn: '/login',\n * signUp: '/register'\n * }\n * })\n * ```\n */\nexport function getInsforgeRoutes(config: GetInsforgeRoutesConfig): RouteObject[] {\n const {\n baseUrl,\n builtInAuth = true,\n paths = {},\n } = config;\n\n const {\n signIn = '/sign-in',\n signUp = '/sign-up',\n verifyEmail = '/verify-email',\n forgotPassword = '/forgot-password',\n resetPassword = '/reset-password',\n } = paths;\n\n const routes: RouteObject[] = [];\n\n // Only add redirect routes if using built-in auth\n if (builtInAuth) {\n routes.push(\n {\n path: signIn,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-in\" />,\n },\n {\n path: signUp,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-up\" />,\n },\n {\n path: verifyEmail,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/verify-email\" />,\n },\n {\n path: forgotPassword,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/forgot-password\" />,\n },\n {\n path: resetPassword,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/reset-password\" />,\n }\n );\n }\n\n return routes;\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/router/getInsforgeRoutes.tsx"],"names":[],"mappings":";;;AAyCA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsC;AAC5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAElB,EAAA,OAAO,IAAA;AACT;AAwDO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,QAAQ;AAAC,GACX,GAAI,MAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,UAAA;AAAA,IACT,MAAA,GAAS,UAAA;AAAA,IACT,WAAA,GAAc,eAAA;AAAA,IACd,cAAA,GAAiB,kBAAA;AAAA,IACjB,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAwB,EAAC;AAG/B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,oBAAA,EAAqB;AAAA,OACvE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,uBAAA,EAAwB;AAAA,OAC1E;AAAA,MACA;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,sBAAA,EAAuB;AAAA;AACzE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"router.mjs","sourcesContent":["'use client';\r\n\r\nimport { useEffect } from 'react';\r\nimport type { RouteObject } from 'react-router-dom';\r\n\r\ninterface GetInsforgeRoutesConfig {\r\n /**\r\n * Base URL of your Insforge backend\r\n */\r\n baseUrl: string;\r\n \r\n /**\r\n * Whether to use built-in auth (deployed Insforge Auth)\r\n * When true: redirects to baseUrl/auth/* pages\r\n * When false: no redirect routes are added (use your own components)\r\n * @default true\r\n */\r\n builtInAuth?: boolean;\r\n \r\n /**\r\n * Custom paths for auth redirect routes\r\n * @default {\r\n * signIn: '/sign-in',\r\n * signUp: '/sign-up',\r\n * verifyEmail: '/verify-email',\r\n * forgotPassword: '/forgot-password',\r\n * resetPassword: '/reset-password'\r\n * }\r\n */\r\n paths?: {\r\n signIn?: string;\r\n signUp?: string;\r\n verifyEmail?: string;\r\n forgotPassword?: string;\r\n resetPassword?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Helper component for redirecting to external auth\r\n */\r\nfunction RedirectToAuth({ baseUrl, path }: { baseUrl: string; path: string }) {\r\n useEffect(() => {\r\n const callbackUrl = `${window.location.origin}/auth/callback`;\r\n const authUrl = new URL(path, baseUrl);\r\n authUrl.searchParams.set('redirect', callbackUrl);\r\n window.location.replace(authUrl.toString());\r\n }, [baseUrl, path]);\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Generates Insforge authentication redirect routes for React Router.\r\n * \r\n * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.\r\n * \r\n * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router\r\n * to handle authentication callbacks. See documentation for details.\r\n * \r\n * @param config - Configuration for Insforge routes\r\n * @returns Array of RouteObject for React Router (redirect routes only)\r\n * \r\n * @example\r\n * ```tsx\r\n * import { createBrowserRouter } from 'react-router-dom';\r\n * import { getInsforgeRoutes } from '@insforge/react/router';\r\n * import { InsforgeCallback } from '@insforge/react';\r\n * \r\n * const router = createBrowserRouter([\r\n * {\r\n * path: '/',\r\n * element: <Layout />,\r\n * children: [\r\n * { index: true, element: <Home /> },\r\n * // ✅ Required: Manually create callback route\r\n * { path: 'auth/callback', element: <AuthCallback /> },\r\n * { path: 'dashboard', element: <Dashboard /> }\r\n * ]\r\n * },\r\n * // Add redirect routes (sign-in, sign-up, etc.)\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true\r\n * })\r\n * ]);\r\n * \r\n * // src/pages/AuthCallback.tsx\r\n * function AuthCallback() {\r\n * return <InsforgeCallback redirectTo=\"/dashboard\" />;\r\n * }\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // Custom paths for redirect routes\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true,\r\n * paths: {\r\n * signIn: '/login',\r\n * signUp: '/register'\r\n * }\r\n * })\r\n * ```\r\n */\r\nexport function getInsforgeRoutes(config: GetInsforgeRoutesConfig): RouteObject[] {\r\n const {\r\n baseUrl,\r\n builtInAuth = true,\r\n paths = {},\r\n } = config;\r\n\r\n const {\r\n signIn = '/sign-in',\r\n signUp = '/sign-up',\r\n verifyEmail = '/verify-email',\r\n forgotPassword = '/forgot-password',\r\n resetPassword = '/reset-password',\r\n } = paths;\r\n\r\n const routes: RouteObject[] = [];\r\n\r\n // Only add redirect routes if using built-in auth\r\n if (builtInAuth) {\r\n routes.push(\r\n {\r\n path: signIn,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-in\" />,\r\n },\r\n {\r\n path: signUp,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-up\" />,\r\n },\r\n {\r\n path: verifyEmail,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/verify-email\" />,\r\n },\r\n {\r\n path: forgotPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/forgot-password\" />,\r\n },\r\n {\r\n path: resetPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/reset-password\" />,\r\n }\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n"]}
1
+ {"version":3,"sources":["../src/router/getInsforgeRoutes.tsx"],"names":[],"mappings":";;;AAyCA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsC;AAC5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAElB,EAAA,OAAO,IAAA;AACT;AAwDO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,QAAQ;AAAC,GACX,GAAI,MAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,UAAA;AAAA,IACT,MAAA,GAAS,UAAA;AAAA,IACT,WAAA,GAAc,eAAA;AAAA,IACd,cAAA,GAAiB,kBAAA;AAAA,IACjB,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAwB,EAAC;AAG/B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,oBAAA,EAAqB;AAAA,OACvE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,uBAAA,EAAwB;AAAA,OAC1E;AAAA,MACA;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,kBAAS,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,sBAAA,EAAuB;AAAA;AACzE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"router.mjs","sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport type { RouteObject } from 'react-router-dom';\n\ninterface GetInsforgeRoutesConfig {\n /**\n * Base URL of your Insforge backend\n */\n baseUrl: string;\n \n /**\n * Whether to use built-in auth (deployed Insforge Auth)\n * When true: redirects to baseUrl/auth/* pages\n * When false: no redirect routes are added (use your own components)\n * @default true\n */\n builtInAuth?: boolean;\n \n /**\n * Custom paths for auth redirect routes\n * @default {\n * signIn: '/sign-in',\n * signUp: '/sign-up',\n * verifyEmail: '/verify-email',\n * forgotPassword: '/forgot-password',\n * resetPassword: '/reset-password'\n * }\n */\n paths?: {\n signIn?: string;\n signUp?: string;\n verifyEmail?: string;\n forgotPassword?: string;\n resetPassword?: string;\n };\n}\n\n/**\n * Helper component for redirecting to external auth\n */\nfunction RedirectToAuth({ baseUrl, path }: { baseUrl: string; path: string }) {\n useEffect(() => {\n const callbackUrl = `${window.location.origin}/auth/callback`;\n const authUrl = new URL(path, baseUrl);\n authUrl.searchParams.set('redirect', callbackUrl);\n window.location.replace(authUrl.toString());\n }, [baseUrl, path]);\n\n return null;\n}\n\n/**\n * Generates Insforge authentication redirect routes for React Router.\n * \n * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.\n * \n * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router\n * to handle authentication callbacks. See documentation for details.\n * \n * @param config - Configuration for Insforge routes\n * @returns Array of RouteObject for React Router (redirect routes only)\n * \n * @example\n * ```tsx\n * import { createBrowserRouter } from 'react-router-dom';\n * import { getInsforgeRoutes } from '@insforge/react/router';\n * import { InsforgeCallback } from '@insforge/react';\n * \n * const router = createBrowserRouter([\n * {\n * path: '/',\n * element: <Layout />,\n * children: [\n * { index: true, element: <Home /> },\n * // ✅ Required: Manually create callback route\n * { path: 'auth/callback', element: <AuthCallback /> },\n * { path: 'dashboard', element: <Dashboard /> }\n * ]\n * },\n * // Add redirect routes (sign-in, sign-up, etc.)\n * ...getInsforgeRoutes({\n * baseUrl: 'https://your-backend.com',\n * builtInAuth: true\n * })\n * ]);\n * \n * // src/pages/AuthCallback.tsx\n * function AuthCallback() {\n * return <InsforgeCallback redirectTo=\"/dashboard\" />;\n * }\n * ```\n * \n * @example\n * ```tsx\n * // Custom paths for redirect routes\n * ...getInsforgeRoutes({\n * baseUrl: 'https://your-backend.com',\n * builtInAuth: true,\n * paths: {\n * signIn: '/login',\n * signUp: '/register'\n * }\n * })\n * ```\n */\nexport function getInsforgeRoutes(config: GetInsforgeRoutesConfig): RouteObject[] {\n const {\n baseUrl,\n builtInAuth = true,\n paths = {},\n } = config;\n\n const {\n signIn = '/sign-in',\n signUp = '/sign-up',\n verifyEmail = '/verify-email',\n forgotPassword = '/forgot-password',\n resetPassword = '/reset-password',\n } = paths;\n\n const routes: RouteObject[] = [];\n\n // Only add redirect routes if using built-in auth\n if (builtInAuth) {\n routes.push(\n {\n path: signIn,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-in\" />,\n },\n {\n path: signUp,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-up\" />,\n },\n {\n path: verifyEmail,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/verify-email\" />,\n },\n {\n path: forgotPassword,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/forgot-password\" />,\n },\n {\n path: resetPassword,\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/reset-password\" />,\n }\n );\n }\n\n return routes;\n}\n\n"]}
package/dist/types.d.mts CHANGED
@@ -67,7 +67,7 @@ interface AuthPasswordFieldProps extends Omit<InputHTMLAttributes<HTMLInputEleme
67
67
  label: string;
68
68
  id: string;
69
69
  showStrengthIndicator?: boolean;
70
- emailAuthConfig: AuthConfig;
70
+ authConfig: AuthConfig;
71
71
  forgotPasswordLink?: {
72
72
  href: string;
73
73
  text?: string;
@@ -252,7 +252,7 @@ interface SignInFormProps {
252
252
  oauthLoading?: OAuthProvider | null;
253
253
  availableProviders?: OAuthProvider[];
254
254
  onOAuthClick?: (provider: OAuthProvider) => void;
255
- emailAuthConfig: AuthConfig;
255
+ authConfig: AuthConfig;
256
256
  /** Hierarchical appearance configuration for deep customization */
257
257
  appearance?: SignInAppearance;
258
258
  title?: string;
@@ -358,7 +358,7 @@ interface SignUpFormProps {
358
358
  oauthLoading?: OAuthProvider | null;
359
359
  availableProviders?: OAuthProvider[];
360
360
  onOAuthClick?: (provider: OAuthProvider) => void;
361
- emailAuthConfig: AuthConfig;
361
+ authConfig: AuthConfig;
362
362
  /** Hierarchical appearance configuration for deep customization */
363
363
  appearance?: SignUpAppearance;
364
364
  title?: string;
@@ -515,7 +515,7 @@ interface ResetPasswordFormProps {
515
515
  error?: string;
516
516
  loading?: boolean;
517
517
  success?: boolean;
518
- emailAuthConfig: AuthConfig;
518
+ authConfig: AuthConfig;
519
519
  /** Hierarchical appearance configuration for deep customization */
520
520
  appearance?: ResetPasswordAppearance;
521
521
  title?: string;
@@ -571,7 +571,7 @@ interface SignInProps {
571
571
  id: string;
572
572
  email: string;
573
573
  name: string;
574
- }, accessToken: string) => void;
574
+ }, accessToken: string, redirectTo?: string) => void;
575
575
  onError?: (error: Error) => void;
576
576
  }
577
577
  /**
@@ -597,7 +597,7 @@ interface SignUpProps {
597
597
  id: string;
598
598
  email: string;
599
599
  name: string;
600
- }, accessToken: string) => void;
600
+ }, accessToken: string, redirectTo?: string) => void;
601
601
  onError?: (error: Error) => void;
602
602
  }
603
603
  /**
package/dist/types.d.ts CHANGED
@@ -67,7 +67,7 @@ interface AuthPasswordFieldProps extends Omit<InputHTMLAttributes<HTMLInputEleme
67
67
  label: string;
68
68
  id: string;
69
69
  showStrengthIndicator?: boolean;
70
- emailAuthConfig: AuthConfig;
70
+ authConfig: AuthConfig;
71
71
  forgotPasswordLink?: {
72
72
  href: string;
73
73
  text?: string;
@@ -252,7 +252,7 @@ interface SignInFormProps {
252
252
  oauthLoading?: OAuthProvider | null;
253
253
  availableProviders?: OAuthProvider[];
254
254
  onOAuthClick?: (provider: OAuthProvider) => void;
255
- emailAuthConfig: AuthConfig;
255
+ authConfig: AuthConfig;
256
256
  /** Hierarchical appearance configuration for deep customization */
257
257
  appearance?: SignInAppearance;
258
258
  title?: string;
@@ -358,7 +358,7 @@ interface SignUpFormProps {
358
358
  oauthLoading?: OAuthProvider | null;
359
359
  availableProviders?: OAuthProvider[];
360
360
  onOAuthClick?: (provider: OAuthProvider) => void;
361
- emailAuthConfig: AuthConfig;
361
+ authConfig: AuthConfig;
362
362
  /** Hierarchical appearance configuration for deep customization */
363
363
  appearance?: SignUpAppearance;
364
364
  title?: string;
@@ -515,7 +515,7 @@ interface ResetPasswordFormProps {
515
515
  error?: string;
516
516
  loading?: boolean;
517
517
  success?: boolean;
518
- emailAuthConfig: AuthConfig;
518
+ authConfig: AuthConfig;
519
519
  /** Hierarchical appearance configuration for deep customization */
520
520
  appearance?: ResetPasswordAppearance;
521
521
  title?: string;
@@ -571,7 +571,7 @@ interface SignInProps {
571
571
  id: string;
572
572
  email: string;
573
573
  name: string;
574
- }, accessToken: string) => void;
574
+ }, accessToken: string, redirectTo?: string) => void;
575
575
  onError?: (error: Error) => void;
576
576
  }
577
577
  /**
@@ -597,7 +597,7 @@ interface SignUpProps {
597
597
  id: string;
598
598
  email: string;
599
599
  name: string;
600
- }, accessToken: string) => void;
600
+ }, accessToken: string, redirectTo?: string) => void;
601
601
  onError?: (error: Error) => void;
602
602
  }
603
603
  /**
package/package.json CHANGED
@@ -1,98 +1,98 @@
1
- {
2
- "name": "@insforge/react",
3
- "version": "0.3.2",
4
- "description": "Framework-agnostic React authentication UI components for Insforge - reusable across all frameworks",
5
- "main": "./dist/index.js",
6
- "module": "./dist/index.mjs",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.mjs",
12
- "require": "./dist/index.js"
13
- },
14
- "./atoms": {
15
- "types": "./dist/atoms.d.ts",
16
- "import": "./dist/atoms.mjs",
17
- "require": "./dist/atoms.js"
18
- },
19
- "./forms": {
20
- "types": "./dist/forms.d.ts",
21
- "import": "./dist/forms.mjs",
22
- "require": "./dist/forms.js"
23
- },
24
- "./components": {
25
- "types": "./dist/components.d.ts",
26
- "import": "./dist/components.mjs",
27
- "require": "./dist/components.js"
28
- },
29
- "./hooks": {
30
- "types": "./dist/hooks.d.ts",
31
- "import": "./dist/hooks.mjs",
32
- "require": "./dist/hooks.js"
33
- },
34
- "./lib": {
35
- "types": "./dist/lib.d.ts",
36
- "import": "./dist/lib.mjs",
37
- "require": "./dist/lib.js"
38
- },
39
- "./types": {
40
- "types": "./dist/types.d.ts",
41
- "import": "./dist/types.mjs",
42
- "require": "./dist/types.js"
43
- },
44
- "./router": {
45
- "types": "./dist/router.d.ts",
46
- "import": "./dist/router.mjs",
47
- "require": "./dist/router.js"
48
- },
49
- "./styles.css": "./src/styles.css"
50
- },
51
- "files": [
52
- "dist",
53
- "src/styles.css",
54
- "README.md"
55
- ],
56
- "scripts": {
57
- "build": "tsup",
58
- "dev": "concurrently \"npx @tailwindcss/cli -i ./src/styles.css -o ./dist/styles.css --watch\" \"tsup --watch\"",
59
- "type-check": "tsc --noEmit",
60
- "clean": "rimraf dist"
61
- },
62
- "keywords": [
63
- "insforge",
64
- "react",
65
- "authentication",
66
- "auth",
67
- "ui",
68
- "components",
69
- "headless",
70
- "framework-agnostic"
71
- ],
72
- "author": "Insforge",
73
- "license": "MIT",
74
- "peerDependencies": {
75
- "react": "^19.0.0",
76
- "react-dom": "^19.0.0",
77
- "react-router-dom": "^7.9.5"
78
- },
79
- "dependencies": {
80
- "@insforge/sdk": "^0.0.58-dev.13",
81
- "@insforge/shared-schemas": "^1.1.17",
82
- "clsx": "^2.1.1",
83
- "lucide-react": "^0.552.0",
84
- "tailwind-merge": "^3.3.1",
85
- "zod": "^4.1.12"
86
- },
87
- "devDependencies": {
88
- "@tailwindcss/postcss": "^4.1.16",
89
- "@types/node": "^24.9.2",
90
- "@types/react": "^19.2.2",
91
- "@types/react-dom": "^19.2.2",
92
- "concurrently": "^9.2.1",
93
- "rimraf": "^6.1.0",
94
- "tailwindcss": "^4.1.16",
95
- "tsup": "^8.5.0",
96
- "typescript": "^5.9.3"
97
- }
98
- }
1
+ {
2
+ "name": "@insforge/react",
3
+ "version": "0.3.4",
4
+ "description": "Framework-agnostic React authentication UI components for Insforge - reusable across all frameworks",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./atoms": {
15
+ "types": "./dist/atoms.d.ts",
16
+ "import": "./dist/atoms.mjs",
17
+ "require": "./dist/atoms.js"
18
+ },
19
+ "./forms": {
20
+ "types": "./dist/forms.d.ts",
21
+ "import": "./dist/forms.mjs",
22
+ "require": "./dist/forms.js"
23
+ },
24
+ "./components": {
25
+ "types": "./dist/components.d.ts",
26
+ "import": "./dist/components.mjs",
27
+ "require": "./dist/components.js"
28
+ },
29
+ "./hooks": {
30
+ "types": "./dist/hooks.d.ts",
31
+ "import": "./dist/hooks.mjs",
32
+ "require": "./dist/hooks.js"
33
+ },
34
+ "./lib": {
35
+ "types": "./dist/lib.d.ts",
36
+ "import": "./dist/lib.mjs",
37
+ "require": "./dist/lib.js"
38
+ },
39
+ "./types": {
40
+ "types": "./dist/types.d.ts",
41
+ "import": "./dist/types.mjs",
42
+ "require": "./dist/types.js"
43
+ },
44
+ "./router": {
45
+ "types": "./dist/router.d.ts",
46
+ "import": "./dist/router.mjs",
47
+ "require": "./dist/router.js"
48
+ },
49
+ "./styles.css": "./src/styles.css"
50
+ },
51
+ "files": [
52
+ "dist",
53
+ "src/styles.css",
54
+ "README.md"
55
+ ],
56
+ "scripts": {
57
+ "build": "tsup",
58
+ "dev": "concurrently \"npx @tailwindcss/cli -i ./src/styles.css -o ./dist/styles.css --watch\" \"tsup --watch\"",
59
+ "type-check": "tsc --noEmit",
60
+ "clean": "rimraf dist"
61
+ },
62
+ "keywords": [
63
+ "insforge",
64
+ "react",
65
+ "authentication",
66
+ "auth",
67
+ "ui",
68
+ "components",
69
+ "headless",
70
+ "framework-agnostic"
71
+ ],
72
+ "author": "Insforge",
73
+ "license": "MIT",
74
+ "peerDependencies": {
75
+ "react": "^19.0.0",
76
+ "react-dom": "^19.0.0",
77
+ "react-router-dom": "^7.9.5"
78
+ },
79
+ "dependencies": {
80
+ "@insforge/sdk": "^0.0.58-dev.14",
81
+ "@insforge/shared-schemas": "^1.1.18",
82
+ "clsx": "^2.1.1",
83
+ "lucide-react": "^0.552.0",
84
+ "tailwind-merge": "^3.3.1",
85
+ "zod": "^4.1.12"
86
+ },
87
+ "devDependencies": {
88
+ "@tailwindcss/postcss": "^4.1.16",
89
+ "@types/node": "^24.9.2",
90
+ "@types/react": "^19.2.2",
91
+ "@types/react-dom": "^19.2.2",
92
+ "concurrently": "^9.2.1",
93
+ "rimraf": "^6.1.0",
94
+ "tailwindcss": "^4.1.16",
95
+ "tsup": "^8.5.0",
96
+ "typescript": "^5.9.3"
97
+ }
98
+ }
package/src/styles.css CHANGED
@@ -1,15 +1,15 @@
1
- /**
2
- * InsForge React Component Library Styles
3
- * Powered by Tailwind CSS 4.1
4
- */
5
-
6
- @import url('https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap');
7
- /* Import Tailwind CSS 4.1 */
8
- @import "tailwindcss";
9
-
10
- /* Custom design tokens */
11
- @theme {
12
- --font-manrope: 'Manrope', sans-serif;
13
- --font-inter: 'Inter', sans-serif;
14
- }
15
-
1
+ /**
2
+ * InsForge React Component Library Styles
3
+ * Powered by Tailwind CSS 4.1
4
+ */
5
+
6
+ @import url('https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap');
7
+ /* Import Tailwind CSS 4.1 */
8
+ @import "tailwindcss";
9
+
10
+ /* Custom design tokens */
11
+ @theme {
12
+ --font-manrope: 'Manrope', sans-serif;
13
+ --font-inter: 'Inter', sans-serif;
14
+ }
15
+