insforge 1.3.0 → 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 (269) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/auth/package.json +5 -3
  3. package/auth/src/lib/broadcastService.ts +115 -117
  4. package/auth/src/lib/insforge.ts +8 -0
  5. package/auth/src/main.tsx +2 -4
  6. package/auth/src/pages/SignInPage.tsx +60 -60
  7. package/auth/src/pages/SignUpPage.tsx +60 -60
  8. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  9. package/auth/tsconfig.json +2 -1
  10. package/backend/package.json +10 -6
  11. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  12. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  13. package/backend/src/api/routes/auth/index.routes.ts +85 -32
  14. package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
  15. package/backend/src/api/routes/database/index.routes.ts +2 -0
  16. package/backend/src/api/routes/database/records.routes.ts +39 -175
  17. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  18. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  19. package/backend/src/api/routes/docs/index.routes.ts +3 -2
  20. package/backend/src/api/routes/email/index.routes.ts +35 -35
  21. package/backend/src/api/routes/functions/index.routes.ts +3 -3
  22. package/backend/src/api/routes/metadata/index.routes.ts +26 -0
  23. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  24. package/backend/src/infra/database/database.manager.ts +0 -10
  25. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  26. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  27. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  28. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  29. package/backend/src/infra/security/token.manager.ts +1 -4
  30. package/backend/src/providers/ai/openrouter.provider.ts +12 -3
  31. package/backend/src/providers/database/base.provider.ts +39 -0
  32. package/backend/src/providers/database/cloud.provider.ts +159 -0
  33. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  34. package/backend/src/server.ts +19 -7
  35. package/backend/src/services/ai/ai-config.service.ts +6 -6
  36. package/backend/src/services/ai/ai-model.service.ts +60 -60
  37. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  38. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  39. package/backend/src/services/ai/helpers.ts +64 -64
  40. package/backend/src/services/ai/index.ts +13 -13
  41. package/backend/src/services/auth/auth-config.service.ts +4 -4
  42. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  43. package/backend/src/services/auth/auth.service.ts +134 -74
  44. package/backend/src/services/auth/index.ts +4 -4
  45. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  46. package/backend/src/services/database/database-advance.service.ts +19 -55
  47. package/backend/src/services/database/database-table.service.ts +38 -85
  48. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  49. package/backend/src/services/deployments/deployment.service.ts +693 -0
  50. package/backend/src/services/functions/function.service.ts +61 -41
  51. package/backend/src/services/logs/audit.service.ts +10 -10
  52. package/backend/src/services/secrets/secret.service.ts +101 -27
  53. package/backend/src/services/storage/storage.service.ts +30 -30
  54. package/backend/src/services/usage/usage.service.ts +6 -6
  55. package/backend/src/types/ai.ts +8 -0
  56. package/backend/src/types/auth.ts +5 -1
  57. package/backend/src/types/database.ts +2 -0
  58. package/backend/src/types/deployments.ts +33 -0
  59. package/backend/src/types/storage.ts +1 -1
  60. package/backend/src/types/webhooks.ts +45 -0
  61. package/backend/src/utils/cookies.ts +34 -35
  62. package/backend/src/utils/environment.ts +0 -14
  63. package/backend/src/utils/s3-config-loader.ts +64 -64
  64. package/backend/src/utils/seed.ts +334 -301
  65. package/backend/src/utils/sql-parser.ts +126 -0
  66. package/backend/src/utils/utils.ts +114 -114
  67. package/backend/src/utils/validations.ts +10 -10
  68. package/backend/tests/local/test-rpc.sh +141 -0
  69. package/backend/tests/local/test-secrets.sh +1 -1
  70. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  71. package/backend/tests/manual/test-rawsql-modes.sh +24 -24
  72. package/backend/tests/unit/database-advance.test.ts +326 -0
  73. package/backend/tests/unit/helpers.test.ts +2 -2
  74. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
  75. package/docker-compose.prod.yml +1 -1
  76. package/docker-compose.yml +1 -1
  77. package/docs/agent-docs/deployment.md +79 -0
  78. package/docs/changelog.mdx +165 -72
  79. package/docs/core-concepts/ai/architecture.mdx +1 -23
  80. package/docs/core-concepts/ai/sdk.mdx +26 -1
  81. package/docs/core-concepts/authentication/architecture.mdx +6 -8
  82. package/docs/core-concepts/authentication/sdk.mdx +387 -91
  83. package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
  84. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
  85. package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
  86. package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
  87. package/docs/core-concepts/database/architecture.mdx +58 -21
  88. package/docs/core-concepts/database/pgvector.mdx +138 -0
  89. package/docs/core-concepts/database/sdk.mdx +17 -17
  90. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  91. package/docs/core-concepts/email/architecture.mdx +4 -2
  92. package/docs/core-concepts/functions/architecture.mdx +1 -1
  93. package/docs/core-concepts/functions/sdk.mdx +0 -1
  94. package/docs/core-concepts/realtime/architecture.mdx +1 -1
  95. package/docs/core-concepts/storage/architecture.mdx +1 -1
  96. package/docs/core-concepts/storage/sdk.mdx +25 -25
  97. package/docs/docs.json +14 -6
  98. package/docs/favicon.png +0 -0
  99. package/docs/favicon.svg +3 -18
  100. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  101. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  102. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  103. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  104. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  105. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  106. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  107. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  108. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  109. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  110. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  111. package/docs/images/mcp-setup/cline-1.png +0 -0
  112. package/docs/images/mcp-setup/cline-2.png +0 -0
  113. package/docs/images/mcp-setup/cline-3.png +0 -0
  114. package/docs/images/mcp-setup/connect-project.png +0 -0
  115. package/docs/images/mcp-setup/copilot-1.png +0 -0
  116. package/docs/images/mcp-setup/copilot-2.png +0 -0
  117. package/docs/images/mcp-setup/copilot-3.png +0 -0
  118. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  119. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  120. package/docs/images/mcp-setup/qoder-1.png +0 -0
  121. package/docs/images/mcp-setup/qoder-2.png +0 -0
  122. package/docs/images/mcp-setup/roocode-1.png +0 -0
  123. package/docs/images/mcp-setup/roocode-2.png +0 -0
  124. package/docs/images/mcp-setup/trae-1.png +0 -0
  125. package/docs/images/mcp-setup/trae-2.png +0 -0
  126. package/docs/images/mcp-setup/trae-3.png +0 -0
  127. package/docs/images/mcp-setup/trae-4.png +0 -0
  128. package/docs/images/mcp-setup/trae-5.png +0 -0
  129. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  130. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  131. package/docs/insforge-instructions-sdk.md +7 -3
  132. package/docs/introduction.mdx +9 -8
  133. package/docs/mcp-setup.mdx +332 -0
  134. package/docs/oauth-server.mdx +563 -0
  135. package/docs/partnership.mdx +79 -10
  136. package/docs/quickstart.mdx +1 -1
  137. package/docs/vscode-extension.mdx +74 -0
  138. package/eslint.config.js +1 -0
  139. package/examples/response-examples.md +1 -1
  140. package/frontend/package.json +1 -1
  141. package/frontend/src/App.tsx +8 -3
  142. package/frontend/src/assets/logos/antigravity.svg +1 -0
  143. package/frontend/src/assets/logos/copilot.svg +10 -0
  144. package/frontend/src/assets/logos/deepseek.svg +139 -0
  145. package/frontend/src/assets/logos/kiro.svg +9 -0
  146. package/frontend/src/assets/logos/qoder.svg +4 -0
  147. package/frontend/src/assets/logos/qwen.svg +15 -0
  148. package/frontend/src/components/CodeBlock.tsx +2 -2
  149. package/frontend/src/components/ConnectCTA.tsx +3 -2
  150. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  151. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  152. package/frontend/src/components/datagrid/index.ts +1 -1
  153. package/frontend/src/components/index.ts +0 -1
  154. package/frontend/src/components/layout/AppHeader.tsx +4 -27
  155. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  156. package/frontend/src/components/layout/Layout.tsx +34 -32
  157. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  158. package/frontend/src/components/radix/Select.tsx +151 -151
  159. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  160. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  161. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  162. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  163. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  164. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  165. package/frontend/src/features/ai/components/index.ts +6 -6
  166. package/frontend/src/features/ai/helpers.ts +147 -141
  167. package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
  168. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  169. package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
  170. package/frontend/src/features/auth/components/index.ts +5 -5
  171. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
  172. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
  173. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  174. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  175. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  176. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  177. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  178. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  179. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  180. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  181. package/frontend/src/features/database/constants.ts +16 -28
  182. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  183. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  184. package/frontend/src/features/database/hooks/useTables.ts +5 -7
  185. package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
  186. package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
  187. package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
  188. package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
  189. package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
  190. package/frontend/src/features/database/services/advance.service.ts +1 -15
  191. package/frontend/src/features/database/services/record.service.ts +4 -20
  192. package/frontend/src/features/database/services/table.service.ts +1 -4
  193. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  194. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  195. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  196. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  197. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  198. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  199. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  200. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  201. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  202. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  203. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  204. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  205. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  206. package/frontend/src/features/functions/components/index.ts +5 -5
  207. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  208. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  209. package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
  210. package/frontend/src/features/functions/services/function.service.ts +8 -25
  211. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  212. package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
  213. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  214. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  215. package/frontend/src/features/logs/components/index.ts +1 -0
  216. package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
  217. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  218. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  219. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  220. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  221. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  222. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  223. package/frontend/src/features/onboard/components/index.ts +9 -4
  224. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  225. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  226. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  227. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  228. package/frontend/src/features/onboard/index.ts +17 -13
  229. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  230. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  231. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
  232. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
  233. package/frontend/src/index.css +249 -249
  234. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  235. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  236. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  237. package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
  238. package/frontend/src/lib/services/metadata.service.ts +20 -3
  239. package/frontend/src/lib/utils/menuItems.ts +223 -207
  240. package/frontend/src/lib/utils/utils.ts +196 -196
  241. package/functions/server.ts +315 -315
  242. package/functions/worker-template.js +1 -1
  243. package/openapi/ai.yaml +115 -5
  244. package/openapi/auth.yaml +97 -17
  245. package/openapi/logs.yaml +0 -2
  246. package/openapi/metadata.yaml +0 -2
  247. package/openapi/records.yaml +21 -21
  248. package/openapi/tables.yaml +1 -2
  249. package/package.json +1 -1
  250. package/shared-schemas/package.json +1 -1
  251. package/shared-schemas/src/ai-api.schema.ts +251 -143
  252. package/shared-schemas/src/ai.schema.ts +63 -63
  253. package/shared-schemas/src/auth-api.schema.ts +34 -6
  254. package/shared-schemas/src/auth.schema.ts +17 -10
  255. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  256. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  257. package/shared-schemas/src/deployments.schema.ts +30 -0
  258. package/shared-schemas/src/docs.schema.ts +8 -2
  259. package/shared-schemas/src/email-api.schema.ts +30 -30
  260. package/shared-schemas/src/functions-api.schema.ts +13 -4
  261. package/shared-schemas/src/functions.schema.ts +1 -1
  262. package/shared-schemas/src/index.ts +22 -18
  263. package/shared-schemas/src/metadata.schema.ts +30 -4
  264. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  265. package/shared-schemas/src/secrets.schema.ts +15 -0
  266. package/zeabur/README.md +13 -0
  267. package/zeabur/template.yml +20 -51
  268. package/backend/src/types/profile.ts +0 -55
  269. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
@@ -16,27 +16,45 @@ Create a new user account with email and password.
16
16
  - `email` (string, required) - User's email address
17
17
  - `password` (string, required) - User's password
18
18
  - `name` (string, optional) - User's display name
19
+ - `options` (object, optional) - Additional options
20
+ - `emailRedirectTo` (string, optional) - Custom URL to redirect to after email verification. It's a fallback if you didn't set default redirect URL configured in your dashboard.
19
21
 
20
22
  ### Returns
21
23
 
22
24
  ```typescript
23
25
  {
24
26
  data: {
25
- user: { id, email, name, emailVerified, createdAt, updatedAt },
26
- accessToken: string
27
+ user?: { id, email, emailVerified, providers, createdAt, updatedAt, profile, metadata },
28
+ accessToken: string | null,
29
+ requireEmailVerification?: boolean,
30
+ redirectTo?: string,
31
+ csrfToken?: string | null
27
32
  } | null,
28
33
  error: Error | null
29
34
  }
30
35
  ```
31
36
 
37
+ <Note>
38
+ When `requireEmailVerification` is true, `accessToken` will be null until the user verifies their email. InsForge sends a verification email with either a link or a 6-digit code, based on your dashboard configuration (`verifyEmailMethod`). For code verification, implement a page that prompts the user to enter the code (see [verifyEmail()](#verifyemail)). For link verification, redirect users to the sign-in page—the insforge backend handles verification automatically when the link is clicked.
39
+ </Note>
40
+
32
41
  ### Example
33
42
 
34
43
  ```javascript
35
44
  const { data, error } = await insforge.auth.signUp({
36
45
  email: 'user@example.com',
37
46
  password: 'secure_password123',
38
- name: 'John Doe'
39
- })
47
+ name: 'John Doe',
48
+ });
49
+
50
+ if (data?.requireEmailVerification) {
51
+ // For code verification: redirect to page where user enters the 6-digit code
52
+ // For link verification: redirect to sign-in page to await email link click
53
+ console.log('Please verify your email');
54
+ } else if (data?.accessToken) {
55
+ // User is signed in (email verification disabled)
56
+ console.log('Welcome!', data.user.email);
57
+ }
40
58
  ```
41
59
 
42
60
  ### Output
@@ -47,12 +65,20 @@ const { data, error } = await insforge.auth.signUp({
47
65
  "user": {
48
66
  "id": "usr_abc123",
49
67
  "email": "user@example.com",
50
- "name": "John Doe",
51
68
  "emailVerified": false,
69
+ "providers": ["email"],
52
70
  "createdAt": "2024-01-15T10:00:00Z",
53
- "updatedAt": "2024-01-15T10:00:00Z"
71
+ "updatedAt": "2024-01-15T10:00:00Z",
72
+ "profile": {
73
+ "name": "John Doe",
74
+ "avatar_url": null
75
+ },
76
+ "metadata": {}
54
77
  },
55
- "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
78
+ "requireEmailVerification": true,
79
+ "accessToken": null,
80
+ "redirectTo": "https://app.example.com/verify-email",
81
+ "csrfToken": null
56
82
  },
57
83
  "error": null
58
84
  }
@@ -74,8 +100,10 @@ Sign in an existing user with email and password.
74
100
  ```typescript
75
101
  {
76
102
  data: {
77
- user: { id, email, name, emailVerified, createdAt, updatedAt },
78
- accessToken: string
103
+ user: { id, email, emailVerified, providers, createdAt, updatedAt, profile, metadata },
104
+ accessToken: string,
105
+ redirectTo?: string,
106
+ csrfToken?: string | null
79
107
  } | null,
80
108
  error: Error | null
81
109
  }
@@ -86,8 +114,16 @@ Sign in an existing user with email and password.
86
114
  ```javascript
87
115
  const { data, error } = await insforge.auth.signInWithPassword({
88
116
  email: 'user@example.com',
89
- password: 'secure_password123'
90
- })
117
+ password: 'secure_password123',
118
+ });
119
+
120
+ if (data) {
121
+ console.log('Signed in as:', data.user.email);
122
+ // Optional: redirect to configured URL
123
+ if (data.redirectTo) {
124
+ window.location.href = data.redirectTo;
125
+ }
126
+ }
91
127
  ```
92
128
 
93
129
  ### Output
@@ -98,12 +134,19 @@ const { data, error } = await insforge.auth.signInWithPassword({
98
134
  "user": {
99
135
  "id": "usr_abc123",
100
136
  "email": "user@example.com",
101
- "name": "John Doe",
102
137
  "emailVerified": true,
138
+ "providers": ["email"],
103
139
  "createdAt": "2024-01-15T10:00:00Z",
104
- "updatedAt": "2024-01-15T10:00:00Z"
140
+ "updatedAt": "2024-01-15T10:00:00Z",
141
+ "profile": {
142
+ "name": "John Doe",
143
+ "avatar_url": "https://example.com/avatar.jpg"
144
+ },
145
+ "metadata": {}
105
146
  },
106
- "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
147
+ "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
148
+ "redirectTo": "https://app.example.com/dashboard",
149
+ "csrfToken": "5758d38259fb..."
107
150
  },
108
151
  "error": null
109
152
  }
@@ -131,7 +174,8 @@ Start OAuth authentication flow with supported providers (Google, GitHub, Micros
131
174
  ```
132
175
 
133
176
  <Note>
134
- After OAuth redirect, SDK automatically detects callback parameters and saves session. No manual handling needed.
177
+ After OAuth redirect, SDK automatically detects callback parameters and saves session. No manual
178
+ handling needed.
135
179
  </Note>
136
180
 
137
181
  ### Example
@@ -140,17 +184,17 @@ After OAuth redirect, SDK automatically detects callback parameters and saves se
140
184
  // Default: auto-redirect
141
185
  await insforge.auth.signInWithOAuth({
142
186
  provider: 'google',
143
- redirectTo: 'http://localhost:3000/dashboard'
144
- })
187
+ redirectTo: 'http://localhost:3000/dashboard',
188
+ });
145
189
  // Browser immediately redirects to Google
146
190
 
147
191
  // skipBrowserRedirect: get URL for manual handling
148
192
  const { data } = await insforge.auth.signInWithOAuth({
149
193
  provider: 'google',
150
- skipBrowserRedirect: true
151
- })
194
+ skipBrowserRedirect: true,
195
+ });
152
196
 
153
- window.location.href = data.url // Redirect when ready
197
+ window.location.href = data.url; // Redirect when ready
154
198
  ```
155
199
 
156
200
  ### Output
@@ -179,14 +223,14 @@ None
179
223
 
180
224
  ```typescript
181
225
  {
182
- error: Error | null
226
+ error: Error | null;
183
227
  }
184
228
  ```
185
229
 
186
230
  ### Example
187
231
 
188
232
  ```javascript
189
- const { error } = await insforge.auth.signOut()
233
+ const { error } = await insforge.auth.signOut();
190
234
  ```
191
235
 
192
236
  ### Output
@@ -199,9 +243,9 @@ const { error } = await insforge.auth.signOut()
199
243
 
200
244
  ---
201
245
 
202
- ## getCurrentUser()
246
+ ## getCurrentSession()
203
247
 
204
- Get authenticated user with profile data from users table.
248
+ Get the current session. If no active session exists, attempts to refresh using the httpOnly cookie. Call this on app initialization to restore user sessions automatically.
205
249
 
206
250
  ### Parameters
207
251
 
@@ -212,8 +256,80 @@ None
212
256
  ```typescript
213
257
  {
214
258
  data: {
215
- user: { id, email, role },
216
- profile: { id, nickname, avatar_url, bio, birthday, ... }
259
+ session: {
260
+ accessToken: string,
261
+ user: { id, email, emailVerified, providers, createdAt, updatedAt, profile, metadata },
262
+ expiresAt?: Date
263
+ } | null
264
+ },
265
+ error: Error | null
266
+ }
267
+ ```
268
+
269
+ ### Example
270
+
271
+ ```javascript
272
+ const { data, error } = await insforge.auth.getCurrentSession();
273
+
274
+ if (data.session) {
275
+ console.log('Token:', data.session.accessToken);
276
+ console.log('User:', data.session.user.email);
277
+
278
+ // Check if session is expired
279
+ if (data.session.expiresAt && new Date() > data.session.expiresAt) {
280
+ console.log('Session expired');
281
+ }
282
+ }
283
+ ```
284
+
285
+ ### Output
286
+
287
+ ```json
288
+ {
289
+ "data": {
290
+ "session": {
291
+ "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
292
+ "expiresAt": "2024-01-22T10:00:00.000Z",
293
+ "user": {
294
+ "id": "usr_abc123",
295
+ "email": "user@example.com",
296
+ "emailVerified": true,
297
+ "createdAt": "2024-01-15T10:00:00Z",
298
+ "updatedAt": "2024-01-15T10:00:00Z",
299
+ "providers": ["email"],
300
+ "profile": {
301
+ "name": "John Doe",
302
+ "avatar_url": "https://example.com/avatar.jpg"
303
+ },
304
+ "metadata": {}
305
+ }
306
+ }
307
+ },
308
+ "error": null
309
+ }
310
+ ```
311
+
312
+ ---
313
+
314
+ ## getProfile()
315
+
316
+ Get any user's public profile by ID. Returns a flat profile object with all fields at the top level.
317
+
318
+ ### Parameters
319
+
320
+ - `userId` (string, required) - User ID to fetch profile for
321
+
322
+ ### Returns
323
+
324
+ ```typescript
325
+ {
326
+ data: {
327
+ id: string,
328
+ name?: string,
329
+ avatar_url?: string,
330
+ createdAt?: string,
331
+ updatedAt?: string,
332
+ ...customFields
217
333
  } | null,
218
334
  error: Error | null
219
335
  }
@@ -222,31 +338,198 @@ None
222
338
  ### Example
223
339
 
224
340
  ```javascript
225
- const { data, error } = await insforge.auth.getCurrentUser()
341
+ const { data, error } = await insforge.auth.getProfile('usr_xyz789');
226
342
 
227
343
  if (data) {
228
- console.log(data.user.email) // Auth info
229
- console.log(data.profile.nickname) // Profile from users table
344
+ console.log(data.name);
345
+ console.log(data.avatar_url);
346
+ }
347
+ ```
348
+
349
+ ### Output
350
+
351
+ ```json
352
+ {
353
+ "data": {
354
+ "id": "usr_xyz789",
355
+ "name": "John Doe",
356
+ "avatar_url": "https://example.com/avatar.jpg",
357
+ "bio": "Full-stack developer",
358
+ "createdAt": "2024-01-15T10:00:00Z",
359
+ "updatedAt": "2024-01-15T10:00:00Z"
360
+ },
361
+ "error": null
362
+ }
363
+ ```
364
+
365
+ ---
366
+
367
+ ## setProfile()
368
+
369
+ Update current user's profile in users table. Supports any dynamic fields and returns the updated profile as a flat object.
370
+
371
+ ### Parameters
372
+
373
+ - `profile` (object) - A key-value map of profile fields to update. Any fields are accepted.
374
+
375
+ **Common fields:**
376
+
377
+ - `name` (predefined, string) - User's display name
378
+ - `avatar_url` (predefined, string) - Profile picture URL
379
+
380
+ ### Returns
381
+
382
+ ```typescript
383
+ {
384
+ data: {
385
+ id: string,
386
+ name?: string,
387
+ avatar_url?: string,
388
+ createdAt?: string,
389
+ updatedAt?: string,
390
+ ...customFields
391
+ } | null,
392
+ error: Error | null
230
393
  }
231
394
  ```
232
395
 
396
+ ### Example
397
+
398
+ ```javascript
399
+ const { data, error } = await insforge.auth.setProfile({
400
+ name: 'JohnDev',
401
+ bio: 'Full-stack developer',
402
+ avatar_url: 'https://example.com/avatar.jpg',
403
+ custom_field: 'any value', // Any custom fields are supported
404
+ });
405
+ ```
406
+
233
407
  ### Output
234
408
 
235
409
  ```json
236
410
  {
237
411
  "data": {
412
+ "id": "usr_abc123",
413
+ "name": "JohnDev",
414
+ "avatar_url": "https://example.com/avatar.jpg",
415
+ "bio": "Full-stack developer",
416
+ "custom_field": "any value",
417
+ "createdAt": "2024-01-15T10:00:00Z",
418
+ "updatedAt": "2024-01-15T12:30:00Z"
419
+ },
420
+ "error": null
421
+ }
422
+ ```
423
+
424
+ ---
425
+
426
+ ## resendVerificationEmail()
427
+
428
+ Resend email verification when the previous OTP has expired or was not received. Uses the method configured in auth settings (`verifyEmailMethod`). When method is `code`, sends a 6-digit numeric code. When method is `link`, sends a magic link.
429
+
430
+ <Note>
431
+ This endpoint prevents user enumeration by returning success even if the email doesn't exist.
432
+ </Note>
433
+
434
+ ### Parameters
435
+
436
+ - `email` (string, required) - User's email address
437
+ - `options` (object, optional) - Additional options
438
+ - `emailRedirectTo` (string, optional) - Custom URL to redirect to after email verification. It's a fallback if you didn't set default redirect URL configured in your dashboard.
439
+
440
+ ### Returns
441
+
442
+ ```typescript
443
+ {
444
+ data: { success: boolean, message: string } | null,
445
+ error: Error | null
446
+ }
447
+ ```
448
+
449
+ ### Example
450
+
451
+ ```javascript
452
+ const { data, error } = await insforge.auth.resendVerificationEmail({
453
+ email: 'user@example.com',
454
+ });
455
+
456
+ if (data?.success) {
457
+ console.log('Verification email sent!');
458
+ }
459
+ ```
460
+
461
+ ### Output
462
+
463
+ ```json
464
+ {
465
+ "data": {
466
+ "success": true,
467
+ "message": "Verification email sent"
468
+ },
469
+ "error": null
470
+ }
471
+ ```
472
+
473
+ ---
474
+
475
+ ## verifyEmail()
476
+
477
+ Verify email address using the method configured in auth settings (`verifyEmailMethod`):
478
+ - **Code verification**: Provide both `email` and `otp` (6-digit numeric code)
479
+ - **Link verification**: Provide only `otp` (64-character hex token from magic link)
480
+
481
+ Successfully verified users will receive a session token.
482
+
483
+ ### Parameters
484
+
485
+ - `email` (string, optional) - User's email address (required for code verification)
486
+ - `otp` (string, required) - 6-digit code or 64-character token from magic link
487
+
488
+ ### Returns
489
+
490
+ ```typescript
491
+ {
492
+ data: {
493
+ accessToken: string,
494
+ user: { id, email, emailVerified, ... },
495
+ redirectTo?: string
496
+ } | null,
497
+ error: Error | null
498
+ }
499
+ ```
500
+
501
+ ### Example
502
+
503
+ ```javascript
504
+ // Code verification (when verifyEmailMethod is 'code')
505
+ const { data, error } = await insforge.auth.verifyEmail({
506
+ email: 'user@example.com',
507
+ otp: '123456',
508
+ });
509
+
510
+ // Link verification (when verifyEmailMethod is 'link')
511
+ // Token is extracted from the magic link URL
512
+ const { data, error } = await insforge.auth.verifyEmail({
513
+ otp: 'a1b2c3d4e5f6...', // 64-character token from URL
514
+ });
515
+
516
+ if (data) {
517
+ console.log('Email verified!', data.accessToken);
518
+ }
519
+ ```
520
+
521
+ ### Output
522
+
523
+ ```json
524
+ {
525
+ "data": {
526
+ "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
238
527
  "user": {
239
528
  "id": "usr_abc123",
240
529
  "email": "user@example.com",
241
- "role": "authenticated"
530
+ "emailVerified": true
242
531
  },
243
- "profile": {
244
- "id": "usr_abc123",
245
- "nickname": "JohnDoe",
246
- "avatar_url": "https://example.com/avatar.jpg",
247
- "bio": "Full-stack developer",
248
- "birthday": "1990-01-01"
249
- }
532
+ "redirectTo": "https://app.example.com/dashboard"
250
533
  },
251
534
  "error": null
252
535
  }
@@ -254,24 +537,23 @@ if (data) {
254
537
 
255
538
  ---
256
539
 
257
- ## getCurrentSession()
540
+ ## sendResetPasswordEmail()
258
541
 
259
- Get current session from local storage (no API call).
542
+ Send password reset email using the method configured in auth settings (`resetPasswordMethod`). When method is `code`, sends a 6-digit numeric code for two-step flow. When method is `link`, sends a magic link.
543
+
544
+ <Note>
545
+ This endpoint prevents user enumeration by returning success even if the email doesn't exist.
546
+ </Note>
260
547
 
261
548
  ### Parameters
262
549
 
263
- None
550
+ - `email` (string, required) - User's email address
264
551
 
265
552
  ### Returns
266
553
 
267
554
  ```typescript
268
555
  {
269
- data: {
270
- session: {
271
- accessToken: string,
272
- user: { id, email, name, ... }
273
- } | null
274
- },
556
+ data: { success: boolean, message: string } | null,
275
557
  error: Error | null
276
558
  }
277
559
  ```
@@ -279,10 +561,12 @@ None
279
561
  ### Example
280
562
 
281
563
  ```javascript
282
- const { data, error } = await insforge.auth.getCurrentSession()
564
+ const { data, error } = await insforge.auth.sendResetPasswordEmail({
565
+ email: 'user@example.com',
566
+ });
283
567
 
284
- if (data.session) {
285
- console.log('Token:', data.session.accessToken)
568
+ if (data?.success) {
569
+ console.log('Password reset email sent!');
286
570
  }
287
571
  ```
288
572
 
@@ -291,14 +575,8 @@ if (data.session) {
291
575
  ```json
292
576
  {
293
577
  "data": {
294
- "session": {
295
- "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
296
- "user": {
297
- "id": "usr_abc123",
298
- "email": "user@example.com",
299
- "name": "John Doe"
300
- }
301
- }
578
+ "success": true,
579
+ "message": "Password reset email sent"
302
580
  },
303
581
  "error": null
304
582
  }
@@ -306,19 +584,24 @@ if (data.session) {
306
584
 
307
585
  ---
308
586
 
309
- ## getProfile()
587
+ ## exchangeResetPasswordToken()
588
+
589
+ Exchange a 6-digit reset password code for a reset token. This is step 1 of the two-step password reset flow (only used when `resetPasswordMethod` is `code`).
310
590
 
311
- Get any user's public profile by ID.
591
+ <Note>
592
+ This endpoint is not used when `resetPasswordMethod` is `link` (magic link flow is direct).
593
+ </Note>
312
594
 
313
595
  ### Parameters
314
596
 
315
- - `userId` (string, required) - User ID to fetch profile for
597
+ - `email` (string, required) - User's email address
598
+ - `code` (string, required) - 6-digit code from the email
316
599
 
317
600
  ### Returns
318
601
 
319
602
  ```typescript
320
603
  {
321
- data: { id, nickname, avatar_url, bio, birthday, ... } | null,
604
+ data: { token: string, expiresAt: string } | null,
322
605
  error: Error | null
323
606
  }
324
607
  ```
@@ -326,9 +609,18 @@ Get any user's public profile by ID.
326
609
  ### Example
327
610
 
328
611
  ```javascript
329
- const { data: profile, error } = await insforge.auth.getProfile('usr_xyz789')
612
+ const { data, error } = await insforge.auth.exchangeResetPasswordToken({
613
+ email: 'user@example.com',
614
+ code: '123456',
615
+ });
330
616
 
331
- console.log(profile.nickname)
617
+ if (data) {
618
+ // Use token to reset password
619
+ await insforge.auth.resetPassword({
620
+ newPassword: 'newSecurePassword123',
621
+ otp: data.token,
622
+ });
623
+ }
332
624
  ```
333
625
 
334
626
  ### Output
@@ -336,11 +628,8 @@ console.log(profile.nickname)
336
628
  ```json
337
629
  {
338
630
  "data": {
339
- "id": "usr_xyz789",
340
- "nickname": "JaneDoe",
341
- "avatar_url": "https://example.com/jane.jpg",
342
- "bio": "Designer and developer",
343
- "birthday": "1992-05-15"
631
+ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
632
+ "expiresAt": "2024-01-15T11:00:00Z"
344
633
  },
345
634
  "error": null
346
635
  }
@@ -348,22 +637,22 @@ console.log(profile.nickname)
348
637
 
349
638
  ---
350
639
 
351
- ## setProfile()
640
+ ## resetPassword()
352
641
 
353
- Update current user's profile in users table.
642
+ Reset user password with a token. The token can be:
643
+ - **Magic link token**: 64-character hex token from `sendResetPasswordEmail` when method is `link`
644
+ - **Reset token**: From `exchangeResetPasswordToken` after code verification when method is `code`
354
645
 
355
646
  ### Parameters
356
647
 
357
- - `nickname` (string, optional) - User's display name
358
- - `avatar_url` (string, optional) - Profile picture URL
359
- - `bio` (string, optional) - User biography
360
- - `birthday` (string, optional) - Birth date (YYYY-MM-DD format)
648
+ - `newPassword` (string, required) - New password for the user
649
+ - `otp` (string, required) - Reset token or magic link token
361
650
 
362
651
  ### Returns
363
652
 
364
653
  ```typescript
365
654
  {
366
- data: { id, nickname, avatar_url, bio, birthday, ... } | null,
655
+ data: { message: string, redirectTo?: string } | null,
367
656
  error: Error | null
368
657
  }
369
658
  ```
@@ -371,11 +660,21 @@ Update current user's profile in users table.
371
660
  ### Example
372
661
 
373
662
  ```javascript
374
- const { data: profile, error } = await insforge.auth.setProfile({
375
- nickname: 'JohnDev',
376
- bio: 'Full-stack developer',
377
- avatar_url: 'https://example.com/avatar.jpg'
378
- })
663
+ // Code method flow: after exchangeResetPasswordToken
664
+ const { data, error } = await insforge.auth.resetPassword({
665
+ newPassword: 'newSecurePassword123',
666
+ otp: resetToken, // Token from exchangeResetPasswordToken
667
+ });
668
+
669
+ // Link method flow: token from URL params
670
+ const { data, error } = await insforge.auth.resetPassword({
671
+ newPassword: 'newSecurePassword123',
672
+ otp: 'a1b2c3d4e5f6...', // 64-character token from magic link URL
673
+ });
674
+
675
+ if (data) {
676
+ console.log('Password reset successful!');
677
+ }
379
678
  ```
380
679
 
381
680
  ### Output
@@ -383,11 +682,8 @@ const { data: profile, error } = await insforge.auth.setProfile({
383
682
  ```json
384
683
  {
385
684
  "data": {
386
- "id": "usr_abc123",
387
- "nickname": "JohnDev",
388
- "avatar_url": "https://example.com/avatar.jpg",
389
- "bio": "Full-stack developer",
390
- "birthday": null
685
+ "message": "Password reset successfully",
686
+ "redirectTo": "https://app.example.com/login"
391
687
  },
392
688
  "error": null
393
689
  }
@@ -402,13 +698,13 @@ All auth methods return structured errors:
402
698
  ```javascript
403
699
  const { data, error } = await insforge.auth.signInWithPassword({
404
700
  email: 'user@example.com',
405
- password: 'wrong_password'
406
- })
701
+ password: 'wrong_password',
702
+ });
407
703
 
408
704
  if (error) {
409
- console.error(error.statusCode) // 401
410
- console.error(error.error) // 'INVALID_CREDENTIALS'
411
- console.error(error.message) // 'Invalid login credentials'
412
- console.error(error.nextActions) // 'Check email and password'
705
+ console.error(error.statusCode); // 401
706
+ console.error(error.error); // 'INVALID_CREDENTIALS'
707
+ console.error(error.message); // 'Invalid login credentials'
708
+ console.error(error.nextActions); // 'Check email and password'
413
709
  }
414
710
  ```