insforge 1.2.10 → 1.4.8

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.
Files changed (506) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +46 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +30 -28
  25. package/auth/src/lib/broadcastService.ts +4 -4
  26. package/auth/src/lib/insforge.ts +8 -0
  27. package/auth/src/main.tsx +2 -4
  28. package/auth/src/pages/SignInPage.tsx +5 -2
  29. package/auth/src/pages/SignUpPage.tsx +5 -2
  30. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  31. package/auth/tsconfig.json +33 -32
  32. package/auth/tsconfig.node.json +11 -11
  33. package/backend/package.json +82 -75
  34. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  35. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  36. package/backend/src/api/routes/auth/index.routes.ts +720 -570
  37. package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
  38. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  39. package/backend/src/api/routes/database/index.routes.ts +80 -1
  40. package/backend/src/api/routes/database/records.routes.ts +48 -184
  41. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  42. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  43. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  44. package/backend/src/api/routes/docs/index.routes.ts +76 -76
  45. package/backend/src/api/routes/email/index.routes.ts +35 -0
  46. package/backend/src/api/routes/functions/index.routes.ts +21 -15
  47. package/backend/src/api/routes/metadata/index.routes.ts +38 -0
  48. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  49. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  50. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  51. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  52. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  53. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  54. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  55. package/backend/src/infra/database/database.manager.ts +14 -11
  56. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  57. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  58. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  59. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  60. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  61. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  62. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  63. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  64. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  65. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  66. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  67. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  68. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  69. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  70. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  71. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  72. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  73. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  74. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  75. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  76. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  77. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  78. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  79. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  80. package/backend/src/infra/security/token.manager.ts +216 -125
  81. package/backend/src/infra/socket/socket.manager.ts +198 -64
  82. package/backend/src/providers/ai/openrouter.provider.ts +24 -12
  83. package/backend/src/providers/database/base.provider.ts +39 -0
  84. package/backend/src/providers/database/cloud.provider.ts +159 -0
  85. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  86. package/backend/src/providers/email/base.provider.ts +4 -7
  87. package/backend/src/providers/email/cloud.provider.ts +84 -0
  88. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  89. package/backend/src/providers/oauth/index.ts +1 -0
  90. package/backend/src/server.ts +329 -284
  91. package/backend/src/services/ai/ai-config.service.ts +6 -6
  92. package/backend/src/services/ai/ai-model.service.ts +60 -60
  93. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  94. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  95. package/backend/src/services/ai/helpers.ts +64 -64
  96. package/backend/src/services/ai/image-generation.service.ts +3 -3
  97. package/backend/src/services/ai/index.ts +13 -13
  98. package/backend/src/services/auth/auth-config.service.ts +4 -4
  99. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  100. package/backend/src/services/auth/auth.service.ts +148 -74
  101. package/backend/src/services/auth/index.ts +4 -4
  102. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  103. package/backend/src/services/database/database-advance.service.ts +19 -55
  104. package/backend/src/services/database/database-table.service.ts +38 -94
  105. package/backend/src/services/database/database.service.ts +127 -0
  106. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  107. package/backend/src/services/deployments/deployment.service.ts +693 -0
  108. package/backend/src/services/email/email.service.ts +5 -7
  109. package/backend/src/services/functions/function.service.ts +61 -41
  110. package/backend/src/services/logs/audit.service.ts +10 -10
  111. package/backend/src/services/realtime/index.ts +3 -0
  112. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  113. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  114. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  115. package/backend/src/services/secrets/secret.service.ts +101 -27
  116. package/backend/src/services/storage/storage.service.ts +30 -30
  117. package/backend/src/services/usage/usage.service.ts +6 -6
  118. package/backend/src/types/ai.ts +8 -0
  119. package/backend/src/types/auth.ts +16 -1
  120. package/backend/src/types/database.ts +2 -0
  121. package/backend/src/types/deployments.ts +33 -0
  122. package/backend/src/types/realtime.ts +18 -0
  123. package/backend/src/types/socket.ts +7 -31
  124. package/backend/src/types/storage.ts +1 -1
  125. package/backend/src/types/webhooks.ts +45 -0
  126. package/backend/src/utils/cookies.ts +34 -0
  127. package/backend/src/utils/environment.ts +0 -14
  128. package/backend/src/utils/s3-config-loader.ts +64 -0
  129. package/backend/src/utils/seed.ts +79 -43
  130. package/backend/src/utils/sql-parser.ts +216 -0
  131. package/backend/src/utils/utils.ts +114 -114
  132. package/backend/src/utils/validations.ts +10 -10
  133. package/backend/tests/README.md +133 -133
  134. package/backend/tests/cleanup-all-test-data.sh +230 -230
  135. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  136. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  137. package/backend/tests/local/test-ai-config.sh +129 -129
  138. package/backend/tests/local/test-ai-usage.sh +80 -80
  139. package/backend/tests/local/test-auth-router.sh +143 -143
  140. package/backend/tests/local/test-database-router.sh +222 -222
  141. package/backend/tests/local/test-e2e.sh +240 -240
  142. package/backend/tests/local/test-fk-errors.sh +96 -96
  143. package/backend/tests/local/test-functions.sh +123 -123
  144. package/backend/tests/local/test-id-field.sh +200 -200
  145. package/backend/tests/local/test-logs.sh +132 -132
  146. package/backend/tests/local/test-public-bucket.sh +264 -264
  147. package/backend/tests/local/test-rpc.sh +141 -0
  148. package/backend/tests/local/test-secrets.sh +249 -249
  149. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  150. package/backend/tests/local/test-traditional-rest.sh +208 -208
  151. package/backend/tests/manual/README.md +50 -50
  152. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  153. package/backend/tests/manual/seed-large-table.sql +100 -100
  154. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  155. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  156. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  157. package/backend/tests/manual/test-database-advance.sh +296 -296
  158. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  159. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  160. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  161. package/backend/tests/manual/test-universal-storage.sh +263 -263
  162. package/backend/tests/manual/test-users.sql +17 -17
  163. package/backend/tests/run-all-tests.sh +139 -139
  164. package/backend/tests/setup.ts +0 -0
  165. package/backend/tests/test-config.sh +338 -338
  166. package/backend/tests/unit/analyze-query.test.ts +697 -0
  167. package/backend/tests/unit/database-advance.test.ts +326 -0
  168. package/backend/tests/unit/helpers.test.ts +2 -2
  169. package/backend/tsconfig.json +22 -22
  170. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  171. package/claude-plugin/README.md +133 -133
  172. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
  173. package/docker-compose.prod.yml +204 -200
  174. package/docker-compose.yml +232 -228
  175. package/docker-init/db/db-init.sql +97 -97
  176. package/docker-init/db/jwt.sql +5 -5
  177. package/docker-init/db/postgresql.conf +16 -16
  178. package/docker-init/logs/vector.yml +236 -236
  179. package/docs/README.md +44 -44
  180. package/docs/agent-docs/deployment.md +79 -0
  181. package/docs/agent-docs/real-time.md +269 -0
  182. package/docs/changelog.mdx +212 -67
  183. package/docs/core-concepts/ai/architecture.mdx +350 -372
  184. package/docs/core-concepts/ai/sdk.mdx +238 -213
  185. package/docs/core-concepts/authentication/architecture.mdx +276 -278
  186. package/docs/core-concepts/authentication/sdk.mdx +710 -414
  187. package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
  188. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
  189. package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
  190. package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
  191. package/docs/core-concepts/database/architecture.mdx +292 -255
  192. package/docs/core-concepts/database/pgvector.mdx +138 -0
  193. package/docs/core-concepts/database/sdk.mdx +382 -382
  194. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  195. package/docs/core-concepts/email/architecture.mdx +103 -0
  196. package/docs/core-concepts/email/sdk.mdx +53 -0
  197. package/docs/core-concepts/functions/architecture.mdx +105 -105
  198. package/docs/core-concepts/functions/sdk.mdx +183 -184
  199. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  200. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  201. package/docs/core-concepts/storage/architecture.mdx +243 -243
  202. package/docs/core-concepts/storage/sdk.mdx +253 -253
  203. package/docs/deployment/README.md +94 -94
  204. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  205. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  206. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  207. package/docs/deployment/deploy-to-render.md +441 -441
  208. package/docs/deprecated/insforge-auth-api.md +214 -214
  209. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  210. package/docs/deprecated/insforge-db-api.md +358 -358
  211. package/docs/deprecated/insforge-db-sdk.md +139 -139
  212. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  213. package/docs/deprecated/insforge-debug.md +64 -64
  214. package/docs/deprecated/insforge-instructions.md +123 -123
  215. package/docs/deprecated/insforge-project.md +117 -117
  216. package/docs/deprecated/insforge-storage-api.md +278 -278
  217. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  218. package/docs/docs.json +240 -210
  219. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  220. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  221. package/docs/examples/framework-guides/react.mdx +165 -165
  222. package/docs/examples/framework-guides/svelte.mdx +153 -153
  223. package/docs/examples/framework-guides/vue.mdx +159 -159
  224. package/docs/examples/overview.mdx +67 -67
  225. package/docs/favicon.png +0 -0
  226. package/docs/favicon.svg +4 -19
  227. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  228. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  229. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  230. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  231. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  232. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  233. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  234. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  235. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  236. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  237. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  238. package/docs/images/icons/ai.svg +4 -4
  239. package/docs/images/logos/nextjs.svg +4 -4
  240. package/docs/images/logos/nuxt.svg +4 -4
  241. package/docs/images/logos/react.svg +5 -5
  242. package/docs/images/logos/svelte.svg +4 -4
  243. package/docs/images/logos/vue.svg +5 -5
  244. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  245. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  246. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  247. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  248. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  249. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  250. package/docs/images/mcp-setup/cline-1.png +0 -0
  251. package/docs/images/mcp-setup/cline-2.png +0 -0
  252. package/docs/images/mcp-setup/cline-3.png +0 -0
  253. package/docs/images/mcp-setup/connect-project.png +0 -0
  254. package/docs/images/mcp-setup/copilot-1.png +0 -0
  255. package/docs/images/mcp-setup/copilot-2.png +0 -0
  256. package/docs/images/mcp-setup/copilot-3.png +0 -0
  257. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  258. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  259. package/docs/images/mcp-setup/qoder-1.png +0 -0
  260. package/docs/images/mcp-setup/qoder-2.png +0 -0
  261. package/docs/images/mcp-setup/roocode-1.png +0 -0
  262. package/docs/images/mcp-setup/roocode-2.png +0 -0
  263. package/docs/images/mcp-setup/trae-1.png +0 -0
  264. package/docs/images/mcp-setup/trae-2.png +0 -0
  265. package/docs/images/mcp-setup/trae-3.png +0 -0
  266. package/docs/images/mcp-setup/trae-4.png +0 -0
  267. package/docs/images/mcp-setup/trae-5.png +0 -0
  268. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  269. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  270. package/docs/insforge-instructions-sdk.md +93 -88
  271. package/docs/introduction.mdx +46 -45
  272. package/docs/logo/dark.svg +22 -22
  273. package/docs/logo/light.svg +20 -20
  274. package/docs/mcp-setup.mdx +332 -0
  275. package/docs/oauth-server.mdx +563 -0
  276. package/docs/partnership.mdx +720 -646
  277. package/docs/quickstart.mdx +82 -82
  278. package/docs/showcase.mdx +52 -52
  279. package/docs/snippets/sdk-installation.mdx +21 -21
  280. package/docs/snippets/service-icons.mdx +27 -27
  281. package/docs/vscode-extension.mdx +74 -0
  282. package/eslint.config.js +1 -0
  283. package/examples/oauth/frontend-oauth-example.html +250 -250
  284. package/examples/response-examples.md +443 -443
  285. package/frontend/components.json +17 -17
  286. package/frontend/package.json +69 -69
  287. package/frontend/src/App.tsx +8 -3
  288. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  289. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  290. package/frontend/src/assets/icons/checked.svg +3 -3
  291. package/frontend/src/assets/icons/connected.svg +3 -3
  292. package/frontend/src/assets/icons/error.svg +3 -3
  293. package/frontend/src/assets/icons/loader.svg +9 -9
  294. package/frontend/src/assets/icons/pencil.svg +4 -4
  295. package/frontend/src/assets/icons/refresh.svg +4 -4
  296. package/frontend/src/assets/icons/step_active.svg +3 -3
  297. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  298. package/frontend/src/assets/icons/warning.svg +3 -3
  299. package/frontend/src/assets/logos/antigravity.svg +1 -0
  300. package/frontend/src/assets/logos/apple.svg +3 -3
  301. package/frontend/src/assets/logos/claude_code.svg +3 -3
  302. package/frontend/src/assets/logos/cline.svg +6 -6
  303. package/frontend/src/assets/logos/copilot.svg +10 -0
  304. package/frontend/src/assets/logos/cursor.svg +20 -20
  305. package/frontend/src/assets/logos/deepseek.svg +139 -0
  306. package/frontend/src/assets/logos/discord.svg +8 -8
  307. package/frontend/src/assets/logos/facebook.svg +3 -3
  308. package/frontend/src/assets/logos/gemini.svg +19 -19
  309. package/frontend/src/assets/logos/github.svg +5 -5
  310. package/frontend/src/assets/logos/google.svg +13 -13
  311. package/frontend/src/assets/logos/grok.svg +10 -10
  312. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  313. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  314. package/frontend/src/assets/logos/instagram.svg +1 -1
  315. package/frontend/src/assets/logos/kiro.svg +9 -0
  316. package/frontend/src/assets/logos/linkedin.svg +3 -3
  317. package/frontend/src/assets/logos/openai.svg +10 -10
  318. package/frontend/src/assets/logos/qoder.svg +4 -0
  319. package/frontend/src/assets/logos/qwen.svg +15 -0
  320. package/frontend/src/assets/logos/roo_code.svg +9 -9
  321. package/frontend/src/assets/logos/spotify.svg +16 -16
  322. package/frontend/src/assets/logos/tiktok.svg +5 -5
  323. package/frontend/src/assets/logos/trae.svg +3 -3
  324. package/frontend/src/assets/logos/windsurf.svg +10 -10
  325. package/frontend/src/assets/logos/x.svg +3 -3
  326. package/frontend/src/components/CodeBlock.tsx +2 -2
  327. package/frontend/src/components/ConnectCTA.tsx +3 -2
  328. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  329. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  330. package/frontend/src/components/datagrid/index.ts +1 -1
  331. package/frontend/src/components/index.ts +0 -1
  332. package/frontend/src/components/layout/AppHeader.tsx +13 -37
  333. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  334. package/frontend/src/components/layout/Layout.tsx +34 -32
  335. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  336. package/frontend/src/components/radix/Select.tsx +151 -151
  337. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  338. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  339. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  340. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  341. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  342. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  343. package/frontend/src/features/ai/components/index.ts +6 -6
  344. package/frontend/src/features/ai/helpers.ts +147 -141
  345. package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
  346. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  347. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  348. package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
  349. package/frontend/src/features/auth/components/index.ts +5 -5
  350. package/frontend/src/features/auth/helpers.tsx +8 -0
  351. package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
  352. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  353. package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
  354. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  355. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  356. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  357. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  358. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  359. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  360. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  361. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  362. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  363. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  364. package/frontend/src/features/database/constants.ts +16 -28
  365. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  366. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  367. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  368. package/frontend/src/features/database/hooks/useTables.ts +30 -28
  369. package/frontend/src/features/database/index.ts +1 -0
  370. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
  371. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
  372. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
  373. package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
  374. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  375. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
  376. package/frontend/src/features/database/services/advance.service.ts +1 -41
  377. package/frontend/src/features/database/services/database.service.ts +55 -0
  378. package/frontend/src/features/database/services/record.service.ts +4 -20
  379. package/frontend/src/features/database/services/table.service.ts +1 -10
  380. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  381. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  382. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  383. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  384. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  385. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  386. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  387. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  388. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  389. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  390. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  391. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  392. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  393. package/frontend/src/features/functions/components/index.ts +5 -5
  394. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  395. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  396. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  397. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
  398. package/frontend/src/features/functions/services/function.service.ts +8 -25
  399. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  400. package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
  401. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  402. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  403. package/frontend/src/features/logs/components/index.ts +1 -0
  404. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  405. package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
  406. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  407. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  408. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  409. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  410. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  411. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  412. package/frontend/src/features/onboard/components/index.ts +9 -4
  413. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  414. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  415. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  416. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  417. package/frontend/src/features/onboard/index.ts +17 -13
  418. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  419. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  420. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  421. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  422. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  423. package/frontend/src/features/realtime/index.ts +11 -0
  424. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  425. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  426. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  427. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  428. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  429. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  430. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  431. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
  432. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
  433. package/frontend/src/index.css +249 -249
  434. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  435. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  436. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  437. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  438. package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
  439. package/frontend/src/lib/services/metadata.service.ts +20 -3
  440. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  441. package/frontend/src/lib/utils/menuItems.ts +223 -183
  442. package/frontend/src/lib/utils/utils.ts +196 -183
  443. package/frontend/tsconfig.json +25 -25
  444. package/frontend/tsconfig.node.json +9 -9
  445. package/functions/deno.json +24 -24
  446. package/functions/server.ts +6 -6
  447. package/functions/worker-template.js +1 -1
  448. package/i18n/README.ar.md +130 -130
  449. package/i18n/README.de.md +130 -130
  450. package/i18n/README.es.md +154 -154
  451. package/i18n/README.fr.md +134 -134
  452. package/i18n/README.hi.md +129 -129
  453. package/i18n/README.ja.md +174 -174
  454. package/i18n/README.ko.md +136 -136
  455. package/i18n/README.pt-BR.md +131 -131
  456. package/i18n/README.ru.md +129 -129
  457. package/i18n/README.zh-CN.md +133 -133
  458. package/openapi/ai.yaml +825 -715
  459. package/openapi/auth.yaml +1324 -1244
  460. package/openapi/email.yaml +158 -0
  461. package/openapi/functions.yaml +475 -475
  462. package/openapi/health.yaml +29 -29
  463. package/openapi/logs.yaml +221 -223
  464. package/openapi/metadata.yaml +175 -177
  465. package/openapi/realtime.yaml +699 -0
  466. package/openapi/records.yaml +381 -381
  467. package/openapi/secrets.yaml +370 -370
  468. package/openapi/storage.yaml +875 -875
  469. package/openapi/tables.yaml +462 -463
  470. package/package.json +97 -97
  471. package/shared-schemas/package.json +31 -31
  472. package/shared-schemas/src/ai-api.schema.ts +251 -143
  473. package/shared-schemas/src/ai.schema.ts +8 -4
  474. package/shared-schemas/src/auth-api.schema.ts +380 -339
  475. package/shared-schemas/src/auth.schema.ts +18 -11
  476. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  477. package/shared-schemas/src/database-api.schema.ts +32 -1
  478. package/shared-schemas/src/database.schema.ts +39 -0
  479. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  480. package/shared-schemas/src/deployments.schema.ts +30 -0
  481. package/shared-schemas/src/docs.schema.ts +32 -0
  482. package/shared-schemas/src/email-api.schema.ts +30 -0
  483. package/shared-schemas/src/functions-api.schema.ts +13 -4
  484. package/shared-schemas/src/functions.schema.ts +1 -1
  485. package/shared-schemas/src/index.ts +22 -14
  486. package/shared-schemas/src/metadata.schema.ts +39 -4
  487. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  488. package/shared-schemas/src/realtime.schema.ts +143 -0
  489. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  490. package/shared-schemas/src/secrets.schema.ts +15 -0
  491. package/shared-schemas/tsconfig.json +21 -21
  492. package/tsconfig.json +7 -7
  493. package/zeabur/README.md +26 -13
  494. package/zeabur/template.yml +1001 -1032
  495. package/.cursor/rules/cursor-rules.mdc +0 -94
  496. package/backend/src/types/profile.ts +0 -55
  497. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
  498. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  499. package/test-gemini.sh +0 -35
  500. package/test-usage-admin.sh +0 -57
  501. package/test-usage.sh +0 -50
  502. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  503. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  504. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  505. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  506. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,529 +1,733 @@
1
- ---
2
- title: InsForge Auth Components
3
- description: Framework-agnostic authentication components guidance for customization
4
- ---
5
-
6
- ## Custom Authentication system
7
-
8
- Use this approach when you need custom authentication pages in your application instead of redirecting to hosted pages.
9
-
10
- ### Step-by-Step: Custom Auth Pages Setup
11
-
12
- #### Step 1: Setup Provider (Same as Quick Start)
13
-
14
- The provider setup is identical:
15
-
16
- ```tsx src/main.tsx
17
- import { StrictMode } from 'react';
18
- import { createRoot } from 'react-dom/client';
19
- import { InsforgeProvider } from '@insforge/react-router';
20
- import App from './App';
21
-
22
- createRoot(document.getElementById('root')!).render(
23
- <StrictMode>
24
- <InsforgeProvider
25
- baseUrl={
26
- import.meta.env.VITE_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
27
- }
28
- afterSignInUrl="/dashboard"
29
- >
30
- <App />
31
- </InsforgeProvider>
32
- </StrictMode>
33
- );
34
- ```
35
-
36
- #### Step 2: Configure Router with Custom Pages
37
-
38
- Set `builtInAuth: false` and provide your page components:
39
-
40
- ```tsx src/App.tsx
41
- import { createBrowserRouter, RouterProvider } from 'react-router-dom';
42
- import { getInsforgeRoutes } from '@insforge/react-router/router';
43
- import Layout from './components/Layout';
44
- import Home from './pages/Home';
45
- import Dashboard from './pages/Dashboard';
46
- // Import your custom auth pages
47
- import SignInPage from './pages/auth/SignInPage';
48
- import SignUpPage from './pages/auth/SignUpPage';
49
- import ForgotPasswordPage from './pages/auth/ForgotPasswordPage';
50
-
51
- const router = createBrowserRouter([
52
- {
53
- path: '/',
54
- element: <Layout />,
55
- children: [
56
- { index: true, element: <Home /> },
57
- { path: 'dashboard', element: <Dashboard /> },
58
- ],
59
- },
60
-
61
- // Custom auth routes
62
- ...getInsforgeRoutes({
63
- baseUrl: import.meta.env.VITE_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app', // Replace with your InsForge backend URL
64
- afterSignInUrl: '/dashboard',
65
- builtInAuth: false, // Render custom components instead of redirecting
66
- pages: {
67
- signIn: <SignInPage />,
68
- signUp: <SignUpPage />,
69
- forgotPassword: <ForgotPasswordPage />,
70
- },
71
- }),
72
- ]);
73
-
74
- export default function App() {
75
- return <RouterProvider router={router} />;
76
- }
77
- ```
78
-
79
- #### Step 3: Create Auth Page Components
80
-
81
- Use our complete authentication components directly. These components are **full-featured page-level components** with all business logic included:
82
-
83
- ```tsx src/pages/auth/SignInPage.tsx
84
- import { SignIn } from '@insforge/react-router';
85
-
86
- export default function SignInPage() {
87
- return (
88
- <div className="h-screen flex items-center justify-center">
89
- <SignIn
90
- title="Welcome Back"
91
- subtitle="Sign in to your account"
92
- onError={(error) => {
93
- console.error('Sign in error:', error);
94
- }}
95
- />
96
- </div>
97
- );
98
- }
99
- ```
100
-
101
- ```tsx src/pages/auth/SignUpPage.tsx
102
- import { SignUp } from '@insforge/react-router';
103
-
104
- export default function SignUpPage() {
105
- return (
106
- <div className="h-screen flex items-center justify-center">
107
- <SignUp
108
- title="Create Account"
109
- subtitle="Get started for free"
110
- onError={(error) => {
111
- console.error('Sign up error:', error);
112
- }}
113
- />
114
- </div>
115
- );
116
- }
117
- ```
118
-
119
- ```tsx src/pages/auth/ForgotPasswordPage.tsx
120
- import { ForgotPassword } from '@insforge/react-router';
121
-
122
- export default function ForgotPasswordPage() {
123
- return (
124
- <div className="h-screen flex items-center justify-center">
125
- <ForgotPassword
126
- onError={(error) => {
127
- console.error('Password reset error:', error);
128
- }}
129
- />
130
- </div>
131
- );
132
- }
133
- ```
134
-
135
- **That's it!** The `<SignIn>`, `<SignUp>`, and `<ForgotPassword>` components are complete page-level components that include:
136
-
137
- - Form UI with validation
138
- - OAuth provider buttons (auto-detected)
139
- - Error handling
140
- - Loading states
141
- - Password strength indicators (SignUp)
142
- - All authentication logic
143
-
144
- You only need to wrap them in your page components for layout/styling purposes.
145
-
146
- ### Key Difference from Built-in Auth
147
-
148
- **Built-in Auth:**
149
-
150
- - `/sign-in` Redirects to `https://your-app.region.insforge.app/auth/sign-in`
151
- - Authentication happens on hosted page
152
- - Returns to your app with token
153
-
154
- **Custom Components:**
155
-
156
- - `/sign-in` → Renders your `<SignInPage>` component
157
- - Authentication happens in your app
158
- - SDK handles token management automatically
159
-
160
- ---
161
-
162
- ## Features
163
-
164
- - **Built-in Auth**: React Router integration with deployed auth pages
165
- - **Complete Components**: Pre-built `<SignIn>`, `<SignUp>`, `<UserButton>` with business logic
166
- - **OAuth Support**: Google, GitHub, Discord, Facebook, LinkedIn, Microsoft, Apple, X, Instagram, TikTok, Spotify
167
- - **React Hooks**: `useAuth()`, `useUser()`, `usePublicAuthConfig()`
168
- - **Control Components**: `<SignedIn>`, `<SignedOut>`, `<Protect>`
169
- - **Form Components**: Pure UI forms for custom logic
170
- - **TypeScript**: Full type safety
171
-
172
- ---
173
-
174
- ## How It Works
175
-
176
- ### Built-in Auth Flow
177
-
178
- ```
179
- 1. User clicks "Sign In" → Visits /sign-in route
180
-
181
- 2. getInsforgeRoutes() redirects → https://your-app.region.insforge.app/auth/sign-in?redirect=yourapp.com/you-defined-destination-after-sign-in
182
-
183
- 3. User signs in on deployed page → Backend processes authentication
184
-
185
- 4. Backend redirects → yourapp.com/you-defined-destination-after-sign-in?access_token=xxx&user_id=xxx
186
-
187
- 5. InsForge SDK will:
188
- - Extracts token from URL
189
- - Saves to localStorage
190
- - Verifies with getCurrentUser()
191
- - Updates Provider state
192
-
193
- 6. User sees the destination page (e.g /dashboard)
194
- ```
195
-
196
- ### Custom UI Flow
197
-
198
- ```
199
- 1. User visits /sign-in route → Renders <SignIn> component
200
-
201
- 2. User enters credentials → Component calls SDK methods
202
-
203
- 3. SDK communicates with backend → Returns auth token and user data
204
-
205
- 4. Component adds token to URL and redirects → SDK auto-detects token from URL
206
-
207
- 5. Provider automatically updates auth state Components re-render
208
-
209
- 6. User sees authenticated UI at destination
210
- ```
211
-
212
- **Architecture:**
213
-
214
- - **InsforgeProvider**: Manages authentication state globally using React Context
215
- - **getInsforgeRoutes()**: Creates redirect routes for built-in auth
216
- - **SDK Integration**: All auth operations go through `@insforge/sdk`, which auto-detects tokens from URL
217
- - **React Context**: Provides auth state to all child components
218
- - **Hooks**: Easy access to auth methods and user data
219
-
220
- ---
221
-
222
- ## Complete Components (with Business Logic)
223
-
224
- These components include full authentication logic and work out of the box.
225
-
226
- ### `<SignIn />`
227
-
228
- Complete sign-in component with email/password and OAuth:
229
-
230
- ```tsx
231
- import { SignIn } from '@insforge/react-router';
232
-
233
- function SignInPage() {
234
- return (
235
- <SignIn
236
- title="Welcome Back"
237
- subtitle="Sign in to continue"
238
- onError={(error) => {
239
- console.error('Error:', error);
240
- }}
241
- />
242
- );
243
- }
244
- ```
245
-
246
- **Key Features:**
247
-
248
- - Email/password authentication
249
- - OAuth provider buttons (auto-detected from backend)
250
- - Password visibility toggle
251
- - Error handling
252
- - Loading states
253
- - Customizable text
254
-
255
- **Props:**
256
-
257
- - `onError` - Callback on error
258
- - `title` / `subtitle` - Custom heading text
259
-
260
- ### `<SignUp />`
261
-
262
- Complete sign-up component with password strength validation:
263
-
264
- ```tsx
265
- import { SignUp } from '@insforge/react-router';
266
-
267
- function SignUpPage() {
268
- return (
269
- <SignUp
270
- title="Create Account"
271
- subtitle="Get started with your free account"
272
- onError={(error) => {
273
- console.error('Error:', error);
274
- }}
275
- />
276
- );
277
- }
278
- ```
279
-
280
- **Key Features:**
281
-
282
- - Email/password registration
283
- - Real-time password strength indicator
284
- - OAuth provider buttons
285
- - Form validation
286
- - Customizable text
287
-
288
- **Props:** Same as `<SignIn>`.
289
-
290
- ### `<UserButton />`
291
-
292
- User profile dropdown with sign-out:
293
-
294
- ```tsx
295
- import { UserButton } from '@insforge/react-router';
296
-
297
- function Header() {
298
- return (
299
- <header>
300
- <nav>{/* Your navigation */}</nav>
301
- <UserButton afterSignOutUrl="/" mode="detailed" />
302
- </header>
303
- );
304
- }
305
- ```
306
-
307
- **Modes:**
308
-
309
- - `detailed` (default): Shows avatar + name + email
310
- - `simple`: Shows avatar only
311
-
312
- **Props:**
313
-
314
- - `mode` - Display mode: `"detailed"` or `"simple"`
315
- - `afterSignOutUrl` - Redirect URL after sign out
316
-
317
- ### `<ForgotPassword />`
318
-
319
- Complete password reset flow with automatic method detection:
320
-
321
- ```tsx
322
- import { ForgotPassword } from '@insforge/react-router';
323
-
324
- function ForgotPasswordPage() {
325
- return (
326
- <ForgotPassword
327
- onError={(error) => {
328
- console.error('Error:', error);
329
- }}
330
- />
331
- );
332
- }
333
- ```
334
-
335
- **Key Features:**
336
-
337
- - Auto-detects reset method (code or link) from backend config
338
- - **Link method**: Sends email with reset link
339
- - **Code method**: Three-step flow (email → verify code → reset password)
340
- - 60-second countdown timer for resend
341
- - Built-in form validation
342
- - Customizable text
343
-
344
- **Props:**
345
-
346
- - `onError` - Callback on error
347
-
348
- ### `<Protect />`
349
-
350
- Protected content with conditional rendering:
351
-
352
- ```tsx
353
- import { Protect } from '@insforge/react-router';
354
-
355
- function Dashboard() {
356
- return (
357
- <div>
358
- <h1>Dashboard</h1>
359
- {/* Simple protection */}
360
- <Protect redirectTo="/sign-in">
361
- <UserContent />
362
- </Protect>
363
- {/* Custom logic */}
364
- <Protect condition={(user) => user.subscription === 'premium'} fallback={<UpgradePrompt />}>
365
- <PremiumFeature />
366
- </Protect>
367
- </div>
368
- );
369
- }
370
- ```
371
-
372
- **Props:**
373
-
374
- - `redirectTo` - URL to redirect if not authorized
375
- - `condition` - Custom condition function `(user) => boolean`
376
- - `fallback` - React node to show if not authorized
377
-
378
- ### `<SignedIn>` / `<SignedOut>`
379
-
380
- Conditional rendering based on auth state:
381
-
382
- ```tsx
383
- import { SignedIn, SignedOut } from '@insforge/react-router';
384
-
385
- function NavBar() {
386
- return (
387
- <nav>
388
- <SignedOut>
389
- <a href="/sign-in">Sign In</a>
390
- <a href="/sign-up">Sign Up</a>
391
- </SignedOut>
392
-
393
- <SignedIn>
394
- <a href="/dashboard">Dashboard</a>
395
- <UserButton />
396
- </SignedIn>
397
- </nav>
398
- );
399
- }
400
- ```
401
-
402
- ---
403
-
404
- ## Hooks
405
-
406
- ### `useAuth()`
407
-
408
- Access authentication methods and state:
409
-
410
- ```tsx
411
- import { useAuth } from '@insforge/react-router';
412
-
413
- function LoginButton() {
414
- const { signIn, signUp, signOut, isSignedIn, isLoaded } = useAuth();
415
-
416
- const handleSignIn = async () => {
417
- try {
418
- await signIn('user@example.com', 'password');
419
- } catch (error) {
420
- console.error('Sign in failed:', error);
421
- }
422
- };
423
-
424
- if (!isLoaded) return <div>Loading...</div>;
425
-
426
- return (
427
- <button onClick={isSignedIn ? signOut : handleSignIn}>
428
- {isSignedIn ? 'Sign Out' : 'Sign In'}
429
- </button>
430
- );
431
- }
432
- ```
433
-
434
- **Returns:**
435
-
436
- - `signIn(email, password)` - Sign in with email/password
437
- - `signUp(email, password)` - Sign up new user
438
- - `signOut()` - Sign out current user
439
- - `isSignedIn` - Boolean auth state
440
- - `isLoaded` - Boolean loading state
441
-
442
- ### `useUser()`
443
-
444
- Access current user data:
445
-
446
- ```tsx
447
- import { useUser } from '@insforge/react-router';
448
-
449
- function UserProfile() {
450
- const { user, isLoaded, updateUser } = useUser();
451
-
452
- if (!isLoaded) return <div>Loading...</div>;
453
- if (!user) return <div>Not signed in</div>;
454
-
455
- const handleUpdate = async () => {
456
- await updateUser({ name: 'New Name' });
457
- };
458
-
459
- return (
460
- <div>
461
- <p>Email: {user.email}</p>
462
- <p>Name: {user.name}</p>
463
- <img src={user.avatarUrl} alt="Avatar" />
464
- <button onClick={handleUpdate}>Update Name</button>
465
- </div>
466
- );
467
- }
468
- ```
469
-
470
- **Returns:**
471
-
472
- - `user` - User object with id, email, name, avatarUrl
473
- - `isLoaded` - Boolean loading state
474
- - `updateUser(data)` - Update user profile
475
-
476
- ### `usePublicAuthConfig()`
477
-
478
- Get your authentication config in InsForge:
479
-
480
- ```tsx
481
- import { usePublicAuthConfig } from '@insforge/react-router';
482
-
483
- function SignInPage() {
484
- const { authConfig, isLoaded } = usePublicAuthConfig();
485
-
486
- if (!isLoaded) return <div>Loading...</div>;
487
-
488
- return (
489
- <div>
490
- <p>Available OAuth: {authConfig.oAuthProviders.join(', ')}</p>
491
- <p>Password min length: {authConfig?.passwordMinLength}</p>
492
- </div>
493
- );
494
- }
495
- ```
496
-
497
- **Returns:**
498
-
499
- - `authConfig` - Authentication Configuration you set in InsForge dashboard.
500
- - `isLoaded` - Boolean loading state
501
-
502
- <Warning>
503
- **Performance**: Only use this hook in SignIn/SignUp components to avoid unnecessary API calls.
504
- </Warning>
505
-
506
- ---
507
-
508
- ## Advanced Features
509
-
510
- ### Auth Change Callback
511
-
512
- Track authentication state changes:
513
-
514
- ```tsx
515
- <InsforgeProvider
516
- baseUrl={baseUrl}
517
- onAuthChange={(user) => {
518
- if (user) {
519
- console.log('User signed in:', user.email);
520
- analytics.identify(user.id);
521
- } else {
522
- console.log('User signed out');
523
- analytics.reset();
524
- }
525
- }}
526
- >
527
- {children}
528
- </InsforgeProvider>
529
- ```
1
+ ---
2
+ title: Custom Auth Pages
3
+ description: Build your own authentication UI using InsForge components
4
+ ---
5
+
6
+ InsForge provides three levels of flexibility for implementing authentication in your app:
7
+
8
+ <CardGroup cols={3}>
9
+ <Card title="Hosted Auth" icon="bolt" href="/core-concepts/authentication/ui-components/react">
10
+ **Fastest setup** - Redirect to hosted login pages. Zero UI code required.
11
+ </Card>
12
+
13
+ <Card title="Custom Components" icon="puzzle-piece">
14
+ **This page** - Use pre-built components with full business logic in your app.
15
+ </Card>
16
+
17
+ <Card title="SDK Only" icon="code" href="/core-concepts/authentication/sdk">
18
+ **Maximum control** - Build 100% custom UI using SDK methods directly.
19
+ </Card>
20
+ </CardGroup>
21
+
22
+ ---
23
+
24
+ ## Key Difference from Hosted Auth
25
+
26
+ | Aspect | Hosted Auth | Custom Components |
27
+ |--------|-------------|-------------------|
28
+ | **Sign-in route** | Redirects to `https://your-app.region.insforge.app/auth/sign-in` | Renders your `<SignIn />` component |
29
+ | **Where auth happens** | On hosted page | In your app |
30
+ | **Token management** | Returns to your app with token | SDK handles automatically |
31
+
32
+ ---
33
+
34
+ ## How It Works
35
+
36
+ ```
37
+ 1. User visits /sign-in route → Renders <SignIn> component
38
+
39
+ 2. User enters credentials → Component calls SDK methods
40
+
41
+ 3. SDK communicates with backend Returns auth token and user data
42
+
43
+ 4. Component adds token to URL and redirects → SDK auto-detects token from URL
44
+
45
+ 5. Provider automatically updates auth state → Components re-render
46
+
47
+ 6. User sees authenticated UI at destination
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Before You Start
53
+
54
+ Make sure to create an InsForge SDK client and wrap your app in the `InsforgeProvider`:
55
+
56
+ ```tsx src/lib/insforge.ts
57
+ import { createClient } from '@insforge/sdk';
58
+
59
+ export const insforge = createClient({
60
+ baseUrl: import.meta.env.VITE_INSFORGE_BASE_URL,
61
+ anonKey: import.meta.env.VITE_INSFORGE_ANON_KEY,
62
+ });
63
+ ```
64
+
65
+ ```tsx src/main.tsx
66
+ import { InsforgeProvider } from '@insforge/react';
67
+ import { insforge } from './lib/insforge';
68
+ import App from './App';
69
+
70
+ createRoot(document.getElementById('root')!).render(
71
+ <StrictMode>
72
+ <InsforgeProvider client={insforge}>
73
+ <App />
74
+ </InsforgeProvider>
75
+ </StrictMode>
76
+ );
77
+ ```
78
+
79
+ ## Complete Components (with Business Logic)
80
+
81
+ These components include full authentication logic and work out of the box.
82
+
83
+ ### `<SignIn />`
84
+
85
+ Complete sign-in component with email/password and OAuth:
86
+
87
+ ```tsx
88
+ import { SignIn } from '@insforge/react';
89
+
90
+ function SignInPage() {
91
+ return (
92
+ <SignIn
93
+ title="Welcome Back"
94
+ subtitle="Sign in to continue"
95
+ onError={(error) => console.error('Error:', error)}
96
+ />
97
+ );
98
+ }
99
+ ```
100
+
101
+ **Key Features:**
102
+
103
+ - Email/password authentication
104
+ - OAuth provider buttons (auto-detected from backend)
105
+ - Email verification flow (when required)
106
+ - Password visibility toggle
107
+ - Error handling & loading states
108
+
109
+ **Props:**
110
+
111
+ | Prop | Type | Description |
112
+ |------|------|-------------|
113
+ | `title` | `string` | Custom title text |
114
+ | `subtitle` | `string` | Custom subtitle text |
115
+ | `emailLabel` | `string` | Label for email input |
116
+ | `emailPlaceholder` | `string` | Placeholder for email input |
117
+ | `passwordLabel` | `string` | Label for password input |
118
+ | `passwordPlaceholder` | `string` | Placeholder for password input |
119
+ | `forgotPasswordText` | `string` | Text for forgot password link |
120
+ | `forgotPasswordUrl` | `string` | URL for forgot password page |
121
+ | `submitButtonText` | `string` | Text for submit button |
122
+ | `loadingButtonText` | `string` | Text while loading |
123
+ | `signUpText` | `string` | Text before sign up link |
124
+ | `signUpLinkText` | `string` | Text for sign up link |
125
+ | `signUpUrl` | `string` | URL for sign up page |
126
+ | `dividerText` | `string` | Text in OAuth divider |
127
+ | `onError` | `(error: Error) => void` | Callback on error |
128
+
129
+ ### `<SignUp />`
130
+
131
+ Complete sign-up component with password strength validation:
132
+
133
+ ```tsx
134
+ import { SignUp } from '@insforge/react';
135
+
136
+ function SignUpPage() {
137
+ return (
138
+ <SignUp
139
+ title="Create Account"
140
+ subtitle="Get started with your free account"
141
+ onError={(error) => console.error('Error:', error)}
142
+ />
143
+ );
144
+ }
145
+ ```
146
+
147
+ **Key Features:**
148
+
149
+ - Email/password registration
150
+ - Real-time password strength indicator
151
+ - Email verification flow (when required)
152
+ - OAuth provider buttons
153
+ - Form validation based on backend config
154
+
155
+ **Props:**
156
+
157
+ | Prop | Type | Description |
158
+ |------|------|-------------|
159
+ | `title` | `string` | Custom title text |
160
+ | `subtitle` | `string` | Custom subtitle text |
161
+ | `emailLabel` | `string` | Label for email input |
162
+ | `emailPlaceholder` | `string` | Placeholder for email input |
163
+ | `passwordLabel` | `string` | Label for password input |
164
+ | `passwordPlaceholder` | `string` | Placeholder for password input |
165
+ | `submitButtonText` | `string` | Text for submit button |
166
+ | `loadingButtonText` | `string` | Text while loading |
167
+ | `signInText` | `string` | Text before sign in link |
168
+ | `signInLinkText` | `string` | Text for sign in link |
169
+ | `signInUrl` | `string` | URL for sign in page |
170
+ | `dividerText` | `string` | Text in OAuth divider |
171
+ | `onError` | `(error: Error) => void` | Callback on error |
172
+
173
+ ### `<UserButton />`
174
+
175
+ User profile dropdown with sign-out and profile management:
176
+
177
+ ```tsx
178
+ import { UserButton } from '@insforge/react';
179
+
180
+ function Header() {
181
+ return (
182
+ <header>
183
+ <nav>{/* Your navigation */}</nav>
184
+ <UserButton
185
+ mode="detailed"
186
+ afterSignOutUrl="/"
187
+ showProfile={true}
188
+ onProfileError={(error) => console.error('Profile error:', error)}
189
+ />
190
+ </header>
191
+ );
192
+ }
193
+ ```
194
+
195
+ **Key Features:**
196
+
197
+ - Avatar with fallback to initials
198
+ - Dropdown menu with Profile and Sign Out options
199
+ - Built-in `UserProfileModal` integration
200
+ - Auto-positioning (opens upward/downward based on viewport)
201
+
202
+ **Props:**
203
+
204
+ | Prop | Type | Default | Description |
205
+ |------|------|---------|-------------|
206
+ | `mode` | `"detailed"` \| `"simple"` | `"simple"` | `detailed`: avatar + name + email, `simple`: avatar only |
207
+ | `afterSignOutUrl` | `string` | `"/"` | Redirect URL after sign out |
208
+ | `showProfile` | `boolean` | `true` | Show the Profile menu item |
209
+ | `onProfileError` | `(error: string) => void` | - | Callback when profile update fails |
210
+
211
+ ### `<UserProfileModal />`
212
+
213
+ Modal for viewing and editing user profile information:
214
+
215
+ ```tsx
216
+ import { useState } from 'react';
217
+ import { UserProfileModal } from '@insforge/react';
218
+
219
+ function ProfileButton() {
220
+ const [showModal, setShowModal] = useState(false);
221
+
222
+ return (
223
+ <>
224
+ <button onClick={() => setShowModal(true)}>Edit Profile</button>
225
+
226
+ {showModal && (
227
+ <UserProfileModal
228
+ onClose={() => setShowModal(false)}
229
+ onError={(error) => console.error('Profile error:', error)}
230
+ />
231
+ )}
232
+ </>
233
+ );
234
+ }
235
+ ```
236
+
237
+ **Key Features:**
238
+
239
+ - Displays user avatar, email, and name
240
+ - Edit mode for updating name
241
+ - Avatar fallback to initials
242
+ - Keyboard support (Escape to close)
243
+ - Portal rendering for proper z-index handling
244
+
245
+ **Props:**
246
+
247
+ | Prop | Type | Description |
248
+ |------|------|-------------|
249
+ | `onClose` | `() => void` | Called when modal is closed |
250
+ | `onError` | `(error: string) => void` | Called when an error occurs |
251
+
252
+ ### `<SignInButton />` / `<SignUpButton />`
253
+
254
+ Simple buttons that redirect to hosted auth pages:
255
+
256
+ ```tsx
257
+ import { SignInButton, SignUpButton } from '@insforge/react';
258
+
259
+ function LandingPage() {
260
+ return (
261
+ <div>
262
+ {/* Default button */}
263
+ <SignInButton />
264
+ <SignUpButton />
265
+
266
+ {/* Custom styled button */}
267
+ <SignInButton>
268
+ <button className="my-custom-button">Login</button>
269
+ </SignInButton>
270
+ </div>
271
+ );
272
+ }
273
+ ```
274
+
275
+ **Props:**
276
+
277
+ | Prop | Type | Description |
278
+ |------|------|-------------|
279
+ | `children` | `ReactNode` | Custom button element (wraps with click handler) |
280
+ | `className` | `string` | CSS class for default button |
281
+
282
+ ### `<SignOutButton />`
283
+
284
+ Simple button that signs out the current user:
285
+
286
+ ```tsx
287
+ import { SignOutButton } from '@insforge/react';
288
+
289
+ function Header() {
290
+ return (
291
+ <SignOutButton afterSignOutUrl="/goodbye">
292
+ <button className="logout-btn">Logout</button>
293
+ </SignOutButton>
294
+ );
295
+ }
296
+ ```
297
+
298
+ **Props:**
299
+
300
+ | Prop | Type | Default | Description |
301
+ |------|------|---------|-------------|
302
+ | `children` | `ReactNode` | - | Custom button element |
303
+ | `className` | `string` | - | CSS class for default button |
304
+ | `afterSignOutUrl` | `string` | `"/"` | Redirect URL after sign out |
305
+
306
+ ### `<ForgotPassword />`
307
+
308
+ Complete password reset flow with automatic method detection:
309
+
310
+ ```tsx
311
+ import { ForgotPassword } from '@insforge/react';
312
+
313
+ function ForgotPasswordPage() {
314
+ return (
315
+ <ForgotPassword
316
+ onError={(error) => console.error('Error:', error)}
317
+ />
318
+ );
319
+ }
320
+ ```
321
+
322
+ **Key Features:**
323
+
324
+ - Auto-detects reset method (code or link) from backend config
325
+ - **Link method**: Sends email with reset link
326
+ - **Code method**: Three-step flow (email → verify code → reset password)
327
+ - 60-second countdown timer for resend
328
+ - Built-in form validation
329
+
330
+ **Props:**
331
+
332
+ | Prop | Type | Description |
333
+ |------|------|-------------|
334
+ | `onError` | `(error: Error) => void` | Callback on error |
335
+
336
+ ### `<ResetPassword />`
337
+
338
+ Password reset form that reads the token from URL automatically:
339
+
340
+ ```tsx
341
+ import { ResetPassword } from '@insforge/react';
342
+
343
+ // Used at /reset-password?token=xxxxx
344
+ function ResetPasswordPage() {
345
+ return (
346
+ <ResetPassword
347
+ onError={(error) => console.error('Error:', error)}
348
+ />
349
+ );
350
+ }
351
+ ```
352
+
353
+ **Key Features:**
354
+
355
+ - Automatically reads reset token from URL (`?token=xxx`)
356
+ - Password confirmation validation
357
+ - Password strength validation based on backend config
358
+ - Success state with completion message
359
+ - Error handling for invalid/missing tokens
360
+
361
+ **Props:**
362
+
363
+ | Prop | Type | Description |
364
+ |------|------|-------------|
365
+ | `title` | `string` | Custom title text |
366
+ | `subtitle` | `string` | Custom subtitle text |
367
+ | `newPasswordLabel` | `string` | Label for new password input |
368
+ | `newPasswordPlaceholder` | `string` | Placeholder for new password |
369
+ | `confirmPasswordLabel` | `string` | Label for confirm password input |
370
+ | `confirmPasswordPlaceholder` | `string` | Placeholder for confirm password |
371
+ | `submitButtonText` | `string` | Text for submit button |
372
+ | `loadingButtonText` | `string` | Text while loading |
373
+ | `onError` | `(error: Error) => void` | Callback on error |
374
+
375
+ ### `<VerifyEmail />`
376
+
377
+ Email verification component with automatic token handling:
378
+
379
+ ```tsx
380
+ import { VerifyEmail } from '@insforge/react';
381
+
382
+ function VerifyEmailPage() {
383
+ const token = new URLSearchParams(window.location.search).get('token');
384
+
385
+ return (
386
+ <VerifyEmail
387
+ token={token || ''}
388
+ onSuccess={(data) => {
389
+ console.log('Email verified!', data);
390
+ // Navigate to dashboard or close window
391
+ }}
392
+ onError={(error) => console.error('Verification failed:', error)}
393
+ />
394
+ );
395
+ }
396
+ ```
397
+
398
+ **Key Features:**
399
+
400
+ - Automatic verification on mount
401
+ - Loading, success, and error states
402
+ - Customizable status messages
403
+
404
+ **Props:**
405
+
406
+ | Prop | Type | Description |
407
+ |------|------|-------------|
408
+ | `token` | `string` | Verification token from URL |
409
+ | `verifyingTitle` | `string` | Title shown while verifying |
410
+ | `successTitle` | `string` | Title shown on success |
411
+ | `successMessage` | `string` | Message shown on success |
412
+ | `errorTitle` | `string` | Title shown on error |
413
+ | `onSuccess` | `(data) => void` | Callback on successful verification |
414
+ | `onError` | `(error: Error) => void` | Callback on error |
415
+
416
+ ### `<Protect />`
417
+
418
+ Protected content with conditional rendering:
419
+
420
+ ```tsx
421
+ import { Protect } from '@insforge/react';
422
+
423
+ function Dashboard() {
424
+ return (
425
+ <div>
426
+ <h1>Dashboard</h1>
427
+ {/* Simple protection */}
428
+ <Protect redirectTo="/sign-in">
429
+ <UserContent />
430
+ </Protect>
431
+ {/* Custom logic */}
432
+ <Protect condition={(user) => user.subscription === 'premium'} fallback={<UpgradePrompt />}>
433
+ <PremiumFeature />
434
+ </Protect>
435
+ </div>
436
+ );
437
+ }
438
+ ```
439
+
440
+ **Props:**
441
+
442
+ - `redirectTo` - URL to redirect if not authorized
443
+ - `condition` - Custom condition function `(user) => boolean`
444
+ - `fallback` - React node to show if not authorized
445
+
446
+ ### `<SignedIn>` / `<SignedOut>`
447
+
448
+ Conditional rendering based on auth state:
449
+
450
+ ```tsx
451
+ import { SignedIn, SignedOut } from '@insforge/react';
452
+
453
+ function NavBar() {
454
+ return (
455
+ <nav>
456
+ <SignedOut>
457
+ <a href="/sign-in">Sign In</a>
458
+ <a href="/sign-up">Sign Up</a>
459
+ </SignedOut>
460
+
461
+ <SignedIn>
462
+ <a href="/dashboard">Dashboard</a>
463
+ <UserButton />
464
+ </SignedIn>
465
+ </nav>
466
+ );
467
+ }
468
+ ```
469
+
470
+ ---
471
+
472
+ ## Hooks
473
+
474
+ ### `useAuth()`
475
+
476
+ Access authentication methods and state. This is an alias for `useInsforge()`.
477
+
478
+ ```tsx
479
+ import { useAuth } from '@insforge/react';
480
+
481
+ function LoginButton() {
482
+ const { signIn, signUp, signOut, isSignedIn, isLoaded } = useAuth();
483
+
484
+ const handleSignIn = async () => {
485
+ const result = await signIn('user@example.com', 'password');
486
+ if ('error' in result) {
487
+ console.error('Sign in failed:', result.error);
488
+ }
489
+ };
490
+
491
+ if (!isLoaded) return <div>Loading...</div>;
492
+
493
+ return (
494
+ <button onClick={isSignedIn ? signOut : handleSignIn}>
495
+ {isSignedIn ? 'Sign Out' : 'Sign In'}
496
+ </button>
497
+ );
498
+ }
499
+ ```
500
+
501
+ **Returns:**
502
+
503
+ | Property/Method | Type | Description |
504
+ |-----------------|------|-------------|
505
+ | `isLoaded` | `boolean` | Whether auth state has been initialized |
506
+ | `isSignedIn` | `boolean` | Whether user is currently signed in |
507
+ | `signIn(email, password)` | `Promise` | Sign in with email/password |
508
+ | `signUp(email, password)` | `Promise` | Register new user |
509
+ | `signOut()` | `Promise<void>` | Sign out current user |
510
+
511
+ ### `useInsforge()`
512
+
513
+ Full access to all authentication methods and context. Use this when you need advanced features like OAuth or email verification.
514
+
515
+ ```tsx
516
+ import { useInsforge } from '@insforge/react';
517
+
518
+ function CustomAuthFlow() {
519
+ const {
520
+ // State
521
+ user,
522
+ isLoaded,
523
+ isSignedIn,
524
+
525
+ // Core auth
526
+ signIn,
527
+ signUp,
528
+ signOut,
529
+
530
+ // User management
531
+ updateUser,
532
+ reloadAuth,
533
+
534
+ // Email verification
535
+ resendVerificationEmail,
536
+ verifyEmail,
537
+
538
+ // Password reset
539
+ sendResetPasswordEmail,
540
+ resetPassword,
541
+ exchangeResetPasswordToken,
542
+
543
+ // OAuth
544
+ loginWithOAuth,
545
+
546
+ // Config
547
+ getPublicAuthConfig,
548
+ baseUrl,
549
+ afterSignInUrl,
550
+ } = useInsforge();
551
+
552
+ // Example: OAuth login
553
+ const handleGoogleLogin = () => {
554
+ loginWithOAuth('google', '/dashboard');
555
+ };
556
+
557
+ // Example: Send password reset email
558
+ const handleForgotPassword = async (email: string) => {
559
+ const result = await sendResetPasswordEmail(email);
560
+ if (result?.message) {
561
+ console.log('Reset email sent!');
562
+ }
563
+ };
564
+
565
+ return <div>...</div>;
566
+ }
567
+ ```
568
+
569
+ **Full API Reference:**
570
+
571
+ | Property/Method | Type | Description |
572
+ |-----------------|------|-------------|
573
+ | `user` | `InsforgeUser \| null` | Current user object |
574
+ | `userId` | `string \| null` | Current user ID |
575
+ | `isLoaded` | `boolean` | Auth state initialized |
576
+ | `isSignedIn` | `boolean` | User is signed in |
577
+ | `signIn(email, password)` | `Promise` | Sign in with credentials |
578
+ | `signUp(email, password)` | `Promise` | Register new user |
579
+ | `signOut()` | `Promise<void>` | Sign out user |
580
+ | `updateUser(profile)` | `Promise` | Update user profile |
581
+ | `reloadAuth()` | `Promise` | Refresh auth state from backend |
582
+ | `resendVerificationEmail(email)` | `Promise` | Resend email verification link or otp |
583
+ | `verifyEmail(otp, email?)` | `Promise` | Verify email with OTP code |
584
+ | `sendResetPasswordEmail(email)` | `Promise` | Send password reset email |
585
+ | `resetPassword(token, newPassword)` | `Promise` | Reset password with token |
586
+ | `exchangeResetPasswordToken(email, code)` | `Promise` | Exchange reset code for token |
587
+ | `loginWithOAuth(provider, redirectTo)` | `Promise<void>` | Start OAuth flow |
588
+ | `getPublicAuthConfig()` | `Promise` | Get auth configuration |
589
+ | `baseUrl` | `string` | InsForge backend URL |
590
+ | `afterSignInUrl` | `string` | Default redirect after sign in |
591
+
592
+ ### `useUser()`
593
+
594
+ Access current user data and update profile:
595
+
596
+ ```tsx
597
+ import { useUser } from '@insforge/react';
598
+
599
+ function UserProfile() {
600
+ const { user, isLoaded, updateUser } = useUser();
601
+
602
+ if (!isLoaded) return <div>Loading...</div>;
603
+ if (!user) return <div>Not signed in</div>;
604
+
605
+ const handleUpdate = async () => {
606
+ const result = await updateUser({ name: 'New Name' });
607
+ if (result?.error) {
608
+ console.error('Update failed:', result.error);
609
+ }
610
+ };
611
+
612
+ return (
613
+ <div>
614
+ <p>Email: {user.email}</p>
615
+ <p>Name: {user.profile.name}</p>
616
+ <img src={user.profile.avatar_url} alt="Avatar" />
617
+ <button onClick={handleUpdate}>Update Name</button>
618
+ </div>
619
+ );
620
+ }
621
+ ```
622
+
623
+ **Returns:**
624
+
625
+ | Property/Method | Type | Description |
626
+ |-----------------|------|-------------|
627
+ | `user` | `InsforgeUser \| null` | User object with id, email, profile |
628
+ | `user.profile` | `object` | Profile with name, avatar_url, and custom fields |
629
+ | `isLoaded` | `boolean` | Whether auth state is loaded |
630
+ | `updateUser(profile)` | `Promise` | Update user profile data |
631
+
632
+ ### `usePublicAuthConfig()`
633
+
634
+ Get your authentication configuration from InsForge backend:
635
+
636
+ ```tsx
637
+ import { usePublicAuthConfig } from '@insforge/react';
638
+
639
+ function CustomSignIn() {
640
+ const { authConfig } = usePublicAuthConfig();
641
+
642
+ return (
643
+ <div>
644
+ <p>Available OAuth: {authConfig?.oAuthProviders?.join(', ')}</p>
645
+ <p>Password min length: {authConfig?.passwordMinLength}</p>
646
+ <p>Require uppercase: {authConfig?.requireUppercase ? 'Yes' : 'No'}</p>
647
+ </div>
648
+ );
649
+ }
650
+ ```
651
+
652
+ **Returns:**
653
+
654
+ | Property | Type | Description |
655
+ |----------|------|-------------|
656
+ | `authConfig` | `object \| null` | Auth configuration from dashboard |
657
+ | `authConfig.oAuthProviders` | `["google", "github", "discord", "linkedin", "facebook", "instagram", "tiktok", "apple", "x", "spotify", "microsoft"]` | Enabled OAuth providers |
658
+ | `authConfig.passwordMinLength` | `number` | Minimum password length |
659
+ | `authConfig.requireUppercase` | `boolean` | Require uppercase letter |
660
+ | `authConfig.requireLowercase` | `boolean` | Require lowercase letter |
661
+ | `authConfig.requireNumber` | `boolean` | Require number |
662
+ | `authConfig.requireSpecialChar` | `boolean` | Require special character |
663
+
664
+ <Warning>
665
+ **Performance**: Only use this hook in SignIn/SignUp components. Using it elsewhere causes unnecessary API calls on every page load.
666
+ </Warning>
667
+
668
+ ---
669
+
670
+ ## Advanced Features
671
+
672
+ ### InsforgeProvider Props
673
+
674
+ The provider accepts several optional props for advanced use cases:
675
+
676
+ ```tsx
677
+ <InsforgeProvider
678
+ client={insforge}
679
+ afterSignInUrl="/dashboard"
680
+ onAuthChange={(user) => {
681
+ if (user) {
682
+ console.log('User signed in:', user.email);
683
+ analytics.identify(user.id);
684
+ } else {
685
+ console.log('User signed out');
686
+ analytics.reset();
687
+ }
688
+ }}
689
+ onSignIn={async (authToken, user) => {
690
+ // Sync token to cookies for SSR (Next.js)
691
+ await fetch('/api/auth/sync', {
692
+ method: 'POST',
693
+ body: JSON.stringify({ token: authToken }),
694
+ });
695
+ }}
696
+ onSignOut={async () => {
697
+ // Clear server-side session
698
+ await fetch('/api/auth/logout', { method: 'POST' });
699
+ }}
700
+ >
701
+ {children}
702
+ </InsforgeProvider>
703
+ ```
704
+
705
+ **Props:**
706
+
707
+ | Prop | Type | Default | Description |
708
+ |------|------|---------|-------------|
709
+ | `client` | `InsForgeClient` | **required** | SDK client instance |
710
+ | `afterSignInUrl` | `string` | `"/"` | Default redirect URL after sign in |
711
+ | `onAuthChange` | `(user: InsforgeUser \| null) => void` | - | Callback when auth state changes |
712
+ | `onSignIn` | `(authToken: string, user: InsforgeUser) => Promise<void>` | - | Custom handler after sign-in (e.g., cookie sync) |
713
+ | `onSignOut` | `() => Promise<void>` | - | Custom handler after sign-out |
714
+ | `onRefresh` | `(authToken: string, user: InsforgeUser) => Promise<void>` | - | Custom handler after token refresh |
715
+
716
+ ### Text Customization
717
+
718
+ All complete components support full text customization:
719
+
720
+ ```tsx
721
+ <SignIn
722
+ title="Welcome Back!"
723
+ subtitle="We're happy to see you again"
724
+ emailLabel="Your Email Address"
725
+ emailPlaceholder="you@company.com"
726
+ passwordLabel="Your Password"
727
+ submitButtonText="Login Now"
728
+ loadingButtonText="Signing you in..."
729
+ signUpText="New to our platform?"
730
+ signUpLinkText="Create an account"
731
+ dividerText="or continue with"
732
+ />
733
+ ```