insforge 0.3.1
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/.dockerignore +58 -0
- package/.env.example +49 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
- package/.github/copilot-instructions.md +147 -0
- package/.github/workflows/build-image.yml +65 -0
- package/.github/workflows/ci-premerge-check.yml +24 -0
- package/.github/workflows/deploy-aws.yml +130 -0
- package/.github/workflows/lint-and-format.yml +33 -0
- package/.prettierignore +65 -0
- package/.prettierrc +9 -0
- package/CHANGELOG.md +3 -0
- package/CONTRIBUTING.md +126 -0
- package/Dockerfile +27 -0
- package/GITHUB_OAUTH_SETUP.md +49 -0
- package/GOOGLE_OAUTH_SETUP.md +148 -0
- package/LICENSE +201 -0
- package/README.md +134 -0
- package/assets/Dark.svg +23 -0
- package/assets/archDiagram.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/assets/signin.png +0 -0
- package/assets/userflow.png +0 -0
- package/backend/migrations/000_create-base-tables.sql +142 -0
- package/backend/migrations/001_create-helper-functions.sql +41 -0
- package/backend/migrations/002_rename-auth-tables.sql +30 -0
- package/backend/migrations/003_create-users-table.sql +56 -0
- package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
- package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
- package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
- package/backend/migrations/007_drop-metadata-table.sql +2 -0
- package/backend/migrations/008_add-system-tables.sql +77 -0
- package/backend/migrations/009_add-function-secrets.sql +24 -0
- package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
- package/backend/migrations/011_refactor-secrets-table.sql +15 -0
- package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
- package/backend/package.json +75 -0
- package/backend/src/api/middleware/auth.ts +240 -0
- package/backend/src/api/middleware/error.ts +231 -0
- package/backend/src/api/middleware/upload.ts +59 -0
- package/backend/src/api/routes/agent.ts +29 -0
- package/backend/src/api/routes/ai.ts +472 -0
- package/backend/src/api/routes/auth.oauth.ts +482 -0
- package/backend/src/api/routes/auth.ts +386 -0
- package/backend/src/api/routes/database.advance.ts +275 -0
- package/backend/src/api/routes/database.records.ts +246 -0
- package/backend/src/api/routes/database.tables.ts +161 -0
- package/backend/src/api/routes/docs.ts +66 -0
- package/backend/src/api/routes/functions.ts +183 -0
- package/backend/src/api/routes/logs.ts +150 -0
- package/backend/src/api/routes/metadata.ts +160 -0
- package/backend/src/api/routes/openapi.ts +82 -0
- package/backend/src/api/routes/secrets.ts +199 -0
- package/backend/src/api/routes/storage.ts +547 -0
- package/backend/src/api/routes/usage.ts +96 -0
- package/backend/src/core/ai/chat.ts +207 -0
- package/backend/src/core/ai/client.ts +242 -0
- package/backend/src/core/ai/config.ts +187 -0
- package/backend/src/core/ai/image.ts +156 -0
- package/backend/src/core/ai/model.ts +117 -0
- package/backend/src/core/ai/usage.ts +290 -0
- package/backend/src/core/auth/auth.ts +781 -0
- package/backend/src/core/auth/oauth.ts +398 -0
- package/backend/src/core/database/advance.ts +1074 -0
- package/backend/src/core/database/manager.ts +178 -0
- package/backend/src/core/database/table.ts +772 -0
- package/backend/src/core/documentation/agent.ts +689 -0
- package/backend/src/core/documentation/openapi.ts +856 -0
- package/backend/src/core/functions/functions.ts +310 -0
- package/backend/src/core/logs/analytics.ts +76 -0
- package/backend/src/core/logs/audit.ts +255 -0
- package/backend/src/core/logs/providers/base.provider.ts +83 -0
- package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
- package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
- package/backend/src/core/secrets/encryption.ts +58 -0
- package/backend/src/core/secrets/secrets.ts +410 -0
- package/backend/src/core/socket/socket.ts +388 -0
- package/backend/src/core/socket/types.ts +79 -0
- package/backend/src/core/storage/storage.ts +923 -0
- package/backend/src/server.ts +288 -0
- package/backend/src/types/ai.ts +46 -0
- package/backend/src/types/auth.ts +90 -0
- package/backend/src/types/database.ts +136 -0
- package/backend/src/types/error-constants.ts +86 -0
- package/backend/src/types/logs.ts +47 -0
- package/backend/src/types/profile.ts +55 -0
- package/backend/src/types/storage.ts +23 -0
- package/backend/src/utils/cloud-token.ts +39 -0
- package/backend/src/utils/constants.ts +1 -0
- package/backend/src/utils/environment.ts +35 -0
- package/backend/src/utils/helpers.ts +49 -0
- package/backend/src/utils/logger.ts +13 -0
- package/backend/src/utils/response.ts +62 -0
- package/backend/src/utils/seed.ts +205 -0
- package/backend/src/utils/sql-parser.ts +63 -0
- package/backend/src/utils/uuid.ts +9 -0
- package/backend/src/utils/validations.ts +129 -0
- package/backend/tests/README.md +134 -0
- package/backend/tests/cleanup-all-test-data.sh +231 -0
- package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
- package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
- package/backend/tests/local/test-auth-router.sh +144 -0
- package/backend/tests/local/test-database-router.sh +222 -0
- package/backend/tests/local/test-e2e.sh +241 -0
- package/backend/tests/local/test-fk-errors.sh +97 -0
- package/backend/tests/local/test-id-field.sh +201 -0
- package/backend/tests/local/test-public-bucket.sh +265 -0
- package/backend/tests/local/test-secrets.sh +248 -0
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
- package/backend/tests/local/test-traditional-rest.sh +209 -0
- package/backend/tests/manual/README.md +51 -0
- package/backend/tests/manual/create-large-table-simple.sql +11 -0
- package/backend/tests/manual/seed-large-table.sql +101 -0
- package/backend/tests/manual/setup-large-table-extras.sql +34 -0
- package/backend/tests/manual/test-better-auth.sh +303 -0
- package/backend/tests/manual/test-bulk-upsert.sh +410 -0
- package/backend/tests/manual/test-database-advance.sh +297 -0
- package/backend/tests/manual/test-postgrest-stability.sh +192 -0
- package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
- package/backend/tests/manual/test-universal-storage.sh +264 -0
- package/backend/tests/manual/test-users.sql +18 -0
- package/backend/tests/run-all-tests.sh +140 -0
- package/backend/tests/setup.ts +22 -0
- package/backend/tests/test-config.sh +303 -0
- package/backend/tsconfig.json +23 -0
- package/backend/tsup.config.ts +18 -0
- package/backend/vitest.config.ts +22 -0
- package/docker-compose.prod.yml +145 -0
- package/docker-compose.yml +167 -0
- package/docker-init/db/db-init.sql +125 -0
- package/docker-init/db/jwt.sql +5 -0
- package/docker-init/db/logs.sql +9 -0
- package/docker-init/db/postgresql.conf +17 -0
- package/docs/deprecated/insforge-auth-api.md +215 -0
- package/docs/deprecated/insforge-auth-sdk.md +100 -0
- package/docs/deprecated/insforge-db-api.md +359 -0
- package/docs/deprecated/insforge-db-sdk.md +140 -0
- package/docs/deprecated/insforge-debug-sdk.md +157 -0
- package/docs/deprecated/insforge-debug.md +65 -0
- package/docs/deprecated/insforge-instructions.md +124 -0
- package/docs/deprecated/insforge-project.md +118 -0
- package/docs/deprecated/insforge-storage-api.md +279 -0
- package/docs/deprecated/insforge-storage-sdk.md +159 -0
- package/docs/insforge-instructions-sdk.md +407 -0
- package/eslint.config.js +317 -0
- package/examples/oauth/frontend-oauth-example.html +251 -0
- package/examples/response-examples.md +444 -0
- package/frontend/README.md +112 -0
- package/frontend/components.json +17 -0
- package/frontend/index.html +13 -0
- package/frontend/package.json +63 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/src/App.tsx +106 -0
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
- package/frontend/src/assets/icons/checked.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -0
- package/frontend/src/assets/icons/pencil.svg +4 -0
- package/frontend/src/assets/icons/refresh.svg +4 -0
- package/frontend/src/assets/icons/step_active.svg +3 -0
- package/frontend/src/assets/icons/step_inactive.svg +11 -0
- package/frontend/src/assets/icons/warning.svg +3 -0
- package/frontend/src/assets/logos/amazon.svg +1 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -0
- package/frontend/src/assets/logos/cline.svg +6 -0
- package/frontend/src/assets/logos/cursor.svg +20 -0
- package/frontend/src/assets/logos/discord.svg +9 -0
- package/frontend/src/assets/logos/gemini.svg +19 -0
- package/frontend/src/assets/logos/github.svg +5 -0
- package/frontend/src/assets/logos/google.svg +13 -0
- package/frontend/src/assets/logos/grok.svg +10 -0
- package/frontend/src/assets/logos/insforge_dark.svg +15 -0
- package/frontend/src/assets/logos/insforge_light.svg +15 -0
- package/frontend/src/assets/logos/openai.svg +10 -0
- package/frontend/src/assets/logos/roo_code.svg +9 -0
- package/frontend/src/assets/logos/trae.svg +3 -0
- package/frontend/src/assets/logos/windsurf.svg +10 -0
- package/frontend/src/components/ButtonWithLoading.tsx +27 -0
- package/frontend/src/components/Checkbox.tsx +61 -0
- package/frontend/src/components/CodeBlock.tsx +32 -0
- package/frontend/src/components/ConfirmDialog.tsx +96 -0
- package/frontend/src/components/CopyButton.tsx +69 -0
- package/frontend/src/components/DeleteActionButton.tsx +42 -0
- package/frontend/src/components/EmptyState.tsx +41 -0
- package/frontend/src/components/ErrorState.tsx +35 -0
- package/frontend/src/components/FeatureSidebar.tsx +126 -0
- package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
- package/frontend/src/components/JsonHighlight.tsx +61 -0
- package/frontend/src/components/LoadingState.tsx +16 -0
- package/frontend/src/components/PaginationControls.tsx +54 -0
- package/frontend/src/components/PromptDialog.tsx +68 -0
- package/frontend/src/components/SearchInput.tsx +90 -0
- package/frontend/src/components/SelectionClearButton.tsx +26 -0
- package/frontend/src/components/Stepper.tsx +139 -0
- package/frontend/src/components/ThemeToggle.tsx +58 -0
- package/frontend/src/components/TypeBadge.tsx +20 -0
- package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
- package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
- package/frontend/src/components/datagrid/IdCell.tsx +44 -0
- package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
- package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
- package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
- package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
- package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
- package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
- package/frontend/src/components/datagrid/index.tsx +20 -0
- package/frontend/src/components/index.ts +39 -0
- package/frontend/src/components/layout/AppHeader.tsx +146 -0
- package/frontend/src/components/layout/AppSidebar.tsx +190 -0
- package/frontend/src/components/layout/CloudLayout.tsx +95 -0
- package/frontend/src/components/layout/Layout.tsx +43 -0
- package/frontend/src/components/radix/Alert.tsx +45 -0
- package/frontend/src/components/radix/AlertDialog.tsx +115 -0
- package/frontend/src/components/radix/Avatar.tsx +45 -0
- package/frontend/src/components/radix/Badge.tsx +33 -0
- package/frontend/src/components/radix/Button.tsx +50 -0
- package/frontend/src/components/radix/Card.tsx +58 -0
- package/frontend/src/components/radix/Dialog.tsx +98 -0
- package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
- package/frontend/src/components/radix/Form.tsx +167 -0
- package/frontend/src/components/radix/Input.tsx +22 -0
- package/frontend/src/components/radix/Label.tsx +19 -0
- package/frontend/src/components/radix/Popover.tsx +29 -0
- package/frontend/src/components/radix/ScrollArea.tsx +44 -0
- package/frontend/src/components/radix/Select.tsx +151 -0
- package/frontend/src/components/radix/Separator.tsx +26 -0
- package/frontend/src/components/radix/Sheet.tsx +119 -0
- package/frontend/src/components/radix/Skeleton.tsx +7 -0
- package/frontend/src/components/radix/Switch.tsx +29 -0
- package/frontend/src/components/radix/Tabs.tsx +50 -0
- package/frontend/src/components/radix/Textarea.tsx +21 -0
- package/frontend/src/components/radix/Tooltip.tsx +28 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
- package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
- package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
- package/frontend/src/features/ai/helpers.ts +155 -0
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
- package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
- package/frontend/src/features/ai/page/AIPage.tsx +178 -0
- package/frontend/src/features/ai/services/ai.service.ts +148 -0
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
- package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
- package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
- package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
- package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
- package/frontend/src/features/auth/index.ts +9 -0
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
- package/frontend/src/features/auth/services/auth.service.ts +112 -0
- package/frontend/src/features/auth/services/oauth.service.ts +49 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
- package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
- package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
- package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
- package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
- package/frontend/src/features/database/components/TableForm.tsx +656 -0
- package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
- package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
- package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
- package/frontend/src/features/database/constants.ts +26 -0
- package/frontend/src/features/database/helpers.ts +125 -0
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
- package/frontend/src/features/database/index.ts +12 -0
- package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
- package/frontend/src/features/database/schema.ts +25 -0
- package/frontend/src/features/database/services/database.service.ts +216 -0
- package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
- package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
- package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
- package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
- package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
- package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
- package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
- package/frontend/src/features/functions/services/functions.service.ts +48 -0
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
- package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
- package/frontend/src/features/login/page/LoginPage.tsx +174 -0
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
- package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
- package/frontend/src/features/logs/index.ts +5 -0
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
- package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
- package/frontend/src/features/logs/services/log.service.ts +171 -0
- package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
- package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
- package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
- package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
- package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
- package/frontend/src/features/onboard/index.ts +3 -0
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
- package/frontend/src/features/onboard/types.ts +8 -0
- package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
- package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
- package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
- package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
- package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
- package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
- package/frontend/src/features/storage/index.ts +3 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
- package/frontend/src/features/storage/services/storage.service.ts +144 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
- package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
- package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
- package/frontend/src/features/visualizer/components/index.ts +5 -0
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
- package/frontend/src/index.css +248 -0
- package/frontend/src/lib/api/client.ts +163 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
- package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
- package/frontend/src/lib/hooks/useAuth.ts +4 -0
- package/frontend/src/lib/hooks/useConfirm.ts +55 -0
- package/frontend/src/lib/hooks/useInterval.ts +27 -0
- package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
- package/frontend/src/lib/hooks/usePagination.ts +27 -0
- package/frontend/src/lib/hooks/useTimeout.ts +27 -0
- package/frontend/src/lib/hooks/useToast.tsx +229 -0
- package/frontend/src/lib/utils/constants.ts +38 -0
- package/frontend/src/lib/utils/utils.ts +165 -0
- package/frontend/src/lib/utils/validation-schemas.ts +126 -0
- package/frontend/src/main.tsx +16 -0
- package/frontend/src/rdg.css +194 -0
- package/frontend/src/vite-env.d.ts +12 -0
- package/frontend/tailwind.config.js +97 -0
- package/frontend/tsconfig.json +26 -0
- package/frontend/tsconfig.node.json +10 -0
- package/frontend/vite.config.ts +37 -0
- package/frontend/vitest.config.ts +36 -0
- package/functions/deno.json +25 -0
- package/functions/server.ts +290 -0
- package/functions/worker-template.js +126 -0
- package/openapi/ai.yaml +689 -0
- package/openapi/auth.yaml +563 -0
- package/openapi/functions.yaml +476 -0
- package/openapi/health.yaml +30 -0
- package/openapi/logs.yaml +224 -0
- package/openapi/metadata.yaml +178 -0
- package/openapi/records.yaml +382 -0
- package/openapi/secrets.yaml +371 -0
- package/openapi/storage.yaml +876 -0
- package/openapi/tables.yaml +464 -0
- package/package.json +88 -0
- package/shared-schemas/package.json +31 -0
- package/shared-schemas/src/ai-api.schema.ts +167 -0
- package/shared-schemas/src/ai.schema.ts +54 -0
- package/shared-schemas/src/auth-api.schema.ts +193 -0
- package/shared-schemas/src/auth.schema.ts +94 -0
- package/shared-schemas/src/database-api.schema.ts +259 -0
- package/shared-schemas/src/database.schema.ts +69 -0
- package/shared-schemas/src/functions-api.schema.ts +25 -0
- package/shared-schemas/src/functions.schema.ts +16 -0
- package/shared-schemas/src/index.ts +13 -0
- package/shared-schemas/src/logs-api.schema.ts +49 -0
- package/shared-schemas/src/logs.schema.ts +14 -0
- package/shared-schemas/src/metadata.schema.ts +56 -0
- package/shared-schemas/src/storage-api.schema.ts +65 -0
- package/shared-schemas/src/storage.schema.ts +19 -0
- package/shared-schemas/tsconfig.json +21 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { FileJson, AlertCircle, CheckCircle } from 'lucide-react';
|
|
3
|
+
import { Button } from '@/components/radix/Button';
|
|
4
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@/components/radix/Popover';
|
|
5
|
+
import { ConfirmDialog } from '@/components/ConfirmDialog';
|
|
6
|
+
import { cn } from '@/lib/utils/utils';
|
|
7
|
+
import type { JsonCellEditorProps } from './types';
|
|
8
|
+
|
|
9
|
+
export function JsonCellEditor({
|
|
10
|
+
value,
|
|
11
|
+
nullable,
|
|
12
|
+
onValueChange,
|
|
13
|
+
onCancel,
|
|
14
|
+
className,
|
|
15
|
+
}: JsonCellEditorProps) {
|
|
16
|
+
const [open, setOpen] = useState(true);
|
|
17
|
+
const [showNullConfirm, setShowNullConfirm] = useState(false);
|
|
18
|
+
const [jsonText, setJsonText] = useState(() => {
|
|
19
|
+
// Ensure value is always converted to string
|
|
20
|
+
if (!value || value === 'null') {
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// If value is already a string, try to parse and format it
|
|
25
|
+
if (typeof value === 'string') {
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(value);
|
|
28
|
+
return JSON.stringify(parsed, null, 2);
|
|
29
|
+
} catch {
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// If value is an object/array, stringify it
|
|
35
|
+
if (typeof value === 'object') {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.stringify(value, null, 2);
|
|
38
|
+
} catch {
|
|
39
|
+
return JSON.stringify(value);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// For any other type, convert to string
|
|
44
|
+
return String(value || '');
|
|
45
|
+
});
|
|
46
|
+
const [isValid, setIsValid] = useState(true);
|
|
47
|
+
const [error, setError] = useState<string | null>(null);
|
|
48
|
+
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
// Auto-open the popover when component mounts
|
|
51
|
+
setOpen(true);
|
|
52
|
+
}, []);
|
|
53
|
+
|
|
54
|
+
const validateJson = (text: string) => {
|
|
55
|
+
// Ensure text is a string before calling trim
|
|
56
|
+
const textStr = String(text || '');
|
|
57
|
+
if (textStr.trim() === '') {
|
|
58
|
+
setIsValid(true);
|
|
59
|
+
setError(null);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
JSON.parse(textStr);
|
|
65
|
+
setIsValid(true);
|
|
66
|
+
setError(null);
|
|
67
|
+
return true;
|
|
68
|
+
} catch (e) {
|
|
69
|
+
setIsValid(false);
|
|
70
|
+
setError(e instanceof Error ? e.message : 'Invalid JSON');
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const handleTextChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
76
|
+
const newText = e.target.value;
|
|
77
|
+
setJsonText(newText);
|
|
78
|
+
validateJson(newText);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const handleFormat = () => {
|
|
82
|
+
// Ensure jsonText is a string before calling trim
|
|
83
|
+
const textStr = String(jsonText || '');
|
|
84
|
+
if (textStr.trim() === '') {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(textStr);
|
|
90
|
+
setJsonText(JSON.stringify(parsed, null, 2));
|
|
91
|
+
setIsValid(true);
|
|
92
|
+
setError(null);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error(error);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const handleMinify = () => {
|
|
99
|
+
// Ensure jsonText is a string before calling trim
|
|
100
|
+
const textStr = String(jsonText || '');
|
|
101
|
+
if (textStr.trim() === '') {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const parsed = JSON.parse(textStr);
|
|
107
|
+
setJsonText(JSON.stringify(parsed));
|
|
108
|
+
setIsValid(true);
|
|
109
|
+
setError(null);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.error(error);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const handleSave = () => {
|
|
116
|
+
if (!isValid) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Ensure jsonText is a string before calling trim
|
|
121
|
+
const textStr = String(jsonText || '');
|
|
122
|
+
if (textStr.trim() === '') {
|
|
123
|
+
onValueChange(nullable ? 'null' : '{}');
|
|
124
|
+
} else {
|
|
125
|
+
try {
|
|
126
|
+
// Validate and normalize the JSON before saving
|
|
127
|
+
const parsed = JSON.parse(textStr);
|
|
128
|
+
onValueChange(JSON.stringify(parsed));
|
|
129
|
+
} catch {
|
|
130
|
+
// This shouldn't happen as we validate before enabling save
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
setOpen(false);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const handleSetNull = (e: React.MouseEvent) => {
|
|
138
|
+
e.preventDefault();
|
|
139
|
+
e.stopPropagation();
|
|
140
|
+
|
|
141
|
+
if (!nullable) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Check if there's existing data
|
|
146
|
+
const textStr = String(jsonText || '');
|
|
147
|
+
const hasData = textStr.trim() !== '' && textStr !== 'null';
|
|
148
|
+
|
|
149
|
+
if (hasData) {
|
|
150
|
+
// Show confirmation dialog if there's existing data
|
|
151
|
+
setShowNullConfirm(true);
|
|
152
|
+
} else {
|
|
153
|
+
// Directly set to null if no data
|
|
154
|
+
confirmSetNull();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const confirmSetNull = () => {
|
|
159
|
+
setShowNullConfirm(false);
|
|
160
|
+
onValueChange('null');
|
|
161
|
+
setOpen(false);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const handleOpenChange = (isOpen: boolean) => {
|
|
165
|
+
if (!isOpen && !showNullConfirm) {
|
|
166
|
+
// Only cancel if confirmation dialog is not showing
|
|
167
|
+
onCancel();
|
|
168
|
+
}
|
|
169
|
+
setOpen(isOpen);
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const formatDisplayValue = () => {
|
|
173
|
+
if (!value || value === 'null') {
|
|
174
|
+
return 'Empty JSON';
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
const parsed = typeof value === 'string' ? JSON.parse(value) : value;
|
|
179
|
+
|
|
180
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
181
|
+
return 'Invalid JSON';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const keys = Object.keys(parsed);
|
|
185
|
+
if (keys.length === 0) {
|
|
186
|
+
return '{}';
|
|
187
|
+
}
|
|
188
|
+
if (keys.length === 1) {
|
|
189
|
+
return `{ ${keys[0]}: ... }`;
|
|
190
|
+
}
|
|
191
|
+
return `{ ${keys.length} properties }`;
|
|
192
|
+
} catch {
|
|
193
|
+
return 'Invalid JSON';
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<>
|
|
199
|
+
<Popover open={open} onOpenChange={showNullConfirm ? undefined : handleOpenChange}>
|
|
200
|
+
<PopoverTrigger asChild>
|
|
201
|
+
<Button
|
|
202
|
+
variant="ghost"
|
|
203
|
+
className={cn(
|
|
204
|
+
'w-full justify-start text-sm text-left font-normal h-full border-0 p-0 hover:bg-transparent dark:text-white',
|
|
205
|
+
(!value || value === 'null') && 'text-muted-foreground',
|
|
206
|
+
className
|
|
207
|
+
)}
|
|
208
|
+
>
|
|
209
|
+
<FileJson className="mr-2 h-4 w-4" />
|
|
210
|
+
{formatDisplayValue()}
|
|
211
|
+
</Button>
|
|
212
|
+
</PopoverTrigger>
|
|
213
|
+
<PopoverContent
|
|
214
|
+
className="overflow-hidden w-125 p-0 dark:bg-neutral-800 dark:border-neutral-700"
|
|
215
|
+
align="start"
|
|
216
|
+
side="bottom"
|
|
217
|
+
>
|
|
218
|
+
<div className="p-4">
|
|
219
|
+
<div className="flex items-center justify-between mb-3">
|
|
220
|
+
<div className="flex items-center gap-2">
|
|
221
|
+
<FileJson className="h-4 w-4 text-muted-foreground" />
|
|
222
|
+
<span className="text-sm font-medium">JSON Editor</span>
|
|
223
|
+
</div>
|
|
224
|
+
<div className="flex items-center gap-2">
|
|
225
|
+
<Button
|
|
226
|
+
variant="ghost"
|
|
227
|
+
size="sm"
|
|
228
|
+
onClick={handleFormat}
|
|
229
|
+
disabled={!isValid || String(jsonText || '').trim() === ''}
|
|
230
|
+
className="h-7 px-2"
|
|
231
|
+
>
|
|
232
|
+
Format
|
|
233
|
+
</Button>
|
|
234
|
+
<Button
|
|
235
|
+
variant="ghost"
|
|
236
|
+
size="sm"
|
|
237
|
+
onClick={handleMinify}
|
|
238
|
+
disabled={!isValid || String(jsonText || '').trim() === ''}
|
|
239
|
+
className="h-7 px-2"
|
|
240
|
+
>
|
|
241
|
+
Minify
|
|
242
|
+
</Button>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
<div className="relative">
|
|
247
|
+
<textarea
|
|
248
|
+
value={jsonText}
|
|
249
|
+
onChange={handleTextChange}
|
|
250
|
+
onKeyDown={(e) => {
|
|
251
|
+
if (e.key === 'Tab') {
|
|
252
|
+
e.preventDefault();
|
|
253
|
+
const target = e.target as HTMLTextAreaElement;
|
|
254
|
+
const start = target.selectionStart;
|
|
255
|
+
const end = target.selectionEnd;
|
|
256
|
+
|
|
257
|
+
// Insert 2 spaces at cursor position
|
|
258
|
+
const newValue = jsonText.substring(0, start) + ' ' + jsonText.substring(end);
|
|
259
|
+
setJsonText(newValue);
|
|
260
|
+
validateJson(newValue);
|
|
261
|
+
|
|
262
|
+
// Move cursor after the inserted spaces
|
|
263
|
+
setTimeout(() => {
|
|
264
|
+
target.selectionStart = target.selectionEnd = start + 2;
|
|
265
|
+
}, 0);
|
|
266
|
+
} else if (e.key === 'Enter' && e.ctrlKey) {
|
|
267
|
+
e.preventDefault();
|
|
268
|
+
handleSave();
|
|
269
|
+
} else if (e.key === 'Enter') {
|
|
270
|
+
// Allow Enter to create new lines (prevent it from bubbling up to parent components)
|
|
271
|
+
e.stopPropagation();
|
|
272
|
+
} else if (e.key === 'Escape') {
|
|
273
|
+
e.preventDefault();
|
|
274
|
+
onCancel();
|
|
275
|
+
setOpen(false);
|
|
276
|
+
}
|
|
277
|
+
}}
|
|
278
|
+
placeholder="Enter JSON here..."
|
|
279
|
+
className={cn(
|
|
280
|
+
'w-full h-75 px-3 py-2 text-sm border border-border-gray dark:border-neutral-600 rounded-md font-mono resize-none',
|
|
281
|
+
'focus:outline-none focus:ring-2 focus:ring-offset-2',
|
|
282
|
+
isValid ? 'focus:ring-primary' : 'focus:ring-red-500 border-red-500'
|
|
283
|
+
)}
|
|
284
|
+
spellCheck={false}
|
|
285
|
+
autoFocus
|
|
286
|
+
/>
|
|
287
|
+
|
|
288
|
+
{/* Validation indicator */}
|
|
289
|
+
<div
|
|
290
|
+
className={cn(
|
|
291
|
+
'absolute bottom-2 right-2 flex items-center gap-1',
|
|
292
|
+
isValid ? 'text-green-600' : 'text-red-600'
|
|
293
|
+
)}
|
|
294
|
+
>
|
|
295
|
+
{isValid ? (
|
|
296
|
+
<>
|
|
297
|
+
<CheckCircle className="h-4 w-4" />
|
|
298
|
+
<span className="text-xs">Valid JSON</span>
|
|
299
|
+
</>
|
|
300
|
+
) : (
|
|
301
|
+
<>
|
|
302
|
+
<AlertCircle className="h-4 w-4" />
|
|
303
|
+
<span className="text-xs">Invalid JSON</span>
|
|
304
|
+
</>
|
|
305
|
+
)}
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
|
|
309
|
+
{/* Error message */}
|
|
310
|
+
{error && (
|
|
311
|
+
<div className="mt-2 text-xs text-red-600 bg-red-50 p-2 rounded">{error}</div>
|
|
312
|
+
)}
|
|
313
|
+
|
|
314
|
+
{/* Tips */}
|
|
315
|
+
<div className="mt-2 text-xs text-muted-foreground">
|
|
316
|
+
Tip: Use Tab for indentation, Ctrl+Enter to save, Escape to cancel
|
|
317
|
+
</div>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
{/* Action buttons */}
|
|
321
|
+
<div className="flex items-center gap-2 p-3 border-t border-border-gray dark:border-neutral-600 bg-muted/30 dark:bg-neutral-800">
|
|
322
|
+
{nullable && (
|
|
323
|
+
<Button
|
|
324
|
+
variant="outline"
|
|
325
|
+
size="sm"
|
|
326
|
+
onClick={handleSetNull}
|
|
327
|
+
className="flex-1 dark:bg-neutral-600 dark:text-white dark:hover:bg-neutral-700"
|
|
328
|
+
>
|
|
329
|
+
Null
|
|
330
|
+
</Button>
|
|
331
|
+
)}
|
|
332
|
+
<Button
|
|
333
|
+
variant="outline"
|
|
334
|
+
size="sm"
|
|
335
|
+
onClick={() => {
|
|
336
|
+
onCancel();
|
|
337
|
+
setOpen(false);
|
|
338
|
+
}}
|
|
339
|
+
className="flex-1 dark:bg-neutral-600 dark:text-white dark:hover:bg-neutral-700"
|
|
340
|
+
>
|
|
341
|
+
Cancel
|
|
342
|
+
</Button>
|
|
343
|
+
<Button size="sm" onClick={handleSave} disabled={!isValid} className="flex-1">
|
|
344
|
+
Save
|
|
345
|
+
</Button>
|
|
346
|
+
</div>
|
|
347
|
+
</PopoverContent>
|
|
348
|
+
</Popover>
|
|
349
|
+
|
|
350
|
+
<ConfirmDialog
|
|
351
|
+
open={showNullConfirm}
|
|
352
|
+
onOpenChange={setShowNullConfirm}
|
|
353
|
+
title="Clear JSON Data"
|
|
354
|
+
description="This action will permanently remove the current JSON data from this cell and set it to null. Are you sure you want to continue?"
|
|
355
|
+
confirmText="Clear Data"
|
|
356
|
+
cancelText="Cancel"
|
|
357
|
+
onConfirm={confirmSetNull}
|
|
358
|
+
destructive={true}
|
|
359
|
+
/>
|
|
360
|
+
</>
|
|
361
|
+
);
|
|
362
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
|
+
import type { TextCellEditorProps } from './types';
|
|
3
|
+
import { cn } from '@/lib/utils/utils';
|
|
4
|
+
|
|
5
|
+
export function TextCellEditor({ value, onValueChange, onCancel, className }: TextCellEditorProps) {
|
|
6
|
+
const [inputValue, setInputValue] = useState(String(value || ''));
|
|
7
|
+
|
|
8
|
+
const handleSave = useCallback(() => {
|
|
9
|
+
onValueChange(inputValue);
|
|
10
|
+
}, [inputValue, onValueChange]);
|
|
11
|
+
|
|
12
|
+
const handleKeyDown = useCallback(
|
|
13
|
+
(e: React.KeyboardEvent) => {
|
|
14
|
+
if (e.key === 'Enter') {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
handleSave();
|
|
17
|
+
} else if (e.key === 'Escape') {
|
|
18
|
+
e.preventDefault();
|
|
19
|
+
onCancel();
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
[handleSave, onCancel]
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<input
|
|
27
|
+
value={inputValue}
|
|
28
|
+
onChange={(e) => setInputValue(e.target.value)}
|
|
29
|
+
onKeyDown={handleKeyDown}
|
|
30
|
+
onBlur={handleSave}
|
|
31
|
+
className={cn(
|
|
32
|
+
'w-full border-none outline-none bg-white dark:bg-neutral-800 focus:border-0! focus:ring-0! focus:ring-offset-0! focus:outline-none!',
|
|
33
|
+
className
|
|
34
|
+
)}
|
|
35
|
+
autoFocus
|
|
36
|
+
/>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Export all cell editor types
|
|
2
|
+
export type {
|
|
3
|
+
BaseCellEditorProps,
|
|
4
|
+
BooleanCellEditorProps,
|
|
5
|
+
DateCellEditorProps,
|
|
6
|
+
JsonCellEditorProps,
|
|
7
|
+
TextCellEditorProps,
|
|
8
|
+
} from './types';
|
|
9
|
+
|
|
10
|
+
// Export all cell editor components
|
|
11
|
+
export { BooleanCellEditor } from './BooleanCellEditor';
|
|
12
|
+
export { DateCellEditor } from './DateCellEditor';
|
|
13
|
+
export { JsonCellEditor } from './JsonCellEditor';
|
|
14
|
+
export { TextCellEditor } from './TextCellEditor';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ColumnType } from '@insforge/shared-schemas';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base props for all cell editors
|
|
5
|
+
*/
|
|
6
|
+
export interface BaseCellEditorProps {
|
|
7
|
+
nullable: boolean;
|
|
8
|
+
onCancel: () => void;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Boolean cell editor specific props
|
|
14
|
+
*/
|
|
15
|
+
export interface BooleanCellEditorProps extends BaseCellEditorProps {
|
|
16
|
+
value: boolean | null;
|
|
17
|
+
onValueChange: (newValue: string) => void; // Returns 'true', 'false', or 'null'
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Date cell editor specific props
|
|
22
|
+
*/
|
|
23
|
+
export interface DateCellEditorProps extends BaseCellEditorProps {
|
|
24
|
+
value: string | null;
|
|
25
|
+
type: ColumnType.DATE | ColumnType.DATETIME;
|
|
26
|
+
onValueChange: (newValue: string | null) => void;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* JSON cell editor specific props
|
|
31
|
+
*/
|
|
32
|
+
export interface JsonCellEditorProps extends BaseCellEditorProps {
|
|
33
|
+
value: string | null;
|
|
34
|
+
onValueChange: (newValue: string) => void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Text cell editor specific props
|
|
39
|
+
*/
|
|
40
|
+
export interface TextCellEditorProps extends BaseCellEditorProps {
|
|
41
|
+
value: string;
|
|
42
|
+
onValueChange: (newValue: string) => void;
|
|
43
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ColumnType } from '@insforge/shared-schemas';
|
|
2
|
+
import type {
|
|
3
|
+
Column,
|
|
4
|
+
RenderCellProps,
|
|
5
|
+
RenderEditCellProps,
|
|
6
|
+
RenderHeaderCellProps,
|
|
7
|
+
} from 'react-data-grid';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Raw database values - these are the actual data types stored in the database
|
|
11
|
+
* and received from the backend API.
|
|
12
|
+
*/
|
|
13
|
+
export type ConvertedValue =
|
|
14
|
+
| string // STRING, UUID, DATETIME, DATE (as ISO string)
|
|
15
|
+
| number // INTEGER, FLOAT
|
|
16
|
+
| boolean // BOOLEAN
|
|
17
|
+
| null // NULL values for any nullable column
|
|
18
|
+
| JSON; // JSON (as parsed object or string)
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* User input values - these are the types of values users enter in forms and cell editors
|
|
22
|
+
* All user inputs need to be converted to ConvertedValue
|
|
23
|
+
*/
|
|
24
|
+
export type UserInputValue = string | number | boolean | null;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Display values - these are always strings formatted for UI display
|
|
28
|
+
* Used by cell renderers and form display components
|
|
29
|
+
*/
|
|
30
|
+
export type DisplayValue = string;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Database record type - represents a row in the database
|
|
34
|
+
*/
|
|
35
|
+
export interface DatabaseRecord {
|
|
36
|
+
[columnName: string]: ConvertedValue | { [key: string]: string }[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* DataGrid row data - extends DatabaseRecord with required id
|
|
41
|
+
*/
|
|
42
|
+
export interface DataGridRow extends DatabaseRecord {
|
|
43
|
+
id: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Generic row type that can be either a DatabaseRecord or a specific schema
|
|
48
|
+
* This allows us to support both AI-generated tables and predefined schemas
|
|
49
|
+
* The id field is optional as react-data-grid can generate it automatically
|
|
50
|
+
*/
|
|
51
|
+
export type DataGridRowType = DatabaseRecord & { id?: string };
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* DataGrid column definition - generic version that extends react-data-grid's Column
|
|
55
|
+
* TRow must extend DataGridRowType to ensure it has both id and index signature
|
|
56
|
+
*/
|
|
57
|
+
export interface DataGridColumn<TRow extends DataGridRowType = DataGridRow> extends Column<TRow> {
|
|
58
|
+
type?: ColumnType;
|
|
59
|
+
isPrimaryKey?: boolean;
|
|
60
|
+
isNullable?: boolean;
|
|
61
|
+
// Override render functions to use our custom prop types
|
|
62
|
+
renderCell?: (props: RenderCellProps<TRow>) => React.ReactNode;
|
|
63
|
+
renderEditCell?: (props: RenderEditCellProps<TRow>) => React.ReactNode;
|
|
64
|
+
renderHeaderCell?: (props: RenderHeaderCellProps<TRow>) => React.ReactNode;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Value conversion result for user input validation
|
|
69
|
+
*/
|
|
70
|
+
export type ValueConversionResult =
|
|
71
|
+
| { success: true; value: ConvertedValue }
|
|
72
|
+
| { success: false; error: string };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
Column,
|
|
3
|
+
SortColumn,
|
|
4
|
+
RenderCellProps,
|
|
5
|
+
RenderEditCellProps,
|
|
6
|
+
RenderHeaderCellProps,
|
|
7
|
+
CellClickArgs,
|
|
8
|
+
CellMouseEvent,
|
|
9
|
+
} from 'react-data-grid';
|
|
10
|
+
export * from './datagridTypes';
|
|
11
|
+
|
|
12
|
+
import IdCell from './IdCell';
|
|
13
|
+
import SortableHeaderRenderer from './SortableHeader';
|
|
14
|
+
import { createDefaultCellRenderer } from './DefaultCellRenderer';
|
|
15
|
+
import DataGrid, { type DataGridProps } from './DataGrid';
|
|
16
|
+
|
|
17
|
+
export { IdCell, SortableHeaderRenderer, DataGrid, type DataGridProps, createDefaultCellRenderer };
|
|
18
|
+
|
|
19
|
+
// Export cell editors
|
|
20
|
+
export * from './cell-editors';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Core radix/ui components
|
|
2
|
+
export * from './radix/Button';
|
|
3
|
+
export * from './radix/Card';
|
|
4
|
+
export * from './radix/Input';
|
|
5
|
+
export * from './radix/Form';
|
|
6
|
+
export * from './radix/Tabs';
|
|
7
|
+
export * from './radix/Badge';
|
|
8
|
+
export * from './radix/Skeleton';
|
|
9
|
+
export * from './radix/ScrollArea';
|
|
10
|
+
export * from './radix/Separator';
|
|
11
|
+
export * from './radix/Alert';
|
|
12
|
+
export * from './radix/DropdownMenu';
|
|
13
|
+
export * from './radix/Dialog';
|
|
14
|
+
export * from './radix/Label';
|
|
15
|
+
export * from './radix/Popover';
|
|
16
|
+
export * from './radix/Select';
|
|
17
|
+
export * from './radix/Sheet';
|
|
18
|
+
export * from './radix/Switch';
|
|
19
|
+
export * from './radix/Tooltip';
|
|
20
|
+
export * from './radix/AlertDialog';
|
|
21
|
+
export * from './radix/Avatar';
|
|
22
|
+
export * from './ConfirmDialog';
|
|
23
|
+
export * from './ButtonWithLoading';
|
|
24
|
+
|
|
25
|
+
// Custom UI components
|
|
26
|
+
export { EmptyState } from './EmptyState';
|
|
27
|
+
export { LoadingState } from './LoadingState';
|
|
28
|
+
export { ErrorState } from './ErrorState';
|
|
29
|
+
export { JsonHighlight } from './JsonHighlight';
|
|
30
|
+
export { SearchInput } from './SearchInput';
|
|
31
|
+
export { PaginationControls } from './PaginationControls';
|
|
32
|
+
export { SelectionClearButton } from './SelectionClearButton';
|
|
33
|
+
export { DeleteActionButton } from './DeleteActionButton';
|
|
34
|
+
export { Checkbox } from './Checkbox';
|
|
35
|
+
export { TypeBadge } from './TypeBadge';
|
|
36
|
+
|
|
37
|
+
// Data Grid Components
|
|
38
|
+
export { DataGrid, SortableHeaderRenderer } from './datagrid';
|
|
39
|
+
export type { DataGridProps } from './datagrid';
|