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,140 +1,140 @@
|
|
|
1
|
-
# InsForge Database SDK
|
|
2
|
-
|
|
3
|
-
## Setup
|
|
4
|
-
```javascript
|
|
5
|
-
import { createClient } from '@insforge/sdk';
|
|
6
|
-
const client = createClient({ baseUrl: 'http://localhost:7130' });
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Query Builder
|
|
10
|
-
|
|
11
|
-
### from(table)
|
|
12
|
-
```javascript
|
|
13
|
-
client.database.from('posts') // Returns QueryBuilder
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Operations
|
|
17
|
-
|
|
18
|
-
### select
|
|
19
|
-
```javascript
|
|
20
|
-
.select() // All columns
|
|
21
|
-
.select('id, title') // Specific columns
|
|
22
|
-
.select('*, user:user_id(name, email)') // Foreign key expansion
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### insert
|
|
26
|
-
```javascript
|
|
27
|
-
.insert({ title: 'Hello' }).select() // Single record with data returned
|
|
28
|
-
.insert([{...}, {...}]).select() // Multiple records with data returned
|
|
29
|
-
// Note: Always sends array to API
|
|
30
|
-
// Without .select(), returns null data
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### update
|
|
34
|
-
```javascript
|
|
35
|
-
.update({ title: 'Updated' }).eq('id', '123').select()
|
|
36
|
-
// Must chain with filter and .select() to return data
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### delete
|
|
40
|
-
```javascript
|
|
41
|
-
.delete().eq('id', '123').select()
|
|
42
|
-
// Must chain with filter and .select() to return data
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### upsert
|
|
46
|
-
```javascript
|
|
47
|
-
.upsert({ id: '123', title: 'New or Update' }).select()
|
|
48
|
-
// Updates if exists, inserts if not
|
|
49
|
-
// Use .select() to return data
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Filters
|
|
53
|
-
|
|
54
|
-
```javascript
|
|
55
|
-
.eq('col', value) // column = value
|
|
56
|
-
.neq('col', value) // column != value
|
|
57
|
-
.gt('col', value) // column > value
|
|
58
|
-
.gte('col', value) // column >= value
|
|
59
|
-
.lt('col', value) // column < value
|
|
60
|
-
.lte('col', value) // column <= value
|
|
61
|
-
.like('col', '%pat%') // LIKE pattern
|
|
62
|
-
.ilike('col', '%pat%') // ILIKE pattern
|
|
63
|
-
.is('col', null) // IS NULL
|
|
64
|
-
.in('col', [1,2,3]) // IN array
|
|
65
|
-
|
|
66
|
-
.or('status.eq.active,status.eq.pending') // OR condition
|
|
67
|
-
.and('price.gte.100,price.lte.500') // Explicit AND
|
|
68
|
-
.not('deleted', 'is.true') // NOT condition
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### OR Examples
|
|
72
|
-
```javascript
|
|
73
|
-
// Simple OR
|
|
74
|
-
.or('status.eq.active,status.eq.pending')
|
|
75
|
-
// WHERE status = 'active' OR status = 'pending'
|
|
76
|
-
|
|
77
|
-
// OR with other filters (implicit AND)
|
|
78
|
-
.eq('user_id', '123')
|
|
79
|
-
.or('status.eq.draft,status.eq.published')
|
|
80
|
-
// WHERE user_id = '123' AND (status = 'draft' OR status = 'published')
|
|
81
|
-
|
|
82
|
-
// Complex OR with NOT
|
|
83
|
-
.or('age.lt.18,age.gt.65,not.is_active.is.true')
|
|
84
|
-
// WHERE age < 18 OR age > 65 OR NOT is_active
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Modifiers
|
|
88
|
-
|
|
89
|
-
```javascript
|
|
90
|
-
.order('col') // ASC
|
|
91
|
-
.order('col', { ascending: false }) // DESC
|
|
92
|
-
.limit(10)
|
|
93
|
-
.offset(20)
|
|
94
|
-
.range(0, 9) // Headers: Range: 0-9
|
|
95
|
-
.single() // Return object not array
|
|
96
|
-
.count('exact') // Include total count
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Execute
|
|
100
|
-
|
|
101
|
-
```javascript
|
|
102
|
-
// Methods are thenable
|
|
103
|
-
const { data, error } = await client.database
|
|
104
|
-
.from('posts')
|
|
105
|
-
.select()
|
|
106
|
-
.eq('user_id', '123')
|
|
107
|
-
.limit(10);
|
|
108
|
-
|
|
109
|
-
// data: array or null
|
|
110
|
-
// error: { message, statusCode, code } or null
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Foreign Key Expansion
|
|
114
|
-
|
|
115
|
-
```javascript
|
|
116
|
-
// PostgREST syntax
|
|
117
|
-
.select('*, user:user_id(name, email)')
|
|
118
|
-
|
|
119
|
-
// Response:
|
|
120
|
-
{
|
|
121
|
-
id: '123',
|
|
122
|
-
title: 'Post',
|
|
123
|
-
user_id: '456',
|
|
124
|
-
user: { name: 'John', email: 'john@example.com' }
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Users Table
|
|
129
|
-
|
|
130
|
-
```javascript
|
|
131
|
-
// Profile data (not auth)
|
|
132
|
-
await client.database.from('users').select().eq('id', userId).single()
|
|
133
|
-
await client.database.from('users').update({ nickname, avatar_url }).eq('id', userId).select()
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Notes
|
|
137
|
-
- Uses PostgREST under the hood
|
|
138
|
-
- POST requires array format `[{...}]`
|
|
139
|
-
- All methods return QueryBuilder for chaining
|
|
1
|
+
# InsForge Database SDK
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
```javascript
|
|
5
|
+
import { createClient } from '@insforge/sdk';
|
|
6
|
+
const client = createClient({ baseUrl: 'http://localhost:7130' });
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Query Builder
|
|
10
|
+
|
|
11
|
+
### from(table)
|
|
12
|
+
```javascript
|
|
13
|
+
client.database.from('posts') // Returns QueryBuilder
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Operations
|
|
17
|
+
|
|
18
|
+
### select
|
|
19
|
+
```javascript
|
|
20
|
+
.select() // All columns
|
|
21
|
+
.select('id, title') // Specific columns
|
|
22
|
+
.select('*, user:user_id(name, email)') // Foreign key expansion
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### insert
|
|
26
|
+
```javascript
|
|
27
|
+
.insert({ title: 'Hello' }).select() // Single record with data returned
|
|
28
|
+
.insert([{...}, {...}]).select() // Multiple records with data returned
|
|
29
|
+
// Note: Always sends array to API
|
|
30
|
+
// Without .select(), returns null data
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### update
|
|
34
|
+
```javascript
|
|
35
|
+
.update({ title: 'Updated' }).eq('id', '123').select()
|
|
36
|
+
// Must chain with filter and .select() to return data
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### delete
|
|
40
|
+
```javascript
|
|
41
|
+
.delete().eq('id', '123').select()
|
|
42
|
+
// Must chain with filter and .select() to return data
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### upsert
|
|
46
|
+
```javascript
|
|
47
|
+
.upsert({ id: '123', title: 'New or Update' }).select()
|
|
48
|
+
// Updates if exists, inserts if not
|
|
49
|
+
// Use .select() to return data
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Filters
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
.eq('col', value) // column = value
|
|
56
|
+
.neq('col', value) // column != value
|
|
57
|
+
.gt('col', value) // column > value
|
|
58
|
+
.gte('col', value) // column >= value
|
|
59
|
+
.lt('col', value) // column < value
|
|
60
|
+
.lte('col', value) // column <= value
|
|
61
|
+
.like('col', '%pat%') // LIKE pattern
|
|
62
|
+
.ilike('col', '%pat%') // ILIKE pattern
|
|
63
|
+
.is('col', null) // IS NULL
|
|
64
|
+
.in('col', [1,2,3]) // IN array
|
|
65
|
+
|
|
66
|
+
.or('status.eq.active,status.eq.pending') // OR condition
|
|
67
|
+
.and('price.gte.100,price.lte.500') // Explicit AND
|
|
68
|
+
.not('deleted', 'is.true') // NOT condition
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### OR Examples
|
|
72
|
+
```javascript
|
|
73
|
+
// Simple OR
|
|
74
|
+
.or('status.eq.active,status.eq.pending')
|
|
75
|
+
// WHERE status = 'active' OR status = 'pending'
|
|
76
|
+
|
|
77
|
+
// OR with other filters (implicit AND)
|
|
78
|
+
.eq('user_id', '123')
|
|
79
|
+
.or('status.eq.draft,status.eq.published')
|
|
80
|
+
// WHERE user_id = '123' AND (status = 'draft' OR status = 'published')
|
|
81
|
+
|
|
82
|
+
// Complex OR with NOT
|
|
83
|
+
.or('age.lt.18,age.gt.65,not.is_active.is.true')
|
|
84
|
+
// WHERE age < 18 OR age > 65 OR NOT is_active
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Modifiers
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
.order('col') // ASC
|
|
91
|
+
.order('col', { ascending: false }) // DESC
|
|
92
|
+
.limit(10)
|
|
93
|
+
.offset(20)
|
|
94
|
+
.range(0, 9) // Headers: Range: 0-9
|
|
95
|
+
.single() // Return object not array
|
|
96
|
+
.count('exact') // Include total count
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Execute
|
|
100
|
+
|
|
101
|
+
```javascript
|
|
102
|
+
// Methods are thenable
|
|
103
|
+
const { data, error } = await client.database
|
|
104
|
+
.from('posts')
|
|
105
|
+
.select()
|
|
106
|
+
.eq('user_id', '123')
|
|
107
|
+
.limit(10);
|
|
108
|
+
|
|
109
|
+
// data: array or null
|
|
110
|
+
// error: { message, statusCode, code } or null
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Foreign Key Expansion
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
// PostgREST syntax
|
|
117
|
+
.select('*, user:user_id(name, email)')
|
|
118
|
+
|
|
119
|
+
// Response:
|
|
120
|
+
{
|
|
121
|
+
id: '123',
|
|
122
|
+
title: 'Post',
|
|
123
|
+
user_id: '456',
|
|
124
|
+
user: { name: 'John', email: 'john@example.com' }
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Users Table
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
// Profile data (not auth)
|
|
132
|
+
await client.database.from('users').select().eq('id', userId).single()
|
|
133
|
+
await client.database.from('users').update({ nickname, avatar_url }).eq('id', userId).select()
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Notes
|
|
137
|
+
- Uses PostgREST under the hood
|
|
138
|
+
- POST requires array format `[{...}]`
|
|
139
|
+
- All methods return QueryBuilder for chaining
|
|
140
140
|
- Execute returns `{ data, error }`
|
|
@@ -1,157 +1,157 @@
|
|
|
1
|
-
# InsForge Debug SDK
|
|
2
|
-
|
|
3
|
-
## Common SDK Errors
|
|
4
|
-
|
|
5
|
-
### Auth Errors
|
|
6
|
-
```javascript
|
|
7
|
-
// Token not stored
|
|
8
|
-
{ code: 'MISSING_AUTHORIZATION_HEADER' }
|
|
9
|
-
// Fix: User needs to login
|
|
10
|
-
|
|
11
|
-
// Token expired
|
|
12
|
-
{ code: 'INVALID_TOKEN' }
|
|
13
|
-
// Fix: client.auth.signInWithPassword()
|
|
14
|
-
|
|
15
|
-
// Invalid credentials
|
|
16
|
-
{ code: 'INVALID_CREDENTIALS' }
|
|
17
|
-
// Fix: Check email/password
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### Database Errors
|
|
21
|
-
```javascript
|
|
22
|
-
// Table doesn't exist
|
|
23
|
-
{ statusCode: 404, message: 'Table not found' }
|
|
24
|
-
// Fix: Use MCP tool to create table
|
|
25
|
-
|
|
26
|
-
// Missing required field
|
|
27
|
-
{ code: '23502', message: 'null value in column "user_id"' }
|
|
28
|
-
// Fix: Include all required fields
|
|
29
|
-
|
|
30
|
-
// Foreign key violation
|
|
31
|
-
{ code: '23503', message: 'violates foreign key constraint' }
|
|
32
|
-
// Fix: Referenced record must exist
|
|
33
|
-
|
|
34
|
-
// Permission denied
|
|
35
|
-
{ code: '42501', message: 'permission denied for table' }
|
|
36
|
-
// Fix: User must be authenticated
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Debug Techniques
|
|
40
|
-
|
|
41
|
-
### 1. Check Authentication
|
|
42
|
-
```javascript
|
|
43
|
-
const { data, error } = await client.auth.getCurrentUser();
|
|
44
|
-
if (error) {
|
|
45
|
-
console.log('Not authenticated:', error.message);
|
|
46
|
-
// Need to login first
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### 2. Verify Token Storage
|
|
51
|
-
```javascript
|
|
52
|
-
const { data } = await client.auth.getCurrentSession();
|
|
53
|
-
console.log('Stored token:', data?.session?.accessToken ? 'Present' : 'Missing');
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 3. Test Database Connection
|
|
57
|
-
```javascript
|
|
58
|
-
// Simple query to test connection
|
|
59
|
-
const { error } = await client.database.from('users').select().limit(1);
|
|
60
|
-
if (error) {
|
|
61
|
-
console.log('Database issue:', error);
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 4. Enable Network Inspection
|
|
66
|
-
```javascript
|
|
67
|
-
// Browser: Open DevTools > Network tab
|
|
68
|
-
// Check request headers for Authorization: Bearer token
|
|
69
|
-
// Check response for error details
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### 5. Test With Raw HTTP
|
|
73
|
-
```javascript
|
|
74
|
-
// When SDK fails, test endpoint directly
|
|
75
|
-
const response = await fetch('http://localhost:7130/api/database/records/posts', {
|
|
76
|
-
headers: {
|
|
77
|
-
'Authorization': 'Bearer ' + token
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
const data = await response.json();
|
|
81
|
-
console.log('Raw response:', data);
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Common Issues
|
|
85
|
-
|
|
86
|
-
### Empty Response
|
|
87
|
-
```javascript
|
|
88
|
-
// INSERT/UPDATE/DELETE return empty without Prefer header
|
|
89
|
-
// SDK handles this automatically, but check if using raw API
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Array Format
|
|
93
|
-
```javascript
|
|
94
|
-
// POST requires array
|
|
95
|
-
// ❌ Wrong: { title: 'Test' }
|
|
96
|
-
// ✅ Right: [{ title: 'Test' }]
|
|
97
|
-
// SDK handles this automatically
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Token Not Persisting
|
|
101
|
-
```javascript
|
|
102
|
-
// Check storage adapter
|
|
103
|
-
const client = createClient({
|
|
104
|
-
baseUrl: 'http://localhost:7130',
|
|
105
|
-
});
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### CORS Issues
|
|
109
|
-
```javascript
|
|
110
|
-
// Backend allows all origins by default
|
|
111
|
-
// If modified, check backend CORS settings
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## Test Utilities
|
|
115
|
-
|
|
116
|
-
### Full Test Suite
|
|
117
|
-
```javascript
|
|
118
|
-
async function testSDK() {
|
|
119
|
-
const email = `test-${Date.now()}@example.com`;
|
|
120
|
-
|
|
121
|
-
// Test auth
|
|
122
|
-
console.log('Testing auth...');
|
|
123
|
-
const { error: signUpError } = await client.auth.signUp({ email, password: 'test123' });
|
|
124
|
-
if (signUpError) return console.error('SignUp failed:', signUpError);
|
|
125
|
-
|
|
126
|
-
// Test current user
|
|
127
|
-
const { data: user, error: userError } = await client.auth.getCurrentUser();
|
|
128
|
-
if (userError) return console.error('GetUser failed:', userError);
|
|
129
|
-
console.log('✅ Auth working, user:', user.user.id);
|
|
130
|
-
|
|
131
|
-
// Test database
|
|
132
|
-
console.log('Testing database...');
|
|
133
|
-
const { data: posts, error: dbError } = await client.database.from('posts').select().limit(1);
|
|
134
|
-
if (dbError) return console.error('Database failed:', dbError);
|
|
135
|
-
console.log('✅ Database working, posts:', posts.length);
|
|
136
|
-
|
|
137
|
-
// Test insert
|
|
138
|
-
const { error: insertError } = await client.database
|
|
139
|
-
.from('posts')
|
|
140
|
-
.insert({ title: 'Test', user_id: user.user.id })
|
|
141
|
-
.select();
|
|
142
|
-
if (insertError) return console.error('Insert failed:', insertError);
|
|
143
|
-
console.log('✅ Insert working');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
testSDK().catch(console.error);
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## Backend Verification
|
|
150
|
-
|
|
151
|
-
```javascript
|
|
152
|
-
// Check backend is running
|
|
153
|
-
fetch('http://localhost:7130/api/health')
|
|
154
|
-
.then(r => r.json())
|
|
155
|
-
.then(d => console.log('Backend:', d))
|
|
156
|
-
.catch(e => console.error('Backend not running'));
|
|
1
|
+
# InsForge Debug SDK
|
|
2
|
+
|
|
3
|
+
## Common SDK Errors
|
|
4
|
+
|
|
5
|
+
### Auth Errors
|
|
6
|
+
```javascript
|
|
7
|
+
// Token not stored
|
|
8
|
+
{ code: 'MISSING_AUTHORIZATION_HEADER' }
|
|
9
|
+
// Fix: User needs to login
|
|
10
|
+
|
|
11
|
+
// Token expired
|
|
12
|
+
{ code: 'INVALID_TOKEN' }
|
|
13
|
+
// Fix: client.auth.signInWithPassword()
|
|
14
|
+
|
|
15
|
+
// Invalid credentials
|
|
16
|
+
{ code: 'INVALID_CREDENTIALS' }
|
|
17
|
+
// Fix: Check email/password
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Database Errors
|
|
21
|
+
```javascript
|
|
22
|
+
// Table doesn't exist
|
|
23
|
+
{ statusCode: 404, message: 'Table not found' }
|
|
24
|
+
// Fix: Use MCP tool to create table
|
|
25
|
+
|
|
26
|
+
// Missing required field
|
|
27
|
+
{ code: '23502', message: 'null value in column "user_id"' }
|
|
28
|
+
// Fix: Include all required fields
|
|
29
|
+
|
|
30
|
+
// Foreign key violation
|
|
31
|
+
{ code: '23503', message: 'violates foreign key constraint' }
|
|
32
|
+
// Fix: Referenced record must exist
|
|
33
|
+
|
|
34
|
+
// Permission denied
|
|
35
|
+
{ code: '42501', message: 'permission denied for table' }
|
|
36
|
+
// Fix: User must be authenticated
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Debug Techniques
|
|
40
|
+
|
|
41
|
+
### 1. Check Authentication
|
|
42
|
+
```javascript
|
|
43
|
+
const { data, error } = await client.auth.getCurrentUser();
|
|
44
|
+
if (error) {
|
|
45
|
+
console.log('Not authenticated:', error.message);
|
|
46
|
+
// Need to login first
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Verify Token Storage
|
|
51
|
+
```javascript
|
|
52
|
+
const { data } = await client.auth.getCurrentSession();
|
|
53
|
+
console.log('Stored token:', data?.session?.accessToken ? 'Present' : 'Missing');
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Test Database Connection
|
|
57
|
+
```javascript
|
|
58
|
+
// Simple query to test connection
|
|
59
|
+
const { error } = await client.database.from('users').select().limit(1);
|
|
60
|
+
if (error) {
|
|
61
|
+
console.log('Database issue:', error);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 4. Enable Network Inspection
|
|
66
|
+
```javascript
|
|
67
|
+
// Browser: Open DevTools > Network tab
|
|
68
|
+
// Check request headers for Authorization: Bearer token
|
|
69
|
+
// Check response for error details
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 5. Test With Raw HTTP
|
|
73
|
+
```javascript
|
|
74
|
+
// When SDK fails, test endpoint directly
|
|
75
|
+
const response = await fetch('http://localhost:7130/api/database/records/posts', {
|
|
76
|
+
headers: {
|
|
77
|
+
'Authorization': 'Bearer ' + token
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
console.log('Raw response:', data);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Common Issues
|
|
85
|
+
|
|
86
|
+
### Empty Response
|
|
87
|
+
```javascript
|
|
88
|
+
// INSERT/UPDATE/DELETE return empty without Prefer header
|
|
89
|
+
// SDK handles this automatically, but check if using raw API
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Array Format
|
|
93
|
+
```javascript
|
|
94
|
+
// POST requires array
|
|
95
|
+
// ❌ Wrong: { title: 'Test' }
|
|
96
|
+
// ✅ Right: [{ title: 'Test' }]
|
|
97
|
+
// SDK handles this automatically
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Token Not Persisting
|
|
101
|
+
```javascript
|
|
102
|
+
// Check storage adapter
|
|
103
|
+
const client = createClient({
|
|
104
|
+
baseUrl: 'http://localhost:7130',
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### CORS Issues
|
|
109
|
+
```javascript
|
|
110
|
+
// Backend allows all origins by default
|
|
111
|
+
// If modified, check backend CORS settings
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Test Utilities
|
|
115
|
+
|
|
116
|
+
### Full Test Suite
|
|
117
|
+
```javascript
|
|
118
|
+
async function testSDK() {
|
|
119
|
+
const email = `test-${Date.now()}@example.com`;
|
|
120
|
+
|
|
121
|
+
// Test auth
|
|
122
|
+
console.log('Testing auth...');
|
|
123
|
+
const { error: signUpError } = await client.auth.signUp({ email, password: 'test123' });
|
|
124
|
+
if (signUpError) return console.error('SignUp failed:', signUpError);
|
|
125
|
+
|
|
126
|
+
// Test current user
|
|
127
|
+
const { data: user, error: userError } = await client.auth.getCurrentUser();
|
|
128
|
+
if (userError) return console.error('GetUser failed:', userError);
|
|
129
|
+
console.log('✅ Auth working, user:', user.user.id);
|
|
130
|
+
|
|
131
|
+
// Test database
|
|
132
|
+
console.log('Testing database...');
|
|
133
|
+
const { data: posts, error: dbError } = await client.database.from('posts').select().limit(1);
|
|
134
|
+
if (dbError) return console.error('Database failed:', dbError);
|
|
135
|
+
console.log('✅ Database working, posts:', posts.length);
|
|
136
|
+
|
|
137
|
+
// Test insert
|
|
138
|
+
const { error: insertError } = await client.database
|
|
139
|
+
.from('posts')
|
|
140
|
+
.insert({ title: 'Test', user_id: user.user.id })
|
|
141
|
+
.select();
|
|
142
|
+
if (insertError) return console.error('Insert failed:', insertError);
|
|
143
|
+
console.log('✅ Insert working');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
testSDK().catch(console.error);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Backend Verification
|
|
150
|
+
|
|
151
|
+
```javascript
|
|
152
|
+
// Check backend is running
|
|
153
|
+
fetch('http://localhost:7130/api/health')
|
|
154
|
+
.then(r => r.json())
|
|
155
|
+
.then(d => console.log('Backend:', d))
|
|
156
|
+
.catch(e => console.error('Backend not running'));
|
|
157
157
|
```
|