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
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import { DatabaseAdvanceService } from '../../src/services/database/database-advance.service';
|
|
3
|
+
import { AppError } from '../../src/api/middlewares/error';
|
|
4
|
+
import { ERROR_CODES } from '../../src/types/error-constants';
|
|
5
|
+
|
|
6
|
+
describe('DatabaseAdvanceService - sanitizeQuery', () => {
|
|
7
|
+
const service = DatabaseAdvanceService.getInstance();
|
|
8
|
+
|
|
9
|
+
describe('auth schema blocking', () => {
|
|
10
|
+
test('blocks DELETE FROM auth.users', () => {
|
|
11
|
+
const query = "DELETE FROM auth.users WHERE id = '00000000-0000-0000-0000-000000000001'";
|
|
12
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
13
|
+
expect(() => service.sanitizeQuery(query)).toThrow(/auth schema/i);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('blocks DELETE FROM quoted auth schema', () => {
|
|
17
|
+
const query = 'DELETE FROM "auth"."users" WHERE id = $1';
|
|
18
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('blocks TRUNCATE auth.users', () => {
|
|
22
|
+
const query = 'TRUNCATE TABLE auth.users';
|
|
23
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('blocks TRUNCATE without TABLE keyword', () => {
|
|
27
|
+
const query = 'TRUNCATE auth.users';
|
|
28
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('blocks DROP TABLE auth.users', () => {
|
|
32
|
+
const query = 'DROP TABLE auth.users';
|
|
33
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('blocks DROP TABLE with IF EXISTS', () => {
|
|
37
|
+
const query = 'DROP TABLE IF EXISTS auth.users';
|
|
38
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('blocks DROP INDEX on auth schema', () => {
|
|
42
|
+
const query = 'DROP INDEX auth.users_email_idx';
|
|
43
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('blocks DROP TRIGGER on auth schema tables', () => {
|
|
47
|
+
const queries = [
|
|
48
|
+
'DROP TRIGGER user_created_trigger ON auth.users',
|
|
49
|
+
'DROP TRIGGER IF EXISTS user_created_trigger ON auth.users',
|
|
50
|
+
'DROP TRIGGER trigger_name ON "auth"."users"',
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
queries.forEach((query) => {
|
|
54
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('blocks DROP FUNCTION on auth schema', () => {
|
|
59
|
+
const query = 'DROP FUNCTION auth.create_user_profile()';
|
|
60
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('blocks DROP VIEW on auth schema', () => {
|
|
64
|
+
const query = 'DROP VIEW auth.user_summary';
|
|
65
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('blocks DROP SCHEMA auth (no dot after auth)', () => {
|
|
69
|
+
const queries = [
|
|
70
|
+
'DROP SCHEMA auth',
|
|
71
|
+
'DROP SCHEMA auth CASCADE',
|
|
72
|
+
'DROP SCHEMA IF EXISTS auth',
|
|
73
|
+
'DROP SCHEMA "auth" CASCADE',
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
queries.forEach((query) => {
|
|
77
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('allows SELECT FROM auth.users (read-only)', () => {
|
|
82
|
+
const query = 'SELECT * FROM auth.users LIMIT 1';
|
|
83
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('blocks case-insensitive AUTH.users', () => {
|
|
87
|
+
const query = 'DELETE FROM AUTH.users WHERE id = $1';
|
|
88
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('blocks mixed case Auth.Users', () => {
|
|
92
|
+
const query = 'DELETE FROM Auth.Users WHERE id = $1';
|
|
93
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('blocks auth schema with quoted table name', () => {
|
|
97
|
+
const query = 'DELETE FROM auth."users" WHERE id = $1';
|
|
98
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('blocks DELETE with whitespace before dot in auth schema', () => {
|
|
102
|
+
const queries = [
|
|
103
|
+
'DELETE FROM auth . users WHERE id = $1',
|
|
104
|
+
'DELETE FROM auth .users WHERE id = $1',
|
|
105
|
+
'DELETE FROM auth\t.users WHERE id = $1',
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
queries.forEach((query) => {
|
|
109
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('allows UPDATE on auth schema (not blocked)', () => {
|
|
114
|
+
// UPDATE is allowed on auth schema
|
|
115
|
+
const queries = [
|
|
116
|
+
'UPDATE auth.users SET email = $1 WHERE id = $2',
|
|
117
|
+
'UPDATE auth.user_providers SET provider = $1 WHERE id = $2',
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
queries.forEach((query) => {
|
|
121
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('blocks DELETE on other auth schema tables', () => {
|
|
126
|
+
const queries = [
|
|
127
|
+
'DELETE FROM auth.user_providers WHERE id = $1',
|
|
128
|
+
'DELETE FROM auth.configs WHERE id = $1',
|
|
129
|
+
'DELETE FROM auth.oauth_configs WHERE id = $1',
|
|
130
|
+
];
|
|
131
|
+
|
|
132
|
+
queries.forEach((query) => {
|
|
133
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('blocks TRUNCATE on other auth schema tables', () => {
|
|
138
|
+
const queries = ['TRUNCATE TABLE auth.user_providers', 'TRUNCATE auth.configs'];
|
|
139
|
+
|
|
140
|
+
queries.forEach((query) => {
|
|
141
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('blocks DROP operations on other auth schema tables', () => {
|
|
146
|
+
const queries = [
|
|
147
|
+
'DROP TABLE auth.user_providers',
|
|
148
|
+
'DROP INDEX auth.configs_key_idx',
|
|
149
|
+
'DROP FUNCTION auth.some_function()',
|
|
150
|
+
'DROP VIEW auth.user_view',
|
|
151
|
+
'DROP SEQUENCE auth.user_id_seq',
|
|
152
|
+
'DROP POLICY auth_policy ON auth.users',
|
|
153
|
+
'DROP TYPE auth.user_type',
|
|
154
|
+
'DROP DOMAIN auth.email_domain',
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
queries.forEach((query) => {
|
|
158
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('allows SELECT on other auth schema tables', () => {
|
|
163
|
+
const queries = [
|
|
164
|
+
'SELECT * FROM auth.email_otps',
|
|
165
|
+
'SELECT * FROM auth.user_providers',
|
|
166
|
+
'SELECT * FROM auth.configs',
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
queries.forEach((query) => {
|
|
170
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test('allows INSERT into auth schema (for test users)', () => {
|
|
175
|
+
const queries = [
|
|
176
|
+
"INSERT INTO auth.users (email, password) VALUES ('test@example.com', 'hashed')",
|
|
177
|
+
'INSERT INTO auth.user_providers (user_id, provider) VALUES ($1, $2)',
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
queries.forEach((query) => {
|
|
181
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('allows CREATE TRIGGER on auth schema', () => {
|
|
186
|
+
const query =
|
|
187
|
+
'CREATE TRIGGER user_profile_trigger AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION create_user_profile()';
|
|
188
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('allows ALTER TABLE on auth schema (for indexes, constraints)', () => {
|
|
192
|
+
const queries = [
|
|
193
|
+
'ALTER TABLE auth.users ADD CONSTRAINT email_unique UNIQUE (email)',
|
|
194
|
+
'CREATE INDEX idx_auth_users_email ON auth.users(email)',
|
|
195
|
+
];
|
|
196
|
+
|
|
197
|
+
queries.forEach((query) => {
|
|
198
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('throws AppError with FORBIDDEN error code', () => {
|
|
203
|
+
const query = 'DELETE FROM auth.users WHERE id = $1';
|
|
204
|
+
try {
|
|
205
|
+
service.sanitizeQuery(query);
|
|
206
|
+
expect.fail('Should have thrown an error');
|
|
207
|
+
} catch (error) {
|
|
208
|
+
expect(error).toBeInstanceOf(AppError);
|
|
209
|
+
if (error instanceof AppError) {
|
|
210
|
+
expect(error.statusCode).toBe(403);
|
|
211
|
+
expect(error.code).toBe(ERROR_CODES.FORBIDDEN);
|
|
212
|
+
expect(error.message).toContain('auth schema');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
describe('allowed queries', () => {
|
|
219
|
+
test('allows DELETE from other tables even when auth is referenced in subquery', () => {
|
|
220
|
+
const queries = [
|
|
221
|
+
'DELETE FROM orders WHERE user_id NOT IN (SELECT id FROM auth.users)',
|
|
222
|
+
'DELETE FROM user_profiles WHERE id IN (SELECT user_id FROM auth.sessions WHERE expired = true)',
|
|
223
|
+
'DELETE FROM public.users WHERE email IN (SELECT email FROM auth.users WHERE verified = false)',
|
|
224
|
+
];
|
|
225
|
+
|
|
226
|
+
queries.forEach((query) => {
|
|
227
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test('allows queries with auth schema in string literals or comments', () => {
|
|
232
|
+
const queries = [
|
|
233
|
+
"SELECT 'DELETE FROM auth.users' AS example_query",
|
|
234
|
+
'/* DELETE FROM auth.users */ SELECT * FROM public.users',
|
|
235
|
+
"SELECT 'DROP TABLE auth.users' AS test",
|
|
236
|
+
];
|
|
237
|
+
|
|
238
|
+
queries.forEach((query) => {
|
|
239
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test('blocks DELETE FROM auth even when previous line has a comment', () => {
|
|
244
|
+
const queries = [
|
|
245
|
+
'SELECT 1; -- some comment\nDELETE FROM auth.users WHERE id = 1',
|
|
246
|
+
'-- previous comment\nDELETE FROM auth.users',
|
|
247
|
+
'/* block comment */\nDELETE FROM auth.users WHERE id = 1',
|
|
248
|
+
];
|
|
249
|
+
|
|
250
|
+
queries.forEach((query) => {
|
|
251
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
test('allows SELECT from public schema', () => {
|
|
256
|
+
const query = 'SELECT 1 as test';
|
|
257
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test('allows auth.uid() function calls', () => {
|
|
261
|
+
const queries = [
|
|
262
|
+
'SELECT auth.uid()',
|
|
263
|
+
'SELECT * FROM users WHERE id = auth.uid()',
|
|
264
|
+
'CREATE POLICY test ON users FOR SELECT USING (id = auth.uid())',
|
|
265
|
+
];
|
|
266
|
+
|
|
267
|
+
queries.forEach((query) => {
|
|
268
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
test('allows auth.role() and auth.email() function calls', () => {
|
|
273
|
+
const queries = [
|
|
274
|
+
'SELECT auth.role()',
|
|
275
|
+
'SELECT auth.email()',
|
|
276
|
+
'SELECT * FROM users WHERE email = auth.email()',
|
|
277
|
+
];
|
|
278
|
+
|
|
279
|
+
queries.forEach((query) => {
|
|
280
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test('allows DELETE from public schema tables', () => {
|
|
285
|
+
const query = 'DELETE FROM users WHERE id = $1';
|
|
286
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
test('allows INSERT into public schema tables', () => {
|
|
290
|
+
const query = "INSERT INTO products (name) VALUES ('test')";
|
|
291
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test('allows UPDATE public schema tables', () => {
|
|
295
|
+
const query = 'UPDATE products SET price = 100 WHERE id = $1';
|
|
296
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
test('allows CREATE TABLE in public schema', () => {
|
|
300
|
+
const query = 'CREATE TABLE test_table (id UUID PRIMARY KEY)';
|
|
301
|
+
expect(() => service.sanitizeQuery(query)).not.toThrow();
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
describe('other blocked operations', () => {
|
|
306
|
+
test('blocks DROP DATABASE', () => {
|
|
307
|
+
const query = 'DROP DATABASE testdb';
|
|
308
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test('blocks CREATE DATABASE', () => {
|
|
312
|
+
const query = 'CREATE DATABASE testdb';
|
|
313
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
test('blocks ALTER DATABASE', () => {
|
|
317
|
+
const query = 'ALTER DATABASE testdb SET connection_limit = 100';
|
|
318
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test('blocks pg_catalog access', () => {
|
|
322
|
+
const query = 'SELECT * FROM pg_catalog.pg_tables';
|
|
323
|
+
expect(() => service.sanitizeQuery(query)).toThrow(AppError);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
@@ -57,7 +57,7 @@ describe('convertSqlTypeToColumnType', () => {
|
|
|
57
57
|
});
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
it('returns first
|
|
61
|
-
expect(convertSqlTypeToColumnType('customtype')).toBe('
|
|
60
|
+
it('returns first 8 chars for unknown types', () => {
|
|
61
|
+
expect(convertSqlTypeToColumnType('customtype')).toBe('customty');
|
|
62
62
|
});
|
|
63
63
|
});
|
package/backend/tsconfig.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ES2022",
|
|
5
|
-
"lib": ["ES2022"],
|
|
6
|
-
"outDir": "../dist",
|
|
7
|
-
"baseUrl": ".",
|
|
8
|
-
"paths": {
|
|
9
|
-
"@/*": ["./src/*"],
|
|
10
|
-
"@insforge/shared-schemas": ["../shared-schemas/src/index.ts"]
|
|
11
|
-
},
|
|
12
|
-
"strict": true,
|
|
13
|
-
"esModuleInterop": true,
|
|
14
|
-
"skipLibCheck": true,
|
|
15
|
-
"forceConsistentCasingInFileNames": true,
|
|
16
|
-
"moduleResolution": "node",
|
|
17
|
-
"resolveJsonModule": true,
|
|
18
|
-
"allowSyntheticDefaultImports": true,
|
|
19
|
-
"types": ["node","vitest" ]
|
|
20
|
-
},
|
|
21
|
-
"include": ["src/**/*", "../shared-schemas/src/**/*"],
|
|
22
|
-
"exclude": ["node_modules", "dist"]
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ES2022",
|
|
5
|
+
"lib": ["ES2022"],
|
|
6
|
+
"outDir": "../dist",
|
|
7
|
+
"baseUrl": ".",
|
|
8
|
+
"paths": {
|
|
9
|
+
"@/*": ["./src/*"],
|
|
10
|
+
"@insforge/shared-schemas": ["../shared-schemas/src/index.ts"]
|
|
11
|
+
},
|
|
12
|
+
"strict": true,
|
|
13
|
+
"esModuleInterop": true,
|
|
14
|
+
"skipLibCheck": true,
|
|
15
|
+
"forceConsistentCasingInFileNames": true,
|
|
16
|
+
"moduleResolution": "node",
|
|
17
|
+
"resolveJsonModule": true,
|
|
18
|
+
"allowSyntheticDefaultImports": true,
|
|
19
|
+
"types": ["node","vitest" ]
|
|
20
|
+
},
|
|
21
|
+
"include": ["src/**/*", "../shared-schemas/src/**/*"],
|
|
22
|
+
"exclude": ["node_modules", "dist"]
|
|
23
23
|
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "insforge",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Official InsForge plugin for Claude Code with skills, templates, and commands for building full-stack applications with InsForge BaaS",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "InsForge Team"
|
|
7
|
-
},
|
|
8
|
-
"repository": "https://github.com/InsForge/InsForge",
|
|
9
|
-
"homepage": "https://insforge.com",
|
|
10
|
-
"keywords": [
|
|
11
|
-
"insforge",
|
|
12
|
-
"baas",
|
|
13
|
-
"backend-as-a-service",
|
|
14
|
-
"postgresql",
|
|
15
|
-
"postgrest",
|
|
16
|
-
"full-stack",
|
|
17
|
-
"react",
|
|
18
|
-
"database",
|
|
19
|
-
"storage",
|
|
20
|
-
"edge-functions",
|
|
21
|
-
"authentication"
|
|
22
|
-
],
|
|
23
|
-
"license": "MIT"
|
|
24
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "insforge",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Official InsForge plugin for Claude Code with skills, templates, and commands for building full-stack applications with InsForge BaaS",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "InsForge Team"
|
|
7
|
+
},
|
|
8
|
+
"repository": "https://github.com/InsForge/InsForge",
|
|
9
|
+
"homepage": "https://insforge.com",
|
|
10
|
+
"keywords": [
|
|
11
|
+
"insforge",
|
|
12
|
+
"baas",
|
|
13
|
+
"backend-as-a-service",
|
|
14
|
+
"postgresql",
|
|
15
|
+
"postgrest",
|
|
16
|
+
"full-stack",
|
|
17
|
+
"react",
|
|
18
|
+
"database",
|
|
19
|
+
"storage",
|
|
20
|
+
"edge-functions",
|
|
21
|
+
"authentication"
|
|
22
|
+
],
|
|
23
|
+
"license": "MIT"
|
|
24
|
+
}
|