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.
Files changed (395) hide show
  1. package/.dockerignore +58 -0
  2. package/.env.example +49 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
  6. package/.github/copilot-instructions.md +147 -0
  7. package/.github/workflows/build-image.yml +65 -0
  8. package/.github/workflows/ci-premerge-check.yml +24 -0
  9. package/.github/workflows/deploy-aws.yml +130 -0
  10. package/.github/workflows/lint-and-format.yml +33 -0
  11. package/.prettierignore +65 -0
  12. package/.prettierrc +9 -0
  13. package/CHANGELOG.md +3 -0
  14. package/CONTRIBUTING.md +126 -0
  15. package/Dockerfile +27 -0
  16. package/GITHUB_OAUTH_SETUP.md +49 -0
  17. package/GOOGLE_OAUTH_SETUP.md +148 -0
  18. package/LICENSE +201 -0
  19. package/README.md +134 -0
  20. package/assets/Dark.svg +23 -0
  21. package/assets/archDiagram.png +0 -0
  22. package/assets/banner.png +0 -0
  23. package/assets/mcpInstallv2.png +0 -0
  24. package/assets/sampleResponse.png +0 -0
  25. package/assets/signin.png +0 -0
  26. package/assets/userflow.png +0 -0
  27. package/backend/migrations/000_create-base-tables.sql +142 -0
  28. package/backend/migrations/001_create-helper-functions.sql +41 -0
  29. package/backend/migrations/002_rename-auth-tables.sql +30 -0
  30. package/backend/migrations/003_create-users-table.sql +56 -0
  31. package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
  32. package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
  33. package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
  34. package/backend/migrations/007_drop-metadata-table.sql +2 -0
  35. package/backend/migrations/008_add-system-tables.sql +77 -0
  36. package/backend/migrations/009_add-function-secrets.sql +24 -0
  37. package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
  38. package/backend/migrations/011_refactor-secrets-table.sql +15 -0
  39. package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
  40. package/backend/package.json +75 -0
  41. package/backend/src/api/middleware/auth.ts +240 -0
  42. package/backend/src/api/middleware/error.ts +231 -0
  43. package/backend/src/api/middleware/upload.ts +59 -0
  44. package/backend/src/api/routes/agent.ts +29 -0
  45. package/backend/src/api/routes/ai.ts +472 -0
  46. package/backend/src/api/routes/auth.oauth.ts +482 -0
  47. package/backend/src/api/routes/auth.ts +386 -0
  48. package/backend/src/api/routes/database.advance.ts +275 -0
  49. package/backend/src/api/routes/database.records.ts +246 -0
  50. package/backend/src/api/routes/database.tables.ts +161 -0
  51. package/backend/src/api/routes/docs.ts +66 -0
  52. package/backend/src/api/routes/functions.ts +183 -0
  53. package/backend/src/api/routes/logs.ts +150 -0
  54. package/backend/src/api/routes/metadata.ts +160 -0
  55. package/backend/src/api/routes/openapi.ts +82 -0
  56. package/backend/src/api/routes/secrets.ts +199 -0
  57. package/backend/src/api/routes/storage.ts +547 -0
  58. package/backend/src/api/routes/usage.ts +96 -0
  59. package/backend/src/core/ai/chat.ts +207 -0
  60. package/backend/src/core/ai/client.ts +242 -0
  61. package/backend/src/core/ai/config.ts +187 -0
  62. package/backend/src/core/ai/image.ts +156 -0
  63. package/backend/src/core/ai/model.ts +117 -0
  64. package/backend/src/core/ai/usage.ts +290 -0
  65. package/backend/src/core/auth/auth.ts +781 -0
  66. package/backend/src/core/auth/oauth.ts +398 -0
  67. package/backend/src/core/database/advance.ts +1074 -0
  68. package/backend/src/core/database/manager.ts +178 -0
  69. package/backend/src/core/database/table.ts +772 -0
  70. package/backend/src/core/documentation/agent.ts +689 -0
  71. package/backend/src/core/documentation/openapi.ts +856 -0
  72. package/backend/src/core/functions/functions.ts +310 -0
  73. package/backend/src/core/logs/analytics.ts +76 -0
  74. package/backend/src/core/logs/audit.ts +255 -0
  75. package/backend/src/core/logs/providers/base.provider.ts +83 -0
  76. package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
  77. package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
  78. package/backend/src/core/secrets/encryption.ts +58 -0
  79. package/backend/src/core/secrets/secrets.ts +410 -0
  80. package/backend/src/core/socket/socket.ts +388 -0
  81. package/backend/src/core/socket/types.ts +79 -0
  82. package/backend/src/core/storage/storage.ts +923 -0
  83. package/backend/src/server.ts +288 -0
  84. package/backend/src/types/ai.ts +46 -0
  85. package/backend/src/types/auth.ts +90 -0
  86. package/backend/src/types/database.ts +136 -0
  87. package/backend/src/types/error-constants.ts +86 -0
  88. package/backend/src/types/logs.ts +47 -0
  89. package/backend/src/types/profile.ts +55 -0
  90. package/backend/src/types/storage.ts +23 -0
  91. package/backend/src/utils/cloud-token.ts +39 -0
  92. package/backend/src/utils/constants.ts +1 -0
  93. package/backend/src/utils/environment.ts +35 -0
  94. package/backend/src/utils/helpers.ts +49 -0
  95. package/backend/src/utils/logger.ts +13 -0
  96. package/backend/src/utils/response.ts +62 -0
  97. package/backend/src/utils/seed.ts +205 -0
  98. package/backend/src/utils/sql-parser.ts +63 -0
  99. package/backend/src/utils/uuid.ts +9 -0
  100. package/backend/src/utils/validations.ts +129 -0
  101. package/backend/tests/README.md +134 -0
  102. package/backend/tests/cleanup-all-test-data.sh +231 -0
  103. package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
  104. package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
  105. package/backend/tests/local/test-auth-router.sh +144 -0
  106. package/backend/tests/local/test-database-router.sh +222 -0
  107. package/backend/tests/local/test-e2e.sh +241 -0
  108. package/backend/tests/local/test-fk-errors.sh +97 -0
  109. package/backend/tests/local/test-id-field.sh +201 -0
  110. package/backend/tests/local/test-public-bucket.sh +265 -0
  111. package/backend/tests/local/test-secrets.sh +248 -0
  112. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
  113. package/backend/tests/local/test-traditional-rest.sh +209 -0
  114. package/backend/tests/manual/README.md +51 -0
  115. package/backend/tests/manual/create-large-table-simple.sql +11 -0
  116. package/backend/tests/manual/seed-large-table.sql +101 -0
  117. package/backend/tests/manual/setup-large-table-extras.sql +34 -0
  118. package/backend/tests/manual/test-better-auth.sh +303 -0
  119. package/backend/tests/manual/test-bulk-upsert.sh +410 -0
  120. package/backend/tests/manual/test-database-advance.sh +297 -0
  121. package/backend/tests/manual/test-postgrest-stability.sh +192 -0
  122. package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
  123. package/backend/tests/manual/test-universal-storage.sh +264 -0
  124. package/backend/tests/manual/test-users.sql +18 -0
  125. package/backend/tests/run-all-tests.sh +140 -0
  126. package/backend/tests/setup.ts +22 -0
  127. package/backend/tests/test-config.sh +303 -0
  128. package/backend/tsconfig.json +23 -0
  129. package/backend/tsup.config.ts +18 -0
  130. package/backend/vitest.config.ts +22 -0
  131. package/docker-compose.prod.yml +145 -0
  132. package/docker-compose.yml +167 -0
  133. package/docker-init/db/db-init.sql +125 -0
  134. package/docker-init/db/jwt.sql +5 -0
  135. package/docker-init/db/logs.sql +9 -0
  136. package/docker-init/db/postgresql.conf +17 -0
  137. package/docs/deprecated/insforge-auth-api.md +215 -0
  138. package/docs/deprecated/insforge-auth-sdk.md +100 -0
  139. package/docs/deprecated/insforge-db-api.md +359 -0
  140. package/docs/deprecated/insforge-db-sdk.md +140 -0
  141. package/docs/deprecated/insforge-debug-sdk.md +157 -0
  142. package/docs/deprecated/insforge-debug.md +65 -0
  143. package/docs/deprecated/insforge-instructions.md +124 -0
  144. package/docs/deprecated/insforge-project.md +118 -0
  145. package/docs/deprecated/insforge-storage-api.md +279 -0
  146. package/docs/deprecated/insforge-storage-sdk.md +159 -0
  147. package/docs/insforge-instructions-sdk.md +407 -0
  148. package/eslint.config.js +317 -0
  149. package/examples/oauth/frontend-oauth-example.html +251 -0
  150. package/examples/response-examples.md +444 -0
  151. package/frontend/README.md +112 -0
  152. package/frontend/components.json +17 -0
  153. package/frontend/index.html +13 -0
  154. package/frontend/package.json +63 -0
  155. package/frontend/public/favicon.ico +0 -0
  156. package/frontend/src/App.tsx +106 -0
  157. package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
  158. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
  159. package/frontend/src/assets/icons/checked.svg +3 -0
  160. package/frontend/src/assets/icons/error.svg +3 -0
  161. package/frontend/src/assets/icons/pencil.svg +4 -0
  162. package/frontend/src/assets/icons/refresh.svg +4 -0
  163. package/frontend/src/assets/icons/step_active.svg +3 -0
  164. package/frontend/src/assets/icons/step_inactive.svg +11 -0
  165. package/frontend/src/assets/icons/warning.svg +3 -0
  166. package/frontend/src/assets/logos/amazon.svg +1 -0
  167. package/frontend/src/assets/logos/claude_code.svg +3 -0
  168. package/frontend/src/assets/logos/cline.svg +6 -0
  169. package/frontend/src/assets/logos/cursor.svg +20 -0
  170. package/frontend/src/assets/logos/discord.svg +9 -0
  171. package/frontend/src/assets/logos/gemini.svg +19 -0
  172. package/frontend/src/assets/logos/github.svg +5 -0
  173. package/frontend/src/assets/logos/google.svg +13 -0
  174. package/frontend/src/assets/logos/grok.svg +10 -0
  175. package/frontend/src/assets/logos/insforge_dark.svg +15 -0
  176. package/frontend/src/assets/logos/insforge_light.svg +15 -0
  177. package/frontend/src/assets/logos/openai.svg +10 -0
  178. package/frontend/src/assets/logos/roo_code.svg +9 -0
  179. package/frontend/src/assets/logos/trae.svg +3 -0
  180. package/frontend/src/assets/logos/windsurf.svg +10 -0
  181. package/frontend/src/components/ButtonWithLoading.tsx +27 -0
  182. package/frontend/src/components/Checkbox.tsx +61 -0
  183. package/frontend/src/components/CodeBlock.tsx +32 -0
  184. package/frontend/src/components/ConfirmDialog.tsx +96 -0
  185. package/frontend/src/components/CopyButton.tsx +69 -0
  186. package/frontend/src/components/DeleteActionButton.tsx +42 -0
  187. package/frontend/src/components/EmptyState.tsx +41 -0
  188. package/frontend/src/components/ErrorState.tsx +35 -0
  189. package/frontend/src/components/FeatureSidebar.tsx +126 -0
  190. package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
  191. package/frontend/src/components/JsonHighlight.tsx +61 -0
  192. package/frontend/src/components/LoadingState.tsx +16 -0
  193. package/frontend/src/components/PaginationControls.tsx +54 -0
  194. package/frontend/src/components/PromptDialog.tsx +68 -0
  195. package/frontend/src/components/SearchInput.tsx +90 -0
  196. package/frontend/src/components/SelectionClearButton.tsx +26 -0
  197. package/frontend/src/components/Stepper.tsx +139 -0
  198. package/frontend/src/components/ThemeToggle.tsx +58 -0
  199. package/frontend/src/components/TypeBadge.tsx +20 -0
  200. package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
  201. package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
  202. package/frontend/src/components/datagrid/IdCell.tsx +44 -0
  203. package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
  204. package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
  205. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
  206. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
  207. package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
  208. package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
  209. package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
  210. package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
  211. package/frontend/src/components/datagrid/index.tsx +20 -0
  212. package/frontend/src/components/index.ts +39 -0
  213. package/frontend/src/components/layout/AppHeader.tsx +146 -0
  214. package/frontend/src/components/layout/AppSidebar.tsx +190 -0
  215. package/frontend/src/components/layout/CloudLayout.tsx +95 -0
  216. package/frontend/src/components/layout/Layout.tsx +43 -0
  217. package/frontend/src/components/radix/Alert.tsx +45 -0
  218. package/frontend/src/components/radix/AlertDialog.tsx +115 -0
  219. package/frontend/src/components/radix/Avatar.tsx +45 -0
  220. package/frontend/src/components/radix/Badge.tsx +33 -0
  221. package/frontend/src/components/radix/Button.tsx +50 -0
  222. package/frontend/src/components/radix/Card.tsx +58 -0
  223. package/frontend/src/components/radix/Dialog.tsx +98 -0
  224. package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
  225. package/frontend/src/components/radix/Form.tsx +167 -0
  226. package/frontend/src/components/radix/Input.tsx +22 -0
  227. package/frontend/src/components/radix/Label.tsx +19 -0
  228. package/frontend/src/components/radix/Popover.tsx +29 -0
  229. package/frontend/src/components/radix/ScrollArea.tsx +44 -0
  230. package/frontend/src/components/radix/Select.tsx +151 -0
  231. package/frontend/src/components/radix/Separator.tsx +26 -0
  232. package/frontend/src/components/radix/Sheet.tsx +119 -0
  233. package/frontend/src/components/radix/Skeleton.tsx +7 -0
  234. package/frontend/src/components/radix/Switch.tsx +29 -0
  235. package/frontend/src/components/radix/Tabs.tsx +50 -0
  236. package/frontend/src/components/radix/Textarea.tsx +21 -0
  237. package/frontend/src/components/radix/Tooltip.tsx +28 -0
  238. package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
  239. package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
  240. package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
  241. package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
  242. package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
  243. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
  244. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
  245. package/frontend/src/features/ai/helpers.ts +155 -0
  246. package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
  247. package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
  248. package/frontend/src/features/ai/page/AIPage.tsx +178 -0
  249. package/frontend/src/features/ai/services/ai.service.ts +148 -0
  250. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
  251. package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
  252. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
  253. package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
  254. package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
  255. package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
  256. package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
  257. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
  258. package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
  259. package/frontend/src/features/auth/index.ts +9 -0
  260. package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
  261. package/frontend/src/features/auth/services/auth.service.ts +112 -0
  262. package/frontend/src/features/auth/services/oauth.service.ts +49 -0
  263. package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
  264. package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
  265. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
  266. package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
  267. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
  268. package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
  269. package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
  270. package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
  271. package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
  272. package/frontend/src/features/database/components/TableForm.tsx +656 -0
  273. package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
  274. package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
  275. package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
  276. package/frontend/src/features/database/constants.ts +26 -0
  277. package/frontend/src/features/database/helpers.ts +125 -0
  278. package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
  279. package/frontend/src/features/database/index.ts +12 -0
  280. package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
  281. package/frontend/src/features/database/schema.ts +25 -0
  282. package/frontend/src/features/database/services/database.service.ts +216 -0
  283. package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
  284. package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
  285. package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
  286. package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
  287. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
  288. package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
  289. package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
  290. package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
  291. package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
  292. package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
  293. package/frontend/src/features/functions/services/functions.service.ts +48 -0
  294. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
  295. package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
  296. package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
  297. package/frontend/src/features/login/page/LoginPage.tsx +174 -0
  298. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
  299. package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
  300. package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
  301. package/frontend/src/features/logs/index.ts +5 -0
  302. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
  303. package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
  304. package/frontend/src/features/logs/services/log.service.ts +171 -0
  305. package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
  306. package/frontend/src/features/metadata/index.ts +0 -0
  307. package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
  308. package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
  309. package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
  310. package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
  311. package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
  312. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
  313. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
  314. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
  315. package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
  316. package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
  317. package/frontend/src/features/onboard/index.ts +3 -0
  318. package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
  319. package/frontend/src/features/onboard/types.ts +8 -0
  320. package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
  321. package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
  322. package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
  323. package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
  324. package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
  325. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
  326. package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
  327. package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
  328. package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
  329. package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
  330. package/frontend/src/features/storage/index.ts +3 -0
  331. package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
  332. package/frontend/src/features/storage/services/storage.service.ts +144 -0
  333. package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
  334. package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
  335. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
  336. package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
  337. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
  338. package/frontend/src/features/visualizer/components/index.ts +5 -0
  339. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
  340. package/frontend/src/index.css +248 -0
  341. package/frontend/src/lib/api/client.ts +163 -0
  342. package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
  343. package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
  344. package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
  345. package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
  346. package/frontend/src/lib/hooks/useAuth.ts +4 -0
  347. package/frontend/src/lib/hooks/useConfirm.ts +55 -0
  348. package/frontend/src/lib/hooks/useInterval.ts +27 -0
  349. package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
  350. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
  351. package/frontend/src/lib/hooks/usePagination.ts +27 -0
  352. package/frontend/src/lib/hooks/useTimeout.ts +27 -0
  353. package/frontend/src/lib/hooks/useToast.tsx +229 -0
  354. package/frontend/src/lib/utils/constants.ts +38 -0
  355. package/frontend/src/lib/utils/utils.ts +165 -0
  356. package/frontend/src/lib/utils/validation-schemas.ts +126 -0
  357. package/frontend/src/main.tsx +16 -0
  358. package/frontend/src/rdg.css +194 -0
  359. package/frontend/src/vite-env.d.ts +12 -0
  360. package/frontend/tailwind.config.js +97 -0
  361. package/frontend/tsconfig.json +26 -0
  362. package/frontend/tsconfig.node.json +10 -0
  363. package/frontend/vite.config.ts +37 -0
  364. package/frontend/vitest.config.ts +36 -0
  365. package/functions/deno.json +25 -0
  366. package/functions/server.ts +290 -0
  367. package/functions/worker-template.js +126 -0
  368. package/openapi/ai.yaml +689 -0
  369. package/openapi/auth.yaml +563 -0
  370. package/openapi/functions.yaml +476 -0
  371. package/openapi/health.yaml +30 -0
  372. package/openapi/logs.yaml +224 -0
  373. package/openapi/metadata.yaml +178 -0
  374. package/openapi/records.yaml +382 -0
  375. package/openapi/secrets.yaml +371 -0
  376. package/openapi/storage.yaml +876 -0
  377. package/openapi/tables.yaml +464 -0
  378. package/package.json +88 -0
  379. package/shared-schemas/package.json +31 -0
  380. package/shared-schemas/src/ai-api.schema.ts +167 -0
  381. package/shared-schemas/src/ai.schema.ts +54 -0
  382. package/shared-schemas/src/auth-api.schema.ts +193 -0
  383. package/shared-schemas/src/auth.schema.ts +94 -0
  384. package/shared-schemas/src/database-api.schema.ts +259 -0
  385. package/shared-schemas/src/database.schema.ts +69 -0
  386. package/shared-schemas/src/functions-api.schema.ts +25 -0
  387. package/shared-schemas/src/functions.schema.ts +16 -0
  388. package/shared-schemas/src/index.ts +13 -0
  389. package/shared-schemas/src/logs-api.schema.ts +49 -0
  390. package/shared-schemas/src/logs.schema.ts +14 -0
  391. package/shared-schemas/src/metadata.schema.ts +56 -0
  392. package/shared-schemas/src/storage-api.schema.ts +65 -0
  393. package/shared-schemas/src/storage.schema.ts +19 -0
  394. package/shared-schemas/tsconfig.json +21 -0
  395. package/tsconfig.json +8 -0
@@ -0,0 +1,259 @@
1
+ import { z } from 'zod';
2
+ import { columnSchema, foreignKeySchema, tableSchema } from './database.schema';
3
+
4
+ export const createTableRequestSchema = tableSchema
5
+ .pick({
6
+ tableName: true,
7
+ columns: true,
8
+ })
9
+ .extend({
10
+ rlsEnabled: z.boolean().default(true),
11
+ });
12
+
13
+ export const createTableResponseSchema = tableSchema
14
+ .pick({
15
+ tableName: true,
16
+ columns: true,
17
+ })
18
+ .extend({
19
+ message: z.string(),
20
+ autoFields: z.array(z.string()),
21
+ nextActions: z.string(),
22
+ });
23
+
24
+ export const getTableSchemaResponseSchema = tableSchema;
25
+
26
+ export const updateTableSchemaRequestSchema = z.object({
27
+ addColumns: z
28
+ .array(
29
+ columnSchema.omit({
30
+ foreignKey: true,
31
+ })
32
+ )
33
+ .optional(),
34
+ dropColumns: z.array(z.string()).optional(),
35
+ updateColumns: z
36
+ .array(
37
+ z.object({
38
+ columnName: z.string(),
39
+ defaultValue: z.string().optional(),
40
+ newColumnName: z
41
+ .string()
42
+ .min(1, 'New column name cannot be empty')
43
+ .max(64, 'New column name must be less than 64 characters')
44
+ .optional(),
45
+ })
46
+ )
47
+ .optional(),
48
+ addForeignKeys: z
49
+ .array(
50
+ z.object({
51
+ columnName: z.string().min(1, 'Column name is required for adding foreign key'),
52
+ foreignKey: foreignKeySchema,
53
+ })
54
+ )
55
+ .optional(),
56
+ dropForeignKeys: z.array(z.string()).optional(),
57
+ renameTable: z
58
+ .object({
59
+ newTableName: z
60
+ .string()
61
+ .min(1, 'New table name cannot be empty')
62
+ .max(64, 'New table name must be less than 64 characters'),
63
+ })
64
+ .optional(),
65
+ });
66
+
67
+ export const updateTableSchemaResponse = z.object({
68
+ message: z.string(),
69
+ tableName: z.string(),
70
+ operations: z.array(z.string()),
71
+ });
72
+
73
+ export const deleteTableResponse = z.object({
74
+ message: z.string(),
75
+ tableName: z.string(),
76
+ nextActions: z.string(),
77
+ });
78
+
79
+ // Raw SQL Schemas
80
+ export const rawSQLRequestSchema = z.object({
81
+ query: z.string().min(1, 'Query is required'),
82
+ params: z.array(z.any()).optional(),
83
+ });
84
+
85
+ export const rawSQLResponseSchema = z.object({
86
+ rows: z.array(z.any()),
87
+ rowCount: z.number().nullable(),
88
+ fields: z
89
+ .array(
90
+ z.object({
91
+ name: z.string(),
92
+ dataTypeID: z.number(),
93
+ })
94
+ )
95
+ .optional(),
96
+ });
97
+
98
+ // Export Schemas
99
+ export const exportRequestSchema = z.object({
100
+ tables: z.array(z.string()).optional(),
101
+ format: z.enum(['sql', 'json']).default('sql'),
102
+ includeData: z.boolean().default(true),
103
+ includeFunctions: z.boolean().default(false),
104
+ includeSequences: z.boolean().default(false),
105
+ includeViews: z.boolean().default(false),
106
+ rowLimit: z.number().int().positive().max(10000).default(1000),
107
+ });
108
+
109
+ export const exportJsonDataSchema = z.object({
110
+ timestamp: z.string(),
111
+ tables: z.record(
112
+ z.string(),
113
+ z.object({
114
+ schema: z.array(
115
+ z.object({
116
+ columnName: z.string(),
117
+ dataType: z.string(),
118
+ characterMaximumLength: z.number().nullable(),
119
+ isNullable: z.string(),
120
+ columnDefault: z.string().nullable(),
121
+ })
122
+ ),
123
+ indexes: z.array(
124
+ z.object({
125
+ indexname: z.string(),
126
+ indexdef: z.string(),
127
+ isUnique: z.boolean().nullable(),
128
+ isPrimary: z.boolean().nullable(),
129
+ })
130
+ ),
131
+ foreignKeys: z.array(
132
+ z.object({
133
+ constraintName: z.string(),
134
+ columnName: z.string(),
135
+ foreignTableName: z.string(),
136
+ foreignColumnName: z.string(),
137
+ deleteRule: z.string().nullable(),
138
+ updateRule: z.string().nullable(),
139
+ })
140
+ ),
141
+ rlsEnabled: z.boolean().optional(),
142
+ policies: z.array(
143
+ z.object({
144
+ policyname: z.string(),
145
+ cmd: z.string(),
146
+ roles: z.array(z.string()),
147
+ qual: z.string().nullable(),
148
+ withCheck: z.string().nullable(),
149
+ })
150
+ ),
151
+ triggers: z.array(
152
+ z.object({
153
+ triggerName: z.string(),
154
+ actionTiming: z.string(),
155
+ eventManipulation: z.string(),
156
+ actionOrientation: z.string(),
157
+ actionCondition: z.string().nullable(),
158
+ actionStatement: z.string(),
159
+ newTable: z.string().nullable(),
160
+ oldTable: z.string().nullable(),
161
+ })
162
+ ),
163
+ rows: z.array(z.any()).optional(),
164
+ recordCount: z.number().optional(),
165
+ })
166
+ ),
167
+ functions: z.array(
168
+ z.object({
169
+ functionName: z.string(),
170
+ functionDef: z.string(),
171
+ kind: z.string(),
172
+ })
173
+ ),
174
+ sequences: z.array(
175
+ z.object({
176
+ sequenceName: z.string(),
177
+ startValue: z.string(),
178
+ increment: z.string(),
179
+ minValue: z.string().nullable(),
180
+ maxValue: z.string().nullable(),
181
+ cycle: z.string(),
182
+ })
183
+ ),
184
+ views: z.array(
185
+ z.object({
186
+ viewName: z.string(),
187
+ definition: z.string(),
188
+ })
189
+ ),
190
+ });
191
+
192
+ export const exportResponseSchema = z.object({
193
+ format: z.enum(['sql', 'json']),
194
+ data: z.union([z.string(), exportJsonDataSchema]),
195
+ timestamp: z.string(),
196
+ });
197
+
198
+ // Import Schemas
199
+ export const importRequestSchema = z.object({
200
+ truncate: z
201
+ .union([
202
+ z.boolean(),
203
+ z.string().transform((val) => {
204
+ if (val === 'true') return true;
205
+ if (val === 'false') return false;
206
+ throw new Error('Invalid boolean string');
207
+ }),
208
+ ])
209
+ .default(false),
210
+ });
211
+
212
+ export const importResponseSchema = z.object({
213
+ success: z.boolean(),
214
+ message: z.string(),
215
+ filename: z.string(),
216
+ tables: z.array(z.string()),
217
+ rowsImported: z.number(),
218
+ fileSize: z.number(),
219
+ });
220
+
221
+ // Bulk Upsert Schemas
222
+ export const bulkUpsertRequestSchema = z.object({
223
+ table: z.string().min(1, 'Table name is required'),
224
+ upsertKey: z.string().optional(),
225
+ // Note: File handling is done at the API layer via multipart/form-data
226
+ });
227
+
228
+ export const bulkUpsertResponseSchema = z.object({
229
+ success: z.boolean(),
230
+ message: z.string(),
231
+ table: z.string(),
232
+ rowsAffected: z.number(),
233
+ totalRecords: z.number(),
234
+ filename: z.string(),
235
+ });
236
+
237
+ export type CreateTableRequest = z.infer<typeof createTableRequestSchema>;
238
+ export type CreateTableResponse = z.infer<typeof createTableResponseSchema>;
239
+ export type GetTableSchemaResponse = z.infer<typeof getTableSchemaResponseSchema>;
240
+ export type UpdateTableSchemaRequest = z.infer<typeof updateTableSchemaRequestSchema>;
241
+ export type UpdateTableSchemaResponse = z.infer<typeof updateTableSchemaResponse>;
242
+ export type DeleteTableResponse = z.infer<typeof deleteTableResponse>;
243
+
244
+ // Raw SQL Types
245
+ export type RawSQLRequest = z.infer<typeof rawSQLRequestSchema>;
246
+ export type RawSQLResponse = z.infer<typeof rawSQLResponseSchema>;
247
+
248
+ // Export Types
249
+ export type ExportDatabaseRequest = z.infer<typeof exportRequestSchema>;
250
+ export type ExportDatabaseJsonData = z.infer<typeof exportJsonDataSchema>;
251
+ export type ExportDatabaseResponse = z.infer<typeof exportResponseSchema>;
252
+
253
+ // Import Types
254
+ export type ImportDatabaseRequest = z.infer<typeof importRequestSchema>;
255
+ export type ImportDatabaseResponse = z.infer<typeof importResponseSchema>;
256
+
257
+ // Bulk Upsert Types
258
+ export type BulkUpsertRequest = z.infer<typeof bulkUpsertRequestSchema>;
259
+ export type BulkUpsertResponse = z.infer<typeof bulkUpsertResponseSchema>;
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+
3
+ export enum ColumnType {
4
+ STRING = 'string',
5
+ DATE = 'date',
6
+ DATETIME = 'datetime',
7
+ INTEGER = 'integer',
8
+ FLOAT = 'float',
9
+ BOOLEAN = 'boolean',
10
+ UUID = 'uuid',
11
+ JSON = 'json',
12
+ }
13
+
14
+ export const onUpdateActionSchema = z.enum(['CASCADE', 'RESTRICT', 'NO ACTION']);
15
+ export const onDeleteActionSchema = z.enum([
16
+ 'CASCADE',
17
+ 'SET NULL',
18
+ 'SET DEFAULT',
19
+ 'RESTRICT',
20
+ 'NO ACTION',
21
+ ]);
22
+
23
+ export const columnTypeSchema = z.enum([
24
+ ColumnType.STRING,
25
+ ColumnType.DATE,
26
+ ColumnType.DATETIME,
27
+ ColumnType.INTEGER,
28
+ ColumnType.FLOAT,
29
+ ColumnType.BOOLEAN,
30
+ ColumnType.UUID,
31
+ ColumnType.JSON,
32
+ ]);
33
+
34
+ export const foreignKeySchema = z.object({
35
+ referenceTable: z.string().min(1, 'Target table cannot be empty'),
36
+ referenceColumn: z.string().min(1, 'Target column cannot be empty'),
37
+ onDelete: onDeleteActionSchema,
38
+ onUpdate: onUpdateActionSchema,
39
+ });
40
+
41
+ export const columnSchema = z.object({
42
+ columnName: z
43
+ .string()
44
+ .min(1, 'Column name cannot be empty')
45
+ .max(64, 'Column name must be less than 64 characters'),
46
+ type: z.union([columnTypeSchema, z.string()]),
47
+ defaultValue: z.string().optional(),
48
+ isPrimaryKey: z.boolean().optional(),
49
+ isNullable: z.boolean(),
50
+ isUnique: z.boolean(),
51
+ foreignKey: foreignKeySchema.optional(),
52
+ });
53
+
54
+ export const tableSchema = z.object({
55
+ tableName: z
56
+ .string()
57
+ .min(1, 'Table name cannot be empty')
58
+ .max(64, 'Table name must be less than 64 characters'),
59
+ columns: z.array(columnSchema).min(1, 'At least one column is required'),
60
+ recordCount: z.number().default(0),
61
+ createdAt: z.string().optional(),
62
+ updatedAt: z.string().optional(),
63
+ });
64
+
65
+ export type TableSchema = z.infer<typeof tableSchema>;
66
+ export type ColumnSchema = z.infer<typeof columnSchema>;
67
+ export type ForeignKeySchema = z.infer<typeof foreignKeySchema>;
68
+ export type OnUpdateActionSchema = z.infer<typeof onUpdateActionSchema>;
69
+ export type OnDeleteActionSchema = z.infer<typeof onDeleteActionSchema>;
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+
3
+ export const functionUploadRequestSchema = z.object({
4
+ name: z.string().min(1, 'Name is required'),
5
+ slug: z
6
+ .string()
7
+ .regex(
8
+ /^[a-zA-Z0-9_-]+$/,
9
+ 'Invalid slug format - must be alphanumeric with hyphens or underscores only'
10
+ )
11
+ .optional(),
12
+ code: z.string().min(1),
13
+ description: z.string().optional(),
14
+ status: z.enum(['draft', 'active']).optional().default('active'),
15
+ });
16
+
17
+ export const functionUpdateRequestSchema = z.object({
18
+ name: z.string().optional(),
19
+ code: z.string().optional(),
20
+ description: z.string().optional(),
21
+ status: z.enum(['draft', 'active']).optional(),
22
+ });
23
+
24
+ export type FunctionUploadRequest = z.infer<typeof functionUploadRequestSchema>;
25
+ export type FunctionUpdateRequest = z.infer<typeof functionUpdateRequestSchema>;
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+
3
+ // Base function schema
4
+ export const functionSchema = z.object({
5
+ id: z.string(),
6
+ slug: z.string(),
7
+ name: z.string(),
8
+ description: z.string().nullable(),
9
+ code: z.string(),
10
+ status: z.enum(['draft', 'active']),
11
+ createdAt: z.string(),
12
+ updatedAt: z.string(),
13
+ deployedAt: z.string().nullable(),
14
+ });
15
+
16
+ export type FunctionSchema = z.infer<typeof functionSchema>;
@@ -0,0 +1,13 @@
1
+ export * from './database.schema';
2
+ export * from './database-api.schema';
3
+ export * from './storage.schema';
4
+ export * from './storage-api.schema';
5
+ export * from './auth.schema';
6
+ export * from './auth-api.schema';
7
+ export * from './metadata.schema';
8
+ export * from './ai.schema';
9
+ export * from './ai-api.schema';
10
+ export * from './logs.schema';
11
+ export * from './logs-api.schema';
12
+ export * from './functions.schema';
13
+ export * from './functions-api.schema';
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { auditLogSchema } from './logs.schema';
3
+
4
+ export const getAuditLogsRequestSchema = z.object({
5
+ limit: z.number().default(100),
6
+ offset: z.number().default(0),
7
+ actor: z.string().optional(),
8
+ action: z.string().optional(),
9
+ module: z.string().optional(),
10
+ startDate: z.string().optional(),
11
+ endDate: z.string().optional(),
12
+ });
13
+
14
+ export const getAuditLogsResponseSchema = z.object({
15
+ data: z.array(auditLogSchema),
16
+ pagination: z.object({
17
+ limit: z.number(),
18
+ offset: z.number(),
19
+ total: z.number(),
20
+ }),
21
+ });
22
+
23
+ export const getAuditLogStatsRequestSchema = z.object({
24
+ days: z.number().default(7),
25
+ });
26
+
27
+ export const getAuditLogStatsResponseSchema = z.object({
28
+ totalLogs: z.number(),
29
+ uniqueActors: z.number(),
30
+ uniqueModules: z.number(),
31
+ actionsByModule: z.record(z.number()),
32
+ recentActivity: z.array(auditLogSchema),
33
+ });
34
+
35
+ export const clearAuditLogsRequestSchema = z.object({
36
+ daysToKeep: z.number().default(90),
37
+ });
38
+
39
+ export const clearAuditLogsResponseSchema = z.object({
40
+ message: z.string(),
41
+ deleted: z.number(),
42
+ });
43
+
44
+ export type GetAuditLogsRequest = z.infer<typeof getAuditLogsRequestSchema>;
45
+ export type GetAuditLogsResponse = z.infer<typeof getAuditLogsResponseSchema>;
46
+ export type GetAuditLogStatsRequest = z.infer<typeof getAuditLogStatsRequestSchema>;
47
+ export type GetAuditLogStatsResponse = z.infer<typeof getAuditLogStatsResponseSchema>;
48
+ export type ClearAuditLogsRequest = z.infer<typeof clearAuditLogsRequestSchema>;
49
+ export type ClearAuditLogsResponse = z.infer<typeof clearAuditLogsResponseSchema>;
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+
3
+ export const auditLogSchema = z.object({
4
+ id: z.string(),
5
+ actor: z.string(),
6
+ action: z.string(),
7
+ module: z.string(),
8
+ details: z.record(z.unknown()).nullable(),
9
+ ipAddress: z.string().nullable(),
10
+ createdAt: z.string(),
11
+ updatedAt: z.string(),
12
+ });
13
+
14
+ export type AuditLogSchema = z.infer<typeof auditLogSchema>;
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ import { storageBucketSchema } from './storage.schema';
3
+ import { oAuthConfigSchema } from './auth.schema';
4
+ import { exportJsonDataSchema } from './database-api.schema';
5
+
6
+ export const authMetadataSchema = z.object({
7
+ oauths: z.array(oAuthConfigSchema),
8
+ });
9
+
10
+ export const databaseMetadataSchema = z.object({
11
+ tables: exportJsonDataSchema.shape.tables,
12
+ totalSize: z.number(),
13
+ });
14
+
15
+ export const bucketMetadataSchema = storageBucketSchema.extend({
16
+ objectCount: z.number().optional(),
17
+ });
18
+
19
+ export const storageMetadataSchema = z.object({
20
+ buckets: z.array(bucketMetadataSchema),
21
+ totalSize: z.number(),
22
+ });
23
+
24
+ export const edgeFunctionMetadataSchema = z.object({
25
+ slug: z.string(),
26
+ name: z.string(),
27
+ description: z.string().nullable(),
28
+ status: z.string(),
29
+ });
30
+
31
+ export const aiMetadataSchema = z.object({
32
+ models: z.array(
33
+ z.object({
34
+ inputModality: z.array(z.string()),
35
+ outputModality: z.array(z.string()),
36
+ modelId: z.string(),
37
+ })
38
+ ),
39
+ });
40
+
41
+ export const appMetaDataSchema = z.object({
42
+ auth: authMetadataSchema,
43
+ database: databaseMetadataSchema,
44
+ storage: storageMetadataSchema,
45
+ aiIntegration: aiMetadataSchema.optional(),
46
+ functions: z.array(edgeFunctionMetadataSchema),
47
+ version: z.string().optional(),
48
+ });
49
+
50
+ export type AuthMetadataSchema = z.infer<typeof authMetadataSchema>;
51
+ export type DatabaseMetadataSchema = z.infer<typeof databaseMetadataSchema>;
52
+ export type BucketMetadataSchema = z.infer<typeof bucketMetadataSchema>;
53
+ export type StorageMetadataSchema = z.infer<typeof storageMetadataSchema>;
54
+ export type EdgeFunctionMetadataSchema = z.infer<typeof edgeFunctionMetadataSchema>;
55
+ export type AIMetadataSchema = z.infer<typeof aiMetadataSchema>;
56
+ export type AppMetadataSchema = z.infer<typeof appMetaDataSchema>;
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ import { storageFileSchema } from './storage.schema';
3
+
4
+ export const createBucketRequestSchema = z.object({
5
+ bucketName: z.string().min(1, 'Bucket name cannot be empty'),
6
+ isPublic: z.boolean().default(true),
7
+ });
8
+
9
+ export const updateBucketRequestSchema = z.object({
10
+ isPublic: z.boolean(),
11
+ });
12
+
13
+ export const listObjectsResponseSchema = z.object({
14
+ objects: z.array(storageFileSchema),
15
+ pagination: z.object({
16
+ offset: z.number(),
17
+ limit: z.number(),
18
+ total: z.number(),
19
+ }),
20
+ });
21
+
22
+ // Upload strategy schemas
23
+ export const uploadStrategyRequestSchema = z.object({
24
+ filename: z.string().min(1, 'Filename cannot be empty'),
25
+ contentType: z.string().optional(),
26
+ size: z.number().optional(),
27
+ });
28
+
29
+ export const uploadStrategyResponseSchema = z.object({
30
+ method: z.enum(['presigned', 'direct']),
31
+ uploadUrl: z.string(),
32
+ fields: z.record(z.string()).optional(),
33
+ key: z.string(),
34
+ confirmRequired: z.boolean(),
35
+ confirmUrl: z.string().optional(),
36
+ expiresAt: z.date().optional(),
37
+ });
38
+
39
+ // Download strategy schemas
40
+ export const downloadStrategyRequestSchema = z.object({
41
+ expiresIn: z.number().optional().default(3600),
42
+ });
43
+
44
+ export const downloadStrategyResponseSchema = z.object({
45
+ method: z.enum(['presigned', 'direct']),
46
+ url: z.string(),
47
+ expiresAt: z.date().optional(),
48
+ headers: z.record(z.string()).optional(),
49
+ });
50
+
51
+ // Confirm upload schema
52
+ export const confirmUploadRequestSchema = z.object({
53
+ size: z.number(),
54
+ contentType: z.string().optional(),
55
+ etag: z.string().optional(),
56
+ });
57
+
58
+ export type CreateBucketRequest = z.infer<typeof createBucketRequestSchema>;
59
+ export type UpdateBucketRequest = z.infer<typeof updateBucketRequestSchema>;
60
+ export type ListObjectsResponseSchema = z.infer<typeof listObjectsResponseSchema>;
61
+ export type UploadStrategyRequest = z.infer<typeof uploadStrategyRequestSchema>;
62
+ export type UploadStrategyResponse = z.infer<typeof uploadStrategyResponseSchema>;
63
+ export type DownloadStrategyRequest = z.infer<typeof downloadStrategyRequestSchema>;
64
+ export type DownloadStrategyResponse = z.infer<typeof downloadStrategyResponseSchema>;
65
+ export type ConfirmUploadRequest = z.infer<typeof confirmUploadRequestSchema>;
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+
3
+ export const storageFileSchema = z.object({
4
+ key: z.string(),
5
+ bucket: z.string(),
6
+ size: z.number(),
7
+ mimeType: z.string().optional(),
8
+ uploadedAt: z.string(),
9
+ url: z.string(),
10
+ });
11
+
12
+ export const storageBucketSchema = z.object({
13
+ name: z.string(),
14
+ public: z.boolean(),
15
+ createdAt: z.string(),
16
+ });
17
+
18
+ export type StorageFileSchema = z.infer<typeof storageFileSchema>;
19
+ export type StorageBucketSchema = z.infer<typeof storageBucketSchema>;
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ESNext",
5
+ "lib": ["ES2020"],
6
+ "moduleResolution": "bundler",
7
+ "resolveJsonModule": true,
8
+ "declaration": true,
9
+ "declarationMap": true,
10
+ "sourceMap": true,
11
+ "outDir": "./dist",
12
+ "rootDir": "./src",
13
+ "strict": true,
14
+ "esModuleInterop": true,
15
+ "skipLibCheck": true,
16
+ "forceConsistentCasingInFileNames": true,
17
+ "types": []
18
+ },
19
+ "include": ["src/**/*"],
20
+ "exclude": ["node_modules", "dist"]
21
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./frontend" },
5
+ { "path": "./backend" },
6
+ { "path": "./shared-schemas" }
7
+ ]
8
+ }