insforge 1.2.10 → 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.
Files changed (335) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +28 -28
  25. package/auth/src/lib/broadcastService.ts +117 -115
  26. package/auth/src/pages/SignInPage.tsx +60 -57
  27. package/auth/src/pages/SignUpPage.tsx +60 -57
  28. package/auth/tsconfig.json +32 -32
  29. package/auth/tsconfig.node.json +11 -11
  30. package/backend/package.json +78 -75
  31. package/backend/src/api/routes/ai/index.routes.ts +3 -3
  32. package/backend/src/api/routes/auth/index.routes.ts +667 -570
  33. package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
  34. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  35. package/backend/src/api/routes/database/index.routes.ts +78 -1
  36. package/backend/src/api/routes/database/records.routes.ts +10 -10
  37. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  38. package/backend/src/api/routes/docs/index.routes.ts +75 -76
  39. package/backend/src/api/routes/email/index.routes.ts +35 -0
  40. package/backend/src/api/routes/functions/index.routes.ts +18 -12
  41. package/backend/src/api/routes/metadata/index.routes.ts +12 -0
  42. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  43. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  44. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  45. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  46. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  47. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  48. package/backend/src/infra/database/database.manager.ts +14 -1
  49. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  50. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  51. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  52. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  53. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  54. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  55. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  56. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  57. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  58. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  59. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  60. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  61. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  62. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  63. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  64. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  65. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  66. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  67. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  68. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  69. package/backend/src/infra/security/token.manager.ts +219 -125
  70. package/backend/src/infra/socket/socket.manager.ts +198 -64
  71. package/backend/src/providers/ai/openrouter.provider.ts +12 -9
  72. package/backend/src/providers/email/base.provider.ts +4 -7
  73. package/backend/src/providers/email/cloud.provider.ts +84 -0
  74. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  75. package/backend/src/providers/oauth/index.ts +1 -0
  76. package/backend/src/server.ts +317 -284
  77. package/backend/src/services/ai/ai-model.service.ts +5 -5
  78. package/backend/src/services/ai/chat-completion.service.ts +4 -4
  79. package/backend/src/services/ai/image-generation.service.ts +3 -3
  80. package/backend/src/services/auth/auth.service.ts +14 -0
  81. package/backend/src/services/database/database-table.service.ts +0 -9
  82. package/backend/src/services/database/database.service.ts +127 -0
  83. package/backend/src/services/email/email.service.ts +5 -7
  84. package/backend/src/services/realtime/index.ts +3 -0
  85. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  86. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  87. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  88. package/backend/src/types/auth.ts +11 -0
  89. package/backend/src/types/realtime.ts +18 -0
  90. package/backend/src/types/socket.ts +7 -31
  91. package/backend/src/utils/cookies.ts +35 -0
  92. package/backend/src/utils/s3-config-loader.ts +64 -0
  93. package/backend/src/utils/seed.ts +301 -298
  94. package/backend/src/utils/sql-parser.ts +90 -0
  95. package/backend/tests/README.md +133 -133
  96. package/backend/tests/cleanup-all-test-data.sh +230 -230
  97. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  98. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  99. package/backend/tests/local/test-ai-config.sh +129 -129
  100. package/backend/tests/local/test-ai-usage.sh +80 -80
  101. package/backend/tests/local/test-auth-router.sh +143 -143
  102. package/backend/tests/local/test-database-router.sh +222 -222
  103. package/backend/tests/local/test-e2e.sh +240 -240
  104. package/backend/tests/local/test-fk-errors.sh +96 -96
  105. package/backend/tests/local/test-functions.sh +123 -123
  106. package/backend/tests/local/test-id-field.sh +200 -200
  107. package/backend/tests/local/test-logs.sh +132 -132
  108. package/backend/tests/local/test-public-bucket.sh +264 -264
  109. package/backend/tests/local/test-secrets.sh +249 -249
  110. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  111. package/backend/tests/local/test-traditional-rest.sh +208 -208
  112. package/backend/tests/manual/README.md +50 -50
  113. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  114. package/backend/tests/manual/seed-large-table.sql +100 -100
  115. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  116. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  117. package/backend/tests/manual/test-database-advance.sh +296 -296
  118. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  119. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  120. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  121. package/backend/tests/manual/test-universal-storage.sh +263 -263
  122. package/backend/tests/manual/test-users.sql +17 -17
  123. package/backend/tests/run-all-tests.sh +139 -139
  124. package/backend/tests/setup.ts +0 -0
  125. package/backend/tests/test-config.sh +338 -338
  126. package/backend/tests/unit/analyze-query.test.ts +697 -0
  127. package/backend/tsconfig.json +22 -22
  128. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  129. package/claude-plugin/README.md +133 -133
  130. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
  131. package/docker-compose.prod.yml +204 -200
  132. package/docker-compose.yml +232 -228
  133. package/docker-init/db/db-init.sql +97 -97
  134. package/docker-init/db/jwt.sql +5 -5
  135. package/docker-init/db/postgresql.conf +16 -16
  136. package/docker-init/logs/vector.yml +236 -236
  137. package/docs/README.md +44 -44
  138. package/docs/agent-docs/real-time.md +269 -0
  139. package/docs/changelog.mdx +119 -67
  140. package/docs/core-concepts/ai/architecture.mdx +372 -372
  141. package/docs/core-concepts/ai/sdk.mdx +213 -213
  142. package/docs/core-concepts/authentication/architecture.mdx +278 -278
  143. package/docs/core-concepts/authentication/sdk.mdx +414 -414
  144. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
  145. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
  146. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
  147. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
  148. package/docs/core-concepts/database/architecture.mdx +255 -255
  149. package/docs/core-concepts/database/sdk.mdx +382 -382
  150. package/docs/core-concepts/email/architecture.mdx +101 -0
  151. package/docs/core-concepts/email/sdk.mdx +53 -0
  152. package/docs/core-concepts/functions/architecture.mdx +105 -105
  153. package/docs/core-concepts/functions/sdk.mdx +184 -184
  154. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  155. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  156. package/docs/core-concepts/storage/architecture.mdx +243 -243
  157. package/docs/core-concepts/storage/sdk.mdx +253 -253
  158. package/docs/deployment/README.md +94 -94
  159. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  160. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  161. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  162. package/docs/deployment/deploy-to-render.md +441 -441
  163. package/docs/deprecated/insforge-auth-api.md +214 -214
  164. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  165. package/docs/deprecated/insforge-db-api.md +358 -358
  166. package/docs/deprecated/insforge-db-sdk.md +139 -139
  167. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  168. package/docs/deprecated/insforge-debug.md +64 -64
  169. package/docs/deprecated/insforge-instructions.md +123 -123
  170. package/docs/deprecated/insforge-project.md +117 -117
  171. package/docs/deprecated/insforge-storage-api.md +278 -278
  172. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  173. package/docs/docs.json +232 -210
  174. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  175. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  176. package/docs/examples/framework-guides/react.mdx +165 -165
  177. package/docs/examples/framework-guides/svelte.mdx +153 -153
  178. package/docs/examples/framework-guides/vue.mdx +159 -159
  179. package/docs/examples/overview.mdx +67 -67
  180. package/docs/favicon.svg +19 -19
  181. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  182. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  183. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  184. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  185. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  186. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  187. package/docs/images/icons/ai.svg +4 -4
  188. package/docs/images/logos/nextjs.svg +4 -4
  189. package/docs/images/logos/nuxt.svg +4 -4
  190. package/docs/images/logos/react.svg +5 -5
  191. package/docs/images/logos/svelte.svg +4 -4
  192. package/docs/images/logos/vue.svg +5 -5
  193. package/docs/insforge-instructions-sdk.md +89 -88
  194. package/docs/introduction.mdx +45 -45
  195. package/docs/logo/dark.svg +22 -22
  196. package/docs/logo/light.svg +20 -20
  197. package/docs/partnership.mdx +651 -646
  198. package/docs/quickstart.mdx +82 -82
  199. package/docs/showcase.mdx +52 -52
  200. package/docs/snippets/sdk-installation.mdx +21 -21
  201. package/docs/snippets/service-icons.mdx +27 -27
  202. package/examples/oauth/frontend-oauth-example.html +250 -250
  203. package/examples/response-examples.md +443 -443
  204. package/frontend/components.json +17 -17
  205. package/frontend/package.json +69 -69
  206. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  207. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  208. package/frontend/src/assets/icons/checked.svg +3 -3
  209. package/frontend/src/assets/icons/connected.svg +3 -3
  210. package/frontend/src/assets/icons/error.svg +3 -3
  211. package/frontend/src/assets/icons/loader.svg +9 -9
  212. package/frontend/src/assets/icons/pencil.svg +4 -4
  213. package/frontend/src/assets/icons/refresh.svg +4 -4
  214. package/frontend/src/assets/icons/step_active.svg +3 -3
  215. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  216. package/frontend/src/assets/icons/warning.svg +3 -3
  217. package/frontend/src/assets/logos/apple.svg +3 -3
  218. package/frontend/src/assets/logos/claude_code.svg +3 -3
  219. package/frontend/src/assets/logos/cline.svg +6 -6
  220. package/frontend/src/assets/logos/cursor.svg +20 -20
  221. package/frontend/src/assets/logos/discord.svg +8 -8
  222. package/frontend/src/assets/logos/facebook.svg +3 -3
  223. package/frontend/src/assets/logos/gemini.svg +19 -19
  224. package/frontend/src/assets/logos/github.svg +5 -5
  225. package/frontend/src/assets/logos/google.svg +13 -13
  226. package/frontend/src/assets/logos/grok.svg +10 -10
  227. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  228. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  229. package/frontend/src/assets/logos/instagram.svg +1 -1
  230. package/frontend/src/assets/logos/linkedin.svg +3 -3
  231. package/frontend/src/assets/logos/openai.svg +10 -10
  232. package/frontend/src/assets/logos/roo_code.svg +9 -9
  233. package/frontend/src/assets/logos/spotify.svg +16 -16
  234. package/frontend/src/assets/logos/tiktok.svg +5 -5
  235. package/frontend/src/assets/logos/trae.svg +3 -3
  236. package/frontend/src/assets/logos/windsurf.svg +10 -10
  237. package/frontend/src/assets/logos/x.svg +3 -3
  238. package/frontend/src/components/layout/AppHeader.tsx +9 -10
  239. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  240. package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
  241. package/frontend/src/features/auth/helpers.tsx +8 -0
  242. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  243. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  244. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  245. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  246. package/frontend/src/features/database/hooks/useTables.ts +32 -28
  247. package/frontend/src/features/database/index.ts +1 -0
  248. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
  249. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
  250. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
  251. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  252. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
  253. package/frontend/src/features/database/services/advance.service.ts +0 -26
  254. package/frontend/src/features/database/services/database.service.ts +55 -0
  255. package/frontend/src/features/database/services/table.service.ts +0 -6
  256. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  257. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
  258. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  259. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  260. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  261. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  262. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  263. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  264. package/frontend/src/features/realtime/index.ts +11 -0
  265. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  266. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  267. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  268. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  269. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  270. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
  271. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
  272. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  273. package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
  274. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  275. package/frontend/src/lib/utils/menuItems.ts +24 -0
  276. package/frontend/src/lib/utils/utils.ts +14 -1
  277. package/frontend/tsconfig.json +25 -25
  278. package/frontend/tsconfig.node.json +9 -9
  279. package/functions/deno.json +24 -24
  280. package/functions/server.ts +315 -315
  281. package/i18n/README.ar.md +130 -130
  282. package/i18n/README.de.md +130 -130
  283. package/i18n/README.es.md +154 -154
  284. package/i18n/README.fr.md +134 -134
  285. package/i18n/README.hi.md +129 -129
  286. package/i18n/README.ja.md +174 -174
  287. package/i18n/README.ko.md +136 -136
  288. package/i18n/README.pt-BR.md +131 -131
  289. package/i18n/README.ru.md +129 -129
  290. package/i18n/README.zh-CN.md +133 -133
  291. package/openapi/ai.yaml +715 -715
  292. package/openapi/auth.yaml +1244 -1244
  293. package/openapi/email.yaml +158 -0
  294. package/openapi/functions.yaml +475 -475
  295. package/openapi/health.yaml +29 -29
  296. package/openapi/logs.yaml +223 -223
  297. package/openapi/metadata.yaml +177 -177
  298. package/openapi/realtime.yaml +699 -0
  299. package/openapi/records.yaml +381 -381
  300. package/openapi/secrets.yaml +370 -370
  301. package/openapi/storage.yaml +875 -875
  302. package/openapi/tables.yaml +463 -463
  303. package/package.json +97 -97
  304. package/shared-schemas/package.json +31 -31
  305. package/shared-schemas/src/ai.schema.ts +63 -59
  306. package/shared-schemas/src/auth-api.schema.ts +352 -339
  307. package/shared-schemas/src/auth.schema.ts +1 -1
  308. package/shared-schemas/src/database-api.schema.ts +32 -1
  309. package/shared-schemas/src/database.schema.ts +39 -0
  310. package/shared-schemas/src/docs.schema.ts +26 -0
  311. package/shared-schemas/src/email-api.schema.ts +30 -0
  312. package/shared-schemas/src/index.ts +4 -0
  313. package/shared-schemas/src/metadata.schema.ts +9 -0
  314. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  315. package/shared-schemas/src/realtime.schema.ts +143 -0
  316. package/shared-schemas/tsconfig.json +21 -21
  317. package/tsconfig.json +7 -7
  318. package/zeabur/README.md +13 -13
  319. package/zeabur/template.yml +1032 -1032
  320. package/.cursor/rules/cursor-rules.mdc +0 -94
  321. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  322. package/test-gemini.sh +0 -35
  323. package/test-usage-admin.sh +0 -57
  324. package/test-usage.sh +0 -50
  325. /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
  326. /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
  327. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  328. /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
  329. /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
  330. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  331. /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
  332. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  333. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  334. /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
  335. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,382 +1,382 @@
1
- ---
2
- title: Database SDK Reference
3
- description: Type-safe database operations using the InsForge SDK
4
- ---
5
-
6
- import Installation from '/snippets/sdk-installation.mdx';
7
-
8
- <Installation />
9
-
10
- ## insert()
11
-
12
- Insert new records into a table.
13
-
14
- ### Parameters
15
-
16
- - `values` (object | Array, required) - Data to insert. Single object or array for bulk insert
17
- - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include count of inserted rows
18
-
19
- ### Returns
20
-
21
- ```typescript
22
- {
23
- data: Array<object> | null,
24
- error: Error | null,
25
- count?: number
26
- }
27
- ```
28
-
29
- <Note>
30
- Chain `.select()` after `.insert()` to return the inserted data
31
- </Note>
32
-
33
- ### Examples
34
-
35
- <CodeGroup>
36
- ```javascript Single insert
37
- const { data, error } = await insforge.database
38
- .from('users')
39
- .insert({ name: 'John', email: 'john@example.com' })
40
- .select()
41
- ```
42
-
43
- ```javascript Bulk insert
44
- const { data, error } = await insforge.database
45
- .from('users')
46
- .insert([
47
- { name: 'Alice', email: 'alice@example.com' },
48
- { name: 'Bob', email: 'bob@example.com' }
49
- ])
50
- .select()
51
- ```
52
- </CodeGroup>
53
-
54
- ### Output Example
55
-
56
- ```json
57
- {
58
- "data": [
59
- { "id": "789", "name": "John", "email": "john@example.com", "created_at": "2024-01-15T10:30:00Z" }
60
- ],
61
- "error": null
62
- }
63
- ```
64
-
65
- ---
66
-
67
- ## update()
68
-
69
- Update existing records in a table. Must use filters to target specific rows.
70
-
71
- ### Parameters
72
-
73
- - `values` (object, required) - Fields to update
74
- - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include count of updated rows
75
-
76
- ### Returns
77
-
78
- ```typescript
79
- {
80
- data: Array<object> | null,
81
- error: Error | null,
82
- count?: number
83
- }
84
- ```
85
-
86
- <Warning>
87
- Always use filters like `.eq()` or `.in()` to specify which rows to update
88
- </Warning>
89
-
90
- ### Examples
91
-
92
- <CodeGroup>
93
- ```javascript Update by ID
94
- const { data, error } = await insforge.database
95
- .from('users')
96
- .update({ name: 'Jane Doe' })
97
- .eq('id', userId)
98
- .select()
99
- ```
100
-
101
- ```javascript Update multiple
102
- const { data, error } = await insforge.database
103
- .from('tasks')
104
- .update({ status: 'completed' })
105
- .in('id', ['task-1', 'task-2'])
106
- .select()
107
- ```
108
- </CodeGroup>
109
-
110
- ### Output Example
111
-
112
- ```json
113
- {
114
- "data": [
115
- { "id": "123", "name": "Jane Doe", "email": "john@example.com", "updated_at": "2024-01-15T11:00:00Z" }
116
- ],
117
- "error": null
118
- }
119
- ```
120
-
121
- ---
122
-
123
- ## delete()
124
-
125
- Delete records from a table. Must use filters to target specific rows.
126
-
127
- ### Parameters
128
-
129
- - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include count of deleted rows
130
-
131
- ### Returns
132
-
133
- ```typescript
134
- {
135
- data: Array<object> | null,
136
- error: Error | null,
137
- count?: number
138
- }
139
- ```
140
-
141
- <Warning>
142
- Always use filters to specify which rows to delete
143
- </Warning>
144
-
145
- ### Examples
146
-
147
- <CodeGroup>
148
- ```javascript Delete by ID
149
- const { error } = await insforge.database
150
- .from('posts')
151
- .delete()
152
- .eq('id', postId)
153
- ```
154
-
155
- ```javascript Delete with filter
156
- const { error } = await insforge.database
157
- .from('sessions')
158
- .delete()
159
- .lt('expires_at', new Date())
160
- ```
161
- </CodeGroup>
162
-
163
- ### Output Example
164
-
165
- ```json
166
- {
167
- "data": null,
168
- "error": null
169
- }
170
- ```
171
-
172
- ---
173
-
174
- ## select()
175
-
176
- Query records from a table or view.
177
-
178
- ### Parameters
179
-
180
- - `columns` (string, optional) - Comma-separated column names. Use `*` for all columns
181
- - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include total row count
182
- - `options.head` (boolean, optional) - Return only count, no data
183
-
184
- ### Returns
185
-
186
- ```typescript
187
- {
188
- data: Array<object> | null,
189
- error: Error | null,
190
- count?: number
191
- }
192
- ```
193
-
194
- ### Examples
195
-
196
- <CodeGroup>
197
- ```javascript Get all
198
- const { data, error } = await insforge.database
199
- .from('users')
200
- .select()
201
- ```
202
-
203
- ```javascript Specific columns
204
- const { data, error } = await insforge.database
205
- .from('users')
206
- .select('id, name, email')
207
- ```
208
-
209
- ```javascript With relationships
210
- const { data, error } = await insforge.database
211
- .from('posts')
212
- .select('*, users(nickname, avatar_url)')
213
- ```
214
- </CodeGroup>
215
-
216
- ### Output Example
217
-
218
- ```json
219
- {
220
- "data": [
221
- { "id": "123", "name": "John", "email": "john@example.com" },
222
- { "id": "456", "name": "Jane", "email": "jane@example.com" }
223
- ],
224
- "error": null
225
- }
226
- ```
227
-
228
- ---
229
-
230
- ## Filters
231
-
232
- Chain filters to narrow down query results. All filters take `(column, value)` as parameters.
233
-
234
- | Filter | Description | Example |
235
- |--------|-------------|---------|
236
- | `.eq(column, value)` | Equals | `.eq('status', 'active')` |
237
- | `.neq(column, value)` | Not equals | `.neq('status', 'banned')` |
238
- | `.gt(column, value)` | Greater than | `.gt('age', 18)` |
239
- | `.gte(column, value)` | Greater than or equal | `.gte('price', 100)` |
240
- | `.lt(column, value)` | Less than | `.lt('stock', 10)` |
241
- | `.lte(column, value)` | Less than or equal | `.lte('priority', 3)` |
242
- | `.like(column, pattern)` | Case-sensitive pattern (use `%` wildcard) | `.like('name', '%Widget%')` |
243
- | `.ilike(column, pattern)` | Case-insensitive pattern (use `%` wildcard) | `.ilike('email', '%@gmail.com')` |
244
- | `.in(column, array)` | Value in array | `.in('status', ['pending', 'active'])` |
245
- | `.is(column, value)` | Exactly equals (for null checks) | `.is('deleted_at', null)` |
246
-
247
- ```javascript
248
- // Example: Chain multiple filters
249
- const { data } = await insforge.database
250
- .from('products')
251
- .select()
252
- .eq('category', 'electronics')
253
- .gte('price', 50)
254
- .lte('price', 500)
255
- .is('in_stock', true)
256
- ```
257
-
258
- ---
259
-
260
- ## Modifiers
261
-
262
- Control how query results are returned.
263
-
264
- | Modifier | Description | Example |
265
- |----------|-------------|---------|
266
- | `.order(column, options)` | Sort results. Options: `{ ascending: true/false, nullsFirst: true/false }` | `.order('created_at', { ascending: false })` |
267
- | `.limit(count)` | Limit number of rows | `.limit(10)` |
268
- | `.range(from, to)` | Get rows between indices (pagination) | `.range(0, 9)` |
269
- | `.single()` | Return object instead of array (throws if multiple) | `.single()` |
270
- | `.maybeSingle()` | Return object or null (no error) | `.maybeSingle()` |
271
-
272
- ```javascript
273
- // Example: Pagination with sorting
274
- const { data } = await insforge.database
275
- .from('posts')
276
- .select()
277
- .order('created_at', { ascending: false })
278
- .range(0, 9)
279
- .limit(10)
280
- ```
281
-
282
- ---
283
-
284
- ## Common Patterns
285
-
286
- ### Pagination with Count
287
-
288
- ```javascript
289
- const page = 1;
290
- const pageSize = 10;
291
- const from = (page - 1) * pageSize;
292
- const to = from + pageSize - 1;
293
-
294
- const { data, count } = await insforge.database
295
- .from('posts')
296
- .select('*', { count: 'exact' })
297
- .range(from, to)
298
- .order('created_at', { ascending: false })
299
-
300
- console.log(`Page ${page}: ${data.length} of ${count} total`)
301
- ```
302
-
303
- **Output:**
304
- ```json
305
- {
306
- "data": [
307
- { "id": "1", "title": "Post 1", "created_at": "2024-01-15T10:00:00Z" },
308
- { "id": "2", "title": "Post 2", "created_at": "2024-01-14T10:00:00Z" }
309
- ],
310
- "count": 50,
311
- "error": null
312
- }
313
- ```
314
-
315
- ### Filtered Search
316
-
317
- ```javascript
318
- const { data } = await insforge.database
319
- .from('products')
320
- .select('id, name, price, category')
321
- .eq('category', 'electronics')
322
- .gte('price', 50)
323
- .lte('price', 500)
324
- .order('price', { ascending: true })
325
- .limit(20)
326
- ```
327
-
328
- **Output:**
329
- ```json
330
- {
331
- "data": [
332
- { "id": "101", "name": "USB Cable", "price": 59.99, "category": "electronics" },
333
- { "id": "102", "name": "Keyboard", "price": 89.99, "category": "electronics" }
334
- ],
335
- "error": null
336
- }
337
- ```
338
-
339
- ### Using with Authentication Hooks
340
-
341
- Combine database queries with `useUser()` or `useAuth()` hooks to fetch user-specific data:
342
-
343
- ```tsx
344
- import { useUser } from '@insforge/react'; // or '@insforge/react-router'
345
- import { insforge } from './lib/insforge';
346
- import { useEffect, useState } from 'react';
347
-
348
- function MyProfile() {
349
- const { user, isLoaded } = useUser();
350
- const [posts, setPosts] = useState([]);
351
-
352
- useEffect(() => {
353
- if (user) {
354
- // Fetch user's posts from database
355
- insforge.database
356
- .from('posts')
357
- .select('*')
358
- .eq('user_id', user.id)
359
- .then(({ data }) => setPosts(data));
360
- }
361
- }, [user]);
362
-
363
- if (!isLoaded) return <div>Loading...</div>;
364
- if (!user) return <div>Not signed in</div>;
365
-
366
- return (
367
- <div>
368
- <h1>{user.name}</h1>
369
- <p>{user.email}</p>
370
- <h2>My Posts: {posts.length}</h2>
371
- {posts.map(post => (
372
- <div key={post.id}>{post.title}</div>
373
- ))}
374
- </div>
375
- );
376
- }
377
- ```
378
-
379
- **Key points:**
380
- - Use `user.id` to filter data for the authenticated user
381
- - Check `isLoaded` before accessing `user` to avoid race conditions
382
- - Check `!user` to handle unauthenticated state
1
+ ---
2
+ title: Database SDK Reference
3
+ description: Type-safe database operations using the InsForge SDK
4
+ ---
5
+
6
+ import Installation from '/snippets/sdk-installation.mdx';
7
+
8
+ <Installation />
9
+
10
+ ## insert()
11
+
12
+ Insert new records into a table.
13
+
14
+ ### Parameters
15
+
16
+ - `values` (object | Array, required) - Data to insert. Single object or array for bulk insert
17
+ - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include count of inserted rows
18
+
19
+ ### Returns
20
+
21
+ ```typescript
22
+ {
23
+ data: Array<object> | null,
24
+ error: Error | null,
25
+ count?: number
26
+ }
27
+ ```
28
+
29
+ <Note>
30
+ Chain `.select()` after `.insert()` to return the inserted data
31
+ </Note>
32
+
33
+ ### Examples
34
+
35
+ <CodeGroup>
36
+ ```javascript Single insert
37
+ const { data, error } = await insforge.database
38
+ .from('users')
39
+ .insert({ name: 'John', email: 'john@example.com' })
40
+ .select()
41
+ ```
42
+
43
+ ```javascript Bulk insert
44
+ const { data, error } = await insforge.database
45
+ .from('users')
46
+ .insert([
47
+ { name: 'Alice', email: 'alice@example.com' },
48
+ { name: 'Bob', email: 'bob@example.com' }
49
+ ])
50
+ .select()
51
+ ```
52
+ </CodeGroup>
53
+
54
+ ### Output Example
55
+
56
+ ```json
57
+ {
58
+ "data": [
59
+ { "id": "789", "name": "John", "email": "john@example.com", "created_at": "2024-01-15T10:30:00Z" }
60
+ ],
61
+ "error": null
62
+ }
63
+ ```
64
+
65
+ ---
66
+
67
+ ## update()
68
+
69
+ Update existing records in a table. Must use filters to target specific rows.
70
+
71
+ ### Parameters
72
+
73
+ - `values` (object, required) - Fields to update
74
+ - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include count of updated rows
75
+
76
+ ### Returns
77
+
78
+ ```typescript
79
+ {
80
+ data: Array<object> | null,
81
+ error: Error | null,
82
+ count?: number
83
+ }
84
+ ```
85
+
86
+ <Warning>
87
+ Always use filters like `.eq()` or `.in()` to specify which rows to update
88
+ </Warning>
89
+
90
+ ### Examples
91
+
92
+ <CodeGroup>
93
+ ```javascript Update by ID
94
+ const { data, error } = await insforge.database
95
+ .from('users')
96
+ .update({ name: 'Jane Doe' })
97
+ .eq('id', userId)
98
+ .select()
99
+ ```
100
+
101
+ ```javascript Update multiple
102
+ const { data, error } = await insforge.database
103
+ .from('tasks')
104
+ .update({ status: 'completed' })
105
+ .in('id', ['task-1', 'task-2'])
106
+ .select()
107
+ ```
108
+ </CodeGroup>
109
+
110
+ ### Output Example
111
+
112
+ ```json
113
+ {
114
+ "data": [
115
+ { "id": "123", "name": "Jane Doe", "email": "john@example.com", "updated_at": "2024-01-15T11:00:00Z" }
116
+ ],
117
+ "error": null
118
+ }
119
+ ```
120
+
121
+ ---
122
+
123
+ ## delete()
124
+
125
+ Delete records from a table. Must use filters to target specific rows.
126
+
127
+ ### Parameters
128
+
129
+ - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include count of deleted rows
130
+
131
+ ### Returns
132
+
133
+ ```typescript
134
+ {
135
+ data: Array<object> | null,
136
+ error: Error | null,
137
+ count?: number
138
+ }
139
+ ```
140
+
141
+ <Warning>
142
+ Always use filters to specify which rows to delete
143
+ </Warning>
144
+
145
+ ### Examples
146
+
147
+ <CodeGroup>
148
+ ```javascript Delete by ID
149
+ const { error } = await insforge.database
150
+ .from('posts')
151
+ .delete()
152
+ .eq('id', postId)
153
+ ```
154
+
155
+ ```javascript Delete with filter
156
+ const { error } = await insforge.database
157
+ .from('sessions')
158
+ .delete()
159
+ .lt('expires_at', new Date())
160
+ ```
161
+ </CodeGroup>
162
+
163
+ ### Output Example
164
+
165
+ ```json
166
+ {
167
+ "data": null,
168
+ "error": null
169
+ }
170
+ ```
171
+
172
+ ---
173
+
174
+ ## select()
175
+
176
+ Query records from a table or view.
177
+
178
+ ### Parameters
179
+
180
+ - `columns` (string, optional) - Comma-separated column names. Use `*` for all columns
181
+ - `options.count` ('exact' | 'planned' | 'estimated', optional) - Include total row count
182
+ - `options.head` (boolean, optional) - Return only count, no data
183
+
184
+ ### Returns
185
+
186
+ ```typescript
187
+ {
188
+ data: Array<object> | null,
189
+ error: Error | null,
190
+ count?: number
191
+ }
192
+ ```
193
+
194
+ ### Examples
195
+
196
+ <CodeGroup>
197
+ ```javascript Get all
198
+ const { data, error } = await insforge.database
199
+ .from('users')
200
+ .select()
201
+ ```
202
+
203
+ ```javascript Specific columns
204
+ const { data, error } = await insforge.database
205
+ .from('users')
206
+ .select('id, name, email')
207
+ ```
208
+
209
+ ```javascript With relationships
210
+ const { data, error } = await insforge.database
211
+ .from('posts')
212
+ .select('*, users(nickname, avatar_url)')
213
+ ```
214
+ </CodeGroup>
215
+
216
+ ### Output Example
217
+
218
+ ```json
219
+ {
220
+ "data": [
221
+ { "id": "123", "name": "John", "email": "john@example.com" },
222
+ { "id": "456", "name": "Jane", "email": "jane@example.com" }
223
+ ],
224
+ "error": null
225
+ }
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Filters
231
+
232
+ Chain filters to narrow down query results. All filters take `(column, value)` as parameters.
233
+
234
+ | Filter | Description | Example |
235
+ |--------|-------------|---------|
236
+ | `.eq(column, value)` | Equals | `.eq('status', 'active')` |
237
+ | `.neq(column, value)` | Not equals | `.neq('status', 'banned')` |
238
+ | `.gt(column, value)` | Greater than | `.gt('age', 18)` |
239
+ | `.gte(column, value)` | Greater than or equal | `.gte('price', 100)` |
240
+ | `.lt(column, value)` | Less than | `.lt('stock', 10)` |
241
+ | `.lte(column, value)` | Less than or equal | `.lte('priority', 3)` |
242
+ | `.like(column, pattern)` | Case-sensitive pattern (use `%` wildcard) | `.like('name', '%Widget%')` |
243
+ | `.ilike(column, pattern)` | Case-insensitive pattern (use `%` wildcard) | `.ilike('email', '%@gmail.com')` |
244
+ | `.in(column, array)` | Value in array | `.in('status', ['pending', 'active'])` |
245
+ | `.is(column, value)` | Exactly equals (for null checks) | `.is('deleted_at', null)` |
246
+
247
+ ```javascript
248
+ // Example: Chain multiple filters
249
+ const { data } = await insforge.database
250
+ .from('products')
251
+ .select()
252
+ .eq('category', 'electronics')
253
+ .gte('price', 50)
254
+ .lte('price', 500)
255
+ .is('in_stock', true)
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Modifiers
261
+
262
+ Control how query results are returned.
263
+
264
+ | Modifier | Description | Example |
265
+ |----------|-------------|---------|
266
+ | `.order(column, options)` | Sort results. Options: `{ ascending: true/false, nullsFirst: true/false }` | `.order('created_at', { ascending: false })` |
267
+ | `.limit(count)` | Limit number of rows | `.limit(10)` |
268
+ | `.range(from, to)` | Get rows between indices (pagination) | `.range(0, 9)` |
269
+ | `.single()` | Return object instead of array (throws if multiple) | `.single()` |
270
+ | `.maybeSingle()` | Return object or null (no error) | `.maybeSingle()` |
271
+
272
+ ```javascript
273
+ // Example: Pagination with sorting
274
+ const { data } = await insforge.database
275
+ .from('posts')
276
+ .select()
277
+ .order('created_at', { ascending: false })
278
+ .range(0, 9)
279
+ .limit(10)
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Common Patterns
285
+
286
+ ### Pagination with Count
287
+
288
+ ```javascript
289
+ const page = 1;
290
+ const pageSize = 10;
291
+ const from = (page - 1) * pageSize;
292
+ const to = from + pageSize - 1;
293
+
294
+ const { data, count } = await insforge.database
295
+ .from('posts')
296
+ .select('*', { count: 'exact' })
297
+ .range(from, to)
298
+ .order('created_at', { ascending: false })
299
+
300
+ console.log(`Page ${page}: ${data.length} of ${count} total`)
301
+ ```
302
+
303
+ **Output:**
304
+ ```json
305
+ {
306
+ "data": [
307
+ { "id": "1", "title": "Post 1", "created_at": "2024-01-15T10:00:00Z" },
308
+ { "id": "2", "title": "Post 2", "created_at": "2024-01-14T10:00:00Z" }
309
+ ],
310
+ "count": 50,
311
+ "error": null
312
+ }
313
+ ```
314
+
315
+ ### Filtered Search
316
+
317
+ ```javascript
318
+ const { data } = await insforge.database
319
+ .from('products')
320
+ .select('id, name, price, category')
321
+ .eq('category', 'electronics')
322
+ .gte('price', 50)
323
+ .lte('price', 500)
324
+ .order('price', { ascending: true })
325
+ .limit(20)
326
+ ```
327
+
328
+ **Output:**
329
+ ```json
330
+ {
331
+ "data": [
332
+ { "id": "101", "name": "USB Cable", "price": 59.99, "category": "electronics" },
333
+ { "id": "102", "name": "Keyboard", "price": 89.99, "category": "electronics" }
334
+ ],
335
+ "error": null
336
+ }
337
+ ```
338
+
339
+ ### Using with Authentication Hooks
340
+
341
+ Combine database queries with `useUser()` or `useAuth()` hooks to fetch user-specific data:
342
+
343
+ ```tsx
344
+ import { useUser } from '@insforge/react'; // or '@insforge/react-router'
345
+ import { insforge } from './lib/insforge';
346
+ import { useEffect, useState } from 'react';
347
+
348
+ function MyProfile() {
349
+ const { user, isLoaded } = useUser();
350
+ const [posts, setPosts] = useState([]);
351
+
352
+ useEffect(() => {
353
+ if (user) {
354
+ // Fetch user's posts from database
355
+ insforge.database
356
+ .from('posts')
357
+ .select('*')
358
+ .eq('user_id', user.id)
359
+ .then(({ data }) => setPosts(data));
360
+ }
361
+ }, [user]);
362
+
363
+ if (!isLoaded) return <div>Loading...</div>;
364
+ if (!user) return <div>Not signed in</div>;
365
+
366
+ return (
367
+ <div>
368
+ <h1>{user.name}</h1>
369
+ <p>{user.email}</p>
370
+ <h2>My Posts: {posts.length}</h2>
371
+ {posts.map(post => (
372
+ <div key={post.id}>{post.title}</div>
373
+ ))}
374
+ </div>
375
+ );
376
+ }
377
+ ```
378
+
379
+ **Key points:**
380
+ - Use `user.id` to filter data for the authenticated user
381
+ - Check `isLoaded` before accessing `user` to avoid race conditions
382
+ - Check `!user` to handle unauthenticated state