@aurabase/aurabase-js 0.3.0 → 0.4.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 (343) hide show
  1. package/README.md +26 -795
  2. package/{packages/aurabase/dist/AuraClient-DAtDbfPB.d.ts → dist/AuraClient-BcFE8u1v.d.cts} +1 -1
  3. package/{packages/aurabase/dist/AuraClient-DAtDbfPB.d.cts → dist/AuraClient-BcFE8u1v.d.ts} +1 -1
  4. package/{packages/aurabase/dist → dist}/index.d.cts +1 -1
  5. package/{packages/aurabase/dist → dist}/index.d.ts +1 -1
  6. package/{packages/aurabase/dist → dist}/ssr.d.cts +1 -1
  7. package/{packages/aurabase/dist → dist}/ssr.d.ts +1 -1
  8. package/package.json +72 -82
  9. package/.changeset/config.json +0 -11
  10. package/CHANGELOG.md +0 -30
  11. package/packages/ai/LICENSE +0 -21
  12. package/packages/ai/README.md +0 -106
  13. package/packages/ai/dist/index.cjs +0 -229
  14. package/packages/ai/dist/index.d.cts +0 -139
  15. package/packages/ai/dist/index.d.ts +0 -139
  16. package/packages/ai/dist/index.js +0 -226
  17. package/packages/ai/node_modules/.bin/esbuild +0 -19
  18. package/packages/ai/node_modules/.bin/tsc +0 -22
  19. package/packages/ai/node_modules/.bin/tsserver +0 -22
  20. package/packages/ai/node_modules/.bin/tsup +0 -22
  21. package/packages/ai/node_modules/.bin/tsup-node +0 -22
  22. package/packages/ai/node_modules/.bin/vite +0 -22
  23. package/packages/ai/node_modules/.bin/vitest +0 -22
  24. package/packages/ai/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  25. package/packages/ai/package.json +0 -61
  26. package/packages/ai/src/AiService.ts +0 -226
  27. package/packages/ai/src/index.ts +0 -18
  28. package/packages/ai/src/sse.ts +0 -141
  29. package/packages/ai/src/types.ts +0 -30
  30. package/packages/ai/tests/chat-stream.test.ts +0 -151
  31. package/packages/ai/tests/rag-namespaces.test.ts +0 -54
  32. package/packages/ai/tests/sse.test.ts +0 -69
  33. package/packages/ai/tsconfig.json +0 -5
  34. package/packages/ai/tsup.config.ts +0 -11
  35. package/packages/aurabase/LICENSE +0 -21
  36. package/packages/aurabase/README.md +0 -64
  37. package/packages/aurabase/node_modules/.bin/esbuild +0 -19
  38. package/packages/aurabase/node_modules/.bin/tsc +0 -22
  39. package/packages/aurabase/node_modules/.bin/tsserver +0 -22
  40. package/packages/aurabase/node_modules/.bin/tsup +0 -22
  41. package/packages/aurabase/node_modules/.bin/tsup-node +0 -22
  42. package/packages/aurabase/node_modules/.bin/vite +0 -22
  43. package/packages/aurabase/node_modules/.bin/vitest +0 -22
  44. package/packages/aurabase/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  45. package/packages/aurabase/package.json +0 -80
  46. package/packages/aurabase/src/AuraClient.ts +0 -237
  47. package/packages/aurabase/src/index.ts +0 -152
  48. package/packages/aurabase/src/ssr.ts +0 -156
  49. package/packages/aurabase/tests/ai-streaming-rag-e2e.test.ts +0 -82
  50. package/packages/aurabase/tests/ai.test.ts +0 -111
  51. package/packages/aurabase/tests/auth-admin.test.ts +0 -515
  52. package/packages/aurabase/tests/auth-e2e.test.ts +0 -135
  53. package/packages/aurabase/tests/auth-hardening.test.ts +0 -206
  54. package/packages/aurabase/tests/auth.test.ts +0 -947
  55. package/packages/aurabase/tests/database.test.ts +0 -230
  56. package/packages/aurabase/tests/db-types-e2e.test.ts +0 -217
  57. package/packages/aurabase/tests/dispose.test.ts +0 -23
  58. package/packages/aurabase/tests/foreign-token.e2e.test.ts +0 -129
  59. package/packages/aurabase/tests/functions.test.ts +0 -107
  60. package/packages/aurabase/tests/integration.test.ts +0 -413
  61. package/packages/aurabase/tests/live-production-validation.js +0 -241
  62. package/packages/aurabase/tests/live-sdk-production-validation.js +0 -293
  63. package/packages/aurabase/tests/mocks.ts +0 -139
  64. package/packages/aurabase/tests/notifications.test.ts +0 -314
  65. package/packages/aurabase/tests/observability-backup.test.ts +0 -186
  66. package/packages/aurabase/tests/observability-hook.test.ts +0 -130
  67. package/packages/aurabase/tests/production-robustness.test.ts +0 -268
  68. package/packages/aurabase/tests/public-api-surface.test.ts +0 -53
  69. package/packages/aurabase/tests/query-builder.test.ts +0 -329
  70. package/packages/aurabase/tests/readme-smoke-e2e.test.ts +0 -231
  71. package/packages/aurabase/tests/realtime-filter-e2e.test.ts +0 -344
  72. package/packages/aurabase/tests/refresh-locks.test.ts +0 -210
  73. package/packages/aurabase/tests/retry-option.test.ts +0 -17
  74. package/packages/aurabase/tests/rpc-e2e.test.ts +0 -254
  75. package/packages/aurabase/tests/rs256-local-e2e.test.ts +0 -114
  76. package/packages/aurabase/tests/rt-alias-public-e2e.test.ts +0 -235
  77. package/packages/aurabase/tests/rt-http-broadcast-e2e.test.ts +0 -124
  78. package/packages/aurabase/tests/service-role-guard.test.ts +0 -99
  79. package/packages/aurabase/tests/ssr.test.ts +0 -91
  80. package/packages/aurabase/tests/storage-backend-e2e.test.ts +0 -481
  81. package/packages/aurabase/tests/storage-sdk-parity-e2e.test.ts +0 -104
  82. package/packages/aurabase/tests/storage-transform-e2e.test.ts +0 -684
  83. package/packages/aurabase/tests/storage.test.ts +0 -55
  84. package/packages/aurabase/tests/types/client-generic.test-d.ts +0 -79
  85. package/packages/aurabase/tests/types/docs-snippets.test-d.ts +0 -571
  86. package/packages/aurabase/tests/types/error-code.test-d.ts +0 -53
  87. package/packages/aurabase/tsconfig.json +0 -5
  88. package/packages/aurabase/tsconfig.test-d.json +0 -5
  89. package/packages/aurabase/tsup.config.ts +0 -11
  90. package/packages/aurabase/vitest.config.ts +0 -16
  91. package/packages/aurabase/vitest.e2e.config.ts +0 -9
  92. package/packages/auth/LICENSE +0 -21
  93. package/packages/auth/README.md +0 -215
  94. package/packages/auth/dist/index.cjs +0 -1175
  95. package/packages/auth/dist/index.d.cts +0 -397
  96. package/packages/auth/dist/index.d.ts +0 -397
  97. package/packages/auth/dist/index.js +0 -1170
  98. package/packages/auth/node_modules/.bin/esbuild +0 -19
  99. package/packages/auth/node_modules/.bin/tsc +0 -22
  100. package/packages/auth/node_modules/.bin/tsserver +0 -22
  101. package/packages/auth/node_modules/.bin/tsup +0 -22
  102. package/packages/auth/node_modules/.bin/tsup-node +0 -22
  103. package/packages/auth/node_modules/.bin/vite +0 -22
  104. package/packages/auth/node_modules/.bin/vitest +0 -22
  105. package/packages/auth/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  106. package/packages/auth/package.json +0 -61
  107. package/packages/auth/src/AuthAdminService.ts +0 -149
  108. package/packages/auth/src/AuthService.ts +0 -1166
  109. package/packages/auth/src/SessionManager.ts +0 -92
  110. package/packages/auth/src/index.ts +0 -17
  111. package/packages/auth/src/jwks.ts +0 -337
  112. package/packages/auth/src/pkce.ts +0 -27
  113. package/packages/auth/src/types.ts +0 -89
  114. package/packages/auth/tests/auth-lifecycle.test.ts +0 -149
  115. package/packages/auth/tests/detect-session.test.ts +0 -361
  116. package/packages/auth/tests/getclaims.test.ts +0 -780
  117. package/packages/auth/tests/is-mfa-challenge.test.ts +0 -27
  118. package/packages/auth/tests/password-recovery.test.ts +0 -124
  119. package/packages/auth/tests/pkce.test.ts +0 -192
  120. package/packages/auth/tests/session-manager.test.ts +0 -103
  121. package/packages/auth/tests/set-session.test.ts +0 -139
  122. package/packages/auth/tests/verify-otp.test.ts +0 -153
  123. package/packages/auth/tsconfig.json +0 -5
  124. package/packages/auth/tsup.config.ts +0 -11
  125. package/packages/core/LICENSE +0 -21
  126. package/packages/core/README.md +0 -132
  127. package/packages/core/dist/index.cjs +0 -695
  128. package/packages/core/dist/index.d.cts +0 -1137
  129. package/packages/core/dist/index.d.ts +0 -1137
  130. package/packages/core/dist/index.js +0 -673
  131. package/packages/core/node_modules/.bin/esbuild +0 -22
  132. package/packages/core/node_modules/.bin/tsc +0 -22
  133. package/packages/core/node_modules/.bin/tsserver +0 -22
  134. package/packages/core/node_modules/.bin/tsup +0 -22
  135. package/packages/core/node_modules/.bin/tsup-node +0 -22
  136. package/packages/core/node_modules/.bin/vite +0 -22
  137. package/packages/core/node_modules/.bin/vitest +0 -22
  138. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  139. package/packages/core/package.json +0 -57
  140. package/packages/core/src/AuraError.ts +0 -89
  141. package/packages/core/src/BaseService.ts +0 -44
  142. package/packages/core/src/client.ts +0 -34
  143. package/packages/core/src/cookie-utils.ts +0 -42
  144. package/packages/core/src/fetch.ts +0 -435
  145. package/packages/core/src/index.ts +0 -22
  146. package/packages/core/src/retry.ts +0 -63
  147. package/packages/core/src/serialize.ts +0 -6
  148. package/packages/core/src/stores/BaseAuthStore.ts +0 -164
  149. package/packages/core/src/stores/LocalAuthStore.ts +0 -199
  150. package/packages/core/src/types.ts +0 -1042
  151. package/packages/core/tests/auth-store.test.ts +0 -300
  152. package/packages/core/tests/error-code.test.ts +0 -61
  153. package/packages/core/tests/error.test.ts +0 -24
  154. package/packages/core/tests/fetch.test.ts +0 -286
  155. package/packages/core/tests/mocks.ts +0 -139
  156. package/packages/core/tests/observability.test.ts +0 -86
  157. package/packages/core/tests/refresh-hardening.test.ts +0 -164
  158. package/packages/core/tests/refresh-observability.test.ts +0 -111
  159. package/packages/core/tests/retry.test.ts +0 -106
  160. package/packages/core/tests/serialize.test.ts +0 -12
  161. package/packages/core/tests/timeout.test.ts +0 -79
  162. package/packages/core/tsconfig.json +0 -5
  163. package/packages/core/tsup.config.ts +0 -11
  164. package/packages/db/LICENSE +0 -21
  165. package/packages/db/README.md +0 -152
  166. package/packages/db/VENDORED.md +0 -93
  167. package/packages/db/dist/index.cjs +0 -544
  168. package/packages/db/dist/index.d.cts +0 -1111
  169. package/packages/db/dist/index.d.ts +0 -1111
  170. package/packages/db/dist/index.js +0 -541
  171. package/packages/db/node_modules/.bin/esbuild +0 -19
  172. package/packages/db/node_modules/.bin/tsc +0 -22
  173. package/packages/db/node_modules/.bin/tsserver +0 -22
  174. package/packages/db/node_modules/.bin/tsup +0 -22
  175. package/packages/db/node_modules/.bin/tsup-node +0 -22
  176. package/packages/db/node_modules/.bin/vite +0 -22
  177. package/packages/db/node_modules/.bin/vitest +0 -22
  178. package/packages/db/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  179. package/packages/db/package.json +0 -62
  180. package/packages/db/src/DatabaseService.ts +0 -170
  181. package/packages/db/src/QueryBuilder.ts +0 -830
  182. package/packages/db/src/index.ts +0 -2
  183. package/packages/db/src/pgrst-types/common/common.ts +0 -86
  184. package/packages/db/src/pgrst-types/common/rpc.ts +0 -151
  185. package/packages/db/src/pgrst-types/feature-flags.ts +0 -20
  186. package/packages/db/src/pgrst-types/types.ts +0 -134
  187. package/packages/db/src/select-query-parser/parser.ts +0 -479
  188. package/packages/db/src/select-query-parser/result.ts +0 -553
  189. package/packages/db/src/select-query-parser/types.ts +0 -132
  190. package/packages/db/src/select-query-parser/utils.ts +0 -707
  191. package/packages/db/tests/filters.test.ts +0 -81
  192. package/packages/db/tests/mutations-filtered.e2e.test.ts +0 -132
  193. package/packages/db/tests/mutations-filtered.test.ts +0 -188
  194. package/packages/db/tests/order.test.ts +0 -45
  195. package/packages/db/tests/rpc.test.ts +0 -41
  196. package/packages/db/tests/scale/build-large-schema.ts +0 -94
  197. package/packages/db/tests/scale/scale-compile.test.ts +0 -167
  198. package/packages/db/tests/schema.test.ts +0 -77
  199. package/packages/db/tests/single-accept.e2e.test.ts +0 -123
  200. package/packages/db/tests/single.test.ts +0 -211
  201. package/packages/db/tests/types/filters.test-d.ts +0 -52
  202. package/packages/db/tests/types/fixtures.ts +0 -40
  203. package/packages/db/tests/types/from-views.test-d.ts +0 -18
  204. package/packages/db/tests/types/mutations.test-d.ts +0 -23
  205. package/packages/db/tests/types/rpc.test-d.ts +0 -60
  206. package/packages/db/tests/types/schema-shape.test-d.ts +0 -8
  207. package/packages/db/tests/types/select-inference.test-d.ts +0 -38
  208. package/packages/db/tests/vendored/fixtures.ts +0 -83
  209. package/packages/db/tests/vendored/get-result.test-d.ts +0 -75
  210. package/packages/db/tsconfig.json +0 -5
  211. package/packages/db/tsconfig.test-d.json +0 -5
  212. package/packages/db/tsup.config.ts +0 -11
  213. package/packages/db/vitest.config.ts +0 -8
  214. package/packages/functions/LICENSE +0 -21
  215. package/packages/functions/README.md +0 -96
  216. package/packages/functions/dist/index.cjs +0 -173
  217. package/packages/functions/dist/index.d.cts +0 -81
  218. package/packages/functions/dist/index.d.ts +0 -81
  219. package/packages/functions/dist/index.js +0 -168
  220. package/packages/functions/node_modules/.bin/esbuild +0 -19
  221. package/packages/functions/node_modules/.bin/tsc +0 -22
  222. package/packages/functions/node_modules/.bin/tsserver +0 -22
  223. package/packages/functions/node_modules/.bin/tsup +0 -22
  224. package/packages/functions/node_modules/.bin/tsup-node +0 -22
  225. package/packages/functions/node_modules/.bin/vite +0 -22
  226. package/packages/functions/node_modules/.bin/vitest +0 -22
  227. package/packages/functions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  228. package/packages/functions/package.json +0 -60
  229. package/packages/functions/src/FunctionsService.ts +0 -188
  230. package/packages/functions/src/errors.ts +0 -70
  231. package/packages/functions/src/index.ts +0 -6
  232. package/packages/functions/tests/invoke.test.ts +0 -97
  233. package/packages/functions/tests/response-type-errors.test.ts +0 -135
  234. package/packages/functions/tsconfig.json +0 -5
  235. package/packages/functions/tsup.config.ts +0 -11
  236. package/packages/gen/LICENSE +0 -21
  237. package/packages/gen/README.md +0 -84
  238. package/packages/gen/dist/cli.cjs +0 -334
  239. package/packages/gen/dist/cli.d.cts +0 -1
  240. package/packages/gen/dist/cli.d.ts +0 -1
  241. package/packages/gen/dist/cli.js +0 -332
  242. package/packages/gen/dist/index.cjs +0 -257
  243. package/packages/gen/dist/index.d.cts +0 -12
  244. package/packages/gen/dist/index.d.ts +0 -12
  245. package/packages/gen/dist/index.js +0 -255
  246. package/packages/gen/node_modules/.bin/esbuild +0 -19
  247. package/packages/gen/node_modules/.bin/tsc +0 -22
  248. package/packages/gen/node_modules/.bin/tsserver +0 -22
  249. package/packages/gen/node_modules/.bin/tsup +0 -22
  250. package/packages/gen/node_modules/.bin/tsup-node +0 -22
  251. package/packages/gen/node_modules/.bin/vite +0 -22
  252. package/packages/gen/node_modules/.bin/vitest +0 -22
  253. package/packages/gen/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  254. package/packages/gen/package.json +0 -66
  255. package/packages/gen/src/cli.ts +0 -67
  256. package/packages/gen/src/generate.ts +0 -0
  257. package/packages/gen/src/index.ts +0 -2
  258. package/packages/gen/tests/compile.test.ts +0 -213
  259. package/packages/gen/tests/e2e.test.ts +0 -130
  260. package/packages/gen/tests/generate.test.ts +0 -396
  261. package/packages/gen/tsconfig.json +0 -5
  262. package/packages/gen/tsup.config.ts +0 -11
  263. package/packages/notifications/LICENSE +0 -21
  264. package/packages/notifications/README.md +0 -134
  265. package/packages/notifications/dist/index.cjs +0 -128
  266. package/packages/notifications/dist/index.d.cts +0 -81
  267. package/packages/notifications/dist/index.d.ts +0 -81
  268. package/packages/notifications/dist/index.js +0 -125
  269. package/packages/notifications/node_modules/.bin/esbuild +0 -19
  270. package/packages/notifications/node_modules/.bin/tsc +0 -22
  271. package/packages/notifications/node_modules/.bin/tsserver +0 -22
  272. package/packages/notifications/node_modules/.bin/tsup +0 -22
  273. package/packages/notifications/node_modules/.bin/tsup-node +0 -22
  274. package/packages/notifications/node_modules/.bin/vite +0 -22
  275. package/packages/notifications/node_modules/.bin/vitest +0 -22
  276. package/packages/notifications/package.json +0 -60
  277. package/packages/notifications/src/NotificationsService.ts +0 -230
  278. package/packages/notifications/src/index.ts +0 -19
  279. package/packages/notifications/tsconfig.json +0 -5
  280. package/packages/notifications/tsup.config.ts +0 -11
  281. package/packages/realtime/LICENSE +0 -21
  282. package/packages/realtime/README.md +0 -183
  283. package/packages/realtime/dist/index.cjs +0 -977
  284. package/packages/realtime/dist/index.d.cts +0 -259
  285. package/packages/realtime/dist/index.d.ts +0 -259
  286. package/packages/realtime/dist/index.js +0 -973
  287. package/packages/realtime/node_modules/.bin/esbuild +0 -19
  288. package/packages/realtime/node_modules/.bin/tsc +0 -22
  289. package/packages/realtime/node_modules/.bin/tsserver +0 -22
  290. package/packages/realtime/node_modules/.bin/tsup +0 -22
  291. package/packages/realtime/node_modules/.bin/tsup-node +0 -22
  292. package/packages/realtime/node_modules/.bin/vite +0 -22
  293. package/packages/realtime/node_modules/.bin/vitest +0 -22
  294. package/packages/realtime/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  295. package/packages/realtime/package.json +0 -60
  296. package/packages/realtime/src/AuraChannel.ts +0 -485
  297. package/packages/realtime/src/HeartbeatManager.ts +0 -73
  298. package/packages/realtime/src/RealtimeService.ts +0 -505
  299. package/packages/realtime/src/columnFilter.ts +0 -301
  300. package/packages/realtime/src/index.ts +0 -4
  301. package/packages/realtime/tests/ack-routing.test.ts +0 -81
  302. package/packages/realtime/tests/column-filter.test.ts +0 -144
  303. package/packages/realtime/tests/dispatch.test.ts +0 -191
  304. package/packages/realtime/tests/heartbeat.test.ts +0 -67
  305. package/packages/realtime/tests/http-broadcast.test.ts +0 -68
  306. package/packages/realtime/tests/realtime-token.test.ts +0 -43
  307. package/packages/realtime/tests/reconnect-race.test.ts +0 -149
  308. package/packages/realtime/tests/ref-id.test.ts +0 -34
  309. package/packages/realtime/tests/set-auth.test.ts +0 -70
  310. package/packages/realtime/tsconfig.json +0 -5
  311. package/packages/realtime/tsup.config.ts +0 -11
  312. package/packages/storage/LICENSE +0 -21
  313. package/packages/storage/README.md +0 -141
  314. package/packages/storage/dist/index.cjs +0 -333
  315. package/packages/storage/dist/index.d.cts +0 -185
  316. package/packages/storage/dist/index.d.ts +0 -185
  317. package/packages/storage/dist/index.js +0 -329
  318. package/packages/storage/node_modules/.bin/esbuild +0 -19
  319. package/packages/storage/node_modules/.bin/tsc +0 -22
  320. package/packages/storage/node_modules/.bin/tsserver +0 -22
  321. package/packages/storage/node_modules/.bin/tsup +0 -22
  322. package/packages/storage/node_modules/.bin/tsup-node +0 -22
  323. package/packages/storage/node_modules/.bin/vite +0 -22
  324. package/packages/storage/node_modules/.bin/vitest +0 -22
  325. package/packages/storage/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  326. package/packages/storage/package.json +0 -60
  327. package/packages/storage/src/DownloadBuilder.ts +0 -60
  328. package/packages/storage/src/StorageService.ts +0 -323
  329. package/packages/storage/src/index.ts +0 -2
  330. package/packages/storage/src/path.ts +0 -35
  331. package/packages/storage/src/transform.ts +0 -15
  332. package/packages/storage/tests/download.test.ts +0 -64
  333. package/packages/storage/tests/parity.test.ts +0 -154
  334. package/packages/storage/tests/path.test.ts +0 -87
  335. package/packages/storage/tests/transform.test.ts +0 -79
  336. package/packages/storage/tsconfig.json +0 -5
  337. package/packages/storage/tsup.config.ts +0 -11
  338. package/pnpm-workspace.yaml +0 -24
  339. package/tsconfig.base.json +0 -15
  340. /package/{packages/aurabase/dist → dist}/index.cjs +0 -0
  341. /package/{packages/aurabase/dist → dist}/index.js +0 -0
  342. /package/{packages/aurabase/dist → dist}/ssr.cjs +0 -0
  343. /package/{packages/aurabase/dist → dist}/ssr.js +0 -0
@@ -1,81 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { QueryBuilder } from '../src/QueryBuilder'
3
- import { BaseAuthStore } from '@aurabase/core'
4
- import type { AuraClientLike } from '@aurabase/core'
5
-
6
- function client(): AuraClientLike {
7
- return {
8
- baseUrl: 'http://x', projectId: 'p', apiKey: 'k',
9
- fetchFn: (async () => new Response('[]')) as unknown as typeof globalThis.fetch,
10
- authStore: new BaseAuthStore(),
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
13
- }
14
- }
15
- const qb = () => new QueryBuilder(client(), '/base')
16
- const get = (b: QueryBuilder, key: string) => new URLSearchParams(b.buildQueryString()).get(key)
17
-
18
- describe('QueryBuilder — filtres PostgREST', () => {
19
- it('notIn', () => { expect(get(qb().notIn('id', [1, 2]), 'id')).toBe('not.in.(1,2)') })
20
- it('contains array/objet/string', () => {
21
- expect(get(qb().contains('tags', ['a', 'b']), 'tags')).toBe('cs.{a,b}')
22
- expect(get(qb().contains('meta', { a: 1 }), 'meta')).toBe('cs.{"a":1}')
23
- expect(get(qb().contains('r', '[1,2)'), 'r')).toBe('cs.[1,2)')
24
- })
25
- it('containedBy / overlaps', () => {
26
- expect(get(qb().containedBy('tags', ['a']), 'tags')).toBe('cd.{a}')
27
- expect(get(qb().overlaps('tags', ['a', 'b']), 'tags')).toBe('ov.{a,b}')
28
- })
29
- it('ranges', () => {
30
- expect(get(qb().rangeGt('r', '[1,2)'), 'r')).toBe('sr.[1,2)')
31
- expect(get(qb().rangeGte('r', '[1,2)'), 'r')).toBe('nxl.[1,2)')
32
- expect(get(qb().rangeLt('r', '[1,2)'), 'r')).toBe('sl.[1,2)')
33
- expect(get(qb().rangeLte('r', '[1,2)'), 'r')).toBe('nxr.[1,2)')
34
- expect(get(qb().rangeAdjacent('r', '[1,2)'), 'r')).toBe('adj.[1,2)')
35
- })
36
- it('textSearch', () => {
37
- expect(get(qb().textSearch('body', 'cat'), 'body')).toBe('fts.cat')
38
- expect(get(qb().textSearch('body', 'cat', { type: 'plain' }), 'body')).toBe('plfts.cat')
39
- expect(get(qb().textSearch('body', 'cat', { type: 'phrase' }), 'body')).toBe('phfts.cat')
40
- expect(get(qb().textSearch('body', 'cat', { type: 'websearch' }), 'body')).toBe('wfts.cat')
41
- expect(get(qb().textSearch('body', 'cat', { config: 'english' }), 'body')).toBe('fts(english).cat')
42
- })
43
- it('isDistinct / not / filter', () => {
44
- expect(get(qb().isDistinct('x', 1), 'x')).toBe('isdistinct.1')
45
- expect(get(qb().not('x', 'eq', 1), 'x')).toBe('not.eq.1')
46
- expect(get(qb().not('id', 'in', [1, 2]), 'id')).toBe('not.in.(1,2)')
47
- expect(get(qb().filter('x', 'gte', 5), 'x')).toBe('gte.5')
48
- })
49
- it('like/ilike all/any', () => {
50
- expect(get(qb().likeAllOf('n', ['a%', 'b%']), 'n')).toBe('like(all).{a%,b%}')
51
- expect(get(qb().likeAnyOf('n', ['a%']), 'n')).toBe('like(any).{a%}')
52
- expect(get(qb().ilikeAllOf('n', ['a%']), 'n')).toBe('ilike(all).{a%}')
53
- expect(get(qb().ilikeAnyOf('n', ['a%']), 'n')).toBe('ilike(any).{a%}')
54
- })
55
- it('match → multi eq', () => {
56
- const b = qb().match({ a: 1, b: 'x' })
57
- const p = new URLSearchParams(b.buildQueryString())
58
- expect(p.get('a')).toBe('eq.1')
59
- expect(p.get('b')).toBe('eq.x')
60
- })
61
- })
62
-
63
- describe('QueryBuilder — correctifs post-audit', () => {
64
- it('D5 : valeurs à caractères réservés quotées (in / contains / like-any)', () => {
65
- expect(get(qb().in('city', ['Paris', 'Aix, FR']), 'city')).toBe('in.(Paris,"Aix, FR")')
66
- expect(get(qb().notIn('city', ['A(x)']), 'city')).toBe('not.in.("A(x)")')
67
- expect(get(qb().contains('tags', ['a,b', 'c']), 'tags')).toBe('cs.{"a,b",c}')
68
- expect(get(qb().likeAnyOf('n', ['a,b']), 'n')).toBe('like(any).{"a,b"}')
69
- // guillemets internes doublés
70
- expect(get(qb().in('q', ['a"b']), 'q')).toBe('in.("a""b")')
71
- })
72
- it('D6 : is(not.null) → not.is.null (et pas neq.null)', () => {
73
- expect(get(qb().is('deleted_at', 'not.null'), 'deleted_at')).toBe('not.is.null')
74
- })
75
- it('D1 : single()/maybeSingle() ne posent PLUS limit (Accept object+json — corrige la mutation filtrée)', () => {
76
- // Le `limit=2` cassait `.eq().update().select().single()` (PostgREST rejette `limit`
77
- // sans `order` sur une mutation). La cardinalité passe désormais par l'en-tête Accept.
78
- expect(get(qb().single(), 'limit')).toBeNull()
79
- expect(get(qb().maybeSingle(), 'limit')).toBeNull()
80
- })
81
- })
@@ -1,132 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // E2E réel (stack live) — LOT A : mutations filtrées (parité PostgREST).
3
- //
4
- // Gaté par RUN_E2E + credentials (AURA_E2E_URL / AURA_E2E_PROJECT / AURA_E2E_KEY,
5
- // clé service_role requise pour le SQL brut). Skip PROPRE sinon (describe.runIf).
6
- //
7
- // Le package `@aurabase/db` ne dépend que de `@aurabase/core` (pas de
8
- // `createClient` — ce serait circulaire), donc on monte un `DatabaseService`
9
- // directement au-dessus d'un `AuraClientLike` minimal pointant sur le backend
10
- // live (auth data-plane via apikey service_role).
11
- //
12
- // Flux : crée une table de test (SQL brut NON qualifié — le schéma tenant est
13
- // `project_<pid>`, pas `public`), GRANT + reload PostgREST, insère 2 lignes,
14
- // puis vérifie :
15
- // 1. `.eq(col,v).update({...}).select().single()` → renvoie la ligne modifiée projetée ;
16
- // 2. `.eq(col,v).delete().select()` → renvoie la ligne supprimée ;
17
- // 3. `update({...})` sans filtre → `unfiltered_mutation` (ZÉRO appel réseau).
18
- // Nettoyage (drop table) en `finally`.
19
- //
20
- // Le run réel n'est PAS lancé ici (pas de creds) — le contrôleur le fera ; ce
21
- // fichier doit seulement compiler et skip proprement.
22
- // ---------------------------------------------------------------------------
23
-
24
- import { describe, it, expect } from 'vitest'
25
- import { BaseAuthStore } from '@aurabase/core'
26
- import type { AuraClientLike, AuraResponse } from '@aurabase/core'
27
- import { DatabaseService } from '../src/DatabaseService'
28
-
29
- const URL = process.env.AURA_E2E_URL
30
- const PROJECT = process.env.AURA_E2E_PROJECT
31
- const KEY = process.env.AURA_E2E_KEY
32
- const RUN = Boolean(process.env.RUN_E2E && URL && PROJECT && KEY)
33
-
34
- /** Monte un `DatabaseService` réel au-dessus d'un `AuraClientLike` minimal. */
35
- function makeDb(): DatabaseService {
36
- const client: AuraClientLike = {
37
- baseUrl: URL!,
38
- projectId: PROJECT!,
39
- apiKey: KEY!,
40
- fetchFn: globalThis.fetch,
41
- authStore: new BaseAuthStore(),
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
44
- }
45
- return new DatabaseService(client)
46
- }
47
-
48
- /**
49
- * Rejoue tant que la réponse est transitoire, borné. Inclut **404** : une table
50
- * fraîchement créée en SQL brut n'est visible par PostgREST qu'après propagation du
51
- * `reload schema` (fenêtre pendant laquelle il renvoie 404 « not found »), en plus des
52
- * 503 (reload/indispo). Aligné sur le smoke db E2E (commit 7dc9f72d).
53
- */
54
- async function retry503<T>(fn: () => Promise<AuraResponse<T>>): Promise<AuraResponse<T>> {
55
- const transient = (s?: number): boolean => s === 404 || s === 503
56
- let res = await fn()
57
- for (let i = 0; i < 25 && transient(res.error?.status); i++) {
58
- await new Promise((r) => setTimeout(r, 1000))
59
- res = await fn()
60
- }
61
- return res
62
- }
63
-
64
- describe.runIf(RUN)('mutations filtrées E2E — .eq().update()/.delete() + garde-fou', () => {
65
- it(
66
- 'update/delete filtrés renvoient la ligne projetée ; mutation sans filtre refusée',
67
- async () => {
68
- const db = makeDb()
69
- const suffix = process.env.AURA_E2E_SUFFIX ?? 'mut'
70
- const table = `e2e_mut_${suffix}`
71
-
72
- // Création via SQL brut (service_role requis). Noms NON qualifiés → schéma tenant.
73
- await db.sql(`DROP TABLE IF EXISTS ${table}`)
74
- await db.sql(
75
- `CREATE TABLE ${table} (id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL, n int NOT NULL DEFAULT 0)`,
76
- )
77
- // GRANTs larges + reload du cache PostgREST (débloque la couche CRUD sur la table jetable).
78
- await db.sql(`GRANT ALL ON ${table} TO PUBLIC`)
79
- await db.sql(`SELECT pg_notify('pgrst', 'reload schema')`)
80
-
81
- try {
82
- // -- Seed : 2 lignes --------------------------------------------------
83
- // TESTS-1.1 : PLUS de graceful-skip silencieux. `retry503` absorbe les 503/404
84
- // TRANSITOIRES ; un 503 PERSISTANT après retries doit FAIRE ÉCHOUER le test.
85
- const seeded = await retry503(() =>
86
- db.from(table).insert([
87
- { name: 'alpha', n: 1 },
88
- { name: 'beta', n: 2 },
89
- ]),
90
- )
91
- expect(seeded.error).toBeNull()
92
-
93
- // -- 1. UPDATE filtré + select() → ligne modifiée projetée ------------
94
- // NB : pas de `.single()` sur une mutation — le mécanisme `single()` d'Aurabase
95
- // ajoute `limit=2`, que PostgREST rejette sur une mutation sans `order`
96
- // (limite pré-existante du single() limit-based ; postgrest-js utilise
97
- // l'en-tête Accept object+json). LOT A = la mutation filtrée + projection.
98
- const updated = await retry503(() =>
99
- db.from(table).eq('name', 'alpha').update({ n: 99 }).select('name,n'),
100
- )
101
- expect(updated.error).toBeNull()
102
- const updatedRows = updated.data as Array<{ name: string; n: number }> | null
103
- expect(Array.isArray(updatedRows)).toBe(true)
104
- expect(updatedRows!).toContainEqual({ name: 'alpha', n: 99 })
105
-
106
- // -- 2. DELETE filtré + select() → ligne supprimée --------------------
107
- const deleted = await retry503(() =>
108
- db.from(table).eq('name', 'beta').delete().select('name,n'),
109
- )
110
- expect(deleted.error).toBeNull()
111
- const deletedRows = deleted.data as Array<{ name: string; n: number }> | null
112
- expect(Array.isArray(deletedRows)).toBe(true)
113
- expect(deletedRows!.some((r) => r.name === 'beta')).toBe(true)
114
-
115
- // -- 3. GARDE-FOU : update sans filtre → refusé sans appel réseau -----
116
- const wipe = await db.from(table).update({ n: 0 })
117
- expect(wipe.data).toBeNull()
118
- expect(wipe.error?.code).toBe('unfiltered_mutation')
119
-
120
- // La table doit être intacte (alpha toujours là, n=99) malgré le garde-fou.
121
- const still = await retry503(() =>
122
- db.from(table).eq('name', 'alpha').select('name,n').single(),
123
- )
124
- expect(still.error).toBeNull()
125
- expect(still.data).toMatchObject({ name: 'alpha', n: 99 })
126
- } finally {
127
- await db.sql(`DROP TABLE IF EXISTS ${table}`)
128
- }
129
- },
130
- 120_000,
131
- )
132
- })
@@ -1,188 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { QueryBuilder } from '../src/QueryBuilder'
3
- import { BaseAuthStore } from '@aurabase/core'
4
- import type { AuraClientLike } from '@aurabase/core'
5
-
6
- interface RecordedCall {
7
- url: string
8
- method: string
9
- headers: Record<string, string>
10
- body: unknown
11
- }
12
-
13
- /**
14
- * Client factice qui enregistre chaque appel (url/méthode/headers/body) et
15
- * renvoie une réponse JSON contrôlée. Sert à asserter l'URL exacte (route
16
- * Table vs id-based), le verbe HTTP et l'en-tête `Prefer` posés par les
17
- * mutations, SANS appel réseau.
18
- */
19
- function client(rows: unknown = []): { c: AuraClientLike; calls: RecordedCall[] } {
20
- const calls: RecordedCall[] = []
21
- const fetchFn = (async (url: string, init: RequestInit) => {
22
- calls.push({
23
- url,
24
- method: (init.method ?? 'GET').toUpperCase(),
25
- headers: (init.headers ?? {}) as Record<string, string>,
26
- body: init.body,
27
- })
28
- return new Response(JSON.stringify(rows), {
29
- status: 200,
30
- headers: { 'Content-Type': 'application/json' },
31
- })
32
- }) as unknown as typeof globalThis.fetch
33
- const c: AuraClientLike = {
34
- baseUrl: 'http://x',
35
- projectId: 'p',
36
- apiKey: 'k',
37
- fetchFn,
38
- authStore: new BaseAuthStore(),
39
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
41
- }
42
- return { c, calls }
43
- }
44
-
45
- const qb = (rows?: unknown) => {
46
- const { c, calls } = client(rows)
47
- return { b: new QueryBuilder(c, '/base'), calls }
48
- }
49
-
50
- describe('QueryBuilder — mutations filtrées (parité PostgREST)', () => {
51
- it('.eq().update() émet PATCH sur la route Table avec filtre (pas /id)', async () => {
52
- const { b, calls } = qb([{ id: 'x', n: 1 }])
53
- await b.eq('id', 'x').update({ n: 1 })
54
- expect(calls).toHaveLength(1)
55
- expect(calls[0]!.method).toBe('PATCH')
56
- expect(calls[0]!.url).toBe('http://x/base?id=eq.x')
57
- })
58
-
59
- it('.eq().delete() émet DELETE sur la route Table avec filtre', async () => {
60
- const { b, calls } = qb([])
61
- await b.eq('id', 'x').delete()
62
- expect(calls).toHaveLength(1)
63
- expect(calls[0]!.method).toBe('DELETE')
64
- expect(calls[0]!.url).toBe('http://x/base?id=eq.x')
65
- })
66
-
67
- it('compat : update(id, body) conserve la route id-based /base/{id}', async () => {
68
- const { b, calls } = qb([{ id: 'x' }])
69
- await b.update('x', { n: 2 })
70
- expect(calls[0]!.method).toBe('PATCH')
71
- expect(calls[0]!.url).toBe('http://x/base/x')
72
- })
73
-
74
- it('compat : delete(id) conserve la route id-based /base/{id}', async () => {
75
- const { b, calls } = qb([])
76
- await b.delete('x')
77
- expect(calls[0]!.method).toBe('DELETE')
78
- expect(calls[0]!.url).toBe('http://x/base/x')
79
- })
80
-
81
- it('.eq().update().select() ajoute select= + Prefer: return=representation', async () => {
82
- const { b, calls } = qb([{ id: 'x', n: 1 }])
83
- await b.eq('id', 'x').update({ n: 1 }).select('id,n')
84
- const u = new URL(calls[0]!.url)
85
- expect(u.searchParams.get('id')).toBe('eq.x')
86
- expect(u.searchParams.get('select')).toBe('id,n')
87
- expect(calls[0]!.headers['Prefer']).toContain('return=representation')
88
- })
89
-
90
- it('.eq().delete().select() pose Prefer: return=representation (indispensable DELETE)', async () => {
91
- const { b, calls } = qb([{ id: 'x' }])
92
- await b.eq('id', 'x').delete().select('*')
93
- expect(calls[0]!.headers['Prefer']).toContain('return=representation')
94
- })
95
-
96
- it('insert().select() envoie select= + Prefer: return=representation', async () => {
97
- const { b, calls } = qb([{ id: 'x' }])
98
- await b.insert({ n: 1 }).select('id')
99
- expect(calls[0]!.method).toBe('POST')
100
- const u = new URL(calls[0]!.url)
101
- expect(u.searchParams.get('select')).toBe('id')
102
- expect(calls[0]!.headers['Prefer']).toContain('return=representation')
103
- })
104
-
105
- it('insert() sans select : aucun Prefer, route Table nue', async () => {
106
- const { b, calls } = qb([{ id: 'x' }])
107
- await b.insert({ n: 1 })
108
- expect(calls[0]!.url).toBe('http://x/base')
109
- expect(calls[0]!.headers['Prefer']).toBeUndefined()
110
- })
111
-
112
- it('count sur mutation → Prefer: count=<mode>', async () => {
113
- const { b, calls } = qb([{ id: 'x' }])
114
- await b.eq('id', 'x').update({ n: 1 }).count('exact')
115
- expect(calls[0]!.headers['Prefer']).toContain('count=exact')
116
- })
117
-
118
- it('upsert conserve on_conflict et accepte des filtres/select', async () => {
119
- const { b, calls } = qb([{ id: 'x' }])
120
- await b.upsert({ id: 'x', n: 1 }, { onConflict: 'id' }).select('id')
121
- const u = new URL(calls[0]!.url)
122
- expect(calls[0]!.method).toBe('POST')
123
- expect(u.searchParams.get('on_conflict')).toBe('id')
124
- expect(u.searchParams.get('select')).toBe('id')
125
- expect(calls[0]!.headers['Prefer']).toContain('return=representation')
126
- })
127
-
128
- it('GARDE-FOU : update() sans filtre → unfiltered_mutation, ZÉRO appel réseau', async () => {
129
- const { b, calls } = qb()
130
- const { data, error } = await b.update({ n: 1 })
131
- expect(calls).toHaveLength(0)
132
- expect(data).toBeNull()
133
- expect(error?.code).toBe('unfiltered_mutation')
134
- })
135
-
136
- it('GARDE-FOU : delete() sans filtre → unfiltered_mutation, ZÉRO appel réseau', async () => {
137
- const { b, calls } = qb()
138
- const { error } = await b.delete()
139
- expect(calls).toHaveLength(0)
140
- expect(error?.code).toBe('unfiltered_mutation')
141
- })
142
-
143
- it('GARDE-FOU : un orGroup suffit à autoriser la mutation', async () => {
144
- const { b, calls } = qb([{ id: 'x' }])
145
- await b.or([{ column: 'id', op: 'eq', value: 'x' }]).delete()
146
- expect(calls).toHaveLength(1)
147
- expect(calls[0]!.method).toBe('DELETE')
148
- })
149
-
150
- // -- DB-F2 : le garde-fou compte les filtres EFFECTIFS (anti-contournement) ---
151
-
152
- it('GARDE-FOU DB-F2 : .delete().or([]) (OrGroup vide) → refusé, ZÉRO appel réseau', async () => {
153
- const { b, calls } = qb()
154
- const { data, error } = await b.or([]).delete()
155
- expect(calls).toHaveLength(0)
156
- expect(data).toBeNull()
157
- expect(error?.code).toBe('unfiltered_mutation')
158
- })
159
-
160
- it("GARDE-FOU DB-F2 : .filter('','','') (colonne vide) → refusé, ZÉRO appel réseau", async () => {
161
- const { b, calls } = qb()
162
- const { error } = await b.filter('', '', '').update({ n: 0 })
163
- expect(calls).toHaveLength(0)
164
- expect(error?.code).toBe('unfiltered_mutation')
165
- })
166
-
167
- // -- DB-F3 : insert 1 ligne + select renvoie un tableau (parité postgrest-js) --
168
-
169
- it('DB-F3 : insert(uneLigne).select() → tableau à 1 élément (gateway déballe le 201)', async () => {
170
- // Le gateway déballe le 201 mono-ligne en objet ; le SDK re-emballe en tableau.
171
- const { b } = qb({ id: 'x', n: 1 })
172
- const { data } = await b.insert({ n: 1 }).select('*')
173
- expect(Array.isArray(data)).toBe(true)
174
- expect(data).toEqual([{ id: 'x', n: 1 }])
175
- })
176
-
177
- it('DB-F3 : insert multi-lignes.select() → tableau inchangé (pas de double emballage)', async () => {
178
- const { b } = qb([{ id: 'x' }, { id: 'y' }])
179
- const { data } = await b.insert([{ n: 1 }, { n: 2 }]).select('*')
180
- expect(data).toEqual([{ id: 'x' }, { id: 'y' }])
181
- })
182
-
183
- it('DB-F3 : upsert(uneLigne).select() → tableau à 1 élément', async () => {
184
- const { b } = qb({ id: 'x', n: 1 })
185
- const { data } = await b.upsert({ id: 'x', n: 1 }).select('*')
186
- expect(data).toEqual([{ id: 'x', n: 1 }])
187
- })
188
- })
@@ -1,45 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { QueryBuilder } from '../src/QueryBuilder'
3
- import { BaseAuthStore } from '@aurabase/core'
4
- import type { AuraClientLike } from '@aurabase/core'
5
-
6
- function client(): AuraClientLike {
7
- return {
8
- baseUrl: 'http://x', projectId: 'p', apiKey: 'k',
9
- fetchFn: (async () => new Response('[]')) as unknown as typeof globalThis.fetch,
10
- authStore: new BaseAuthStore(),
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
13
- }
14
- }
15
- const qb = () => new QueryBuilder(client(), '/base')
16
- const get = (b: QueryBuilder, key: string) => new URLSearchParams(b.buildQueryString()).get(key)
17
-
18
- /**
19
- * Verrouille le contrat de tri contre le backend `aura-db` : le handler CRUD
20
- * (services/aura-db/src/handlers/crud.rs:79-97) lit `sort_by` + `sort_order`
21
- * (et `order` en multi-colonnes, prioritaire). Le SDK émet `sort_by`/`sort_order`
22
- * — ce test garantit qu'on ne dérive pas vers `order=col.dir` par mégarde, ce qui
23
- * casserait silencieusement le tri single-colonne.
24
- */
25
- describe('QueryBuilder — tri (contrat aura-db sort_by / sort_order)', () => {
26
- it('order(col) émet sort_by=col + sort_order=asc par défaut', () => {
27
- const b = qb().order('created_at')
28
- expect(get(b, 'sort_by')).toBe('created_at')
29
- expect(get(b, 'sort_order')).toBe('asc')
30
- // Ne doit PAS émettre la syntaxe PostgREST `order=` (non lue en single-col).
31
- expect(get(b, 'order')).toBeNull()
32
- })
33
-
34
- it('order(col, "desc") émet sort_order=desc', () => {
35
- const b = qb().order('created_at', 'desc')
36
- expect(get(b, 'sort_by')).toBe('created_at')
37
- expect(get(b, 'sort_order')).toBe('desc')
38
- })
39
-
40
- it('sans order() : aucun paramètre de tri', () => {
41
- const b = qb()
42
- expect(get(b, 'sort_by')).toBeNull()
43
- expect(get(b, 'sort_order')).toBeNull()
44
- })
45
- })
@@ -1,41 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { DatabaseService } from '../src/DatabaseService'
3
-
4
- function mkClient(capture: (url: string, init: any) => void) {
5
- return {
6
- baseUrl: 'http://x', projectId: 'p', apiKey: 'k',
7
- fetchFn: async (url: string, init: any) => {
8
- capture(url, init)
9
- return new Response(JSON.stringify({ data: [{ id: 1 }], meta: {} }), { status: 200, headers: { 'content-type': 'application/json' } })
10
- },
11
- authStore: { token: null, refreshToken: null, save() {}, clear() {}, onChange() { return () => {} }, removalEpoch: 0, getItem() { return null }, setItem() {}, removeItem() {}, persistent: false },
12
- auth: { refreshSession: async () => ({ data: null, error: null }) },
13
- } as any
14
- }
15
-
16
- describe('rpc runtime', () => {
17
- it('POST /rpc/{fn} avec args en body + filtre en query', async () => {
18
- let url = '', init: any = null
19
- const db = new DatabaseService(mkClient((u, i) => { url = u; init = i }))
20
- await db.rpc('add', { a: 1, b: 2 }).eq('id', 1)
21
- expect(url).toContain('/v1/db/p/rpc/add')
22
- expect(url).toContain('id=eq.1')
23
- expect(init.method).toBe('POST')
24
- expect(JSON.parse(init.body)).toEqual({ a: 1, b: 2 })
25
- })
26
-
27
- it('get:true → GET, pas de body', async () => {
28
- let init: any = null
29
- const db = new DatabaseService(mkClient((_u, i) => { init = i }))
30
- await db.rpc('now', undefined, { get: true })
31
- expect(init.method).toBe('GET')
32
- expect(init.body).toBeUndefined()
33
- })
34
-
35
- it('count → query param count=exact', async () => {
36
- let url = ''
37
- const db = new DatabaseService(mkClient((u) => { url = u }))
38
- await db.rpc('list_things', {}, { count: 'exact' })
39
- expect(url).toContain('count=exact')
40
- })
41
- })
@@ -1,94 +0,0 @@
1
- // LOT 6 (B5 — TS2589 non testé à l'échelle) : fabrique un schéma `SchemaTable[]`
2
- // synthétique mais réaliste, destiné à stresser l'inférence type-level du query
3
- // builder (`@aurabase/db`) au même ordre de grandeur qu'une base de production
4
- // (≥50 tables, colonnes larges sur certaines tables, FK croisées).
5
- //
6
- // Utilisé par `scale-compile.test.ts` : ce fichier ne produit que la matière
7
- // première (SchemaTable[]) — la génération du `Database` TS passe par le vrai
8
- // générateur `@aurabase/gen` (`generateDatabaseTypes`), pas une réimplémentation.
9
- import type { SchemaColumn, SchemaTable } from '@aurabase/core'
10
-
11
- const COLUMN_TYPE_POOL = ['text', 'int', 'bool', 'jsonb', 'numeric', 'timestamp'] as const
12
-
13
- function col(
14
- name: string,
15
- col_type: string,
16
- opts: Partial<Omit<SchemaColumn, 'name' | 'col_type'>> = {},
17
- ): SchemaColumn {
18
- return { name, col_type, nullable: false, unique: false, default_val: null, references: null, ...opts }
19
- }
20
-
21
- function fk(name: string, table: string, opts: Partial<Omit<SchemaColumn, 'name' | 'col_type'>> = {}): SchemaColumn {
22
- return col(name, 'uuid', { references: { table, column: 'id' }, ...opts })
23
- }
24
-
25
- export interface BuildLargeSchemaOptions {
26
- /** Nombre total de tables (défaut 60, ≥50 exigé par LOT 6). */
27
- tableCount?: number
28
- /** Nombre de colonnes "larges" ajoutées sur les tables "wide" (une table sur dix). */
29
- wideTableColumnCount?: number
30
- }
31
-
32
- /**
33
- * Fabrique un schéma synthétique pour la sonde de compile à l'échelle.
34
- *
35
- * Structure :
36
- * - `t0 → t1 → t2 → t3` forment une chaîne de FK NOT NULL propre, dédiée à la
37
- * sonde d'embed imbriqué sur 4 niveaux (`from('t0').select('*, t1(*, t2(*, t3(name))))')`),
38
- * dans le sens "many-to-one" (la table courante porte la FK) — c'est le même
39
- * sens que le cas déjà testé unitairement (`posts.author_id → users.id` dans
40
- * `tests/types/fixtures.ts`), donc pas de risque d'emprunter un chemin de
41
- * résolution du parser non couvert par ailleurs.
42
- * - Une table sur dix (`t0`, `t10`, `t20`, ...) est "wide" : elle porte
43
- * `wideTableColumnCount` colonnes en plus des 3 colonnes de base, pour stresser
44
- * le cas d'un `select()` avec une longue liste de colonnes nommées (le chemin
45
- * qui, empiriquement, fait le plus grossir le nombre d'instanciations — voir
46
- * `scale-compile.test.ts`).
47
- * - À partir de `t4`, chaque table porte deux FK "croisées" vers des tables
48
- * antérieures (`t(i-1)` et `t(i-4)`) pour densifier le graphe de relations
49
- * comme un schéma métier réel, sans jamais introduire d'ambiguïté de FK
50
- * (une seule FK vers une même table donnée par table) qui ferait échouer la
51
- * compilation pour une raison hors-sujet (désambiguïsation de hint).
52
- */
53
- export function buildLargeSchemaTables(options: BuildLargeSchemaOptions = {}): SchemaTable[] {
54
- const { tableCount = 60, wideTableColumnCount = 20 } = options
55
- const tables: SchemaTable[] = []
56
-
57
- for (let i = 0; i < tableCount; i++) {
58
- const name = `t${i}`
59
- const columns: SchemaColumn[] = [
60
- col('id', 'uuid', { unique: true, default_val: 'gen_random_uuid()' }),
61
- col('name', 'text'),
62
- col('created_at', 'timestamp', { default_val: 'now()' }),
63
- ]
64
-
65
- const isWideTable = i % 10 === 0
66
- const extraCount = isWideTable ? wideTableColumnCount : 3
67
- for (let w = 0; w < extraCount; w++) {
68
- const type = COLUMN_TYPE_POOL[w % COLUMN_TYPE_POOL.length]
69
- columns.push(col(`extra_${w}_${type}`, type, { nullable: true }))
70
- }
71
-
72
- // Chaîne dédiée à la sonde d'embed profond (t0 → t1 → t2 → t3), NOT NULL.
73
- if (i === 0) columns.push(fk('t1_id', 't1', { nullable: false }))
74
- if (i === 1) columns.push(fk('t2_id', 't2', { nullable: false }))
75
- if (i === 2) columns.push(fk('t3_id', 't3', { nullable: false }))
76
-
77
- // FK croisées pour densifier le graphe au-delà de la chaîne dédiée.
78
- if (i >= 4) {
79
- columns.push(fk('ref_prev_id', `t${i - 1}`, { nullable: true }))
80
- columns.push(fk('ref_cross_id', `t${i - 4}`, { nullable: true }))
81
- }
82
-
83
- tables.push({
84
- name,
85
- columns,
86
- primary_key: 'id',
87
- indexes: [],
88
- rls_enabled: true,
89
- realtime_enabled: false,
90
- })
91
- }
92
-
93
- return tables
94
- }