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.
- package/CHANGELOG.md +2 -0
- package/auth/package.json +5 -3
- package/auth/src/lib/broadcastService.ts +115 -117
- package/auth/src/lib/insforge.ts +8 -0
- package/auth/src/main.tsx +2 -4
- package/auth/src/pages/SignInPage.tsx +60 -60
- package/auth/src/pages/SignUpPage.tsx +60 -60
- package/auth/src/pages/VerifyEmailPage.tsx +18 -0
- package/auth/tsconfig.json +2 -1
- package/backend/package.json +10 -6
- package/backend/src/api/middlewares/rate-limiters.ts +127 -127
- package/backend/src/api/routes/ai/index.routes.ts +475 -468
- package/backend/src/api/routes/auth/index.routes.ts +85 -32
- package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
- package/backend/src/api/routes/database/index.routes.ts +2 -0
- package/backend/src/api/routes/database/records.routes.ts +39 -175
- package/backend/src/api/routes/database/rpc.routes.ts +69 -0
- package/backend/src/api/routes/deployments/index.routes.ts +192 -0
- package/backend/src/api/routes/docs/index.routes.ts +3 -2
- package/backend/src/api/routes/email/index.routes.ts +35 -35
- package/backend/src/api/routes/functions/index.routes.ts +3 -3
- package/backend/src/api/routes/metadata/index.routes.ts +26 -0
- package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
- package/backend/src/infra/database/database.manager.ts +0 -10
- package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
- package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
- package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
- package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
- package/backend/src/infra/security/token.manager.ts +1 -4
- package/backend/src/providers/ai/openrouter.provider.ts +12 -3
- package/backend/src/providers/database/base.provider.ts +39 -0
- package/backend/src/providers/database/cloud.provider.ts +159 -0
- package/backend/src/providers/deployments/vercel.provider.ts +516 -0
- package/backend/src/server.ts +19 -7
- package/backend/src/services/ai/ai-config.service.ts +6 -6
- package/backend/src/services/ai/ai-model.service.ts +60 -60
- package/backend/src/services/ai/ai-usage.service.ts +7 -7
- package/backend/src/services/ai/chat-completion.service.ts +415 -220
- package/backend/src/services/ai/helpers.ts +64 -64
- package/backend/src/services/ai/index.ts +13 -13
- package/backend/src/services/auth/auth-config.service.ts +4 -4
- package/backend/src/services/auth/auth-otp.service.ts +6 -6
- package/backend/src/services/auth/auth.service.ts +134 -74
- package/backend/src/services/auth/index.ts +4 -4
- package/backend/src/services/auth/oauth-config.service.ts +12 -12
- package/backend/src/services/database/database-advance.service.ts +19 -55
- package/backend/src/services/database/database-table.service.ts +38 -85
- package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
- package/backend/src/services/deployments/deployment.service.ts +693 -0
- package/backend/src/services/functions/function.service.ts +61 -41
- package/backend/src/services/logs/audit.service.ts +10 -10
- package/backend/src/services/secrets/secret.service.ts +101 -27
- package/backend/src/services/storage/storage.service.ts +30 -30
- package/backend/src/services/usage/usage.service.ts +6 -6
- package/backend/src/types/ai.ts +8 -0
- package/backend/src/types/auth.ts +5 -1
- package/backend/src/types/database.ts +2 -0
- package/backend/src/types/deployments.ts +33 -0
- package/backend/src/types/storage.ts +1 -1
- package/backend/src/types/webhooks.ts +45 -0
- package/backend/src/utils/cookies.ts +34 -35
- package/backend/src/utils/environment.ts +0 -14
- package/backend/src/utils/s3-config-loader.ts +64 -64
- package/backend/src/utils/seed.ts +334 -301
- package/backend/src/utils/sql-parser.ts +126 -0
- package/backend/src/utils/utils.ts +114 -114
- package/backend/src/utils/validations.ts +10 -10
- package/backend/tests/local/test-rpc.sh +141 -0
- package/backend/tests/local/test-secrets.sh +1 -1
- package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
- package/backend/tests/manual/test-rawsql-modes.sh +24 -24
- package/backend/tests/unit/database-advance.test.ts +326 -0
- package/backend/tests/unit/helpers.test.ts +2 -2
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
- package/docker-compose.prod.yml +1 -1
- package/docker-compose.yml +1 -1
- package/docs/agent-docs/deployment.md +79 -0
- package/docs/changelog.mdx +165 -72
- package/docs/core-concepts/ai/architecture.mdx +1 -23
- package/docs/core-concepts/ai/sdk.mdx +26 -1
- package/docs/core-concepts/authentication/architecture.mdx +6 -8
- package/docs/core-concepts/authentication/sdk.mdx +387 -91
- package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
- package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
- package/docs/core-concepts/database/architecture.mdx +58 -21
- package/docs/core-concepts/database/pgvector.mdx +138 -0
- package/docs/core-concepts/database/sdk.mdx +17 -17
- package/docs/core-concepts/deployments/architecture.mdx +152 -0
- package/docs/core-concepts/email/architecture.mdx +4 -2
- package/docs/core-concepts/functions/architecture.mdx +1 -1
- package/docs/core-concepts/functions/sdk.mdx +0 -1
- package/docs/core-concepts/realtime/architecture.mdx +1 -1
- package/docs/core-concepts/storage/architecture.mdx +1 -1
- package/docs/core-concepts/storage/sdk.mdx +25 -25
- package/docs/docs.json +14 -6
- package/docs/favicon.png +0 -0
- package/docs/favicon.svg +3 -18
- package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
- package/docs/images/changelog/dec-2025/moreModels.png +0 -0
- package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
- package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
- package/docs/images/changelog/dec-2025/realtime2.png +0 -0
- package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
- package/docs/images/mcp-setup/claude-code-connect.png +0 -0
- package/docs/images/mcp-setup/cline-1.png +0 -0
- package/docs/images/mcp-setup/cline-2.png +0 -0
- package/docs/images/mcp-setup/cline-3.png +0 -0
- package/docs/images/mcp-setup/connect-project.png +0 -0
- package/docs/images/mcp-setup/copilot-1.png +0 -0
- package/docs/images/mcp-setup/copilot-2.png +0 -0
- package/docs/images/mcp-setup/copilot-3.png +0 -0
- package/docs/images/mcp-setup/mcp-json-1.png +0 -0
- package/docs/images/mcp-setup/mcp-json-2.png +0 -0
- package/docs/images/mcp-setup/qoder-1.png +0 -0
- package/docs/images/mcp-setup/qoder-2.png +0 -0
- package/docs/images/mcp-setup/roocode-1.png +0 -0
- package/docs/images/mcp-setup/roocode-2.png +0 -0
- package/docs/images/mcp-setup/trae-1.png +0 -0
- package/docs/images/mcp-setup/trae-2.png +0 -0
- package/docs/images/mcp-setup/trae-3.png +0 -0
- package/docs/images/mcp-setup/trae-4.png +0 -0
- package/docs/images/mcp-setup/trae-5.png +0 -0
- package/docs/images/mcp-setup/windsurf-1.png +0 -0
- package/docs/images/mcp-setup/windsurf-2.png +0 -0
- package/docs/insforge-instructions-sdk.md +7 -3
- package/docs/introduction.mdx +9 -8
- package/docs/mcp-setup.mdx +332 -0
- package/docs/oauth-server.mdx +563 -0
- package/docs/partnership.mdx +79 -10
- package/docs/quickstart.mdx +1 -1
- package/docs/vscode-extension.mdx +74 -0
- package/eslint.config.js +1 -0
- package/examples/response-examples.md +1 -1
- package/frontend/package.json +1 -1
- package/frontend/src/App.tsx +8 -3
- package/frontend/src/assets/logos/antigravity.svg +1 -0
- package/frontend/src/assets/logos/copilot.svg +10 -0
- package/frontend/src/assets/logos/deepseek.svg +139 -0
- package/frontend/src/assets/logos/kiro.svg +9 -0
- package/frontend/src/assets/logos/qoder.svg +4 -0
- package/frontend/src/assets/logos/qwen.svg +15 -0
- package/frontend/src/components/CodeBlock.tsx +2 -2
- package/frontend/src/components/ConnectCTA.tsx +3 -2
- package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
- package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
- package/frontend/src/components/datagrid/index.ts +1 -1
- package/frontend/src/components/index.ts +0 -1
- package/frontend/src/components/layout/AppHeader.tsx +4 -27
- package/frontend/src/components/layout/AppSidebar.tsx +85 -100
- package/frontend/src/components/layout/Layout.tsx +34 -32
- package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
- package/frontend/src/components/radix/Select.tsx +151 -151
- package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
- package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
- package/frontend/src/features/ai/components/index.ts +6 -6
- package/frontend/src/features/ai/helpers.ts +147 -141
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
- package/frontend/src/features/auth/components/index.ts +5 -5
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
- package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
- package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
- package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
- package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
- package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
- package/frontend/src/features/database/constants.ts +16 -28
- package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
- package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
- package/frontend/src/features/database/hooks/useTables.ts +5 -7
- package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
- package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
- package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
- package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
- package/frontend/src/features/database/services/advance.service.ts +1 -15
- package/frontend/src/features/database/services/record.service.ts +4 -20
- package/frontend/src/features/database/services/table.service.ts +1 -4
- package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
- package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
- package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
- package/frontend/src/features/database/templates/notion-clone.ts +8 -8
- package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
- package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
- package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
- package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
- package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
- package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
- package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
- package/frontend/src/features/functions/components/index.ts +5 -5
- package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
- package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
- package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
- package/frontend/src/features/functions/services/function.service.ts +8 -25
- package/frontend/src/features/functions/services/secret.service.ts +23 -41
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
- package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
- package/frontend/src/features/logs/components/index.ts +1 -0
- package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
- package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
- package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
- package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
- package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
- package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
- package/frontend/src/features/onboard/components/index.ts +9 -4
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
- package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
- package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
- package/frontend/src/features/onboard/index.ts +17 -13
- package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
- package/frontend/src/index.css +249 -249
- package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
- package/frontend/src/lib/hooks/useMetadata.ts +45 -1
- package/frontend/src/lib/hooks/useModal.tsx +2 -0
- package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
- package/frontend/src/lib/services/metadata.service.ts +20 -3
- package/frontend/src/lib/utils/menuItems.ts +223 -207
- package/frontend/src/lib/utils/utils.ts +196 -196
- package/functions/server.ts +315 -315
- package/functions/worker-template.js +1 -1
- package/openapi/ai.yaml +115 -5
- package/openapi/auth.yaml +97 -17
- package/openapi/logs.yaml +0 -2
- package/openapi/metadata.yaml +0 -2
- package/openapi/records.yaml +21 -21
- package/openapi/tables.yaml +1 -2
- package/package.json +1 -1
- package/shared-schemas/package.json +1 -1
- package/shared-schemas/src/ai-api.schema.ts +251 -143
- package/shared-schemas/src/ai.schema.ts +63 -63
- package/shared-schemas/src/auth-api.schema.ts +34 -6
- package/shared-schemas/src/auth.schema.ts +17 -10
- package/shared-schemas/src/cloud-events.schema.ts +26 -0
- package/shared-schemas/src/deployments-api.schema.ts +55 -0
- package/shared-schemas/src/deployments.schema.ts +30 -0
- package/shared-schemas/src/docs.schema.ts +8 -2
- package/shared-schemas/src/email-api.schema.ts +30 -30
- package/shared-schemas/src/functions-api.schema.ts +13 -4
- package/shared-schemas/src/functions.schema.ts +1 -1
- package/shared-schemas/src/index.ts +22 -18
- package/shared-schemas/src/metadata.schema.ts +30 -4
- package/shared-schemas/src/secrets-api.schema.ts +44 -0
- package/shared-schemas/src/secrets.schema.ts +15 -0
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +20 -51
- package/backend/src/types/profile.ts +0 -55
- 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
|
|
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
|
-
"
|
|
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,
|
|
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
|
|
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
|
-
##
|
|
246
|
+
## getCurrentSession()
|
|
203
247
|
|
|
204
|
-
Get
|
|
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
|
-
|
|
216
|
-
|
|
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.
|
|
341
|
+
const { data, error } = await insforge.auth.getProfile('usr_xyz789');
|
|
226
342
|
|
|
227
343
|
if (data) {
|
|
228
|
-
console.log(data.
|
|
229
|
-
console.log(data.
|
|
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
|
-
"
|
|
530
|
+
"emailVerified": true
|
|
242
531
|
},
|
|
243
|
-
"
|
|
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
|
-
##
|
|
540
|
+
## sendResetPasswordEmail()
|
|
258
541
|
|
|
259
|
-
|
|
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
|
-
|
|
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.
|
|
564
|
+
const { data, error } = await insforge.auth.sendResetPasswordEmail({
|
|
565
|
+
email: 'user@example.com',
|
|
566
|
+
});
|
|
283
567
|
|
|
284
|
-
if (data
|
|
285
|
-
console.log('
|
|
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
|
-
"
|
|
295
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
- `
|
|
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: {
|
|
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
|
|
612
|
+
const { data, error } = await insforge.auth.exchangeResetPasswordToken({
|
|
613
|
+
email: 'user@example.com',
|
|
614
|
+
code: '123456',
|
|
615
|
+
});
|
|
330
616
|
|
|
331
|
-
|
|
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
|
-
"
|
|
340
|
-
"
|
|
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
|
-
##
|
|
640
|
+
## resetPassword()
|
|
352
641
|
|
|
353
|
-
|
|
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
|
-
- `
|
|
358
|
-
- `
|
|
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: {
|
|
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
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
"
|
|
387
|
-
"
|
|
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)
|
|
410
|
-
console.error(error.error)
|
|
411
|
-
console.error(error.message)
|
|
412
|
-
console.error(error.nextActions)
|
|
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
|
```
|