@aurabase/aurabase-js 0.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 (344) hide show
  1. package/.changeset/config.json +11 -0
  2. package/CHANGELOG.md +30 -0
  3. package/LICENSE +21 -0
  4. package/README.md +833 -0
  5. package/package.json +90 -0
  6. package/packages/ai/LICENSE +21 -0
  7. package/packages/ai/README.md +106 -0
  8. package/packages/ai/dist/index.cjs +229 -0
  9. package/packages/ai/dist/index.d.cts +139 -0
  10. package/packages/ai/dist/index.d.ts +139 -0
  11. package/packages/ai/dist/index.js +226 -0
  12. package/packages/ai/node_modules/.bin/esbuild +19 -0
  13. package/packages/ai/node_modules/.bin/tsc +22 -0
  14. package/packages/ai/node_modules/.bin/tsserver +22 -0
  15. package/packages/ai/node_modules/.bin/tsup +22 -0
  16. package/packages/ai/node_modules/.bin/tsup-node +22 -0
  17. package/packages/ai/node_modules/.bin/vite +22 -0
  18. package/packages/ai/node_modules/.bin/vitest +22 -0
  19. package/packages/ai/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  20. package/packages/ai/package.json +61 -0
  21. package/packages/ai/src/AiService.ts +226 -0
  22. package/packages/ai/src/index.ts +18 -0
  23. package/packages/ai/src/sse.ts +141 -0
  24. package/packages/ai/src/types.ts +30 -0
  25. package/packages/ai/tests/chat-stream.test.ts +151 -0
  26. package/packages/ai/tests/rag-namespaces.test.ts +54 -0
  27. package/packages/ai/tests/sse.test.ts +69 -0
  28. package/packages/ai/tsconfig.json +5 -0
  29. package/packages/ai/tsup.config.ts +11 -0
  30. package/packages/aurabase/LICENSE +21 -0
  31. package/packages/aurabase/README.md +64 -0
  32. package/packages/aurabase/dist/AuraClient-DAtDbfPB.d.cts +77 -0
  33. package/packages/aurabase/dist/AuraClient-DAtDbfPB.d.ts +77 -0
  34. package/packages/aurabase/dist/index.cjs +237 -0
  35. package/packages/aurabase/dist/index.d.cts +46 -0
  36. package/packages/aurabase/dist/index.d.ts +46 -0
  37. package/packages/aurabase/dist/index.js +177 -0
  38. package/packages/aurabase/dist/ssr.cjs +224 -0
  39. package/packages/aurabase/dist/ssr.d.cts +65 -0
  40. package/packages/aurabase/dist/ssr.d.ts +65 -0
  41. package/packages/aurabase/dist/ssr.js +214 -0
  42. package/packages/aurabase/node_modules/.bin/esbuild +19 -0
  43. package/packages/aurabase/node_modules/.bin/tsc +22 -0
  44. package/packages/aurabase/node_modules/.bin/tsserver +22 -0
  45. package/packages/aurabase/node_modules/.bin/tsup +22 -0
  46. package/packages/aurabase/node_modules/.bin/tsup-node +22 -0
  47. package/packages/aurabase/node_modules/.bin/vite +22 -0
  48. package/packages/aurabase/node_modules/.bin/vitest +22 -0
  49. package/packages/aurabase/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  50. package/packages/aurabase/package.json +80 -0
  51. package/packages/aurabase/src/AuraClient.ts +237 -0
  52. package/packages/aurabase/src/index.ts +152 -0
  53. package/packages/aurabase/src/ssr.ts +156 -0
  54. package/packages/aurabase/tests/ai-streaming-rag-e2e.test.ts +82 -0
  55. package/packages/aurabase/tests/ai.test.ts +111 -0
  56. package/packages/aurabase/tests/auth-admin.test.ts +515 -0
  57. package/packages/aurabase/tests/auth-e2e.test.ts +135 -0
  58. package/packages/aurabase/tests/auth-hardening.test.ts +206 -0
  59. package/packages/aurabase/tests/auth.test.ts +947 -0
  60. package/packages/aurabase/tests/database.test.ts +230 -0
  61. package/packages/aurabase/tests/db-types-e2e.test.ts +217 -0
  62. package/packages/aurabase/tests/dispose.test.ts +23 -0
  63. package/packages/aurabase/tests/foreign-token.e2e.test.ts +129 -0
  64. package/packages/aurabase/tests/functions.test.ts +107 -0
  65. package/packages/aurabase/tests/integration.test.ts +413 -0
  66. package/packages/aurabase/tests/live-production-validation.js +241 -0
  67. package/packages/aurabase/tests/live-sdk-production-validation.js +293 -0
  68. package/packages/aurabase/tests/mocks.ts +139 -0
  69. package/packages/aurabase/tests/notifications.test.ts +314 -0
  70. package/packages/aurabase/tests/observability-backup.test.ts +186 -0
  71. package/packages/aurabase/tests/observability-hook.test.ts +130 -0
  72. package/packages/aurabase/tests/production-robustness.test.ts +268 -0
  73. package/packages/aurabase/tests/public-api-surface.test.ts +53 -0
  74. package/packages/aurabase/tests/query-builder.test.ts +329 -0
  75. package/packages/aurabase/tests/readme-smoke-e2e.test.ts +231 -0
  76. package/packages/aurabase/tests/realtime-filter-e2e.test.ts +344 -0
  77. package/packages/aurabase/tests/refresh-locks.test.ts +210 -0
  78. package/packages/aurabase/tests/retry-option.test.ts +17 -0
  79. package/packages/aurabase/tests/rpc-e2e.test.ts +254 -0
  80. package/packages/aurabase/tests/rs256-local-e2e.test.ts +114 -0
  81. package/packages/aurabase/tests/rt-alias-public-e2e.test.ts +235 -0
  82. package/packages/aurabase/tests/rt-http-broadcast-e2e.test.ts +124 -0
  83. package/packages/aurabase/tests/service-role-guard.test.ts +99 -0
  84. package/packages/aurabase/tests/ssr.test.ts +91 -0
  85. package/packages/aurabase/tests/storage-backend-e2e.test.ts +481 -0
  86. package/packages/aurabase/tests/storage-sdk-parity-e2e.test.ts +104 -0
  87. package/packages/aurabase/tests/storage-transform-e2e.test.ts +684 -0
  88. package/packages/aurabase/tests/storage.test.ts +55 -0
  89. package/packages/aurabase/tests/types/client-generic.test-d.ts +79 -0
  90. package/packages/aurabase/tests/types/docs-snippets.test-d.ts +571 -0
  91. package/packages/aurabase/tests/types/error-code.test-d.ts +53 -0
  92. package/packages/aurabase/tsconfig.json +5 -0
  93. package/packages/aurabase/tsconfig.test-d.json +5 -0
  94. package/packages/aurabase/tsup.config.ts +11 -0
  95. package/packages/aurabase/vitest.config.ts +16 -0
  96. package/packages/aurabase/vitest.e2e.config.ts +9 -0
  97. package/packages/auth/LICENSE +21 -0
  98. package/packages/auth/README.md +215 -0
  99. package/packages/auth/dist/index.cjs +1175 -0
  100. package/packages/auth/dist/index.d.cts +397 -0
  101. package/packages/auth/dist/index.d.ts +397 -0
  102. package/packages/auth/dist/index.js +1170 -0
  103. package/packages/auth/node_modules/.bin/esbuild +19 -0
  104. package/packages/auth/node_modules/.bin/tsc +22 -0
  105. package/packages/auth/node_modules/.bin/tsserver +22 -0
  106. package/packages/auth/node_modules/.bin/tsup +22 -0
  107. package/packages/auth/node_modules/.bin/tsup-node +22 -0
  108. package/packages/auth/node_modules/.bin/vite +22 -0
  109. package/packages/auth/node_modules/.bin/vitest +22 -0
  110. package/packages/auth/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  111. package/packages/auth/package.json +61 -0
  112. package/packages/auth/src/AuthAdminService.ts +149 -0
  113. package/packages/auth/src/AuthService.ts +1166 -0
  114. package/packages/auth/src/SessionManager.ts +92 -0
  115. package/packages/auth/src/index.ts +17 -0
  116. package/packages/auth/src/jwks.ts +337 -0
  117. package/packages/auth/src/pkce.ts +27 -0
  118. package/packages/auth/src/types.ts +89 -0
  119. package/packages/auth/tests/auth-lifecycle.test.ts +149 -0
  120. package/packages/auth/tests/detect-session.test.ts +361 -0
  121. package/packages/auth/tests/getclaims.test.ts +780 -0
  122. package/packages/auth/tests/is-mfa-challenge.test.ts +27 -0
  123. package/packages/auth/tests/password-recovery.test.ts +124 -0
  124. package/packages/auth/tests/pkce.test.ts +192 -0
  125. package/packages/auth/tests/session-manager.test.ts +103 -0
  126. package/packages/auth/tests/set-session.test.ts +139 -0
  127. package/packages/auth/tests/verify-otp.test.ts +153 -0
  128. package/packages/auth/tsconfig.json +5 -0
  129. package/packages/auth/tsup.config.ts +11 -0
  130. package/packages/core/LICENSE +21 -0
  131. package/packages/core/README.md +132 -0
  132. package/packages/core/dist/index.cjs +695 -0
  133. package/packages/core/dist/index.d.cts +1137 -0
  134. package/packages/core/dist/index.d.ts +1137 -0
  135. package/packages/core/dist/index.js +673 -0
  136. package/packages/core/node_modules/.bin/esbuild +22 -0
  137. package/packages/core/node_modules/.bin/tsc +22 -0
  138. package/packages/core/node_modules/.bin/tsserver +22 -0
  139. package/packages/core/node_modules/.bin/tsup +22 -0
  140. package/packages/core/node_modules/.bin/tsup-node +22 -0
  141. package/packages/core/node_modules/.bin/vite +22 -0
  142. package/packages/core/node_modules/.bin/vitest +22 -0
  143. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  144. package/packages/core/package.json +57 -0
  145. package/packages/core/src/AuraError.ts +89 -0
  146. package/packages/core/src/BaseService.ts +44 -0
  147. package/packages/core/src/client.ts +34 -0
  148. package/packages/core/src/cookie-utils.ts +42 -0
  149. package/packages/core/src/fetch.ts +435 -0
  150. package/packages/core/src/index.ts +22 -0
  151. package/packages/core/src/retry.ts +63 -0
  152. package/packages/core/src/serialize.ts +6 -0
  153. package/packages/core/src/stores/BaseAuthStore.ts +164 -0
  154. package/packages/core/src/stores/LocalAuthStore.ts +199 -0
  155. package/packages/core/src/types.ts +1042 -0
  156. package/packages/core/tests/auth-store.test.ts +300 -0
  157. package/packages/core/tests/error-code.test.ts +61 -0
  158. package/packages/core/tests/error.test.ts +24 -0
  159. package/packages/core/tests/fetch.test.ts +286 -0
  160. package/packages/core/tests/mocks.ts +139 -0
  161. package/packages/core/tests/observability.test.ts +86 -0
  162. package/packages/core/tests/refresh-hardening.test.ts +164 -0
  163. package/packages/core/tests/refresh-observability.test.ts +111 -0
  164. package/packages/core/tests/retry.test.ts +106 -0
  165. package/packages/core/tests/serialize.test.ts +12 -0
  166. package/packages/core/tests/timeout.test.ts +79 -0
  167. package/packages/core/tsconfig.json +5 -0
  168. package/packages/core/tsup.config.ts +11 -0
  169. package/packages/db/LICENSE +21 -0
  170. package/packages/db/README.md +152 -0
  171. package/packages/db/VENDORED.md +93 -0
  172. package/packages/db/dist/index.cjs +544 -0
  173. package/packages/db/dist/index.d.cts +1111 -0
  174. package/packages/db/dist/index.d.ts +1111 -0
  175. package/packages/db/dist/index.js +541 -0
  176. package/packages/db/node_modules/.bin/esbuild +19 -0
  177. package/packages/db/node_modules/.bin/tsc +22 -0
  178. package/packages/db/node_modules/.bin/tsserver +22 -0
  179. package/packages/db/node_modules/.bin/tsup +22 -0
  180. package/packages/db/node_modules/.bin/tsup-node +22 -0
  181. package/packages/db/node_modules/.bin/vite +22 -0
  182. package/packages/db/node_modules/.bin/vitest +22 -0
  183. package/packages/db/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  184. package/packages/db/package.json +62 -0
  185. package/packages/db/src/DatabaseService.ts +170 -0
  186. package/packages/db/src/QueryBuilder.ts +830 -0
  187. package/packages/db/src/index.ts +2 -0
  188. package/packages/db/src/pgrst-types/common/common.ts +86 -0
  189. package/packages/db/src/pgrst-types/common/rpc.ts +151 -0
  190. package/packages/db/src/pgrst-types/feature-flags.ts +20 -0
  191. package/packages/db/src/pgrst-types/types.ts +134 -0
  192. package/packages/db/src/select-query-parser/parser.ts +479 -0
  193. package/packages/db/src/select-query-parser/result.ts +553 -0
  194. package/packages/db/src/select-query-parser/types.ts +132 -0
  195. package/packages/db/src/select-query-parser/utils.ts +707 -0
  196. package/packages/db/tests/filters.test.ts +81 -0
  197. package/packages/db/tests/mutations-filtered.e2e.test.ts +132 -0
  198. package/packages/db/tests/mutations-filtered.test.ts +188 -0
  199. package/packages/db/tests/order.test.ts +45 -0
  200. package/packages/db/tests/rpc.test.ts +41 -0
  201. package/packages/db/tests/scale/build-large-schema.ts +94 -0
  202. package/packages/db/tests/scale/scale-compile.test.ts +167 -0
  203. package/packages/db/tests/schema.test.ts +77 -0
  204. package/packages/db/tests/single-accept.e2e.test.ts +123 -0
  205. package/packages/db/tests/single.test.ts +211 -0
  206. package/packages/db/tests/types/filters.test-d.ts +52 -0
  207. package/packages/db/tests/types/fixtures.ts +40 -0
  208. package/packages/db/tests/types/from-views.test-d.ts +18 -0
  209. package/packages/db/tests/types/mutations.test-d.ts +23 -0
  210. package/packages/db/tests/types/rpc.test-d.ts +60 -0
  211. package/packages/db/tests/types/schema-shape.test-d.ts +8 -0
  212. package/packages/db/tests/types/select-inference.test-d.ts +38 -0
  213. package/packages/db/tests/vendored/fixtures.ts +83 -0
  214. package/packages/db/tests/vendored/get-result.test-d.ts +75 -0
  215. package/packages/db/tsconfig.json +5 -0
  216. package/packages/db/tsconfig.test-d.json +5 -0
  217. package/packages/db/tsup.config.ts +11 -0
  218. package/packages/db/vitest.config.ts +8 -0
  219. package/packages/functions/LICENSE +21 -0
  220. package/packages/functions/README.md +96 -0
  221. package/packages/functions/dist/index.cjs +173 -0
  222. package/packages/functions/dist/index.d.cts +81 -0
  223. package/packages/functions/dist/index.d.ts +81 -0
  224. package/packages/functions/dist/index.js +168 -0
  225. package/packages/functions/node_modules/.bin/esbuild +19 -0
  226. package/packages/functions/node_modules/.bin/tsc +22 -0
  227. package/packages/functions/node_modules/.bin/tsserver +22 -0
  228. package/packages/functions/node_modules/.bin/tsup +22 -0
  229. package/packages/functions/node_modules/.bin/tsup-node +22 -0
  230. package/packages/functions/node_modules/.bin/vite +22 -0
  231. package/packages/functions/node_modules/.bin/vitest +22 -0
  232. package/packages/functions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  233. package/packages/functions/package.json +60 -0
  234. package/packages/functions/src/FunctionsService.ts +188 -0
  235. package/packages/functions/src/errors.ts +70 -0
  236. package/packages/functions/src/index.ts +6 -0
  237. package/packages/functions/tests/invoke.test.ts +97 -0
  238. package/packages/functions/tests/response-type-errors.test.ts +135 -0
  239. package/packages/functions/tsconfig.json +5 -0
  240. package/packages/functions/tsup.config.ts +11 -0
  241. package/packages/gen/LICENSE +21 -0
  242. package/packages/gen/README.md +84 -0
  243. package/packages/gen/dist/cli.cjs +334 -0
  244. package/packages/gen/dist/cli.d.cts +1 -0
  245. package/packages/gen/dist/cli.d.ts +1 -0
  246. package/packages/gen/dist/cli.js +332 -0
  247. package/packages/gen/dist/index.cjs +257 -0
  248. package/packages/gen/dist/index.d.cts +12 -0
  249. package/packages/gen/dist/index.d.ts +12 -0
  250. package/packages/gen/dist/index.js +255 -0
  251. package/packages/gen/node_modules/.bin/esbuild +19 -0
  252. package/packages/gen/node_modules/.bin/tsc +22 -0
  253. package/packages/gen/node_modules/.bin/tsserver +22 -0
  254. package/packages/gen/node_modules/.bin/tsup +22 -0
  255. package/packages/gen/node_modules/.bin/tsup-node +22 -0
  256. package/packages/gen/node_modules/.bin/vite +22 -0
  257. package/packages/gen/node_modules/.bin/vitest +22 -0
  258. package/packages/gen/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  259. package/packages/gen/package.json +66 -0
  260. package/packages/gen/src/cli.ts +67 -0
  261. package/packages/gen/src/generate.ts +0 -0
  262. package/packages/gen/src/index.ts +2 -0
  263. package/packages/gen/tests/compile.test.ts +213 -0
  264. package/packages/gen/tests/e2e.test.ts +130 -0
  265. package/packages/gen/tests/generate.test.ts +396 -0
  266. package/packages/gen/tsconfig.json +5 -0
  267. package/packages/gen/tsup.config.ts +11 -0
  268. package/packages/notifications/LICENSE +21 -0
  269. package/packages/notifications/README.md +134 -0
  270. package/packages/notifications/dist/index.cjs +128 -0
  271. package/packages/notifications/dist/index.d.cts +81 -0
  272. package/packages/notifications/dist/index.d.ts +81 -0
  273. package/packages/notifications/dist/index.js +125 -0
  274. package/packages/notifications/node_modules/.bin/esbuild +19 -0
  275. package/packages/notifications/node_modules/.bin/tsc +22 -0
  276. package/packages/notifications/node_modules/.bin/tsserver +22 -0
  277. package/packages/notifications/node_modules/.bin/tsup +22 -0
  278. package/packages/notifications/node_modules/.bin/tsup-node +22 -0
  279. package/packages/notifications/node_modules/.bin/vite +22 -0
  280. package/packages/notifications/node_modules/.bin/vitest +22 -0
  281. package/packages/notifications/package.json +60 -0
  282. package/packages/notifications/src/NotificationsService.ts +230 -0
  283. package/packages/notifications/src/index.ts +19 -0
  284. package/packages/notifications/tsconfig.json +5 -0
  285. package/packages/notifications/tsup.config.ts +11 -0
  286. package/packages/realtime/LICENSE +21 -0
  287. package/packages/realtime/README.md +183 -0
  288. package/packages/realtime/dist/index.cjs +977 -0
  289. package/packages/realtime/dist/index.d.cts +259 -0
  290. package/packages/realtime/dist/index.d.ts +259 -0
  291. package/packages/realtime/dist/index.js +973 -0
  292. package/packages/realtime/node_modules/.bin/esbuild +19 -0
  293. package/packages/realtime/node_modules/.bin/tsc +22 -0
  294. package/packages/realtime/node_modules/.bin/tsserver +22 -0
  295. package/packages/realtime/node_modules/.bin/tsup +22 -0
  296. package/packages/realtime/node_modules/.bin/tsup-node +22 -0
  297. package/packages/realtime/node_modules/.bin/vite +22 -0
  298. package/packages/realtime/node_modules/.bin/vitest +22 -0
  299. package/packages/realtime/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  300. package/packages/realtime/package.json +60 -0
  301. package/packages/realtime/src/AuraChannel.ts +485 -0
  302. package/packages/realtime/src/HeartbeatManager.ts +73 -0
  303. package/packages/realtime/src/RealtimeService.ts +505 -0
  304. package/packages/realtime/src/columnFilter.ts +301 -0
  305. package/packages/realtime/src/index.ts +4 -0
  306. package/packages/realtime/tests/ack-routing.test.ts +81 -0
  307. package/packages/realtime/tests/column-filter.test.ts +144 -0
  308. package/packages/realtime/tests/dispatch.test.ts +191 -0
  309. package/packages/realtime/tests/heartbeat.test.ts +67 -0
  310. package/packages/realtime/tests/http-broadcast.test.ts +68 -0
  311. package/packages/realtime/tests/realtime-token.test.ts +43 -0
  312. package/packages/realtime/tests/reconnect-race.test.ts +149 -0
  313. package/packages/realtime/tests/ref-id.test.ts +34 -0
  314. package/packages/realtime/tests/set-auth.test.ts +70 -0
  315. package/packages/realtime/tsconfig.json +5 -0
  316. package/packages/realtime/tsup.config.ts +11 -0
  317. package/packages/storage/LICENSE +21 -0
  318. package/packages/storage/README.md +141 -0
  319. package/packages/storage/dist/index.cjs +333 -0
  320. package/packages/storage/dist/index.d.cts +185 -0
  321. package/packages/storage/dist/index.d.ts +185 -0
  322. package/packages/storage/dist/index.js +329 -0
  323. package/packages/storage/node_modules/.bin/esbuild +19 -0
  324. package/packages/storage/node_modules/.bin/tsc +22 -0
  325. package/packages/storage/node_modules/.bin/tsserver +22 -0
  326. package/packages/storage/node_modules/.bin/tsup +22 -0
  327. package/packages/storage/node_modules/.bin/tsup-node +22 -0
  328. package/packages/storage/node_modules/.bin/vite +22 -0
  329. package/packages/storage/node_modules/.bin/vitest +22 -0
  330. package/packages/storage/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  331. package/packages/storage/package.json +60 -0
  332. package/packages/storage/src/DownloadBuilder.ts +60 -0
  333. package/packages/storage/src/StorageService.ts +323 -0
  334. package/packages/storage/src/index.ts +2 -0
  335. package/packages/storage/src/path.ts +35 -0
  336. package/packages/storage/src/transform.ts +15 -0
  337. package/packages/storage/tests/download.test.ts +64 -0
  338. package/packages/storage/tests/parity.test.ts +154 -0
  339. package/packages/storage/tests/path.test.ts +87 -0
  340. package/packages/storage/tests/transform.test.ts +79 -0
  341. package/packages/storage/tsconfig.json +5 -0
  342. package/packages/storage/tsup.config.ts +11 -0
  343. package/pnpm-workspace.yaml +24 -0
  344. package/tsconfig.base.json +15 -0
@@ -0,0 +1,22 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules/vitest/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules/vitest/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../vitest/vitest.mjs" "$@"
21
+ fi
22
+ # cmd-shim-target=/Users/affanedaylami/aurabase/aurabase-js/packages/gen/node_modules/vitest/vitest.mjs
@@ -0,0 +1 @@
1
+ {"version":"4.1.9","results":[[":tests/generate.test.ts",{"duration":284.61229099999946,"failed":false}],[":tests/compile.test.ts",{"duration":86465.322083,"failed":false}],[":tests/e2e.test.ts",{"duration":0,"failed":false}]]}
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@aurabase/gen",
3
+ "version": "0.3.0",
4
+ "description": "Générateur de types TypeScript Database pour le SDK Aurabase (CLI aurabase-gen)",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "bin": {
10
+ "aurabase-gen": "./dist/cli.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "import": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "require": {
19
+ "types": "./dist/index.d.cts",
20
+ "default": "./dist/index.cjs"
21
+ }
22
+ }
23
+ },
24
+ "sideEffects": false,
25
+ "files": [
26
+ "dist",
27
+ "README.md",
28
+ "LICENSE"
29
+ ],
30
+ "engines": {
31
+ "node": ">=20.0.0"
32
+ },
33
+ "license": "MIT",
34
+ "author": "Aurabase",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/daylami555/aurabase.git",
38
+ "directory": "aurabase-js/packages/gen"
39
+ },
40
+ "homepage": "https://github.com/daylami555/aurabase/tree/main/aurabase-js/packages/gen#readme",
41
+ "bugs": {
42
+ "url": "https://github.com/daylami555/aurabase/issues"
43
+ },
44
+ "keywords": [
45
+ "aurabase",
46
+ "baas",
47
+ "sdk",
48
+ "generator",
49
+ "types"
50
+ ],
51
+ "scripts": {
52
+ "build": "tsup",
53
+ "test": "vitest run --passWithNoTests",
54
+ "typecheck": "tsc --noEmit"
55
+ },
56
+ "dependencies": {
57
+ "@aurabase/core": "workspace:*",
58
+ "aurabase": "workspace:*"
59
+ },
60
+ "devDependencies": {
61
+ "tsup": "catalog:",
62
+ "typescript": "catalog:",
63
+ "vitest": "catalog:",
64
+ "@types/node": "catalog:"
65
+ }
66
+ }
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import { writeFileSync } from 'node:fs'
3
+ import { createClient } from 'aurabase'
4
+ import { generateDatabaseTypes } from './generate'
5
+
6
+ interface Args { url?: string; project?: string; key?: string; out?: string; schema?: string; typeName?: string }
7
+
8
+ function parseArgs(argv: string[]): Args {
9
+ const a: Args = {}
10
+ for (let i = 0; i < argv.length; i++) {
11
+ const v = argv[i + 1]
12
+ switch (argv[i]) {
13
+ case '--url': a.url = v; i++; break
14
+ case '--project': a.project = v; i++; break
15
+ case '--key': a.key = v; i++; break
16
+ case '--out': a.out = v; i++; break
17
+ case '--schema': a.schema = v; i++; break
18
+ case '--type-name': a.typeName = v; i++; break
19
+ }
20
+ }
21
+ return a
22
+ }
23
+
24
+ const USAGE = `Usage: aurabase-gen --url <baseUrl> --project <id> [--key <apiKey>] [--out database.types.ts] [--schema public] [--type-name Database]`
25
+
26
+ async function main(): Promise<void> {
27
+ const args = parseArgs(process.argv.slice(2))
28
+ if (!args.url || !args.project) {
29
+ console.error(USAGE)
30
+ process.exit(1)
31
+ }
32
+ const client = createClient(args.url, args.project, args.key)
33
+ const { data, error } = await client.db.schema()
34
+ if (error) {
35
+ console.error(`[aurabase-gen] Erreur de récupération du schéma : ${error.message}`)
36
+ process.exit(1)
37
+ }
38
+ // `schema()` renvoie `{ tables, functions, enums, views }`. Le typage généré
39
+ // sérialise Functions (Args/Returns/SetofOptions), Enums (unions) et Views (Row).
40
+ const tables = data?.tables ?? []
41
+ const functions = data?.functions ?? []
42
+ const enums = data?.enums ?? []
43
+ const views = data?.views ?? []
44
+ if (tables.length === 0) {
45
+ console.error('[aurabase-gen] Avertissement : schéma vide (aucune table).')
46
+ }
47
+ const output = generateDatabaseTypes(tables, {
48
+ schemaName: args.schema,
49
+ typeName: args.typeName,
50
+ functions,
51
+ enums,
52
+ views,
53
+ })
54
+ if (args.out) {
55
+ writeFileSync(args.out, output)
56
+ console.error(
57
+ `[aurabase-gen] ✓ Types écrits dans ${args.out} (${tables.length} table(s), ${functions.length} fonction(s), ${enums.length} enum(s), ${views.length} vue(s)).`,
58
+ )
59
+ } else {
60
+ process.stdout.write(output)
61
+ }
62
+ }
63
+
64
+ main().catch((e) => {
65
+ console.error('[aurabase-gen]', e instanceof Error ? e.message : e)
66
+ process.exit(1)
67
+ })
Binary file
@@ -0,0 +1,2 @@
1
+ export { generateDatabaseTypes } from './generate'
2
+ export type { GenerateOptions } from './generate'
@@ -0,0 +1,213 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { execFileSync } from 'node:child_process'
3
+ import { mkdtempSync, writeFileSync } from 'node:fs'
4
+ import { tmpdir } from 'node:os'
5
+ import { join } from 'node:path'
6
+ import { generateDatabaseTypes } from '../src/generate'
7
+ import type { SchemaTable, SchemaFunction, SchemaEnum } from '@aurabase/core'
8
+
9
+ const tables: SchemaTable[] = [
10
+ { name: 'users', columns: [
11
+ { name: 'id', col_type: 'uuid', nullable: false, unique: true, default_val: 'gen_random_uuid()', references: null },
12
+ { name: 'email', col_type: 'text', nullable: false, unique: true, default_val: null, references: null },
13
+ ], indexes: [], rls_enabled: false, realtime_enabled: false, primary_key: 'id' },
14
+ { name: 'posts', columns: [
15
+ { name: 'id', col_type: 'uuid', nullable: false, unique: true, default_val: 'gen_random_uuid()', references: null },
16
+ { name: 'author_id', col_type: 'uuid', nullable: false, unique: false, default_val: null, references: { table: 'users', column: 'id' } },
17
+ { name: 'meta', col_type: 'jsonb', nullable: true, unique: false, default_val: null, references: null },
18
+ ], indexes: [], rls_enabled: false, realtime_enabled: false, primary_key: 'id' },
19
+ ]
20
+
21
+ describe('generateDatabaseTypes — la sortie compile', () => {
22
+ it('tsc --noEmit --strict sans erreur', () => {
23
+ const out = generateDatabaseTypes(tables)
24
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-'))
25
+ const file = join(dir, 'database.types.ts')
26
+ writeFileSync(file, out)
27
+ // Compile le fichier isolé (aucun import externe → autonome).
28
+ expect(() =>
29
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
30
+ ).not.toThrow()
31
+ }, 30000)
32
+ })
33
+
34
+ const functions: SchemaFunction[] = [
35
+ { name: 'add', args: [
36
+ { name: 'a', data_type: 'int4', mode: 'IN' },
37
+ { name: 'b', data_type: 'int4', mode: 'IN' },
38
+ ], returns: 'int4', is_set_returning: false },
39
+ { name: 'list_things', args: [], returns: 'record', is_set_returning: true },
40
+ ]
41
+
42
+ // Forme minimale de `GenericSchema['Functions']` (packages/db/src/pgrst-types/common/common.ts),
43
+ // dupliquée ici pour garder ce test autonome (le fichier généré compile isolément).
44
+ const GENERIC_SCHEMA_SHAPE = `
45
+ type GenericFunction = {
46
+ Args: Record<string, unknown> | never
47
+ Returns: unknown
48
+ SetofOptions?: {
49
+ isSetofReturn?: boolean
50
+ isOneToOne?: boolean
51
+ isNotNullable?: boolean
52
+ to: string
53
+ from: string
54
+ }
55
+ }
56
+ type AssertFunctionsShape<T extends Record<string, GenericFunction>> = T
57
+ type _assertFunctions = AssertFunctionsShape<Database['public']['Functions']>
58
+ `
59
+
60
+ describe('generateDatabaseTypes — le bloc Functions compile et satisfait GenericSchema', () => {
61
+ it('tsc --noEmit --strict : Args/Returns/SetofOptions valides pour une fonction scalaire + une SETOF', () => {
62
+ const out = generateDatabaseTypes(tables, { functions })
63
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-fn-'))
64
+ const file = join(dir, 'database.types.ts')
65
+ writeFileSync(file, `${out}\n${GENERIC_SCHEMA_SHAPE}`)
66
+ expect(() =>
67
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
68
+ ).not.toThrow()
69
+ }, 30000)
70
+ })
71
+
72
+ // C5/C6 : preuve que l'auto-référence `Database['public']['Enums']['mood']` (colonnes
73
+ // enum + args de fonction enum) et le bloc Views compilent réellement.
74
+ const enums: SchemaEnum[] = [{ name: 'mood', values: ['happy', 'sad'] }]
75
+ const enumTables: SchemaTable[] = [
76
+ { name: 'people', columns: [
77
+ { name: 'id', col_type: 'uuid', nullable: false, unique: true, default_val: 'gen_random_uuid()', references: null },
78
+ { name: 'mood', col_type: { enum: 'mood' } as unknown as string, nullable: false, unique: false, default_val: null, references: null },
79
+ { name: 'tags', col_type: { array: 'text' } as unknown as string, nullable: true, unique: false, default_val: null, references: null },
80
+ { name: 'moods', col_type: { array: { enum: 'mood' } } as unknown as string, nullable: true, unique: false, default_val: null, references: null },
81
+ ], indexes: [], rls_enabled: false, realtime_enabled: false, primary_key: 'id' },
82
+ ]
83
+ const enumViews: SchemaTable[] = [
84
+ { name: 'v_happy_people', columns: [
85
+ { name: 'id', col_type: 'uuid', nullable: true, unique: false, default_val: null, references: null },
86
+ { name: 'mood', col_type: { enum: 'mood' } as unknown as string, nullable: true, unique: false, default_val: null, references: null },
87
+ ], indexes: [], rls_enabled: false, realtime_enabled: false },
88
+ ]
89
+ const enumFunctions: SchemaFunction[] = [
90
+ { name: 'set_mood', args: [{ name: 'm', data_type: 'mood', mode: 'IN' }], returns: 'mood', is_set_returning: false },
91
+ { name: 'tags_of', args: [{ name: 'ids', data_type: '_int4', mode: 'IN' }], returns: '_text', is_set_returning: false },
92
+ ]
93
+
94
+ // GEN-M1 : deux overloads de même nom NE DOIVENT PAS produire deux clés dupliquées
95
+ // (TS2300, fichier non compilable). Ils sont fusionnés en union `Args`/`Returns`.
96
+ const overloads: SchemaFunction[] = [
97
+ { name: 'add', args: [
98
+ { name: 'a', data_type: 'int4', mode: 'IN' },
99
+ { name: 'b', data_type: 'int4', mode: 'IN' },
100
+ ], returns: 'int4', is_set_returning: false },
101
+ { name: 'add', args: [
102
+ { name: 'a', data_type: 'text', mode: 'IN' },
103
+ { name: 'b', data_type: 'text', mode: 'IN' },
104
+ ], returns: 'text', is_set_returning: false },
105
+ ]
106
+
107
+ describe('generateDatabaseTypes — GEN-M1 : overloads fusionnés (compile, pas de TS2300)', () => {
108
+ it('deux add(...) → UNE clé add, Args/Returns en union, tsc --strict OK', () => {
109
+ const out = generateDatabaseTypes(tables, { functions: overloads })
110
+ // Une seule clé `add:` dans le bloc Functions (pas de duplicate identifier).
111
+ const fnBlock = out.slice(out.indexOf('Functions:'), out.indexOf('Enums:'))
112
+ expect(fnBlock.match(/add: {/g)).toHaveLength(1)
113
+ // Union des signatures (les deux formes d'Args + les deux Returns).
114
+ expect(fnBlock).toContain('{ a: number; b: number } | { a: string; b: string }')
115
+ expect(fnBlock).toContain('Returns: number | string')
116
+ // Et surtout : le fichier compile réellement.
117
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-ovl-'))
118
+ const file = join(dir, 'database.types.ts')
119
+ writeFileSync(file, `${out}\n${GENERIC_SCHEMA_SHAPE}`)
120
+ expect(() =>
121
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
122
+ ).not.toThrow()
123
+ }, 30000)
124
+ })
125
+
126
+ // Probe type-level (P4) : mirroir FIDÈLE des branches `Row` et `Result` du résolveur RPC
127
+ // vendoré (`packages/db/src/pgrst-types/common/rpc.ts:110-135`), dupliqué ici pour rester
128
+ // autonome (le fichier généré compile isolément, sans importer @aurabase/db). Prouve que la
129
+ // sortie de `@aurabase/gen` alimente CORRECTEMENT le narrowing SETOF :
130
+ // - `.select()` (Row) sur une fonction `SETOF <table>` narrown les colonnes de la table cible
131
+ // (`SetofOptions.to` = table réelle) — c'est le fix P4 ;
132
+ // - une fonction `SETOF record` (placeholder) garde un `.rpc()` Result = `Fn['Returns']` =
133
+ // `Record<string, unknown>[]` (non-régression, comportement identique avant/après le fix).
134
+ const SETOF_NARROWING_PROBE = `
135
+ type Schema = Database['public']
136
+ type TablesAndViews = Schema['Tables'] & Exclude<Schema['Views'], ''>
137
+
138
+ // Branche Row du résolveur (post-.select) : rpc.ts:111-113 pour le cas table connue.
139
+ type RpcRow<FnName extends keyof Schema['Functions']> =
140
+ Schema['Functions'][FnName] extends infer Fn
141
+ ? Fn extends { SetofOptions: { to: infer To } }
142
+ ? To extends keyof TablesAndViews
143
+ ? TablesAndViews[To] extends { Row: infer R } ? R : never
144
+ : never
145
+ : never
146
+ : never
147
+
148
+ // Branche Result du résolveur (.rpc sans .select) : rpc.ts:129-135.
149
+ type RpcResult<FnName extends keyof Schema['Functions']> =
150
+ Schema['Functions'][FnName] extends infer Fn
151
+ ? Fn extends { SetofOptions: { isSetofReturn: infer S; isOneToOne: infer O }; Returns: infer R }
152
+ ? S extends true ? (O extends true ? R[] : R) : R
153
+ : Fn extends { Returns: infer R2 } ? R2 : never
154
+ : never
155
+
156
+ type Assert<T extends true> = T
157
+ type Extends<A, B> = [A] extends [B] ? true : false
158
+ type Equals<A, B> =
159
+ (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false
160
+
161
+ // SETOF users → Row de la table users (id/email typés, PAS Record<string, unknown>).
162
+ type _P1 = Assert<Extends<RpcRow<'list_users'>, { id: string; email: string }>>
163
+ // La colonne 'id' est bien une clé narrowée.
164
+ type _P2 = Assert<Extends<'id', keyof RpcRow<'list_users'>>>
165
+ // Colonne inexistante NON présente (prouve le narrowing réel, pas un index signature).
166
+ type _P3 = Assert<Extends<'not_a_col', keyof RpcRow<'list_users'>> extends true ? false : true>
167
+ // SETOF record (placeholder) → .rpc() Result reste Record<string, unknown>[] (non-régression).
168
+ type _P4 = Assert<Equals<RpcResult<'list_things'>, Record<string, unknown>[]>>
169
+ `
170
+
171
+ describe('generateDatabaseTypes — P4 : narrowing SETOF <table> (probe tsc type-level)', () => {
172
+ it('tsc --strict : SETOF users narrown les colonnes, SETOF record reste Record<string, unknown>', () => {
173
+ const out = generateDatabaseTypes(
174
+ [
175
+ { name: 'users', columns: [
176
+ { name: 'id', col_type: 'uuid', nullable: false, unique: true, default_val: null, references: null },
177
+ { name: 'email', col_type: 'text', nullable: false, unique: false, default_val: null, references: null },
178
+ ], indexes: [], rls_enabled: false, realtime_enabled: false, primary_key: 'id' },
179
+ ],
180
+ {
181
+ functions: [
182
+ { name: 'list_users', args: [], returns: 'users', is_set_returning: true },
183
+ { name: 'list_things', args: [], returns: 'record', is_set_returning: true },
184
+ ],
185
+ },
186
+ )
187
+ // La cible SETOF est bien résolue à la table dans la sortie textuelle.
188
+ expect(out).toContain("to: 'users'")
189
+ expect(out).toContain("to: 'list_things'")
190
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-setof-'))
191
+ const file = join(dir, 'database.types.ts')
192
+ writeFileSync(file, `${out}\n${SETOF_NARROWING_PROBE}`)
193
+ expect(() =>
194
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
195
+ ).not.toThrow()
196
+ }, 30000)
197
+ })
198
+
199
+ describe('generateDatabaseTypes — Enums/Views/colonnes enum compilent (C5/C6)', () => {
200
+ it('tsc --noEmit --strict : auto-référence Enums, array d’enum, view, function enum/array', () => {
201
+ const out = generateDatabaseTypes(enumTables, {
202
+ enums,
203
+ views: enumViews,
204
+ functions: enumFunctions,
205
+ })
206
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-enum-'))
207
+ const file = join(dir, 'database.types.ts')
208
+ writeFileSync(file, `${out}\n${GENERIC_SCHEMA_SHAPE}`)
209
+ expect(() =>
210
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
211
+ ).not.toThrow()
212
+ }, 30000)
213
+ })
@@ -0,0 +1,130 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { execFileSync } from 'node:child_process'
3
+ import { mkdtempSync, writeFileSync } from 'node:fs'
4
+ import { tmpdir } from 'node:os'
5
+ import { join } from 'node:path'
6
+ import { createClient } from 'aurabase'
7
+ import { generateDatabaseTypes } from '../src/generate'
8
+
9
+ const URL = process.env.AURA_E2E_URL
10
+ const PROJECT = process.env.AURA_E2E_PROJECT
11
+ const KEY = process.env.AURA_E2E_KEY
12
+ const RUN = Boolean(process.env.RUN_E2E && URL && PROJECT && KEY)
13
+
14
+ // Suffixe UNIQUE par run : évite les collisions « already exists » sur reruns
15
+ // (l'endpoint /raw interdit les DROP → impossible de nettoyer par SQL brut ; on ne
16
+ // tente donc plus de DROP, on isole chaque run par un suffixe distinct).
17
+ function uniqueSuffix(): string {
18
+ return (process.env.AURA_E2E_SUFFIX ?? '') + Math.random().toString(36).slice(2, 8)
19
+ }
20
+
21
+ // Exécute un SQL brut en RETENTANT sur les statuts transitoires — notamment 429
22
+ // (l'endpoint /raw est rate-limité : burst 10 / 30 req/min) et 404/503 (cache
23
+ // PostgREST). ASSERTE le succès : un CREATE avalé silencieusement (429) ne doit
24
+ // plus faire échouer le test plus loin sur « 0 table ».
25
+ async function sqlOk(
26
+ client: ReturnType<typeof createClient>,
27
+ query: string,
28
+ ): Promise<void> {
29
+ let res = await client.db.sql(query)
30
+ for (let i = 0; i < 20 && res.error && [429, 404, 503].includes(res.error.status ?? 0); i++) {
31
+ await new Promise((r) => setTimeout(r, 1000))
32
+ res = await client.db.sql(query)
33
+ }
34
+ expect(res.error, `SQL a échoué: ${query.slice(0, 60)}… → ${JSON.stringify(res.error)}`).toBeNull()
35
+ }
36
+
37
+ async function schemaWithRetry<T extends { error: { status?: number } | null }>(
38
+ fn: () => Promise<T>,
39
+ ): Promise<T> {
40
+ let res = await fn()
41
+ for (let i = 0; i < 20 && res.error && [429, 404, 503].includes(res.error.status ?? 0); i++) {
42
+ await new Promise((r) => setTimeout(r, 1000))
43
+ res = await fn()
44
+ }
45
+ return res
46
+ }
47
+
48
+ describe.runIf(RUN)('gen E2E — schéma réel → génère → compile', () => {
49
+ it('crée 2 tables liées par FK, génère les types, et ils compilent', async () => {
50
+ const client = createClient(URL!, PROJECT!, KEY!)
51
+ const suffix = uniqueSuffix()
52
+ const authors = `e2e_authors_${suffix}`
53
+ const books = `e2e_books_${suffix}`
54
+
55
+ // Création via SQL brut (service_role). Pas de DROP préalable : /raw les rejette
56
+ // (blocklist DDL) et ils consommeraient inutilement le budget rate-limit.
57
+ await sqlOk(client, `CREATE TABLE ${authors} (id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL)`)
58
+ await sqlOk(client, `CREATE TABLE ${books} (id uuid PRIMARY KEY DEFAULT gen_random_uuid(), author_id uuid NOT NULL REFERENCES ${authors}(id), title text NOT NULL)`)
59
+
60
+ const { data, error } = await schemaWithRetry(() => client.db.schema())
61
+ expect(error).toBeNull()
62
+ const tables = (data?.tables ?? []).filter((t) => t.name === authors || t.name === books)
63
+ expect(tables.length).toBe(2)
64
+
65
+ const out = generateDatabaseTypes(tables)
66
+ expect(out).toContain(`referencedRelation: '${authors}'`)
67
+ expect(out).toContain(`columns: ['author_id']`)
68
+
69
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-e2e-'))
70
+ const file = join(dir, 'database.types.ts')
71
+ writeFileSync(file, out)
72
+ expect(() =>
73
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
74
+ ).not.toThrow()
75
+ }, 60_000)
76
+
77
+ // LOT C — enum + array typé + FK composite + view + function scalaire.
78
+ it('enum + array + FK composite + view + function → génère blocs Enums/Views/Functions typés et compile', async () => {
79
+ const client = createClient(URL!, PROJECT!, KEY!)
80
+ const suffix = uniqueSuffix()
81
+ const moodEnum = `e2e_mood_${suffix}`
82
+ const orders = `e2e_orders_${suffix}`
83
+ const items = `e2e_items_${suffix}`
84
+ const view = `e2e_v_items_${suffix}`
85
+ const addFn = `e2e_add_${suffix}`
86
+
87
+ // Pas de DROP (voir cas 1). Chaque CREATE est asserté + retenté sur 429/404/503.
88
+ await sqlOk(client, `CREATE TYPE ${moodEnum} AS ENUM ('happy', 'sad', 'ok')`)
89
+ await sqlOk(
90
+ client,
91
+ `CREATE TABLE ${orders} (tenant uuid NOT NULL, id uuid NOT NULL, mood ${moodEnum} NOT NULL, tags text[] NOT NULL DEFAULT '{}', PRIMARY KEY (tenant, id))`,
92
+ )
93
+ await sqlOk(
94
+ client,
95
+ `CREATE TABLE ${items} (id uuid PRIMARY KEY DEFAULT gen_random_uuid(), order_tenant uuid NOT NULL, order_id uuid NOT NULL, CONSTRAINT fk_order FOREIGN KEY (order_tenant, order_id) REFERENCES ${orders}(tenant, id))`,
96
+ )
97
+ await sqlOk(client, `CREATE VIEW ${view} AS SELECT id, order_id FROM ${items}`)
98
+ await sqlOk(client, `CREATE FUNCTION ${addFn}(a int, b int) RETURNS int LANGUAGE sql AS 'SELECT a + b'`)
99
+ await sqlOk(client, `SELECT pg_notify('pgrst', 'reload schema')`)
100
+
101
+ const { data, error } = await schemaWithRetry(() => client.db.schema())
102
+ expect(error).toBeNull()
103
+ const tables = (data?.tables ?? []).filter((t) => t.name === orders || t.name === items)
104
+ const enums = (data?.enums ?? []).filter((e) => e.name === moodEnum)
105
+ const views = (data?.views ?? []).filter((v) => v.name === view)
106
+ const functions = (data?.functions ?? []).filter((f) => f.name === addFn)
107
+ expect(tables.length).toBe(2)
108
+ expect(enums.length).toBe(1)
109
+ expect(views.length).toBe(1)
110
+ expect(functions.length).toBe(1)
111
+
112
+ const out = generateDatabaseTypes(tables, { enums, views, functions })
113
+ expect(out).toContain(`${moodEnum}: 'happy' | 'sad' | 'ok'`)
114
+ expect(out).toContain(`mood: Database['public']['Enums']['${moodEnum}']`)
115
+ expect(out).toContain('tags: string[]')
116
+ expect(out).toContain("columns: ['order_tenant', 'order_id']")
117
+ expect(out).toContain(`${view}: {`)
118
+ const fnBlock = out.slice(out.indexOf(`${addFn}: {`), out.indexOf(`${addFn}: {`) + 300)
119
+ expect(fnBlock).toContain('a: number')
120
+ expect(fnBlock).toContain('Returns: number')
121
+ expect(fnBlock).not.toContain('unknown')
122
+
123
+ const dir = mkdtempSync(join(tmpdir(), 'aura-gen-e2e-c-'))
124
+ const file = join(dir, 'database.types.ts')
125
+ writeFileSync(file, out)
126
+ expect(() =>
127
+ execFileSync('npx', ['tsc', '--noEmit', '--strict', '--skipLibCheck', file], { stdio: 'pipe' }),
128
+ ).not.toThrow()
129
+ }, 60_000)
130
+ })