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.
- package/.claude-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +46 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +30 -28
- package/auth/src/lib/broadcastService.ts +4 -4
- package/auth/src/lib/insforge.ts +8 -0
- package/auth/src/main.tsx +2 -4
- package/auth/src/pages/SignInPage.tsx +5 -2
- package/auth/src/pages/SignUpPage.tsx +5 -2
- package/auth/src/pages/VerifyEmailPage.tsx +18 -0
- package/auth/tsconfig.json +33 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +82 -75
- 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 +720 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +80 -1
- package/backend/src/api/routes/database/records.routes.ts +48 -184
- package/backend/src/api/routes/database/rpc.routes.ts +69 -0
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/deployments/index.routes.ts +192 -0
- package/backend/src/api/routes/docs/index.routes.ts +76 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +21 -15
- package/backend/src/api/routes/metadata/index.routes.ts +38 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
- package/backend/src/infra/database/database.manager.ts +14 -11
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- 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/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +216 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +24 -12
- 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/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +329 -284
- 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/image-generation.service.ts +3 -3
- 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 +148 -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 -94
- package/backend/src/services/database/database.service.ts +127 -0
- 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/email/email.service.ts +5 -7
- package/backend/src/services/functions/function.service.ts +61 -41
- package/backend/src/services/logs/audit.service.ts +10 -10
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- 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 +16 -1
- package/backend/src/types/database.ts +2 -0
- package/backend/src/types/deployments.ts +33 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/types/storage.ts +1 -1
- package/backend/src/types/webhooks.ts +45 -0
- package/backend/src/utils/cookies.ts +34 -0
- package/backend/src/utils/environment.ts +0 -14
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +79 -43
- package/backend/src/utils/sql-parser.ts +216 -0
- package/backend/src/utils/utils.ts +114 -114
- package/backend/src/utils/validations.ts +10 -10
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-rpc.sh +141 -0
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tests/unit/database-advance.test.ts +326 -0
- package/backend/tests/unit/helpers.test.ts +2 -2
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/deployment.md +79 -0
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +212 -67
- package/docs/core-concepts/ai/architecture.mdx +350 -372
- package/docs/core-concepts/ai/sdk.mdx +238 -213
- package/docs/core-concepts/authentication/architecture.mdx +276 -278
- package/docs/core-concepts/authentication/sdk.mdx +710 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
- package/docs/core-concepts/database/architecture.mdx +292 -255
- package/docs/core-concepts/database/pgvector.mdx +138 -0
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/deployments/architecture.mdx +152 -0
- package/docs/core-concepts/email/architecture.mdx +103 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +183 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +240 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.png +0 -0
- package/docs/favicon.svg +4 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +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/realtime-module.jpg +0 -0
- package/docs/images/changelog/dec-2025/realtime2.png +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- 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 +93 -88
- package/docs/introduction.mdx +46 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/mcp-setup.mdx +332 -0
- package/docs/oauth-server.mdx +563 -0
- package/docs/partnership.mdx +720 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/docs/vscode-extension.mdx +74 -0
- package/eslint.config.js +1 -0
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/App.tsx +8 -3
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/antigravity.svg +1 -0
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/copilot.svg +10 -0
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/deepseek.svg +139 -0
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/kiro.svg +9 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/qoder.svg +4 -0
- package/frontend/src/assets/logos/qwen.svg +15 -0
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- 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 +13 -37
- 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/{page → pages}/AIPage.tsx +166 -166
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
- package/frontend/src/features/auth/components/index.ts +5 -5
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/dashboard/{page → 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/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- 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/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
- package/frontend/src/features/database/hooks/useTables.ts +30 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
- package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
- package/frontend/src/features/database/services/advance.service.ts +1 -41
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/record.service.ts +4 -20
- package/frontend/src/features/database/services/table.service.ts +1 -10
- 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/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
- 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/{page → 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/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/logs/{page → 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/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
- package/frontend/src/index.css +249 -249
- package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- 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 -84
- package/frontend/src/lib/services/metadata.service.ts +20 -3
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +223 -183
- package/frontend/src/lib/utils/utils.ts +196 -183
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +6 -6
- package/functions/worker-template.js +1 -1
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +825 -715
- package/openapi/auth.yaml +1324 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +221 -223
- package/openapi/metadata.yaml +175 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +462 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai-api.schema.ts +251 -143
- package/shared-schemas/src/ai.schema.ts +8 -4
- package/shared-schemas/src/auth-api.schema.ts +380 -339
- package/shared-schemas/src/auth.schema.ts +18 -11
- package/shared-schemas/src/cloud-events.schema.ts +26 -0
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -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 +32 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- 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 -14
- package/shared-schemas/src/metadata.schema.ts +39 -4
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/src/secrets-api.schema.ts +44 -0
- package/shared-schemas/src/secrets.schema.ts +15 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +26 -13
- package/zeabur/template.yml +1001 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/backend/src/types/profile.ts +0 -55
- package/frontend/src/components/ProjectInfoModal.tsx +0 -128
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
|
@@ -1,529 +1,733 @@
|
|
|
1
|
-
---
|
|
2
|
-
title:
|
|
3
|
-
description:
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
<
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
</
|
|
466
|
-
);
|
|
467
|
-
}
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
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
|
+
```
|