@insforge/react 0.4.0 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/router.cjs CHANGED
@@ -5,9 +5,9 @@ var jsxRuntime = require('react/jsx-runtime');
5
5
 
6
6
  function RedirectToAuth({ baseUrl, path }) {
7
7
  react.useEffect(() => {
8
- const callbackUrl = `${window.location.origin}/auth/callback`;
8
+ const currentUrl = window.location.href;
9
9
  const authUrl = new URL(path, baseUrl);
10
- authUrl.searchParams.set("redirect", callbackUrl);
10
+ authUrl.searchParams.set("redirect", currentUrl);
11
11
  window.location.replace(authUrl.toString());
12
12
  }, [baseUrl, path]);
13
13
  return null;
@@ -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,EAAE,OAAA,EAAS,WAAA,GAAc,MAAM,KAAA,GAAQ,IAAG,GAAI,MAAA;AAEpD,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.cjs","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 { baseUrl, builtInAuth = true, paths = {} } = 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"]}
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;AAEd,IAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC/C,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;AA6CO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,GAAc,MAAM,KAAA,GAAQ,IAAG,GAAI,MAAA;AAEpD,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.cjs","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 // Redirect back to current URL - middleware/SDK will handle token from URL\n const currentUrl = window.location.href;\n const authUrl = new URL(path, baseUrl);\n authUrl.searchParams.set('redirect', currentUrl);\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 * @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 *\n * const router = createBrowserRouter([\n * {\n * path: '/',\n * element: <Layout />,\n * children: [\n * { index: true, element: <Home /> },\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 *\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 { baseUrl, builtInAuth = true, paths = {} } = 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"]}
package/dist/router.d.cts CHANGED
@@ -35,9 +35,6 @@ interface GetInsforgeRoutesConfig {
35
35
  *
36
36
  * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.
37
37
  *
38
- * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router
39
- * to handle authentication callbacks. See documentation for details.
40
- *
41
38
  * @param config - Configuration for Insforge routes
42
39
  * @returns Array of RouteObject for React Router (redirect routes only)
43
40
  *
@@ -45,7 +42,6 @@ interface GetInsforgeRoutesConfig {
45
42
  * ```tsx
46
43
  * import { createBrowserRouter } from 'react-router-dom';
47
44
  * import { getInsforgeRoutes } from '@insforge/react/router';
48
- * import { InsforgeCallback } from '@insforge/react';
49
45
  *
50
46
  * const router = createBrowserRouter([
51
47
  * {
@@ -53,8 +49,6 @@ interface GetInsforgeRoutesConfig {
53
49
  * element: <Layout />,
54
50
  * children: [
55
51
  * { index: true, element: <Home /> },
56
- * // ✅ Required: Manually create callback route
57
- * { path: 'auth/callback', element: <AuthCallback /> },
58
52
  * { path: 'dashboard', element: <Dashboard /> }
59
53
  * ]
60
54
  * },
@@ -64,11 +58,6 @@ interface GetInsforgeRoutesConfig {
64
58
  * builtInAuth: true
65
59
  * })
66
60
  * ]);
67
- *
68
- * // src/pages/AuthCallback.tsx
69
- * function AuthCallback() {
70
- * return <InsforgeCallback redirectTo="/dashboard" />;
71
- * }
72
61
  * ```
73
62
  *
74
63
  * @example
package/dist/router.d.ts CHANGED
@@ -35,9 +35,6 @@ interface GetInsforgeRoutesConfig {
35
35
  *
36
36
  * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.
37
37
  *
38
- * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router
39
- * to handle authentication callbacks. See documentation for details.
40
- *
41
38
  * @param config - Configuration for Insforge routes
42
39
  * @returns Array of RouteObject for React Router (redirect routes only)
43
40
  *
@@ -45,7 +42,6 @@ interface GetInsforgeRoutesConfig {
45
42
  * ```tsx
46
43
  * import { createBrowserRouter } from 'react-router-dom';
47
44
  * import { getInsforgeRoutes } from '@insforge/react/router';
48
- * import { InsforgeCallback } from '@insforge/react';
49
45
  *
50
46
  * const router = createBrowserRouter([
51
47
  * {
@@ -53,8 +49,6 @@ interface GetInsforgeRoutesConfig {
53
49
  * element: <Layout />,
54
50
  * children: [
55
51
  * { index: true, element: <Home /> },
56
- * // ✅ Required: Manually create callback route
57
- * { path: 'auth/callback', element: <AuthCallback /> },
58
52
  * { path: 'dashboard', element: <Dashboard /> }
59
53
  * ]
60
54
  * },
@@ -64,11 +58,6 @@ interface GetInsforgeRoutesConfig {
64
58
  * builtInAuth: true
65
59
  * })
66
60
  * ]);
67
- *
68
- * // src/pages/AuthCallback.tsx
69
- * function AuthCallback() {
70
- * return <InsforgeCallback redirectTo="/dashboard" />;
71
- * }
72
61
  * ```
73
62
  *
74
63
  * @example
package/dist/router.js CHANGED
@@ -3,9 +3,9 @@ import { jsx } from 'react/jsx-runtime';
3
3
 
4
4
  function RedirectToAuth({ baseUrl, path }) {
5
5
  useEffect(() => {
6
- const callbackUrl = `${window.location.origin}/auth/callback`;
6
+ const currentUrl = window.location.href;
7
7
  const authUrl = new URL(path, baseUrl);
8
- authUrl.searchParams.set("redirect", callbackUrl);
8
+ authUrl.searchParams.set("redirect", currentUrl);
9
9
  window.location.replace(authUrl.toString());
10
10
  }, [baseUrl, path]);
11
11
  return null;
@@ -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,EAAE,OAAA,EAAS,WAAA,GAAc,MAAM,KAAA,GAAQ,IAAG,GAAI,MAAA;AAEpD,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.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 { baseUrl, builtInAuth = true, paths = {} } = 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"]}
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;AAEd,IAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC/C,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;AA6CO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,GAAc,MAAM,KAAA,GAAQ,IAAG,GAAI,MAAA;AAEpD,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.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 // Redirect back to current URL - middleware/SDK will handle token from URL\n const currentUrl = window.location.href;\n const authUrl = new URL(path, baseUrl);\n authUrl.searchParams.set('redirect', currentUrl);\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 * @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 *\n * const router = createBrowserRouter([\n * {\n * path: '/',\n * element: <Layout />,\n * children: [\n * { index: true, element: <Home /> },\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 *\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 { baseUrl, builtInAuth = true, paths = {} } = 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"]}
package/dist/styles.css CHANGED
@@ -424,6 +424,19 @@
424
424
  border: 1px solid var(--if-color-error);
425
425
  }
426
426
 
427
+ .if-errorBanner-content {
428
+ display: flex;
429
+ align-items: center;
430
+ gap: var(--if-space-2);
431
+ }
432
+
433
+ .if-errorBanner-icon {
434
+ width: 1.5rem;
435
+ height: 1.5rem;
436
+ flex-shrink: 0;
437
+ color: var(--if-color-error);
438
+ }
439
+
427
440
  .if-errorBanner-text {
428
441
  font-size: var(--if-font-size-sm);
429
442
  color: var(--if-color-error);
@@ -497,6 +510,78 @@
497
510
  border-color: var(--if-color-border-focus);
498
511
  }
499
512
 
513
+ /* ============================================
514
+ VERIFICATION STEP
515
+ ============================================ */
516
+ .if-verificationStep {
517
+ display: flex;
518
+ flex-direction: column;
519
+ gap: var(--if-space-6);
520
+ align-items: stretch;
521
+ }
522
+
523
+ .if-verificationStep-description {
524
+ font-size: var(--if-font-size-sm);
525
+ color: var(--if-color-text-secondary);
526
+ text-align: center;
527
+ margin: 0;
528
+ font-family: var(--if-font-family);
529
+ }
530
+
531
+ .if-verificationStep-codeContainer {
532
+ width: 100%;
533
+ background-color: #f5f5f5;
534
+ border-radius: var(--if-radius-lg);
535
+ padding: var(--if-space-4) var(--if-space-4) var(--if-space-6);
536
+ display: flex;
537
+ flex-direction: column;
538
+ gap: var(--if-space-4);
539
+ }
540
+
541
+ .if-verificationStep-codeInputWrapper {
542
+ display: flex;
543
+ flex-direction: column;
544
+ gap: var(--if-space-3);
545
+ margin-top: var(--if-space-2);
546
+ }
547
+
548
+ .if-verificationStep-verifyingText {
549
+ font-size: var(--if-font-size-sm);
550
+ color: var(--if-color-text-secondary);
551
+ text-align: center;
552
+ font-family: var(--if-font-family);
553
+ }
554
+
555
+ .if-verificationStep-resendContainer {
556
+ width: 100%;
557
+ font-size: var(--if-font-size-sm);
558
+ text-align: center;
559
+ color: var(--if-color-text-secondary);
560
+ font-family: var(--if-font-family);
561
+ }
562
+
563
+ .if-verificationStep-resendButton {
564
+ color: var(--if-color-text);
565
+ font-weight: 500;
566
+ transition: all var(--if-transition-base);
567
+ background: none;
568
+ border: none;
569
+ padding: 0;
570
+ font-family: var(--if-font-family);
571
+ font-size: var(--if-font-size-sm);
572
+ }
573
+
574
+ .if-verificationStep-resendButton:not(:disabled) {
575
+ cursor: pointer;
576
+ text-decoration: underline;
577
+ }
578
+
579
+ .if-verificationStep-resendButton:disabled {
580
+ cursor: not-allowed;
581
+ text-decoration: none;
582
+ opacity: 0.5;
583
+ }
584
+
500
585
  /* ============================================
501
586
  PASSWORD STRENGTH INDICATOR
502
587
  ============================================ */
@@ -576,20 +661,38 @@
576
661
  /* ============================================
577
662
  USER BUTTON
578
663
  ============================================ */
664
+ .if-userButton-container {
665
+ position: relative;
666
+ display: inline-block;
667
+ }
668
+
579
669
  .if-userButton {
580
- display: inline-flex;
670
+ display: flex;
581
671
  align-items: center;
582
672
  justify-content: center;
673
+ gap: var(--if-space-2);
583
674
  padding: var(--if-space-2);
584
675
  border-radius: 9999px;
585
- background-color: var(--if-color-bg-white);
586
- border: 1px solid var(--if-color-border);
676
+ background-color: transparent;
677
+ border: none;
587
678
  cursor: pointer;
588
679
  transition: all var(--if-transition-base);
589
680
  }
590
681
 
591
682
  .if-userButton:hover {
683
+ opacity: 0.8;
684
+ }
685
+
686
+ .if-userButton-detailed {
687
+ background-color: var(--if-color-bg-white);
688
+ border: 1px solid var(--if-color-border);
689
+ border-radius: var(--if-radius-sm);
690
+ padding: var(--if-space-2);
691
+ }
692
+
693
+ .if-userButton-detailed:hover {
592
694
  background-color: var(--if-color-bg-light);
695
+ opacity: 1;
593
696
  }
594
697
 
595
698
  .if-userButton-avatar {
@@ -604,6 +707,44 @@
604
707
  font-weight: 600;
605
708
  font-size: var(--if-font-size-sm);
606
709
  font-family: var(--if-font-family);
710
+ overflow: hidden;
711
+ }
712
+
713
+ .if-userButton-avatarImage {
714
+ border-radius: 9999px;
715
+ object-fit: cover;
716
+ width: 100%;
717
+ height: 100%;
718
+ }
719
+
720
+ .if-userButton-avatarInitials {
721
+ color: var(--if-color-bg-white);
722
+ font-weight: 600;
723
+ font-size: var(--if-font-size-sm);
724
+ }
725
+
726
+ .if-userButton-info {
727
+ display: flex;
728
+ flex-direction: column;
729
+ align-items: flex-start;
730
+ gap: 0.125rem;
731
+ }
732
+
733
+ .if-userButton-name {
734
+ font-size: var(--if-font-size-sm);
735
+ font-weight: 600;
736
+ color: var(--if-color-text);
737
+ line-height: 1.25rem;
738
+ text-align: left;
739
+ font-family: var(--if-font-family);
740
+ }
741
+
742
+ .if-userButton-email {
743
+ font-size: var(--if-font-size-xs);
744
+ color: var(--if-color-text-secondary);
745
+ line-height: 1rem;
746
+ text-align: left;
747
+ font-family: var(--if-font-family);
607
748
  }
608
749
 
609
750
  .if-userButton-menu {
@@ -629,12 +770,80 @@
629
770
  font-size: var(--if-font-size-sm);
630
771
  color: var(--if-color-text);
631
772
  font-family: var(--if-font-family);
773
+ background: none;
774
+ border: none;
775
+ width: 100%;
776
+ text-align: left;
632
777
  }
633
778
 
634
779
  .if-userButton-menuItem:hover {
635
780
  background-color: var(--if-color-bg-light);
636
781
  }
637
782
 
783
+ .if-userButton-menuItem-signout {
784
+ color: var(--if-color-error);
785
+ }
786
+
787
+ .if-userButton-menuItem-icon {
788
+ width: 1.25rem;
789
+ height: 1.25rem;
790
+ }
791
+
792
+ /* ============================================
793
+ EMAIL VERIFICATION STATUS
794
+ ============================================ */
795
+ .if-verifyStatus-container {
796
+ width: 100%;
797
+ display: flex;
798
+ flex-direction: column;
799
+ align-items: center;
800
+ justify-content: center;
801
+ gap: var(--if-space-6);
802
+ }
803
+
804
+ .if-verifyStatus-container-stretch {
805
+ width: 100%;
806
+ display: flex;
807
+ flex-direction: column;
808
+ align-items: stretch;
809
+ justify-content: center;
810
+ gap: var(--if-space-6);
811
+ }
812
+
813
+ .if-verifyStatus-spinner {
814
+ border-radius: 9999px;
815
+ height: 3rem;
816
+ width: 3rem;
817
+ border-bottom: 2px solid var(--if-color-primary);
818
+ }
819
+
820
+ .if-verifyStatus-successContent {
821
+ display: flex;
822
+ flex-direction: column;
823
+ align-items: center;
824
+ gap: var(--if-space-4);
825
+ }
826
+
827
+ .if-verifyStatus-successIcon {
828
+ width: 4rem;
829
+ height: 4rem;
830
+ border-radius: 9999px;
831
+ background-color: #d1fae5;
832
+ display: flex;
833
+ align-items: center;
834
+ justify-content: center;
835
+ }
836
+
837
+ .if-verifyStatus-successIconSvg {
838
+ width: 2rem;
839
+ height: 2rem;
840
+ color: #059669;
841
+ }
842
+
843
+ .if-verifyStatus-textCenter {
844
+ text-align: center;
845
+ }
846
+
638
847
  /* ============================================
639
848
  UTILITY CLASSES
640
849
  ============================================ */