insforge 0.3.3 → 1.3.0
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 -0
- package/.dockerignore +60 -57
- package/.env.example +84 -49
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +66 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -0
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -3
- package/CLAUDE_PLUGIN.md +104 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -27
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -134
- package/assets/Dark.svg +23 -23
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/auth/index.html +13 -0
- package/auth/package.json +28 -0
- package/auth/public/favicon.ico +0 -0
- package/auth/src/App.tsx +33 -0
- package/auth/src/components/ErrorCard.tsx +37 -0
- package/auth/src/components/Layout.tsx +13 -0
- package/auth/src/index.css +19 -0
- package/auth/src/lib/broadcastService.ts +117 -0
- package/auth/src/lib/utils.ts +11 -0
- package/auth/src/main.tsx +22 -0
- package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
- package/auth/src/pages/ResetPasswordPage.tsx +11 -0
- package/auth/src/pages/SignInPage.tsx +60 -0
- package/auth/src/pages/SignUpPage.tsx +60 -0
- package/auth/src/pages/VerifyEmailPage.tsx +20 -0
- package/auth/src/vite-env.d.ts +10 -0
- package/auth/tsconfig.json +32 -0
- package/auth/tsconfig.node.json +11 -0
- package/auth/vite.config.ts +25 -0
- package/backend/package.json +78 -75
- package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
- package/backend/src/api/middlewares/rate-limiters.ts +127 -0
- package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
- package/backend/src/api/routes/auth/index.routes.ts +667 -0
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
- package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
- package/backend/src/api/routes/database/index.routes.ts +90 -0
- package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
- package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
- package/backend/src/api/routes/docs/index.routes.ts +75 -0
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +194 -0
- package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
- package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
- 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/{secrets.ts → secrets/index.routes.ts} +27 -22
- package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
- package/backend/src/api/routes/usage/index.routes.ts +91 -0
- package/backend/src/infra/config/app.config.ts +51 -0
- package/backend/src/infra/database/database.manager.ts +182 -0
- package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
- package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
- package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
- package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
- package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
- package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
- package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
- package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
- package/backend/{migrations → 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 -0
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
- package/backend/src/infra/security/token.manager.ts +219 -0
- package/backend/src/infra/socket/socket.manager.ts +522 -0
- package/backend/src/providers/ai/openrouter.provider.ts +380 -0
- package/backend/src/providers/email/base.provider.ts +38 -0
- package/backend/src/providers/email/cloud.provider.ts +271 -0
- package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
- package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
- package/backend/src/providers/logs/local.provider.ts +185 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/base.provider.ts +29 -0
- package/backend/src/providers/oauth/discord.provider.ts +195 -0
- package/backend/src/providers/oauth/facebook.provider.ts +194 -0
- package/backend/src/providers/oauth/github.provider.ts +208 -0
- package/backend/src/providers/oauth/google.provider.ts +249 -0
- package/backend/src/providers/oauth/index.ts +8 -0
- package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
- package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
- package/backend/src/providers/oauth/x.provider.ts +202 -0
- package/backend/src/providers/storage/base.provider.ts +29 -0
- package/backend/src/providers/storage/local.provider.ts +103 -0
- package/backend/src/providers/storage/s3.provider.ts +313 -0
- package/backend/src/server.ts +317 -288
- package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
- package/backend/src/services/ai/ai-model.service.ts +60 -0
- package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
- package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
- package/backend/src/services/ai/helpers.ts +64 -0
- package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
- package/backend/src/services/ai/index.ts +13 -0
- package/backend/src/services/auth/auth-config.service.ts +250 -0
- package/backend/src/services/auth/auth-otp.service.ts +424 -0
- package/backend/src/services/auth/auth.service.ts +1150 -0
- package/backend/src/services/auth/index.ts +4 -0
- package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
- package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
- package/backend/src/services/database/database-table.service.ts +802 -0
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +73 -0
- package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
- package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
- package/backend/src/services/logs/log.service.ts +73 -0
- 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/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
- package/backend/src/services/storage/storage.service.ts +617 -0
- package/backend/src/services/usage/usage.service.ts +149 -0
- package/backend/src/types/auth.ts +77 -2
- package/backend/src/types/email.ts +8 -0
- package/backend/src/types/error-constants.ts +4 -0
- package/backend/src/types/logs.ts +0 -29
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/environment.ts +9 -3
- package/backend/src/utils/logger.ts +20 -2
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -205
- package/backend/src/utils/sql-parser.ts +91 -1
- package/backend/src/utils/utils.ts +114 -0
- package/backend/src/utils/validations.ts +40 -4
- 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 -0
- package/backend/tests/local/test-ai-usage.sh +80 -0
- 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 -0
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -0
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -247
- 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-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 -0
- 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 -302
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tests/unit/cloud-token.test.ts +48 -0
- package/backend/tests/unit/constant.test.ts +8 -0
- package/backend/tests/unit/email.test.ts +372 -0
- package/backend/tests/unit/environment.test.ts +59 -0
- package/backend/tests/unit/helpers.test.ts +63 -0
- package/backend/tests/unit/logger.test.ts +22 -0
- package/backend/tests/unit/rate-limit.test.ts +154 -0
- package/backend/tests/unit/response.test.ts +58 -0
- package/backend/tests/unit/sql-parser.test.ts +74 -0
- package/backend/tests/unit/uuid.test.ts +21 -0
- package/backend/tests/unit/validations.test.ts +80 -0
- package/backend/tsconfig.json +22 -22
- package/backend/vitest.config.ts +11 -0
- package/claude-plugin/.claude-plugin/plugin.json +24 -0
- package/claude-plugin/README.md +133 -0
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
- package/docker-compose.prod.yml +204 -144
- package/docker-compose.yml +232 -167
- package/docker-init/db/db-init.sql +97 -125
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -0
- package/docs/README.md +44 -0
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -0
- package/docs/core-concepts/ai/architecture.mdx +373 -0
- package/docs/core-concepts/ai/sdk.mdx +213 -0
- package/docs/core-concepts/authentication/architecture.mdx +278 -0
- package/docs/core-concepts/authentication/sdk.mdx +414 -0
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
- package/docs/core-concepts/database/architecture.mdx +256 -0
- package/docs/core-concepts/database/sdk.mdx +382 -0
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -0
- package/docs/core-concepts/functions/sdk.mdx +184 -0
- 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 -0
- package/docs/core-concepts/storage/sdk.mdx +253 -0
- package/docs/deployment/README.md +94 -0
- package/docs/deployment/deploy-to-aws-ec2.md +565 -0
- package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
- package/docs/deployment/deploy-to-render.md +441 -0
- 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 +232 -0
- package/docs/examples/framework-guides/nextjs.mdx +131 -0
- package/docs/examples/framework-guides/nuxt.mdx +165 -0
- package/docs/examples/framework-guides/react.mdx +165 -0
- package/docs/examples/framework-guides/svelte.mdx +153 -0
- package/docs/examples/framework-guides/vue.mdx +159 -0
- package/docs/examples/overview.mdx +67 -0
- package/docs/favicon.svg +19 -0
- 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/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
- package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
- package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
- package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
- package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
- package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
- package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
- package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
- package/docs/images/checks-passed.png +0 -0
- package/docs/images/dashboard-connect-expanded.png +0 -0
- package/docs/images/dashboard-connect.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/icons/ai.svg +4 -0
- package/docs/images/icons/auth.svg +1 -0
- package/docs/images/icons/database.svg +1 -0
- package/docs/images/icons/function.svg +1 -0
- package/docs/images/icons/storage.svg +1 -0
- package/docs/images/logos/nextjs.svg +4 -0
- package/docs/images/logos/nuxt.svg +4 -0
- package/docs/images/logos/react.svg +5 -0
- package/docs/images/logos/svelte.svg +4 -0
- package/docs/images/logos/vue.svg +5 -0
- package/docs/images/mcp-install.png +0 -0
- package/docs/images/onboarding-mcp.png +0 -0
- package/docs/insforge-instructions-sdk.md +89 -407
- package/docs/introduction.mdx +45 -0
- package/docs/logo/dark.svg +22 -0
- package/docs/logo/light.svg +20 -0
- package/docs/partnership.mdx +652 -0
- package/docs/quickstart.mdx +83 -0
- package/docs/showcase/2048-arena.png +0 -0
- package/docs/showcase/framegen-cloud.png +0 -0
- package/docs/showcase/line-connect-race.png +0 -0
- package/docs/showcase/moment-vibe.png +0 -0
- package/docs/showcase/national-flags.png +0 -0
- package/docs/showcase/pokemon-vibe.png +0 -0
- package/docs/showcase/pure-browse-buy.png +0 -0
- package/docs/showcase.mdx +52 -0
- package/docs/snippets/sdk-installation.mdx +22 -0
- package/docs/snippets/service-icons.mdx +27 -0
- package/eslint.config.js +10 -3
- 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 -63
- package/frontend/src/App.tsx +13 -82
- 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 -0
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -0
- 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/apple.svg +4 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -0
- 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 +2 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -0
- package/frontend/src/assets/logos/microsoft.svg +1 -0
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +17 -0
- package/frontend/src/assets/logos/tiktok.svg +6 -0
- 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 -0
- package/frontend/src/components/Checkbox.tsx +27 -29
- package/frontend/src/components/CodeBlock.tsx +55 -2
- package/frontend/src/components/CodeEditor.tsx +92 -0
- package/frontend/src/components/ConfirmDialog.tsx +1 -1
- package/frontend/src/components/ConnectCTA.tsx +38 -0
- package/frontend/src/components/CopyButton.tsx +52 -15
- package/frontend/src/components/ErrorState.tsx +1 -2
- package/frontend/src/components/FeatureSidebar.tsx +6 -6
- package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
- package/frontend/src/components/JsonHighlight.tsx +21 -9
- package/frontend/src/components/ProjectInfoModal.tsx +128 -0
- package/frontend/src/components/PromptDialog.tsx +1 -4
- package/frontend/src/components/SearchInput.tsx +1 -2
- package/frontend/src/components/Stepper.tsx +53 -0
- package/frontend/src/components/ThemeToggle.tsx +3 -3
- package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
- package/frontend/src/components/datagrid/index.ts +23 -0
- package/frontend/src/components/index.ts +23 -30
- package/frontend/src/components/layout/AppHeader.tsx +131 -91
- package/frontend/src/components/layout/AppSidebar.tsx +80 -170
- package/frontend/src/components/layout/Layout.tsx +12 -23
- package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
- package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
- package/frontend/src/components/layout/index.ts +5 -0
- package/frontend/src/components/radix/Tooltip.tsx +24 -13
- package/frontend/src/components/radix/index.ts +22 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
- package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
- package/frontend/src/features/ai/components/index.ts +6 -0
- package/frontend/src/features/ai/helpers.ts +57 -71
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
- package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
- package/frontend/src/features/ai/services/ai.service.ts +5 -5
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
- package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
- package/frontend/src/features/auth/components/index.ts +5 -0
- package/frontend/src/features/auth/helpers.tsx +208 -0
- package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
- package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
- package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
- package/frontend/src/features/auth/index.ts +3 -2
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
- package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
- package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
- package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
- package/frontend/src/features/auth/services/config.service.ts +19 -0
- package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
- package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
- package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
- package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
- package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
- package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
- package/frontend/src/features/dashboard/components/index.ts +4 -0
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
- package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
- package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
- package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
- package/frontend/src/features/dashboard/prompts/index.ts +31 -0
- package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
- package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
- package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
- package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
- package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
- package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
- package/frontend/src/features/database/components/TableForm.tsx +28 -19
- package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
- package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
- package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
- package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
- package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
- package/frontend/src/features/database/components/index.ts +19 -0
- package/frontend/src/features/database/constants.ts +28 -2
- package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
- package/frontend/src/features/database/helpers.ts +2 -2
- package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
- package/frontend/src/features/database/hooks/useRecords.ts +139 -0
- package/frontend/src/features/database/hooks/useTables.ts +135 -0
- package/frontend/src/features/database/index.ts +7 -1
- package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
- package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
- package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
- package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
- package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
- package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
- package/frontend/src/features/database/services/advance.service.ts +40 -0
- package/frontend/src/features/database/services/database.service.ts +33 -194
- package/frontend/src/features/database/services/record.service.ts +219 -0
- package/frontend/src/features/database/services/table.service.ts +58 -0
- package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
- package/frontend/src/features/database/templates/crm-system.ts +528 -0
- package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
- package/frontend/src/features/database/templates/index.ts +34 -0
- package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
- package/frontend/src/features/database/templates/notion-clone.ts +483 -0
- package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
- package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
- package/frontend/src/features/functions/components/index.ts +5 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
- package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
- package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
- package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
- package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
- package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
- package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
- package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
- package/frontend/src/features/login/services/partnership.service.ts +65 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
- package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
- package/frontend/src/features/logs/components/index.ts +2 -0
- package/frontend/src/features/logs/helpers.ts +24 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
- package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
- package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
- package/frontend/src/features/logs/index.ts +8 -2
- package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
- package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
- package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
- package/frontend/src/features/logs/services/audit.service.ts +63 -0
- package/frontend/src/features/logs/services/log.service.ts +15 -110
- package/frontend/src/features/logs/services/usage.service.ts +31 -0
- package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
- package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
- package/frontend/src/features/onboard/components/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
- package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
- package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
- package/frontend/src/features/onboard/index.ts +13 -3
- 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/storage/components/BucketEmptyState.tsx +9 -6
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
- package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
- package/frontend/src/features/storage/components/index.ts +12 -0
- package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
- package/frontend/src/features/storage/services/storage.service.ts +22 -1
- package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
- package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
- package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
- package/frontend/src/index.css +1 -0
- package/frontend/src/lib/analytics/posthog.tsx +27 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
- package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
- package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
- package/frontend/src/lib/hooks/useToast.tsx +6 -2
- package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
- package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
- package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
- package/frontend/src/lib/utils/menuItems.ts +207 -0
- package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
- package/frontend/src/lib/utils/utils.ts +32 -1
- package/frontend/src/vite-env.d.ts +1 -0
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/frontend/vite.config.ts +5 -3
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -290
- package/functions/worker-template.js +15 -4
- package/i18n/README.ar.md +130 -0
- package/i18n/README.de.md +130 -0
- package/i18n/README.es.md +154 -0
- package/i18n/README.fr.md +134 -0
- package/i18n/README.hi.md +129 -0
- package/i18n/README.ja.md +174 -0
- package/i18n/README.ko.md +137 -0
- package/i18n/README.pt-BR.md +131 -0
- package/i18n/README.ru.md +129 -0
- package/i18n/README.zh-CN.md +133 -0
- package/openapi/ai.yaml +715 -688
- package/openapi/auth.yaml +1244 -563
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -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 +463 -463
- package/package.json +97 -88
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai-api.schema.ts +34 -58
- package/shared-schemas/src/ai.schema.ts +63 -54
- package/shared-schemas/src/auth-api.schema.ts +352 -193
- package/shared-schemas/src/auth.schema.ts +43 -7
- package/shared-schemas/src/cloud-events.schema.ts +57 -0
- package/shared-schemas/src/database-api.schema.ts +35 -4
- package/shared-schemas/src/database.schema.ts +40 -1
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +5 -0
- package/shared-schemas/src/logs-api.schema.ts +7 -1
- package/shared-schemas/src/logs.schema.ts +26 -0
- package/shared-schemas/src/metadata.schema.ts +18 -4
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +1032 -0
- package/.github/workflows/deploy-aws.yml +0 -130
- package/backend/src/api/routes/agent.ts +0 -29
- package/backend/src/api/routes/auth.oauth.ts +0 -482
- package/backend/src/api/routes/auth.ts +0 -386
- package/backend/src/api/routes/docs.ts +0 -66
- package/backend/src/api/routes/functions.ts +0 -183
- package/backend/src/api/routes/openapi.ts +0 -82
- package/backend/src/api/routes/usage.ts +0 -96
- package/backend/src/core/ai/client.ts +0 -242
- package/backend/src/core/ai/model.ts +0 -117
- package/backend/src/core/auth/auth.ts +0 -780
- package/backend/src/core/database/manager.ts +0 -178
- package/backend/src/core/database/table.ts +0 -772
- package/backend/src/core/documentation/agent.ts +0 -689
- package/backend/src/core/documentation/openapi.ts +0 -856
- package/backend/src/core/logs/analytics.ts +0 -76
- package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
- package/backend/src/core/socket/socket.ts +0 -388
- package/backend/src/core/storage/storage.ts +0 -923
- package/backend/src/utils/cloud-token.ts +0 -39
- package/backend/src/utils/helpers.ts +0 -49
- package/backend/src/utils/uuid.ts +0 -9
- package/backend/tests/manual/test-better-auth.sh +0 -303
- package/docker-init/db/logs.sql +0 -9
- package/frontend/README.md +0 -112
- package/frontend/src/components/datagrid/index.tsx +0 -20
- package/frontend/src/components/layout/CloudLayout.tsx +0 -95
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
- package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
- package/frontend/src/features/ai/page/AIPage.tsx +0 -178
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
- package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
- package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
- package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
- package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
- package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
- package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
- package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
- package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
- package/frontend/src/features/onboard/types.ts +0 -8
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
- /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
- /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
- /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
# Project Overview
|
|
2
|
-
|
|
3
|
-
InsForge is an open-source Backend-as-a-Service (BaaS) platform designed specifically for AI agents. It provides a comprehensive solution for managing backend services including authentication, database operations, storage, and serverless functions, all accessible through REST APIs with PostgreSQL as the primary database.
|
|
4
|
-
|
|
5
|
-
## Architecture
|
|
6
|
-
|
|
7
|
-
This is a monorepo containing:
|
|
8
|
-
- **Backend**: Node.js with Express.js, providing RESTful APIs
|
|
9
|
-
- **Frontend**: React with Vite, offering an admin dashboard
|
|
10
|
-
- **Functions**: Serverless function runtime using Deno
|
|
11
|
-
- **Shared-schemas**: Common TypeScript schemas shared across modules
|
|
12
|
-
|
|
13
|
-
## Folder Structure
|
|
14
|
-
|
|
15
|
-
- `/backend`: Node.js backend server
|
|
16
|
-
- `/src/api`: API routes and middleware
|
|
17
|
-
- `/src/controllers`: Business logic controllers
|
|
18
|
-
- `/src/core`: Core services (auth, database, storage, metadata)
|
|
19
|
-
- `/src/types`: TypeScript type definitions
|
|
20
|
-
- `/src/utils`: Utility functions and helpers
|
|
21
|
-
- `/frontend`: React dashboard application
|
|
22
|
-
- `/src/components`: Reusable UI components
|
|
23
|
-
- `/src/features`: Feature-specific modules (auth, database, storage, logs)
|
|
24
|
-
- `/src/lib`: Shared libraries, hooks, and utilities
|
|
25
|
-
- `/functions`: Serverless function runtime
|
|
26
|
-
- `/shared-schemas`: Shared TypeScript schemas
|
|
27
|
-
- `/docker-init`: Docker initialization scripts
|
|
28
|
-
- `/openapi`: API documentation in OpenAPI format
|
|
29
|
-
- `/tests`: Comprehensive test suites
|
|
30
|
-
|
|
31
|
-
## Libraries and Frameworks
|
|
32
|
-
|
|
33
|
-
### Backend
|
|
34
|
-
- Express.js for REST API framework
|
|
35
|
-
- PostgreSQL with pg driver for database
|
|
36
|
-
- Better-auth for authentication
|
|
37
|
-
- AWS SDK for S3-compatible storage
|
|
38
|
-
- Zod for schema validation
|
|
39
|
-
- JWT for token management
|
|
40
|
-
- TypeScript for type safety
|
|
41
|
-
|
|
42
|
-
### Frontend
|
|
43
|
-
- React 19 with functional components
|
|
44
|
-
- Vite for build tooling
|
|
45
|
-
- TanStack Query for data fetching
|
|
46
|
-
- React Hook Form with Zod validation
|
|
47
|
-
- Tailwind CSS for styling
|
|
48
|
-
- Radix UI for accessible component primitives
|
|
49
|
-
- React Router for navigation
|
|
50
|
-
- TypeScript for type safety
|
|
51
|
-
|
|
52
|
-
## Coding Standards
|
|
53
|
-
|
|
54
|
-
### General
|
|
55
|
-
- Use TypeScript for all code files
|
|
56
|
-
- Prefer descriptive, unabbreviated variable and function names
|
|
57
|
-
- Follow consistent file naming: kebab-case for files, PascalCase for components
|
|
58
|
-
- Maintain clear folder structure with feature-based organization
|
|
59
|
-
- Use ES modules (import/export syntax)
|
|
60
|
-
- Implement proper error handling with try-catch blocks
|
|
61
|
-
- Add appropriate logging for debugging
|
|
62
|
-
|
|
63
|
-
### Backend Specific
|
|
64
|
-
- Use async/await for asynchronous operations
|
|
65
|
-
- Implement proper middleware for authentication and error handling
|
|
66
|
-
- Follow RESTful conventions for API endpoints
|
|
67
|
-
- Use Zod schemas for request/response validation
|
|
68
|
-
- Return consistent API responses using utility functions
|
|
69
|
-
- Implement proper database transaction handling
|
|
70
|
-
|
|
71
|
-
### Frontend Specific
|
|
72
|
-
- Use functional components with hooks exclusively
|
|
73
|
-
- Implement proper TypeScript interfaces for all props
|
|
74
|
-
- Use React Hook Form for form handling
|
|
75
|
-
- Follow component composition patterns
|
|
76
|
-
- Implement proper loading and error states
|
|
77
|
-
- Use TanStack Query for server state management
|
|
78
|
-
- Keep components focused and single-purpose
|
|
79
|
-
|
|
80
|
-
#### Naming Conventions
|
|
81
|
-
- **Variables, parameters, properties, and functions**: Use camelCase
|
|
82
|
-
- Examples: `userName`, `getUserData()`, `isLoading`
|
|
83
|
-
- **React components and TypeScript types/interfaces**: Use PascalCase
|
|
84
|
-
- Examples: `UserProfileDialog`, `interface User`, `type TableSchema`
|
|
85
|
-
- **Constants and Enum members**: Use UPPER_CASE
|
|
86
|
-
- Examples: `const API_BASE_URL`, `enum Status { ACTIVE, INACTIVE }`
|
|
87
|
-
- **File naming**:
|
|
88
|
-
- Components: `PascalCase.tsx` (e.g., `DataGrid.tsx`)
|
|
89
|
-
- Hooks: `use` + `PascalCase.ts` (e.g., `useAuth.ts`)
|
|
90
|
-
- Services: `camelCase.service.ts` (e.g., `auth.service.ts`)
|
|
91
|
-
- Utils: `kebab-case.ts` or `camelCase.ts` (e.g., `database-utils.ts`)
|
|
92
|
-
- **No snake_case**: Avoid snake_case except in SQL queries and external APIs
|
|
93
|
-
|
|
94
|
-
### Code Style
|
|
95
|
-
- Use single quotes for strings
|
|
96
|
-
- Include semicolons at the end of statements
|
|
97
|
-
- Use arrow functions for callbacks and inline functions
|
|
98
|
-
- Prefer const over let, avoid var
|
|
99
|
-
- Use template literals for string interpolation
|
|
100
|
-
- Maintain consistent indentation (2 spaces)
|
|
101
|
-
- Format code with Prettier configuration
|
|
102
|
-
|
|
103
|
-
## UI Guidelines
|
|
104
|
-
|
|
105
|
-
- Follow a clean, modern design with consistent spacing
|
|
106
|
-
- Use Radix UI primitives for accessibility
|
|
107
|
-
- Maintain consistent color scheme using CSS variables
|
|
108
|
-
- Use appropriate loading skeletons for data fetching
|
|
109
|
-
- Display clear error messages with actionable feedback
|
|
110
|
-
- Implement proper form validation with inline errors
|
|
111
|
-
- Use consistent icon set from lucide-react
|
|
112
|
-
|
|
113
|
-
## Testing Standards
|
|
114
|
-
|
|
115
|
-
- Implement integration tests for API endpoints
|
|
116
|
-
- Maintain test coverage above 70%
|
|
117
|
-
- Mock external dependencies appropriately
|
|
118
|
-
|
|
119
|
-
## Security Considerations
|
|
120
|
-
|
|
121
|
-
- Never commit secrets or API keys
|
|
122
|
-
- Use environment variables for configuration
|
|
123
|
-
- Implement proper authentication and authorization
|
|
124
|
-
- Validate all user inputs
|
|
125
|
-
- Sanitize data before database operations
|
|
126
|
-
- Use prepared statements for SQL queries
|
|
127
|
-
- Implement rate limiting for API endpoints
|
|
128
|
-
- Follow OWASP security best practices
|
|
129
|
-
|
|
130
|
-
## Performance Guidelines
|
|
131
|
-
|
|
132
|
-
- Implement proper database indexing
|
|
133
|
-
- Use pagination for large data sets
|
|
134
|
-
- Optimize React component re-renders
|
|
135
|
-
- Implement proper caching strategies
|
|
136
|
-
- Use lazy loading for code splitting
|
|
137
|
-
- Optimize bundle size with proper imports
|
|
138
|
-
- Monitor and log performance metrics
|
|
139
|
-
|
|
140
|
-
## Documentation
|
|
141
|
-
|
|
142
|
-
- Document all API endpoints with clear descriptions
|
|
143
|
-
- Include JSDoc comments for complex functions
|
|
144
|
-
- Maintain up-to-date README files
|
|
145
|
-
- Document environment variables and configuration
|
|
146
|
-
- Provide clear setup instructions
|
|
1
|
+
# Project Overview
|
|
2
|
+
|
|
3
|
+
InsForge is an open-source Backend-as-a-Service (BaaS) platform designed specifically for AI agents. It provides a comprehensive solution for managing backend services including authentication, database operations, storage, and serverless functions, all accessible through REST APIs with PostgreSQL as the primary database.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
This is a monorepo containing:
|
|
8
|
+
- **Backend**: Node.js with Express.js, providing RESTful APIs
|
|
9
|
+
- **Frontend**: React with Vite, offering an admin dashboard
|
|
10
|
+
- **Functions**: Serverless function runtime using Deno
|
|
11
|
+
- **Shared-schemas**: Common TypeScript schemas shared across modules
|
|
12
|
+
|
|
13
|
+
## Folder Structure
|
|
14
|
+
|
|
15
|
+
- `/backend`: Node.js backend server
|
|
16
|
+
- `/src/api`: API routes and middleware
|
|
17
|
+
- `/src/controllers`: Business logic controllers
|
|
18
|
+
- `/src/core`: Core services (auth, database, storage, metadata)
|
|
19
|
+
- `/src/types`: TypeScript type definitions
|
|
20
|
+
- `/src/utils`: Utility functions and helpers
|
|
21
|
+
- `/frontend`: React dashboard application
|
|
22
|
+
- `/src/components`: Reusable UI components
|
|
23
|
+
- `/src/features`: Feature-specific modules (auth, database, storage, logs)
|
|
24
|
+
- `/src/lib`: Shared libraries, hooks, and utilities
|
|
25
|
+
- `/functions`: Serverless function runtime
|
|
26
|
+
- `/shared-schemas`: Shared TypeScript schemas
|
|
27
|
+
- `/docker-init`: Docker initialization scripts
|
|
28
|
+
- `/openapi`: API documentation in OpenAPI format
|
|
29
|
+
- `/tests`: Comprehensive test suites
|
|
30
|
+
|
|
31
|
+
## Libraries and Frameworks
|
|
32
|
+
|
|
33
|
+
### Backend
|
|
34
|
+
- Express.js for REST API framework
|
|
35
|
+
- PostgreSQL with pg driver for database
|
|
36
|
+
- Better-auth for authentication
|
|
37
|
+
- AWS SDK for S3-compatible storage
|
|
38
|
+
- Zod for schema validation
|
|
39
|
+
- JWT for token management
|
|
40
|
+
- TypeScript for type safety
|
|
41
|
+
|
|
42
|
+
### Frontend
|
|
43
|
+
- React 19 with functional components
|
|
44
|
+
- Vite for build tooling
|
|
45
|
+
- TanStack Query for data fetching
|
|
46
|
+
- React Hook Form with Zod validation
|
|
47
|
+
- Tailwind CSS for styling
|
|
48
|
+
- Radix UI for accessible component primitives
|
|
49
|
+
- React Router for navigation
|
|
50
|
+
- TypeScript for type safety
|
|
51
|
+
|
|
52
|
+
## Coding Standards
|
|
53
|
+
|
|
54
|
+
### General
|
|
55
|
+
- Use TypeScript for all code files
|
|
56
|
+
- Prefer descriptive, unabbreviated variable and function names
|
|
57
|
+
- Follow consistent file naming: kebab-case for files, PascalCase for components
|
|
58
|
+
- Maintain clear folder structure with feature-based organization
|
|
59
|
+
- Use ES modules (import/export syntax)
|
|
60
|
+
- Implement proper error handling with try-catch blocks
|
|
61
|
+
- Add appropriate logging for debugging
|
|
62
|
+
|
|
63
|
+
### Backend Specific
|
|
64
|
+
- Use async/await for asynchronous operations
|
|
65
|
+
- Implement proper middleware for authentication and error handling
|
|
66
|
+
- Follow RESTful conventions for API endpoints
|
|
67
|
+
- Use Zod schemas for request/response validation
|
|
68
|
+
- Return consistent API responses using utility functions
|
|
69
|
+
- Implement proper database transaction handling
|
|
70
|
+
|
|
71
|
+
### Frontend Specific
|
|
72
|
+
- Use functional components with hooks exclusively
|
|
73
|
+
- Implement proper TypeScript interfaces for all props
|
|
74
|
+
- Use React Hook Form for form handling
|
|
75
|
+
- Follow component composition patterns
|
|
76
|
+
- Implement proper loading and error states
|
|
77
|
+
- Use TanStack Query for server state management
|
|
78
|
+
- Keep components focused and single-purpose
|
|
79
|
+
|
|
80
|
+
#### Naming Conventions
|
|
81
|
+
- **Variables, parameters, properties, and functions**: Use camelCase
|
|
82
|
+
- Examples: `userName`, `getUserData()`, `isLoading`
|
|
83
|
+
- **React components and TypeScript types/interfaces**: Use PascalCase
|
|
84
|
+
- Examples: `UserProfileDialog`, `interface User`, `type TableSchema`
|
|
85
|
+
- **Constants and Enum members**: Use UPPER_CASE
|
|
86
|
+
- Examples: `const API_BASE_URL`, `enum Status { ACTIVE, INACTIVE }`
|
|
87
|
+
- **File naming**:
|
|
88
|
+
- Components: `PascalCase.tsx` (e.g., `DataGrid.tsx`)
|
|
89
|
+
- Hooks: `use` + `PascalCase.ts` (e.g., `useAuth.ts`)
|
|
90
|
+
- Services: `camelCase.service.ts` (e.g., `auth.service.ts`)
|
|
91
|
+
- Utils: `kebab-case.ts` or `camelCase.ts` (e.g., `database-utils.ts`)
|
|
92
|
+
- **No snake_case**: Avoid snake_case except in SQL queries and external APIs
|
|
93
|
+
|
|
94
|
+
### Code Style
|
|
95
|
+
- Use single quotes for strings
|
|
96
|
+
- Include semicolons at the end of statements
|
|
97
|
+
- Use arrow functions for callbacks and inline functions
|
|
98
|
+
- Prefer const over let, avoid var
|
|
99
|
+
- Use template literals for string interpolation
|
|
100
|
+
- Maintain consistent indentation (2 spaces)
|
|
101
|
+
- Format code with Prettier configuration
|
|
102
|
+
|
|
103
|
+
## UI Guidelines
|
|
104
|
+
|
|
105
|
+
- Follow a clean, modern design with consistent spacing
|
|
106
|
+
- Use Radix UI primitives for accessibility
|
|
107
|
+
- Maintain consistent color scheme using CSS variables
|
|
108
|
+
- Use appropriate loading skeletons for data fetching
|
|
109
|
+
- Display clear error messages with actionable feedback
|
|
110
|
+
- Implement proper form validation with inline errors
|
|
111
|
+
- Use consistent icon set from lucide-react
|
|
112
|
+
|
|
113
|
+
## Testing Standards
|
|
114
|
+
|
|
115
|
+
- Implement integration tests for API endpoints
|
|
116
|
+
- Maintain test coverage above 70%
|
|
117
|
+
- Mock external dependencies appropriately
|
|
118
|
+
|
|
119
|
+
## Security Considerations
|
|
120
|
+
|
|
121
|
+
- Never commit secrets or API keys
|
|
122
|
+
- Use environment variables for configuration
|
|
123
|
+
- Implement proper authentication and authorization
|
|
124
|
+
- Validate all user inputs
|
|
125
|
+
- Sanitize data before database operations
|
|
126
|
+
- Use prepared statements for SQL queries
|
|
127
|
+
- Implement rate limiting for API endpoints
|
|
128
|
+
- Follow OWASP security best practices
|
|
129
|
+
|
|
130
|
+
## Performance Guidelines
|
|
131
|
+
|
|
132
|
+
- Implement proper database indexing
|
|
133
|
+
- Use pagination for large data sets
|
|
134
|
+
- Optimize React component re-renders
|
|
135
|
+
- Implement proper caching strategies
|
|
136
|
+
- Use lazy loading for code splitting
|
|
137
|
+
- Optimize bundle size with proper imports
|
|
138
|
+
- Monitor and log performance metrics
|
|
139
|
+
|
|
140
|
+
## Documentation
|
|
141
|
+
|
|
142
|
+
- Document all API endpoints with clear descriptions
|
|
143
|
+
- Include JSDoc comments for complex functions
|
|
144
|
+
- Maintain up-to-date README files
|
|
145
|
+
- Document environment variables and configuration
|
|
146
|
+
- Provide clear setup instructions
|
|
147
147
|
- Include examples for common use cases
|
|
@@ -1,65 +1,66 @@
|
|
|
1
|
-
name: Build and Push Docker Image on github container registry
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
tags:
|
|
6
|
-
- 'v*'
|
|
7
|
-
workflow_dispatch:
|
|
8
|
-
inputs:
|
|
9
|
-
test_tag:
|
|
10
|
-
description: 'Test tag name (e.g., v0.1.1-test)'
|
|
11
|
-
required: false
|
|
12
|
-
default: 'v0.1.1-test'
|
|
13
|
-
|
|
14
|
-
env:
|
|
15
|
-
REGISTRY: ghcr.io
|
|
16
|
-
IMAGE_NAME: ${{ github.repository_owner }}/insforge-oss
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
build-and-push:
|
|
20
|
-
runs-on: ubuntu-latest
|
|
21
|
-
permissions:
|
|
22
|
-
contents: read
|
|
23
|
-
packages: write
|
|
24
|
-
id-token: write
|
|
25
|
-
|
|
26
|
-
steps:
|
|
27
|
-
- name: Checkout repository
|
|
28
|
-
uses: actions/checkout@v4
|
|
29
|
-
|
|
30
|
-
- name: Set up QEMU
|
|
31
|
-
uses: docker/setup-qemu-action@v3
|
|
32
|
-
|
|
33
|
-
- name: Set up Docker Buildx
|
|
34
|
-
uses: docker/setup-buildx-action@v3
|
|
35
|
-
|
|
36
|
-
- name: Log in to GitHub Container Registry
|
|
37
|
-
uses: docker/login-action@v3
|
|
38
|
-
with:
|
|
39
|
-
registry: ${{ env.REGISTRY }}
|
|
40
|
-
username: ${{ github.actor }}
|
|
41
|
-
password: ${{ secrets.GHCR_PAT }}
|
|
42
|
-
|
|
43
|
-
- name: Extract metadata
|
|
44
|
-
id: meta
|
|
45
|
-
uses: docker/metadata-action@v5
|
|
46
|
-
with:
|
|
47
|
-
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
48
|
-
tags: |
|
|
49
|
-
type=ref,event=tag
|
|
50
|
-
type=raw,value=${{ github.event.inputs.test_tag }},enable=${{ github.event_name == 'workflow_dispatch' }}
|
|
51
|
-
|
|
52
|
-
- name: Build and push Docker image
|
|
53
|
-
uses: docker/build-push-action@v5
|
|
54
|
-
with:
|
|
55
|
-
context: .
|
|
56
|
-
platforms: linux/amd64,linux/arm64
|
|
57
|
-
push: true
|
|
58
|
-
tags: ${{ steps.meta.outputs.tags }}
|
|
59
|
-
labels: ${{ steps.meta.outputs.labels }}
|
|
60
|
-
cache-from: type=gha
|
|
61
|
-
cache-to: type=gha,mode=max
|
|
62
|
-
build-args: |
|
|
63
|
-
VERSION=${{ github.ref_name }}
|
|
64
|
-
BUILD_DATE=${{ github.event.head_commit.timestamp }}
|
|
65
|
-
COMMIT_SHA=${{ github.sha }}
|
|
1
|
+
name: Build and Push Docker Image on github container registry
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
test_tag:
|
|
10
|
+
description: 'Test tag name (e.g., v0.1.1-test)'
|
|
11
|
+
required: false
|
|
12
|
+
default: 'v0.1.1-test'
|
|
13
|
+
|
|
14
|
+
env:
|
|
15
|
+
REGISTRY: ghcr.io
|
|
16
|
+
IMAGE_NAME: ${{ github.repository_owner }}/insforge-oss
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build-and-push:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
packages: write
|
|
24
|
+
id-token: write
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- name: Checkout repository
|
|
28
|
+
uses: actions/checkout@v4
|
|
29
|
+
|
|
30
|
+
- name: Set up QEMU
|
|
31
|
+
uses: docker/setup-qemu-action@v3
|
|
32
|
+
|
|
33
|
+
- name: Set up Docker Buildx
|
|
34
|
+
uses: docker/setup-buildx-action@v3
|
|
35
|
+
|
|
36
|
+
- name: Log in to GitHub Container Registry
|
|
37
|
+
uses: docker/login-action@v3
|
|
38
|
+
with:
|
|
39
|
+
registry: ${{ env.REGISTRY }}
|
|
40
|
+
username: ${{ github.actor }}
|
|
41
|
+
password: ${{ secrets.GHCR_PAT }}
|
|
42
|
+
|
|
43
|
+
- name: Extract metadata
|
|
44
|
+
id: meta
|
|
45
|
+
uses: docker/metadata-action@v5
|
|
46
|
+
with:
|
|
47
|
+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
48
|
+
tags: |
|
|
49
|
+
type=ref,event=tag
|
|
50
|
+
type=raw,value=${{ github.event.inputs.test_tag }},enable=${{ github.event_name == 'workflow_dispatch' }}
|
|
51
|
+
|
|
52
|
+
- name: Build and push Docker image
|
|
53
|
+
uses: docker/build-push-action@v5
|
|
54
|
+
with:
|
|
55
|
+
context: .
|
|
56
|
+
platforms: linux/amd64,linux/arm64
|
|
57
|
+
push: true
|
|
58
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
59
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
60
|
+
cache-from: type=gha
|
|
61
|
+
cache-to: type=gha,mode=max
|
|
62
|
+
build-args: |
|
|
63
|
+
VERSION=${{ github.ref_name }}
|
|
64
|
+
BUILD_DATE=${{ github.event.head_commit.timestamp }}
|
|
65
|
+
COMMIT_SHA=${{ github.sha }}
|
|
66
|
+
VITE_PUBLIC_POSTHOG_KEY=${{ secrets.POSTHOG_KEY }}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
name: CI Pre-merge Check
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches: [ main, master, develop ]
|
|
6
|
-
push:
|
|
7
|
-
branches: [ main, master, develop ]
|
|
8
|
-
workflow_dispatch: # Allows manual triggering for testing
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
docker-build:
|
|
12
|
-
name: CI Pre-merge Check
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- name: Checkout code
|
|
17
|
-
uses: actions/checkout@v4
|
|
18
|
-
|
|
19
|
-
- name: Build Docker image
|
|
20
|
-
uses: docker/build-push-action@v5
|
|
21
|
-
with:
|
|
22
|
-
context: .
|
|
23
|
-
push: false
|
|
1
|
+
name: CI Pre-merge Check
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [ main, master, develop ]
|
|
6
|
+
push:
|
|
7
|
+
branches: [ main, master, develop ]
|
|
8
|
+
workflow_dispatch: # Allows manual triggering for testing
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
docker-build:
|
|
12
|
+
name: CI Pre-merge Check
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout code
|
|
17
|
+
uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Build Docker image
|
|
20
|
+
uses: docker/build-push-action@v5
|
|
21
|
+
with:
|
|
22
|
+
context: .
|
|
23
|
+
push: false
|
|
24
24
|
tags: insforge:test
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
name: E2E Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main, master, develop]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
e2e:
|
|
10
|
+
name: E2E Tests
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout code
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Create .env file
|
|
18
|
+
run: |
|
|
19
|
+
cat > .env << EOF
|
|
20
|
+
POSTGRES_USER=postgres
|
|
21
|
+
POSTGRES_PASSWORD=postgres
|
|
22
|
+
POSTGRES_DB=insforge
|
|
23
|
+
JWT_SECRET=test-secret-key-for-ci-cd-pipeline
|
|
24
|
+
ADMIN_EMAIL=admin@example.com
|
|
25
|
+
ADMIN_PASSWORD=test-admin-password-for-ci
|
|
26
|
+
TEST_API_BASE=http://localhost:7130/api
|
|
27
|
+
EOF
|
|
28
|
+
|
|
29
|
+
- name: Start Docker Compose services
|
|
30
|
+
run: docker compose up -d
|
|
31
|
+
|
|
32
|
+
- name: Wait for PostgreSQL to be ready
|
|
33
|
+
run: |
|
|
34
|
+
echo "Waiting for PostgreSQL..."
|
|
35
|
+
timeout 60 bash -c 'until docker compose exec -T postgres pg_isready -U postgres; do sleep 2; done'
|
|
36
|
+
|
|
37
|
+
- name: Wait for InsForge backend to be ready
|
|
38
|
+
run: |
|
|
39
|
+
echo "Waiting for InsForge backend..."
|
|
40
|
+
timeout 120 bash -c 'until curl -f http://localhost:7130/api/health 2>/dev/null; do echo "Waiting..."; sleep 5; done'
|
|
41
|
+
echo "Backend is ready!"
|
|
42
|
+
|
|
43
|
+
- name: Install test dependencies in container
|
|
44
|
+
run: docker compose exec -T insforge apk add --no-cache bash curl jq
|
|
45
|
+
|
|
46
|
+
- name: Run E2E tests
|
|
47
|
+
run: docker compose exec -T insforge npm run test:e2e
|
|
48
|
+
|
|
49
|
+
- name: Show container logs on failure
|
|
50
|
+
if: failure()
|
|
51
|
+
run: |
|
|
52
|
+
echo "=== PostgreSQL logs ==="
|
|
53
|
+
docker compose logs postgres
|
|
54
|
+
echo ""
|
|
55
|
+
echo "=== InsForge backend logs ==="
|
|
56
|
+
docker compose logs insforge
|
|
57
|
+
echo ""
|
|
58
|
+
echo "=== PostgREST logs ==="
|
|
59
|
+
docker compose logs postgrest
|
|
60
|
+
|
|
61
|
+
- name: Cleanup
|
|
62
|
+
if: always()
|
|
63
|
+
run: docker compose down -v
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
name: Lint and Format Check
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ main ]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [ '*' ]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
lint-and-format:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
|
|
13
|
-
steps:
|
|
14
|
-
- name: Checkout repository
|
|
15
|
-
uses: actions/checkout@v4
|
|
16
|
-
|
|
17
|
-
- name: Setup Node.js
|
|
18
|
-
uses: actions/setup-node@v4
|
|
19
|
-
with:
|
|
20
|
-
node-version: '20'
|
|
21
|
-
cache: 'npm'
|
|
22
|
-
|
|
23
|
-
- name: Install dependencies
|
|
24
|
-
run: npm ci
|
|
25
|
-
|
|
26
|
-
- name: Run ESLint
|
|
27
|
-
run: npm run lint
|
|
28
|
-
|
|
29
|
-
- name: Check Prettier formatting
|
|
30
|
-
run: npx prettier --check .
|
|
31
|
-
|
|
32
|
-
- name: Run TypeScript type checking
|
|
1
|
+
name: Lint and Format Check
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ '*' ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint-and-format:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout repository
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Setup Node.js
|
|
18
|
+
uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: '20'
|
|
21
|
+
cache: 'npm'
|
|
22
|
+
|
|
23
|
+
- name: Install dependencies
|
|
24
|
+
run: npm ci
|
|
25
|
+
|
|
26
|
+
- name: Run ESLint
|
|
27
|
+
run: npm run lint
|
|
28
|
+
|
|
29
|
+
- name: Check Prettier formatting
|
|
30
|
+
run: npx prettier --check .
|
|
31
|
+
|
|
32
|
+
- name: Run TypeScript type checking
|
|
33
33
|
run: npm run typecheck
|