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,4 +1,5 @@
|
|
|
1
1
|
import { useState, useMemo } from 'react';
|
|
2
|
+
import { useNavigate } from 'react-router-dom';
|
|
2
3
|
import { Link2, AlertCircle, X } from 'lucide-react';
|
|
3
4
|
import {
|
|
4
5
|
Button,
|
|
@@ -17,6 +18,9 @@ import { useTables } from '@/features/database/hooks/useTables';
|
|
|
17
18
|
import { useRecords } from '@/features/database/hooks/useRecords';
|
|
18
19
|
import { convertSchemaToColumns } from '@/features/database/components/DatabaseDataGrid';
|
|
19
20
|
import { formatValueForDisplay } from '@/lib/utils/utils';
|
|
21
|
+
import { useQuery } from '@tanstack/react-query';
|
|
22
|
+
import { useUsers } from '@/features/auth/hooks/useUsers';
|
|
23
|
+
import { AUTH_USERS_TABLE, authUsersSchema } from '../constants';
|
|
20
24
|
|
|
21
25
|
interface ForeignKeyCellProps {
|
|
22
26
|
value: string;
|
|
@@ -29,9 +33,16 @@ interface ForeignKeyCellProps {
|
|
|
29
33
|
|
|
30
34
|
export function ForeignKeyCell({ value, foreignKey, onJumpToTable }: ForeignKeyCellProps) {
|
|
31
35
|
const [open, setOpen] = useState(false);
|
|
36
|
+
const navigate = useNavigate();
|
|
32
37
|
const { useTableSchema } = useTables();
|
|
38
|
+
const isAuthUsers = foreignKey.table === AUTH_USERS_TABLE;
|
|
39
|
+
|
|
40
|
+
// Regular table records hook (disabled for auth.users)
|
|
33
41
|
const recordsHook = useRecords(foreignKey.table);
|
|
34
42
|
|
|
43
|
+
// Auth users hook
|
|
44
|
+
const { getUser } = useUsers({ enabled: false });
|
|
45
|
+
|
|
35
46
|
// Helper function to safely render any value type (including JSON objects)
|
|
36
47
|
const renderValue = (val: ConvertedValue): string => {
|
|
37
48
|
return formatValueForDisplay(val);
|
|
@@ -39,16 +50,28 @@ export function ForeignKeyCell({ value, foreignKey, onJumpToTable }: ForeignKeyC
|
|
|
39
50
|
|
|
40
51
|
// Fetch the referenced record when popover opens
|
|
41
52
|
const searchValue = value ? renderValue(value) : '';
|
|
42
|
-
const {
|
|
43
|
-
data: recordData,
|
|
44
|
-
isLoading: _isLoading,
|
|
45
|
-
error,
|
|
46
|
-
} = recordsHook.useRecordByForeignKey(foreignKey.column, searchValue, open && !!value);
|
|
47
53
|
|
|
48
|
-
|
|
54
|
+
// For auth.users, fetch user by ID
|
|
55
|
+
const { data: authUserData, error: authUserError } = useQuery({
|
|
56
|
+
queryKey: ['user', searchValue],
|
|
57
|
+
queryFn: () => getUser(searchValue),
|
|
58
|
+
enabled: isAuthUsers && open && !!value,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// For regular tables, fetch by foreign key
|
|
62
|
+
const { data: recordData, error: recordError } = recordsHook.useRecordByForeignKey(
|
|
63
|
+
foreignKey.column,
|
|
64
|
+
searchValue,
|
|
65
|
+
!isAuthUsers && open && !!value
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// Use appropriate data source based on table type
|
|
69
|
+
const record = isAuthUsers ? authUserData : recordData;
|
|
70
|
+
const error = isAuthUsers ? authUserError : recordError;
|
|
49
71
|
|
|
50
|
-
// Fetch schema for the referenced table
|
|
51
|
-
const { data:
|
|
72
|
+
// Fetch schema for the referenced table (skip for auth.users)
|
|
73
|
+
const { data: fetchedSchema } = useTableSchema(foreignKey.table, !isAuthUsers && open && !!value);
|
|
74
|
+
const schema = isAuthUsers ? authUsersSchema : fetchedSchema;
|
|
52
75
|
|
|
53
76
|
// Convert schema to columns for the mini DataGrid
|
|
54
77
|
const columns = useMemo(() => {
|
|
@@ -142,18 +165,22 @@ export function ForeignKeyCell({ value, foreignKey, onJumpToTable }: ForeignKeyC
|
|
|
142
165
|
</div>
|
|
143
166
|
|
|
144
167
|
{/* Jump to Table Button */}
|
|
145
|
-
{onJumpToTable && (
|
|
168
|
+
{(onJumpToTable || isAuthUsers) && (
|
|
146
169
|
<div className="flex justify-end p-6 border-t border-border-gray dark:border-neutral-700">
|
|
147
170
|
<Button
|
|
148
171
|
variant="outline"
|
|
149
172
|
size="sm"
|
|
150
173
|
className="h-9 px-3 py-2 text-sm font-medium dark:text-white bg-bg-gray dark:bg-neutral-600"
|
|
151
174
|
onClick={() => {
|
|
152
|
-
|
|
175
|
+
if (isAuthUsers) {
|
|
176
|
+
void navigate('/dashboard/users');
|
|
177
|
+
} else if (onJumpToTable) {
|
|
178
|
+
onJumpToTable(foreignKey.table);
|
|
179
|
+
}
|
|
153
180
|
setOpen(false);
|
|
154
181
|
}}
|
|
155
182
|
>
|
|
156
|
-
Open Table
|
|
183
|
+
{isAuthUsers ? 'Open Users' : 'Open Table'}
|
|
157
184
|
</Button>
|
|
158
185
|
</div>
|
|
159
186
|
)}
|
|
@@ -16,6 +16,7 @@ import { UseFormReturn } from 'react-hook-form';
|
|
|
16
16
|
import { TableFormSchema, TableFormForeignKeySchema } from '../schema';
|
|
17
17
|
import { ColumnSchema, OnDeleteActionSchema, OnUpdateActionSchema } from '@insforge/shared-schemas';
|
|
18
18
|
import { cn } from '@/lib/utils/utils';
|
|
19
|
+
import { AUTH_USERS_TABLE } from '../constants';
|
|
19
20
|
|
|
20
21
|
interface ForeignKeyPopoverProps {
|
|
21
22
|
form: UseFormReturn<TableFormSchema>;
|
|
@@ -69,17 +70,26 @@ export function ForeignKeyPopover({
|
|
|
69
70
|
}
|
|
70
71
|
}, [open, initialValue]);
|
|
71
72
|
|
|
72
|
-
// Get available tables
|
|
73
|
-
const availableTables =
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
// Get available tables (include auth.users as a special option)
|
|
74
|
+
const availableTables = [
|
|
75
|
+
AUTH_USERS_TABLE,
|
|
76
|
+
...tables.filter((tableName) => mode === 'create' || tableName !== editTableName),
|
|
77
|
+
];
|
|
76
78
|
|
|
77
|
-
// Get columns for selected reference table
|
|
78
|
-
const
|
|
79
|
+
// Get columns for selected reference table (skip fetch for auth.users)
|
|
80
|
+
const isAuthUsers = newForeignKey.referenceTable === AUTH_USERS_TABLE;
|
|
81
|
+
const { data: fetchedTableSchema } = useTableSchema(
|
|
79
82
|
newForeignKey.referenceTable || '',
|
|
80
|
-
!!newForeignKey.referenceTable && open
|
|
83
|
+
!!newForeignKey.referenceTable && !isAuthUsers && open
|
|
81
84
|
);
|
|
82
85
|
|
|
86
|
+
// Use hardcoded schema for auth.users, otherwise use fetched schema
|
|
87
|
+
const referenceTableSchema = isAuthUsers
|
|
88
|
+
? {
|
|
89
|
+
columns: [{ columnName: 'id', type: 'uuid', isUnique: true, isNullable: false }],
|
|
90
|
+
}
|
|
91
|
+
: fetchedTableSchema;
|
|
92
|
+
|
|
83
93
|
// Get the type of the selected source column
|
|
84
94
|
const getSourceFieldType = useMemo(() => {
|
|
85
95
|
if (!newForeignKey.columnName) {
|
|
@@ -252,7 +262,7 @@ export function ForeignKeyPopover({
|
|
|
252
262
|
if (!col.isUnique) {
|
|
253
263
|
rightText = 'Not unique';
|
|
254
264
|
} else if (!typesMatch) {
|
|
255
|
-
rightText = '
|
|
265
|
+
rightText = 'Column types mismatch';
|
|
256
266
|
}
|
|
257
267
|
|
|
258
268
|
return (
|
|
@@ -20,9 +20,11 @@ import {
|
|
|
20
20
|
} from '@/components';
|
|
21
21
|
import { useTables } from '@/features/database/hooks/useTables';
|
|
22
22
|
import { useRecords } from '@/features/database/hooks/useRecords';
|
|
23
|
+
import { useUsers } from '@/features/auth/hooks/useUsers';
|
|
23
24
|
import { convertSchemaToColumns } from '@/features/database/components/DatabaseDataGrid';
|
|
24
25
|
import { formatValueForDisplay } from '@/lib/utils/utils';
|
|
25
26
|
import { ColumnType } from '@insforge/shared-schemas';
|
|
27
|
+
import { AUTH_USERS_TABLE, authUsersSchema } from '../constants';
|
|
26
28
|
|
|
27
29
|
const PAGE_SIZE = 50;
|
|
28
30
|
|
|
@@ -45,29 +47,67 @@ export function LinkRecordModal({
|
|
|
45
47
|
const [sortColumns, setSortColumns] = useState<SortColumn[]>([]);
|
|
46
48
|
const [currentPage, setCurrentPage] = useState(1);
|
|
47
49
|
const { useTableSchema } = useTables();
|
|
48
|
-
const
|
|
50
|
+
const isAuthUsers = referenceTable === AUTH_USERS_TABLE;
|
|
49
51
|
|
|
50
|
-
//
|
|
51
|
-
const
|
|
52
|
+
// Regular table records hook (disabled for auth.users)
|
|
53
|
+
const recordsHook = useRecords(isAuthUsers ? '' : referenceTable);
|
|
52
54
|
|
|
53
|
-
//
|
|
55
|
+
// Auth users hook
|
|
56
|
+
const {
|
|
57
|
+
users,
|
|
58
|
+
totalUsers,
|
|
59
|
+
isLoading: isLoadingUsers,
|
|
60
|
+
setCurrentPage: setUsersCurrentPage,
|
|
61
|
+
} = useUsers({
|
|
62
|
+
pageSize: PAGE_SIZE,
|
|
63
|
+
enabled: isAuthUsers && open,
|
|
64
|
+
searchQuery: isAuthUsers ? searchQuery : '',
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Sync current page with users hook
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (isAuthUsers) {
|
|
70
|
+
setUsersCurrentPage(currentPage);
|
|
71
|
+
}
|
|
72
|
+
}, [currentPage, isAuthUsers, setUsersCurrentPage]);
|
|
73
|
+
|
|
74
|
+
// Fetch table schema (skip for auth.users)
|
|
75
|
+
const { data: fetchedSchema } = useTableSchema(referenceTable, !isAuthUsers && open);
|
|
76
|
+
const schema = isAuthUsers ? authUsersSchema : fetchedSchema;
|
|
77
|
+
|
|
78
|
+
// Fetch records from the reference table (skip for auth.users)
|
|
54
79
|
const offset = (currentPage - 1) * PAGE_SIZE;
|
|
55
|
-
const { data: recordsResponse, isLoading } = recordsHook.useTableRecords(
|
|
80
|
+
const { data: recordsResponse, isLoading: isLoadingRecords } = recordsHook.useTableRecords(
|
|
56
81
|
PAGE_SIZE,
|
|
57
82
|
offset,
|
|
58
83
|
searchQuery || undefined,
|
|
59
84
|
sortColumns,
|
|
60
|
-
open
|
|
85
|
+
!isAuthUsers && open
|
|
61
86
|
);
|
|
62
87
|
|
|
63
|
-
|
|
64
|
-
|
|
88
|
+
// Combine data from either source
|
|
89
|
+
const recordsData = useMemo(() => {
|
|
90
|
+
if (isAuthUsers) {
|
|
91
|
+
return users.length > 0 || open
|
|
92
|
+
? {
|
|
93
|
+
schema: authUsersSchema,
|
|
94
|
+
records: users as DatabaseRecord[],
|
|
95
|
+
totalRecords: totalUsers,
|
|
96
|
+
}
|
|
97
|
+
: undefined;
|
|
98
|
+
}
|
|
99
|
+
return schema && recordsResponse
|
|
65
100
|
? {
|
|
66
101
|
schema,
|
|
67
102
|
records: recordsResponse.records,
|
|
68
|
-
totalRecords:
|
|
103
|
+
totalRecords:
|
|
104
|
+
recordsResponse.pagination.total ??
|
|
105
|
+
('recordCount' in schema ? (schema.recordCount as number) : 0),
|
|
69
106
|
}
|
|
70
107
|
: undefined;
|
|
108
|
+
}, [isAuthUsers, users, totalUsers, open, schema, recordsResponse]);
|
|
109
|
+
|
|
110
|
+
const isLoading = isAuthUsers ? isLoadingUsers : isLoadingRecords;
|
|
71
111
|
|
|
72
112
|
// Reset page when search query changes
|
|
73
113
|
useEffect(() => {
|
|
@@ -122,15 +162,23 @@ export function LinkRecordModal({
|
|
|
122
162
|
};
|
|
123
163
|
|
|
124
164
|
// Helper function to render cell value properly based on type
|
|
125
|
-
|
|
126
|
-
|
|
165
|
+
// Accepts DatabaseRecord value type and converts to display string
|
|
166
|
+
const renderCellValue = (
|
|
167
|
+
value: ConvertedValue | { [key: string]: string }[],
|
|
168
|
+
type: ColumnType | undefined
|
|
169
|
+
): string => {
|
|
170
|
+
// For JSON type, if value is already an object/array, stringify it for formatValueForDisplay
|
|
171
|
+
if (type === ColumnType.JSON && value !== null && typeof value === 'object') {
|
|
172
|
+
return formatValueForDisplay(JSON.stringify(value), type);
|
|
173
|
+
}
|
|
174
|
+
return formatValueForDisplay(value as ConvertedValue, type);
|
|
127
175
|
};
|
|
128
176
|
|
|
129
177
|
if (col.key === referenceColumn) {
|
|
130
178
|
return {
|
|
131
179
|
...baseCol,
|
|
132
180
|
renderCell: (props: RenderCellProps<DataGridRowType>) => {
|
|
133
|
-
const displayValue = renderCellValue(
|
|
181
|
+
const displayValue = renderCellValue(props.row[col.key], col.type);
|
|
134
182
|
return (
|
|
135
183
|
<div className="w-full h-full flex items-center cursor-pointer">
|
|
136
184
|
<span className="truncate font-medium" title={displayValue}>
|
|
@@ -155,7 +203,7 @@ export function LinkRecordModal({
|
|
|
155
203
|
...baseCol,
|
|
156
204
|
cellClass: 'link-modal-disabled-cell',
|
|
157
205
|
renderCell: (props: RenderCellProps<DataGridRowType>) => {
|
|
158
|
-
const displayValue = renderCellValue(
|
|
206
|
+
const displayValue = renderCellValue(props.row[col.key], col.type);
|
|
159
207
|
return (
|
|
160
208
|
<div className="w-full h-full flex items-center cursor-not-allowed relative">
|
|
161
209
|
<div className="absolute inset-0 pointer-events-none opacity-0 hover:opacity-10 bg-gray-200 dark:bg-gray-600 transition-opacity z-5" />
|
|
@@ -495,7 +495,7 @@ export function RecordFormField({ field, form, tableName }: RecordFormFieldProps
|
|
|
495
495
|
onChange={(newValue) => {
|
|
496
496
|
const result = convertValueForColumn(ColumnType.JSON, newValue as string);
|
|
497
497
|
if (result.success) {
|
|
498
|
-
formField.onChange(result.value
|
|
498
|
+
formField.onChange(result.value);
|
|
499
499
|
} else {
|
|
500
500
|
// If parsing fails, keep the string value
|
|
501
501
|
formField.onChange(newValue);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ExternalLink } from 'lucide-react';
|
|
2
|
+
import CodeMirror from '@uiw/react-codemirror';
|
|
3
|
+
import { sql } from '@codemirror/lang-sql';
|
|
4
|
+
import { EditorView } from '@codemirror/view';
|
|
5
|
+
import { vscodeDark, vscodeLight } from '@uiw/codemirror-theme-vscode';
|
|
6
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components';
|
|
7
|
+
import { useTheme } from '@/lib/contexts/ThemeContext';
|
|
8
|
+
|
|
9
|
+
const customTheme = EditorView.theme({
|
|
10
|
+
'&': { backgroundColor: 'transparent', maxHeight: '400px' },
|
|
11
|
+
'.cm-scroller': { overflow: 'auto' },
|
|
12
|
+
'.cm-gutters': { display: 'none' },
|
|
13
|
+
'.cm-content': { padding: '16px' },
|
|
14
|
+
'.cm-line': { padding: '0' },
|
|
15
|
+
'&.cm-focused': { outline: 'none' },
|
|
16
|
+
'.cm-selectionBackground': { backgroundColor: 'transparent !important' },
|
|
17
|
+
'&.cm-focused .cm-selectionBackground': { backgroundColor: 'transparent !important' },
|
|
18
|
+
'.cm-cursor': { display: 'none' },
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
interface SQLModalProps {
|
|
22
|
+
open: boolean;
|
|
23
|
+
onOpenChange: (open: boolean) => void;
|
|
24
|
+
title: string;
|
|
25
|
+
value: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function SQLModal({ open, onOpenChange, title, value }: SQLModalProps) {
|
|
29
|
+
const { resolvedTheme } = useTheme();
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
33
|
+
<DialogContent className="max-w-2xl">
|
|
34
|
+
<DialogHeader>
|
|
35
|
+
<DialogTitle className="text-zinc-950 dark:text-white">{title}</DialogTitle>
|
|
36
|
+
</DialogHeader>
|
|
37
|
+
<div className="mt-2 rounded-lg overflow-hidden bg-neutral-100 dark:bg-neutral-900">
|
|
38
|
+
<CodeMirror
|
|
39
|
+
value={value}
|
|
40
|
+
theme={[resolvedTheme === 'dark' ? vscodeDark : vscodeLight, customTheme]}
|
|
41
|
+
extensions={[sql(), EditorView.lineWrapping, EditorView.editable.of(false)]}
|
|
42
|
+
editable={false}
|
|
43
|
+
basicSetup={false}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
</DialogContent>
|
|
47
|
+
</Dialog>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface SQLCellButtonProps {
|
|
52
|
+
value: string | null;
|
|
53
|
+
onClick: () => void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function SQLCellButton({ value, onClick }: SQLCellButtonProps) {
|
|
57
|
+
if (!value) {
|
|
58
|
+
return <span className="text-sm">-</span>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<div className="flex items-center justify-between gap-1 min-w-0">
|
|
63
|
+
<span className="text-sm truncate">{value}</span>
|
|
64
|
+
<button
|
|
65
|
+
onClick={(e) => {
|
|
66
|
+
e.stopPropagation();
|
|
67
|
+
onClick();
|
|
68
|
+
}}
|
|
69
|
+
className="shrink-0 p-1 hover:bg-neutral-200 dark:hover:bg-neutral-700 rounded transition-colors"
|
|
70
|
+
>
|
|
71
|
+
<ExternalLink className="size-4 text-zinc-400 dark:text-neutral-400" />
|
|
72
|
+
</button>
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
@@ -360,9 +360,6 @@ export function TableForm({
|
|
|
360
360
|
// Invalidate all table data queries for this table (with all parameter combinations)
|
|
361
361
|
void queryClient.invalidateQueries({ queryKey: ['table', editTable?.tableName] });
|
|
362
362
|
|
|
363
|
-
// Invalidate the separate table schema query used by AddRecordSheet
|
|
364
|
-
void queryClient.invalidateQueries({ queryKey: ['table-schema', editTable?.tableName] });
|
|
365
|
-
|
|
366
363
|
showToast(`Table "${data.tableName}" updated successfully!`, 'success');
|
|
367
364
|
|
|
368
365
|
form.reset();
|
|
@@ -373,7 +370,6 @@ export function TableForm({
|
|
|
373
370
|
onError: (err) => {
|
|
374
371
|
// Invalidate queries to ensure we have fresh data after failed request
|
|
375
372
|
void queryClient.invalidateQueries({ queryKey: ['table', editTable?.tableName] });
|
|
376
|
-
void queryClient.invalidateQueries({ queryKey: ['table-schema', editTable?.tableName] });
|
|
377
373
|
|
|
378
374
|
const errorMessage = err.message || 'Failed to update table';
|
|
379
375
|
setError(errorMessage);
|
|
@@ -37,9 +37,6 @@ export function TableSidebar({
|
|
|
37
37
|
editLabel="Edit Table"
|
|
38
38
|
deleteLabel="Delete Table"
|
|
39
39
|
icon={Table}
|
|
40
|
-
filterItems={(tableNames) =>
|
|
41
|
-
tableNames.filter((name) => name !== 'auth' && name !== 'profiles' && name !== 'identifies')
|
|
42
|
-
}
|
|
43
40
|
renderSkeleton={() => <TableListSkeleton />}
|
|
44
41
|
renderEmptyState={(searchTerm) => <TableEmptyState searchTerm={searchTerm} />}
|
|
45
42
|
/>
|
|
@@ -15,7 +15,7 @@ export function TablesEmptyState({
|
|
|
15
15
|
onTemplateClick,
|
|
16
16
|
}: TablesEmptyStateProps) {
|
|
17
17
|
return (
|
|
18
|
-
<div className="flex justify-center w-full h-full bg-bg-gray dark:bg-neutral-800 px-6">
|
|
18
|
+
<div className="flex justify-center w-full h-full bg-bg-gray dark:bg-neutral-800 px-6 overflow-y-auto">
|
|
19
19
|
<div className="flex flex-col gap-6 max-w-[1024px] w-full pb-9 pt-6">
|
|
20
20
|
<h2 className="text-xl font-semibold text-zinc-950 dark:text-white leading-7 tracking-[-0.1px]">
|
|
21
21
|
Create Your First Table
|
|
@@ -70,7 +70,7 @@ export function TemplatePreview({ template, onCancel }: TemplatePreviewProps) {
|
|
|
70
70
|
externalSchemas={template.visualizerSchema}
|
|
71
71
|
metadata={{
|
|
72
72
|
auth: {
|
|
73
|
-
|
|
73
|
+
providers: [],
|
|
74
74
|
},
|
|
75
75
|
database: {
|
|
76
76
|
tables: [],
|
|
@@ -80,7 +80,6 @@ export function TemplatePreview({ template, onCancel }: TemplatePreviewProps) {
|
|
|
80
80
|
buckets: [],
|
|
81
81
|
totalSizeInGB: 0,
|
|
82
82
|
},
|
|
83
|
-
functions: [],
|
|
84
83
|
}}
|
|
85
84
|
showControls={false}
|
|
86
85
|
showMiniMap={false}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { Type, Clock, Calendar, Hash, Percent, ToggleLeft, Fingerprint, Code } from 'lucide-react';
|
|
2
2
|
import { ColumnType } from '@insforge/shared-schemas';
|
|
3
3
|
|
|
4
|
+
// Special handling for auth.users foreign key references
|
|
5
|
+
export const AUTH_USERS_TABLE = 'auth.users';
|
|
6
|
+
|
|
7
|
+
// schema for auth.users - used for displaying user records
|
|
8
|
+
export const authUsersSchema = {
|
|
9
|
+
tableName: 'auth.users',
|
|
10
|
+
columns: [
|
|
11
|
+
{ columnName: 'id', type: 'uuid', isUnique: true, isNullable: false },
|
|
12
|
+
{ columnName: 'email', type: 'string', isUnique: true, isNullable: false },
|
|
13
|
+
{ columnName: 'emailVerified', type: 'boolean', isUnique: false, isNullable: false },
|
|
14
|
+
{ columnName: 'providers', type: 'json', isUnique: false, isNullable: true },
|
|
15
|
+
{ columnName: 'createdAt', type: 'timestamp', isUnique: false, isNullable: false },
|
|
16
|
+
{ columnName: 'updatedAt', type: 'timestamp', isUnique: false, isNullable: false },
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
|
|
4
20
|
export const columnTypeIcons: Record<ColumnType, React.ComponentType<{ className?: string }>> = {
|
|
5
21
|
[ColumnType.STRING]: Type,
|
|
6
22
|
[ColumnType.DATE]: Calendar,
|
|
@@ -22,31 +38,3 @@ export const columnTypeDescriptions: Record<ColumnType, string> = {
|
|
|
22
38
|
[ColumnType.UUID]: 'Unique identifiers (auto-generated)',
|
|
23
39
|
[ColumnType.JSON]: 'Complex structured data',
|
|
24
40
|
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* System tables that should be filtered out from user-facing database views
|
|
28
|
-
*/
|
|
29
|
-
export const SYSTEM_TABLES = ['users'];
|
|
30
|
-
export const SYSTEM_FUNCTIONS = [
|
|
31
|
-
'create_default_policies',
|
|
32
|
-
'create_policies_after_rls',
|
|
33
|
-
'email',
|
|
34
|
-
'reload_postgrest_schema',
|
|
35
|
-
'role',
|
|
36
|
-
'uid',
|
|
37
|
-
'update_updated_at_column',
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Check if a table name is a system table
|
|
42
|
-
*/
|
|
43
|
-
export function isSystemTable(tableName: string): boolean {
|
|
44
|
-
return tableName.startsWith('_') || SYSTEM_TABLES.includes(tableName);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Check if a function name is a system function
|
|
49
|
-
*/
|
|
50
|
-
export function isSystemFunction(functionName: string): boolean {
|
|
51
|
-
return SYSTEM_FUNCTIONS.includes(functionName);
|
|
52
|
-
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { useMutation } from '@tanstack/react-query';
|
|
2
|
-
import { recordService
|
|
2
|
+
import { recordService } from '../services/record.service.js';
|
|
3
|
+
import { BulkUpsertResponse } from '@insforge/shared-schemas';
|
|
3
4
|
|
|
4
5
|
interface UseCSVImportOptions {
|
|
5
|
-
onSuccess?: (data:
|
|
6
|
+
onSuccess?: (data: BulkUpsertResponse) => void;
|
|
6
7
|
onError?: (error: Error) => void;
|
|
7
8
|
}
|
|
8
9
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { databaseService } from '../services/database.service';
|
|
3
|
+
|
|
4
|
+
export function useFunctions(enabled = false) {
|
|
5
|
+
const { data, isLoading, error, refetch } = useQuery({
|
|
6
|
+
queryKey: ['database', 'functions'],
|
|
7
|
+
queryFn: () => databaseService.getFunctions(),
|
|
8
|
+
staleTime: 5 * 60 * 1000, // Cache for 5 minutes
|
|
9
|
+
enabled,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
data,
|
|
14
|
+
isLoading,
|
|
15
|
+
error,
|
|
16
|
+
refetch,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function useIndexes(enabled = false) {
|
|
21
|
+
const { data, isLoading, error, refetch } = useQuery({
|
|
22
|
+
queryKey: ['database', 'indexes'],
|
|
23
|
+
queryFn: () => databaseService.getIndexes(),
|
|
24
|
+
staleTime: 5 * 60 * 1000, // Cache for 5 minutes
|
|
25
|
+
enabled,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
data,
|
|
30
|
+
isLoading,
|
|
31
|
+
error,
|
|
32
|
+
refetch,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function usePolicies(enabled = false) {
|
|
37
|
+
const { data, isLoading, error, refetch } = useQuery({
|
|
38
|
+
queryKey: ['database', 'policies'],
|
|
39
|
+
queryFn: () => databaseService.getPolicies(),
|
|
40
|
+
staleTime: 5 * 60 * 1000, // Cache for 5 minutes
|
|
41
|
+
enabled,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
data,
|
|
46
|
+
isLoading,
|
|
47
|
+
error,
|
|
48
|
+
refetch,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function useTriggers(enabled = false) {
|
|
53
|
+
const { data, isLoading, error, refetch } = useQuery({
|
|
54
|
+
queryKey: ['database', 'triggers'],
|
|
55
|
+
queryFn: () => databaseService.getTriggers(),
|
|
56
|
+
staleTime: 5 * 60 * 1000, // Cache for 5 minutes
|
|
57
|
+
enabled,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
data,
|
|
62
|
+
isLoading,
|
|
63
|
+
error,
|
|
64
|
+
refetch,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
2
|
-
import { advanceService
|
|
2
|
+
import { advanceService } from '../services/advance.service';
|
|
3
|
+
import { RawSQLResponse } from '@insforge/shared-schemas';
|
|
3
4
|
import { useToast } from '@/lib/hooks/useToast';
|
|
4
5
|
|
|
5
6
|
interface UseRawSQLOptions {
|
|
@@ -28,7 +29,7 @@ export function useRawSQL(options?: UseRawSQLOptions) {
|
|
|
28
29
|
void queryClient.invalidateQueries({ queryKey: ['tables', 'schemas'] });
|
|
29
30
|
|
|
30
31
|
if (options?.showSuccessToast !== false) {
|
|
31
|
-
const message =
|
|
32
|
+
const message = 'SQL query executed successfully';
|
|
32
33
|
showToast(message, 'success');
|
|
33
34
|
}
|
|
34
35
|
options?.onSuccess?.(data);
|