@aurabase/aurabase-js 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/package.json +4 -4
  2. package/packages/ai/node_modules/.bin/esbuild +0 -19
  3. package/packages/ai/node_modules/.bin/tsc +0 -22
  4. package/packages/ai/node_modules/.bin/tsserver +0 -22
  5. package/packages/ai/node_modules/.bin/tsup +0 -22
  6. package/packages/ai/node_modules/.bin/tsup-node +0 -22
  7. package/packages/ai/node_modules/.bin/vite +0 -22
  8. package/packages/ai/node_modules/.bin/vitest +0 -22
  9. package/packages/ai/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  10. package/packages/ai/src/AiService.ts +0 -226
  11. package/packages/ai/src/index.ts +0 -18
  12. package/packages/ai/src/sse.ts +0 -141
  13. package/packages/ai/src/types.ts +0 -30
  14. package/packages/ai/tests/chat-stream.test.ts +0 -151
  15. package/packages/ai/tests/rag-namespaces.test.ts +0 -54
  16. package/packages/ai/tests/sse.test.ts +0 -69
  17. package/packages/ai/tsconfig.json +0 -5
  18. package/packages/ai/tsup.config.ts +0 -11
  19. package/packages/aurabase/node_modules/.bin/esbuild +0 -19
  20. package/packages/aurabase/node_modules/.bin/tsc +0 -22
  21. package/packages/aurabase/node_modules/.bin/tsserver +0 -22
  22. package/packages/aurabase/node_modules/.bin/tsup +0 -22
  23. package/packages/aurabase/node_modules/.bin/tsup-node +0 -22
  24. package/packages/aurabase/node_modules/.bin/vite +0 -22
  25. package/packages/aurabase/node_modules/.bin/vitest +0 -22
  26. package/packages/aurabase/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  27. package/packages/aurabase/src/AuraClient.ts +0 -237
  28. package/packages/aurabase/src/index.ts +0 -152
  29. package/packages/aurabase/src/ssr.ts +0 -156
  30. package/packages/aurabase/tests/ai-streaming-rag-e2e.test.ts +0 -82
  31. package/packages/aurabase/tests/ai.test.ts +0 -111
  32. package/packages/aurabase/tests/auth-admin.test.ts +0 -515
  33. package/packages/aurabase/tests/auth-e2e.test.ts +0 -135
  34. package/packages/aurabase/tests/auth-hardening.test.ts +0 -206
  35. package/packages/aurabase/tests/auth.test.ts +0 -947
  36. package/packages/aurabase/tests/database.test.ts +0 -230
  37. package/packages/aurabase/tests/db-types-e2e.test.ts +0 -217
  38. package/packages/aurabase/tests/dispose.test.ts +0 -23
  39. package/packages/aurabase/tests/foreign-token.e2e.test.ts +0 -129
  40. package/packages/aurabase/tests/functions.test.ts +0 -107
  41. package/packages/aurabase/tests/integration.test.ts +0 -413
  42. package/packages/aurabase/tests/live-production-validation.js +0 -241
  43. package/packages/aurabase/tests/live-sdk-production-validation.js +0 -293
  44. package/packages/aurabase/tests/mocks.ts +0 -139
  45. package/packages/aurabase/tests/notifications.test.ts +0 -314
  46. package/packages/aurabase/tests/observability-backup.test.ts +0 -186
  47. package/packages/aurabase/tests/observability-hook.test.ts +0 -130
  48. package/packages/aurabase/tests/production-robustness.test.ts +0 -268
  49. package/packages/aurabase/tests/public-api-surface.test.ts +0 -53
  50. package/packages/aurabase/tests/query-builder.test.ts +0 -329
  51. package/packages/aurabase/tests/readme-smoke-e2e.test.ts +0 -231
  52. package/packages/aurabase/tests/realtime-filter-e2e.test.ts +0 -344
  53. package/packages/aurabase/tests/refresh-locks.test.ts +0 -210
  54. package/packages/aurabase/tests/retry-option.test.ts +0 -17
  55. package/packages/aurabase/tests/rpc-e2e.test.ts +0 -254
  56. package/packages/aurabase/tests/rs256-local-e2e.test.ts +0 -114
  57. package/packages/aurabase/tests/rt-alias-public-e2e.test.ts +0 -235
  58. package/packages/aurabase/tests/rt-http-broadcast-e2e.test.ts +0 -124
  59. package/packages/aurabase/tests/service-role-guard.test.ts +0 -99
  60. package/packages/aurabase/tests/ssr.test.ts +0 -91
  61. package/packages/aurabase/tests/storage-backend-e2e.test.ts +0 -481
  62. package/packages/aurabase/tests/storage-sdk-parity-e2e.test.ts +0 -104
  63. package/packages/aurabase/tests/storage-transform-e2e.test.ts +0 -684
  64. package/packages/aurabase/tests/storage.test.ts +0 -55
  65. package/packages/aurabase/tests/types/client-generic.test-d.ts +0 -79
  66. package/packages/aurabase/tests/types/docs-snippets.test-d.ts +0 -571
  67. package/packages/aurabase/tests/types/error-code.test-d.ts +0 -53
  68. package/packages/aurabase/tsconfig.json +0 -5
  69. package/packages/aurabase/tsconfig.test-d.json +0 -5
  70. package/packages/aurabase/tsup.config.ts +0 -11
  71. package/packages/aurabase/vitest.config.ts +0 -16
  72. package/packages/auth/node_modules/.bin/esbuild +0 -19
  73. package/packages/auth/node_modules/.bin/tsc +0 -22
  74. package/packages/auth/node_modules/.bin/tsserver +0 -22
  75. package/packages/auth/node_modules/.bin/tsup +0 -22
  76. package/packages/auth/node_modules/.bin/tsup-node +0 -22
  77. package/packages/auth/node_modules/.bin/vite +0 -22
  78. package/packages/auth/node_modules/.bin/vitest +0 -22
  79. package/packages/auth/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  80. package/packages/auth/src/AuthAdminService.ts +0 -149
  81. package/packages/auth/src/AuthService.ts +0 -1166
  82. package/packages/auth/src/SessionManager.ts +0 -92
  83. package/packages/auth/src/index.ts +0 -17
  84. package/packages/auth/src/jwks.ts +0 -337
  85. package/packages/auth/src/pkce.ts +0 -27
  86. package/packages/auth/src/types.ts +0 -89
  87. package/packages/auth/tests/auth-lifecycle.test.ts +0 -149
  88. package/packages/auth/tests/detect-session.test.ts +0 -361
  89. package/packages/auth/tests/getclaims.test.ts +0 -780
  90. package/packages/auth/tests/is-mfa-challenge.test.ts +0 -27
  91. package/packages/auth/tests/password-recovery.test.ts +0 -124
  92. package/packages/auth/tests/pkce.test.ts +0 -192
  93. package/packages/auth/tests/session-manager.test.ts +0 -103
  94. package/packages/auth/tests/set-session.test.ts +0 -139
  95. package/packages/auth/tests/verify-otp.test.ts +0 -153
  96. package/packages/auth/tsconfig.json +0 -5
  97. package/packages/auth/tsup.config.ts +0 -11
  98. package/packages/core/node_modules/.bin/esbuild +0 -22
  99. package/packages/core/node_modules/.bin/tsc +0 -22
  100. package/packages/core/node_modules/.bin/tsserver +0 -22
  101. package/packages/core/node_modules/.bin/tsup +0 -22
  102. package/packages/core/node_modules/.bin/tsup-node +0 -22
  103. package/packages/core/node_modules/.bin/vite +0 -22
  104. package/packages/core/node_modules/.bin/vitest +0 -22
  105. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  106. package/packages/core/src/AuraError.ts +0 -89
  107. package/packages/core/src/BaseService.ts +0 -44
  108. package/packages/core/src/client.ts +0 -34
  109. package/packages/core/src/cookie-utils.ts +0 -42
  110. package/packages/core/src/fetch.ts +0 -435
  111. package/packages/core/src/index.ts +0 -22
  112. package/packages/core/src/retry.ts +0 -63
  113. package/packages/core/src/serialize.ts +0 -6
  114. package/packages/core/src/stores/BaseAuthStore.ts +0 -164
  115. package/packages/core/src/stores/LocalAuthStore.ts +0 -199
  116. package/packages/core/src/types.ts +0 -1042
  117. package/packages/core/tests/auth-store.test.ts +0 -300
  118. package/packages/core/tests/error-code.test.ts +0 -61
  119. package/packages/core/tests/error.test.ts +0 -24
  120. package/packages/core/tests/fetch.test.ts +0 -286
  121. package/packages/core/tests/mocks.ts +0 -139
  122. package/packages/core/tests/observability.test.ts +0 -86
  123. package/packages/core/tests/refresh-hardening.test.ts +0 -164
  124. package/packages/core/tests/refresh-observability.test.ts +0 -111
  125. package/packages/core/tests/retry.test.ts +0 -106
  126. package/packages/core/tests/serialize.test.ts +0 -12
  127. package/packages/core/tests/timeout.test.ts +0 -79
  128. package/packages/core/tsconfig.json +0 -5
  129. package/packages/core/tsup.config.ts +0 -11
  130. package/packages/db/node_modules/.bin/esbuild +0 -19
  131. package/packages/db/node_modules/.bin/tsc +0 -22
  132. package/packages/db/node_modules/.bin/tsserver +0 -22
  133. package/packages/db/node_modules/.bin/tsup +0 -22
  134. package/packages/db/node_modules/.bin/tsup-node +0 -22
  135. package/packages/db/node_modules/.bin/vite +0 -22
  136. package/packages/db/node_modules/.bin/vitest +0 -22
  137. package/packages/db/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  138. package/packages/db/src/DatabaseService.ts +0 -170
  139. package/packages/db/src/QueryBuilder.ts +0 -830
  140. package/packages/db/src/index.ts +0 -2
  141. package/packages/db/src/pgrst-types/common/common.ts +0 -86
  142. package/packages/db/src/pgrst-types/common/rpc.ts +0 -151
  143. package/packages/db/src/pgrst-types/feature-flags.ts +0 -20
  144. package/packages/db/src/pgrst-types/types.ts +0 -134
  145. package/packages/db/src/select-query-parser/parser.ts +0 -479
  146. package/packages/db/src/select-query-parser/result.ts +0 -553
  147. package/packages/db/src/select-query-parser/types.ts +0 -132
  148. package/packages/db/src/select-query-parser/utils.ts +0 -707
  149. package/packages/db/tests/filters.test.ts +0 -81
  150. package/packages/db/tests/mutations-filtered.e2e.test.ts +0 -132
  151. package/packages/db/tests/mutations-filtered.test.ts +0 -188
  152. package/packages/db/tests/order.test.ts +0 -45
  153. package/packages/db/tests/rpc.test.ts +0 -41
  154. package/packages/db/tests/scale/build-large-schema.ts +0 -94
  155. package/packages/db/tests/scale/scale-compile.test.ts +0 -167
  156. package/packages/db/tests/schema.test.ts +0 -77
  157. package/packages/db/tests/single-accept.e2e.test.ts +0 -123
  158. package/packages/db/tests/single.test.ts +0 -211
  159. package/packages/db/tests/types/filters.test-d.ts +0 -52
  160. package/packages/db/tests/types/fixtures.ts +0 -40
  161. package/packages/db/tests/types/from-views.test-d.ts +0 -18
  162. package/packages/db/tests/types/mutations.test-d.ts +0 -23
  163. package/packages/db/tests/types/rpc.test-d.ts +0 -60
  164. package/packages/db/tests/types/schema-shape.test-d.ts +0 -8
  165. package/packages/db/tests/types/select-inference.test-d.ts +0 -38
  166. package/packages/db/tests/vendored/fixtures.ts +0 -83
  167. package/packages/db/tests/vendored/get-result.test-d.ts +0 -75
  168. package/packages/db/tsconfig.json +0 -5
  169. package/packages/db/tsconfig.test-d.json +0 -5
  170. package/packages/db/tsup.config.ts +0 -11
  171. package/packages/db/vitest.config.ts +0 -8
  172. package/packages/functions/node_modules/.bin/esbuild +0 -19
  173. package/packages/functions/node_modules/.bin/tsc +0 -22
  174. package/packages/functions/node_modules/.bin/tsserver +0 -22
  175. package/packages/functions/node_modules/.bin/tsup +0 -22
  176. package/packages/functions/node_modules/.bin/tsup-node +0 -22
  177. package/packages/functions/node_modules/.bin/vite +0 -22
  178. package/packages/functions/node_modules/.bin/vitest +0 -22
  179. package/packages/functions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  180. package/packages/functions/src/FunctionsService.ts +0 -188
  181. package/packages/functions/src/errors.ts +0 -70
  182. package/packages/functions/src/index.ts +0 -6
  183. package/packages/functions/tests/invoke.test.ts +0 -97
  184. package/packages/functions/tests/response-type-errors.test.ts +0 -135
  185. package/packages/functions/tsconfig.json +0 -5
  186. package/packages/functions/tsup.config.ts +0 -11
  187. package/packages/gen/node_modules/.bin/esbuild +0 -19
  188. package/packages/gen/node_modules/.bin/tsc +0 -22
  189. package/packages/gen/node_modules/.bin/tsserver +0 -22
  190. package/packages/gen/node_modules/.bin/tsup +0 -22
  191. package/packages/gen/node_modules/.bin/tsup-node +0 -22
  192. package/packages/gen/node_modules/.bin/vite +0 -22
  193. package/packages/gen/node_modules/.bin/vitest +0 -22
  194. package/packages/gen/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  195. package/packages/gen/src/cli.ts +0 -67
  196. package/packages/gen/src/generate.ts +0 -0
  197. package/packages/gen/src/index.ts +0 -2
  198. package/packages/gen/tests/compile.test.ts +0 -213
  199. package/packages/gen/tests/e2e.test.ts +0 -130
  200. package/packages/gen/tests/generate.test.ts +0 -396
  201. package/packages/gen/tsconfig.json +0 -5
  202. package/packages/gen/tsup.config.ts +0 -11
  203. package/packages/notifications/node_modules/.bin/esbuild +0 -19
  204. package/packages/notifications/node_modules/.bin/tsc +0 -22
  205. package/packages/notifications/node_modules/.bin/tsserver +0 -22
  206. package/packages/notifications/node_modules/.bin/tsup +0 -22
  207. package/packages/notifications/node_modules/.bin/tsup-node +0 -22
  208. package/packages/notifications/node_modules/.bin/vite +0 -22
  209. package/packages/notifications/node_modules/.bin/vitest +0 -22
  210. package/packages/notifications/src/NotificationsService.ts +0 -230
  211. package/packages/notifications/src/index.ts +0 -19
  212. package/packages/notifications/tsconfig.json +0 -5
  213. package/packages/notifications/tsup.config.ts +0 -11
  214. package/packages/realtime/node_modules/.bin/esbuild +0 -19
  215. package/packages/realtime/node_modules/.bin/tsc +0 -22
  216. package/packages/realtime/node_modules/.bin/tsserver +0 -22
  217. package/packages/realtime/node_modules/.bin/tsup +0 -22
  218. package/packages/realtime/node_modules/.bin/tsup-node +0 -22
  219. package/packages/realtime/node_modules/.bin/vite +0 -22
  220. package/packages/realtime/node_modules/.bin/vitest +0 -22
  221. package/packages/realtime/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  222. package/packages/realtime/src/AuraChannel.ts +0 -485
  223. package/packages/realtime/src/HeartbeatManager.ts +0 -73
  224. package/packages/realtime/src/RealtimeService.ts +0 -505
  225. package/packages/realtime/src/columnFilter.ts +0 -301
  226. package/packages/realtime/src/index.ts +0 -4
  227. package/packages/realtime/tests/ack-routing.test.ts +0 -81
  228. package/packages/realtime/tests/column-filter.test.ts +0 -144
  229. package/packages/realtime/tests/dispatch.test.ts +0 -191
  230. package/packages/realtime/tests/heartbeat.test.ts +0 -67
  231. package/packages/realtime/tests/http-broadcast.test.ts +0 -68
  232. package/packages/realtime/tests/realtime-token.test.ts +0 -43
  233. package/packages/realtime/tests/reconnect-race.test.ts +0 -149
  234. package/packages/realtime/tests/ref-id.test.ts +0 -34
  235. package/packages/realtime/tests/set-auth.test.ts +0 -70
  236. package/packages/realtime/tsconfig.json +0 -5
  237. package/packages/realtime/tsup.config.ts +0 -11
  238. package/packages/storage/node_modules/.bin/esbuild +0 -19
  239. package/packages/storage/node_modules/.bin/tsc +0 -22
  240. package/packages/storage/node_modules/.bin/tsserver +0 -22
  241. package/packages/storage/node_modules/.bin/tsup +0 -22
  242. package/packages/storage/node_modules/.bin/tsup-node +0 -22
  243. package/packages/storage/node_modules/.bin/vite +0 -22
  244. package/packages/storage/node_modules/.bin/vitest +0 -22
  245. package/packages/storage/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  246. package/packages/storage/src/DownloadBuilder.ts +0 -60
  247. package/packages/storage/src/StorageService.ts +0 -323
  248. package/packages/storage/src/index.ts +0 -2
  249. package/packages/storage/src/path.ts +0 -35
  250. package/packages/storage/src/transform.ts +0 -15
  251. package/packages/storage/tests/download.test.ts +0 -64
  252. package/packages/storage/tests/parity.test.ts +0 -154
  253. package/packages/storage/tests/path.test.ts +0 -87
  254. package/packages/storage/tests/transform.test.ts +0 -79
  255. package/packages/storage/tsconfig.json +0 -5
  256. package/packages/storage/tsup.config.ts +0 -11
  257. package/pnpm-workspace.yaml +0 -24
  258. package/tsconfig.base.json +0 -15
@@ -1,107 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest'
2
- import { AuraClient } from '../src/AuraClient'
3
- import { FetchMock, fakeTokenPair } from './mocks'
4
-
5
- const BASE = 'http://localhost:8080'
6
- const PROJECT = '00000000-0000-0000-0000-000000000001'
7
- const PREFIX = `${BASE}/v1/functions/${PROJECT}`
8
-
9
- let fetchMock: FetchMock
10
- let client: AuraClient
11
-
12
- beforeEach(() => {
13
- fetchMock = new FetchMock()
14
- fetchMock.init()
15
- client = new AuraClient(BASE, PROJECT, 'aura_anon_test', {
16
- auth: { persistSession: false },
17
- })
18
- const tp = fakeTokenPair()
19
- client.authStore.save(tp.access_token, tp.refresh_token, tp.user)
20
- })
21
-
22
- afterEach(() => {
23
- fetchMock.restore()
24
- fetchMock.clearMocks()
25
- })
26
-
27
- describe('FunctionsService route contract', () => {
28
- it('lists and gets functions through backend routes', async () => {
29
- fetchMock.on({ method: 'GET', url: PREFIX, replyCode: 200, replyBody: { data: [] } })
30
- fetchMock.on({
31
- method: 'GET',
32
- url: `${PREFIX}/hello`,
33
- replyCode: 200,
34
- replyBody: { data: { id: 'fn-1', name: 'hello' } },
35
- })
36
-
37
- await client.functions.list()
38
- await client.functions.get('hello')
39
-
40
- expect(fetchMock.calls[0].url).toBe(PREFIX)
41
- expect(fetchMock.calls[1].url).toBe(`${PREFIX}/hello`)
42
- })
43
-
44
- it('invokes a function at /{name}/invoke and wraps the request body', async () => {
45
- fetchMock.on({
46
- method: 'POST',
47
- url: `${PREFIX}/hello/invoke`,
48
- replyCode: 200,
49
- replyBody: { data: { status: 200 } },
50
- })
51
-
52
- await client.functions.invoke('hello', {
53
- body: { name: 'Ada' },
54
- method: 'POST',
55
- path: '/welcome',
56
- headers: { 'x-test': '1' },
57
- })
58
-
59
- expect(fetchMock.calls[0].url).toBe(`${PREFIX}/hello/invoke`)
60
- expect(fetchMock.calls[0].body).toEqual({
61
- method: 'POST',
62
- path: '/welcome',
63
- headers: { 'x-test': '1' },
64
- body: { name: 'Ada' },
65
- })
66
- })
67
-
68
- it('uses status and limit query params for jobs', async () => {
69
- fetchMock.on({
70
- method: 'GET',
71
- url: `${PREFIX}/jobs?status=pending&limit=10`,
72
- replyCode: 200,
73
- replyBody: { data: [] },
74
- })
75
-
76
- await client.functions.listJobs({ status: 'pending', limit: 10 })
77
-
78
- expect(fetchMock.calls[0].url).toBe(`${PREFIX}/jobs?status=pending&limit=10`)
79
- })
80
-
81
- it('creates and deletes cron jobs by name', async () => {
82
- fetchMock.on({
83
- method: 'POST',
84
- url: `${PREFIX}/cron`,
85
- replyCode: 200,
86
- replyBody: { data: { name: 'nightly' } },
87
- })
88
- fetchMock.on({
89
- method: 'DELETE',
90
- url: `${PREFIX}/cron/nightly`,
91
- replyCode: 204,
92
- })
93
-
94
- await client.functions.createCronJob('nightly', '0 0 * * * *', 'hello', {
95
- payload: { ok: true },
96
- })
97
- await client.functions.deleteCronJob('nightly')
98
-
99
- expect(fetchMock.calls[0].body).toEqual({
100
- name: 'nightly',
101
- schedule: '0 0 * * * *',
102
- function_name: 'hello',
103
- payload: { ok: true },
104
- })
105
- expect(fetchMock.calls[1].url).toBe(`${PREFIX}/cron/nightly`)
106
- })
107
- })
@@ -1,413 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll } from 'vitest'
2
- import { createClient } from '../src/index'
3
-
4
- const GATEWAY_URL = 'http://localhost:8080'
5
- const MGMT_URL = 'http://localhost:8090'
6
-
7
- describe('Tests d\'intégration du SDK JS en conditions réelles (E2E)', () => {
8
- let devToken: string
9
- let projectId: string
10
- let anonKey: string
11
- let serviceKey: string
12
-
13
- // Identifiants développeur console générés dynamiquement
14
- const runId = Math.random().toString(36).substring(2, 10)
15
- const devEmail = `integration-dev-${runId}@aurabase.dev`
16
- const devPassword = 'DevPasswordE2E123!'
17
- const projectName = `integration-proj-${runId}`
18
-
19
- // Identifiants utilisateur final
20
- const endUserEmail = `enduser-${runId}@example.com`
21
- const endUserPassword = 'EndUserPassword123!'
22
- const otherUserEmail = `other-${runId}@example.com`
23
- const otherUserPassword = 'OtherPassword123!'
24
-
25
- beforeAll(async () => {
26
- // 1. Enregistrement du développeur sur la console
27
- const regRes = await fetch(`${MGMT_URL}/v1/control/accounts/register`, {
28
- method: 'POST',
29
- headers: { 'Content-Type': 'application/json' },
30
- body: JSON.stringify({ email: devEmail, password: devPassword }),
31
- })
32
- expect(regRes.status).toBe(200)
33
- const regData = await regRes.json()
34
- devToken = regData.data.access_token
35
- expect(devToken).toBeDefined()
36
-
37
- // 2. Création dynamique d'une organisation
38
- const orgRes = await fetch(`${MGMT_URL}/v1/control/orgs`, {
39
- method: 'POST',
40
- headers: {
41
- 'Authorization': `Bearer ${devToken}`,
42
- 'Content-Type': 'application/json',
43
- },
44
- body: JSON.stringify({ name: 'Integration Org', slug: `integration-org-${runId}` }),
45
- })
46
- expect(orgRes.status).toBeLessThan(300)
47
- const orgData = await orgRes.json()
48
- const orgId = orgData.id
49
- expect(orgId).toBeDefined()
50
-
51
- // 3. Création du projet temporaire via l'organisation
52
- const projRes = await fetch(`${MGMT_URL}/v1/control/orgs/${orgId}/projects`, {
53
- method: 'POST',
54
- headers: {
55
- 'Authorization': `Bearer ${devToken}`,
56
- 'Content-Type': 'application/json',
57
- },
58
- body: JSON.stringify({ name: projectName, engine: 'postgres', region: 'eu-west-1' }),
59
- })
60
- expect(projRes.status).toBe(202) // 202 ACCEPTED
61
- const projData = await projRes.json()
62
- projectId = projData.id
63
- expect(projectId).toBeDefined()
64
-
65
- // Attente active du provisioning du projet (status = active)
66
- let active = false
67
- for (let i = 0; i < 50; i++) {
68
- const statusRes = await fetch(`${MGMT_URL}/v1/control/projects/${projectId}`, {
69
- headers: { 'Authorization': `Bearer ${devToken}` },
70
- })
71
- const statusData = await statusRes.json()
72
- if (statusData && statusData.status === 'active') {
73
- active = true
74
- break
75
- }
76
- await new Promise((resolve) => setTimeout(resolve, 1500))
77
- }
78
- expect(active).toBe(true)
79
-
80
- // Récupération des clés API initiales (avec retry en cas de KEYS_PENDING / 404)
81
- let keysRes: Response | null = null
82
- for (let i = 0; i < 15; i++) {
83
- keysRes = await fetch(`${MGMT_URL}/v1/control/projects/${projectId}/initial-keys`, {
84
- headers: { 'Authorization': `Bearer ${devToken}` },
85
- })
86
- if (keysRes.status === 200) {
87
- break
88
- }
89
- await new Promise((resolve) => setTimeout(resolve, 1000))
90
- }
91
- expect(keysRes).not.toBeNull()
92
- expect(keysRes!.status).toBe(200)
93
- const keysData = await keysRes!.json()
94
- const keys = keysData.data || keysData
95
- anonKey = keys.find((k: any) => k.scope === 'anon').key
96
- serviceKey = keys.find((k: any) => k.scope === 'service_role').key
97
- expect(anonKey).toBeDefined()
98
- expect(serviceKey).toBeDefined()
99
-
100
- // 4. Création de la table 'todos' avec RLS active
101
- const tableDef = {
102
- name: 'todos',
103
- columns: [
104
- {
105
- name: 'id',
106
- col_type: 'uuid',
107
- nullable: false,
108
- unique: true,
109
- default_val: 'gen_random_uuid()',
110
- references: null
111
- },
112
- {
113
- name: 'title',
114
- col_type: 'text',
115
- nullable: false,
116
- unique: false,
117
- default_val: null,
118
- references: null
119
- },
120
- {
121
- name: 'completed',
122
- col_type: 'bool',
123
- nullable: false,
124
- unique: false,
125
- default_val: 'false',
126
- references: null
127
- },
128
- {
129
- name: 'owner_id',
130
- col_type: 'text',
131
- nullable: false,
132
- unique: false,
133
- default_val: null,
134
- references: null
135
- }
136
- ],
137
- primary_key: 'id',
138
- indexes: [],
139
- rls_enabled: true,
140
- realtime_enabled: true
141
- }
142
-
143
- const tableRes = await fetch(`${MGMT_URL}/v1/db/${projectId}/schema/tables`, {
144
- method: 'POST',
145
- headers: {
146
- 'Authorization': `Bearer ${devToken}`,
147
- 'Content-Type': 'application/json',
148
- },
149
- body: JSON.stringify(tableDef),
150
- })
151
- expect(tableRes.status).toBe(200)
152
-
153
- // 5. Création de la policy RLS (propriétaire uniquement)
154
- const policyDef = {
155
- name: 'todos_owner_policy',
156
- table: 'todos',
157
- command: 'ALL',
158
- using_expr: 'auth.uid()::text = owner_id',
159
- check_expr: 'auth.uid()::text = owner_id'
160
- }
161
-
162
- const policyRes = await fetch(`${MGMT_URL}/v1/db/${projectId}/policies`, {
163
- method: 'POST',
164
- headers: {
165
- 'Authorization': `Bearer ${devToken}`,
166
- 'Content-Type': 'application/json',
167
- },
168
- body: JSON.stringify(policyDef),
169
- })
170
- expect(policyRes.status).toBe(200)
171
-
172
- // 6. Attente de l'indexation PostgREST (statut 200 OK garanti et réponse JSON sous forme de tableau ou de enveloppe data)
173
- let ready = false
174
- for (let i = 0; i < 30; i++) {
175
- const probeRes = await fetch(`${GATEWAY_URL}/v1/db/${projectId}/todos`, {
176
- headers: { 'apikey': anonKey },
177
- })
178
- const status = probeRes.status
179
- let bodyText = ''
180
- try {
181
- bodyText = await probeRes.text()
182
- } catch (e) {}
183
- console.log(`[PROBE LOOP ${i}] HTTP STATUS:`, status, 'BODY:', bodyText)
184
-
185
- // On s'assure que la Gateway ou PostgREST répond avec un succès (soit un tableau [], soit un objet enveloppe {"data":[]})
186
- if (status === 200 && (bodyText.trim().startsWith('[') || bodyText.includes('"data":'))) {
187
- ready = true
188
- break
189
- }
190
- await new Promise((resolve) => setTimeout(resolve, 1500))
191
- }
192
- expect(ready).toBe(true)
193
-
194
- // Attendre 3 secondes supplémentaires de sécurité pour garantir la stabilisation complète du cache PostgREST
195
- await new Promise((resolve) => setTimeout(resolve, 3000))
196
- }, 50000)
197
-
198
- afterAll(async () => {
199
- // Suppression propre du projet de test
200
- if (projectId && devToken) {
201
- const delRes = await fetch(`${MGMT_URL}/v1/control/projects/${projectId}`, {
202
- method: 'DELETE',
203
- headers: { 'Authorization': `Bearer ${devToken}` },
204
- })
205
- expect(delRes.status).toBe(204) // NO CONTENT
206
- }
207
- })
208
-
209
- it('devrait inscrire et connecter un utilisateur final avec succès', async () => {
210
- const client = createClient(GATEWAY_URL, projectId, anonKey, {
211
- auth: { persistSession: false },
212
- })
213
-
214
- // Inscription utilisateur principal
215
- const signUpRes = await client.auth.signUp({
216
- email: endUserEmail,
217
- password: endUserPassword,
218
- })
219
- expect(signUpRes.error).toBeNull()
220
- expect(signUpRes.data?.user).toBeDefined()
221
- expect(signUpRes.data?.user?.email).toBe(endUserEmail)
222
-
223
- // Inscription du second utilisateur (pour tester l'isolation RLS plus tard)
224
- const signUpOtherRes = await client.auth.signUp({
225
- email: otherUserEmail,
226
- password: otherUserPassword,
227
- })
228
- expect(signUpOtherRes.error).toBeNull()
229
-
230
- // Connexion
231
- const signInRes = await client.auth.signInWithPassword({
232
- email: endUserEmail,
233
- password: endUserPassword,
234
- })
235
- expect(signInRes.error).toBeNull()
236
- expect(signInRes.data?.access_token).toBeDefined()
237
-
238
- // Récupération de l'utilisateur courant
239
- const userRes = await client.auth.getUser()
240
- expect(userRes.error).toBeNull()
241
- expect(userRes.data?.email).toBe(endUserEmail)
242
- })
243
-
244
- it('devrait exécuter des requêtes CRUD avec RLS et valider l\'isolation des données', async () => {
245
- const client = createClient(GATEWAY_URL, projectId, anonKey, {
246
- auth: { persistSession: false },
247
- })
248
-
249
- // Se connecter en tant qu'utilisateur principal
250
- await client.auth.signInWithPassword({
251
- email: endUserEmail,
252
- password: endUserPassword,
253
- })
254
-
255
- const user = (await client.auth.getUser()).data
256
- expect(user).toBeDefined()
257
- const userId = user!.id
258
-
259
- // 1. Insertion de todo
260
- const insertRes = await client.db.from('todos').insert({
261
- title: 'Tester le SDK en conditions réelles',
262
- completed: false,
263
- owner_id: userId,
264
- })
265
- if (insertRes.error) {
266
- console.log('DEBUG INSERT ERROR DETAIL:', JSON.stringify(insertRes.error, null, 2))
267
- }
268
- expect(insertRes.error).toBeNull()
269
-
270
- // 2. Sélection de todo
271
- const selectRes = await client.db.from('todos').select('*')
272
- expect(selectRes.error).toBeNull()
273
- expect(selectRes.data).toBeInstanceOf(Array)
274
- expect(selectRes.data!.length).toBe(1)
275
- expect(selectRes.data![0].title).toBe('Tester le SDK en conditions réelles')
276
-
277
- const todoId = selectRes.data![0].id
278
- expect(todoId).toBeDefined()
279
-
280
- // 3. Vérification de l'isolation RLS : l'accès anonyme (sans JWT) doit retourner 0 lignes
281
- const anonClient = createClient(GATEWAY_URL, projectId, anonKey, {
282
- auth: { persistSession: false },
283
- })
284
- const anonSelectRes = await anonClient.db.from('todos').select('*')
285
- expect(anonSelectRes.error).toBeNull()
286
- expect(anonSelectRes.data).toBeInstanceOf(Array)
287
- expect(anonSelectRes.data!.length).toBe(0)
288
-
289
- // 4. Vérification de l'isolation RLS : un autre utilisateur connecté doit obtenir 0 lignes
290
- const otherClient = createClient(GATEWAY_URL, projectId, anonKey, {
291
- auth: { persistSession: false },
292
- })
293
- await otherClient.auth.signInWithPassword({
294
- email: otherUserEmail,
295
- password: otherUserPassword,
296
- })
297
- const otherSelectRes = await otherClient.db.from('todos').select('*')
298
- expect(otherSelectRes.error).toBeNull()
299
- expect(otherSelectRes.data).toBeInstanceOf(Array)
300
- expect(otherSelectRes.data!.length).toBe(0)
301
-
302
- // 5. Mise à jour de todo (l'utilisateur principal modifie son propre todo)
303
- const updateRes = await client.db.from('todos').update(todoId, {
304
- completed: true,
305
- })
306
- expect(updateRes.error).toBeNull()
307
-
308
- const selectUpdatedRes = await client.db.from('todos').select('*')
309
- expect(selectUpdatedRes.data![0].completed).toBe(true)
310
-
311
- // 6. Suppression de todo
312
- const deleteRes = await client.db.from('todos').delete(todoId)
313
- expect(deleteRes.error).toBeNull()
314
-
315
- const selectDeletedRes = await client.db.from('todos').select('*')
316
- expect(selectDeletedRes.data!.length).toBe(0)
317
- })
318
-
319
- it('devrait exécuter des requêtes SQL brutes et rejeter les requêtes non autorisées', async () => {
320
- const client = createClient(GATEWAY_URL, projectId, anonKey, {
321
- auth: { persistSession: false },
322
- })
323
-
324
- await client.auth.signInWithPassword({
325
- email: endUserEmail,
326
- password: endUserPassword,
327
- })
328
-
329
- const user = (await client.auth.getUser()).data
330
- const userId = user!.id
331
-
332
- // Insérer un todo temporaire pour la requête SQL
333
- const sqlInsert = await client.db.from('todos').insert({
334
- title: 'SQL Todo',
335
- completed: false,
336
- owner_id: userId,
337
- })
338
- if (sqlInsert.error) {
339
- console.log('DEBUG SQL INSERT ERROR:', JSON.stringify(sqlInsert.error, null, 2))
340
- }
341
-
342
- // Requête SQL autorisée
343
- const sqlRes = await client.db.sql<any[]>('SELECT title FROM todos WHERE owner_id = $1', [userId])
344
- expect(sqlRes.error).toBeNull()
345
- expect(sqlRes.data).toBeDefined()
346
- expect(sqlRes.data!.length).toBe(1)
347
- expect(sqlRes.data![0].title).toBe('SQL Todo')
348
-
349
- // Requête SQL non autorisée vers pg_catalog (rejetée par l'AST de la gateway)
350
- const forbiddenSqlRes = await client.db.sql('SELECT * FROM pg_catalog.pg_tables')
351
- expect(forbiddenSqlRes.error).not.toBeNull()
352
- expect(forbiddenSqlRes.error?.message).toMatch(/non autorisées|interdit|rejetée|pg_catalog/)
353
- })
354
-
355
- it('devrait manipuler le service Storage (buckets et objets) avec succès', async () => {
356
- // La gestion des buckets (create/delete) exige une clé service_role côté gateway ;
357
- // ce test valide les méthodes storage du SDK de bout en bout, on utilise donc un
358
- // client service_role (la RLS storage est testée ailleurs).
359
- const client = createClient(GATEWAY_URL, projectId, serviceKey, {
360
- auth: { persistSession: false },
361
- })
362
-
363
- const bucketName = `integration-bucket-${runId}`
364
- const fileName = 'test-file.txt'
365
- const fileContent = 'Bonjour Aurabase E2E'
366
-
367
- // 1. Création de bucket
368
- const bucketCreateRes = await client.storage.createBucket(bucketName, {
369
- public: true,
370
- })
371
- expect(bucketCreateRes.error).toBeNull()
372
- expect(bucketCreateRes.data?.name).toBe(bucketName)
373
-
374
- // 2. Téléversement de fichier (upload)
375
- const blob = new Blob([fileContent], { type: 'text/plain' })
376
- const uploadRes = await client.storage.upload(bucketName, fileName, blob, {
377
- contentType: 'text/plain',
378
- })
379
- expect(uploadRes.error).toBeNull()
380
- expect(uploadRes.data?.key).toBeDefined()
381
-
382
- // `data.key` est déjà relative au bucket (contrat SDK : réutilisable directement).
383
- // Robuste : strippe un éventuel préfixe bucket si le backend en ajoutait un.
384
- const uploadedKey = uploadRes.data!.key
385
- const objectPath = uploadedKey.startsWith(`${bucketName}/`)
386
- ? uploadedKey.slice(bucketName.length + 1)
387
- : uploadedKey
388
- expect(objectPath).toBeTruthy()
389
-
390
- // 3. Récupération des métadonnées
391
- const metaRes = await client.storage.getMetadata(bucketName, objectPath)
392
- expect(metaRes.error).toBeNull()
393
- // Note : `getMetadata` renvoie la clé préfixée du bucket alors qu'`upload` renvoie la clé
394
- // nue (incohérence de format backend, à harmoniser) → on vérifie l'inclusion, pas l'égalité.
395
- expect((metaRes.data as any)?.key).toContain(uploadedKey)
396
-
397
- // 4. Téléchargement et vérification du contenu
398
- const downloadRes = await client.storage.download(bucketName, objectPath)
399
- expect(downloadRes.error).toBeNull()
400
- expect(downloadRes.data).toBeInstanceOf(Blob)
401
-
402
- const textContent = await downloadRes.data!.text()
403
- expect(textContent).toBe(fileContent)
404
-
405
- // 5. Suppression du fichier
406
- const removeRes = await client.storage.remove(bucketName, [objectPath])
407
- expect(removeRes.error).toBeNull()
408
-
409
- // 6. Suppression du bucket
410
- const bucketDeleteRes = await client.storage.deleteBucket(bucketName)
411
- expect(bucketDeleteRes.error).toBeNull()
412
- })
413
- })