@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,154 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { StorageService } from '../src/StorageService'
3
- import { BaseAuthStore } from '@aurabase/core'
4
- import type { AuraClientLike } from '@aurabase/core'
5
-
6
- interface Call {
7
- url: string
8
- method: string
9
- body: unknown
10
- }
11
-
12
- /**
13
- * Client de test capturant chaque requête (url + method + body) ; le responder
14
- * choisit la réponse en fonction de l'URL. `apiKey` présent → header apikey injecté.
15
- */
16
- function make(responder: (url: string, init: RequestInit) => Response) {
17
- const calls: Call[] = []
18
- const client: AuraClientLike = {
19
- baseUrl: 'http://x',
20
- projectId: 'p',
21
- apiKey: 'k',
22
- authStore: new BaseAuthStore(),
23
- fetchFn: (async (url: string, init: RequestInit) => {
24
- calls.push({ url: String(url), method: init.method ?? 'GET', body: init.body })
25
- return responder(String(url), init)
26
- }) as unknown as typeof globalThis.fetch,
27
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
29
- }
30
- return { storage: new StorageService(client), calls }
31
- }
32
-
33
- function json(body: unknown, status = 200): Response {
34
- return new Response(JSON.stringify(body), { status, headers: { 'Content-Type': 'application/json' } })
35
- }
36
-
37
- describe('storage.updateBucket', () => {
38
- it('émet PATCH /v1/storage/{pid}/buckets/{id} avec le mapping createBucket', async () => {
39
- const { storage, calls } = make(() => json({ id: 'b', name: 'b', public: true }))
40
- const { error } = await storage.updateBucket('b', { public: true, fileSizeLimit: 1024, allowedMimeTypes: ['image/png'] })
41
- expect(error).toBeNull()
42
- expect(calls).toHaveLength(1)
43
- expect(calls[0].method).toBe('PATCH')
44
- expect(calls[0].url).toBe('http://x/v1/storage/p/buckets/b')
45
- const sent = JSON.parse(calls[0].body as string)
46
- expect(sent).toEqual({ public: true, file_size_limit: 1024, allowed_mime_types: ['image/png'] })
47
- })
48
-
49
- it('mise à jour partielle : seuls les champs fournis sont envoyés (public seul)', async () => {
50
- const { storage, calls } = make(() => json({ id: 'b', name: 'b', public: false }))
51
- await storage.updateBucket('b', { public: false })
52
- const sent = JSON.parse(calls[0].body as string)
53
- expect(sent).toEqual({ public: false })
54
- expect('file_size_limit' in sent).toBe(false)
55
- expect('allowed_mime_types' in sent).toBe(false)
56
- })
57
-
58
- it('sans options → PATCH avec corps vide {}', async () => {
59
- const { storage, calls } = make(() => json({ id: 'b', name: 'b' }))
60
- await storage.updateBucket('b')
61
- expect(JSON.parse(calls[0].body as string)).toEqual({})
62
- })
63
- })
64
-
65
- describe('storage.upload — option metadata', () => {
66
- it("chaque paire metadata est ajoutée au FormData en plus de 'file'", async () => {
67
- const { storage, calls } = make(() => json({ key: 'k.png' }))
68
- await storage.upload('b', 'p.png', new Blob(['x']), { metadata: { owner: 'x', team: 'a' } })
69
- const fd = calls[0].body as FormData
70
- expect(fd).toBeInstanceOf(FormData)
71
- expect(fd.get('owner')).toBe('x')
72
- expect(fd.get('team')).toBe('a')
73
- expect(fd.get('file')).toBeInstanceOf(Blob)
74
- })
75
-
76
- it('non-régression : upload sans metadata ne contient que file (+ upsert si demandé)', async () => {
77
- const { storage, calls } = make(() => json({ key: 'k.png' }))
78
- await storage.upload('b', 'p.png', new Blob(['x']), { upsert: true })
79
- const fd = calls[0].body as FormData
80
- expect(fd.get('file')).toBeInstanceOf(Blob)
81
- expect(fd.get('upsert')).toBe('true')
82
- expect([...fd.keys()].sort()).toEqual(['file', 'upsert'])
83
- })
84
-
85
- it('metadata + upsert cohabitent', async () => {
86
- const { storage, calls } = make(() => json({ key: 'k.png' }))
87
- await storage.upload('b', 'p.png', new Blob(['x']), { upsert: true, metadata: { owner: 'z' } })
88
- const fd = calls[0].body as FormData
89
- expect(fd.get('upsert')).toBe('true')
90
- expect(fd.get('owner')).toBe('z')
91
- })
92
- })
93
-
94
- describe('storage.createSignedUrls — batch', () => {
95
- it('fan-out N : appelle createSignedUrl pour chaque chemin, renvoie N entrées avec path+url', async () => {
96
- const { storage, calls } = make((url) => {
97
- const key = new URL(url).searchParams.get('key')
98
- return json({ url: `http://signed/${key}?sig=abc`, expires_in: 3600 })
99
- })
100
- const { data, error } = await storage.createSignedUrls('b', ['a.png', 'b.png', 'c.png'])
101
- expect(error).toBeNull()
102
- expect(calls).toHaveLength(3)
103
- expect(data).toHaveLength(3)
104
- expect(data![0]).toMatchObject({ path: 'a.png', expires_in: 3600 })
105
- expect((data![0] as { url: string }).url).toContain('a.png')
106
- expect(data!.map((d) => (d as { path: string }).path)).toEqual(['a.png', 'b.png', 'c.png'])
107
- })
108
-
109
- it('résilient par-item : une erreur produit {path, error} sans faire échouer les autres', async () => {
110
- const { storage } = make((url) => {
111
- const key = new URL(url).searchParams.get('key')
112
- if (key === 'bad.png') return json({ error: { message: 'not found' } }, 404)
113
- return json({ url: `http://signed/${key}`, expires_in: 60 })
114
- })
115
- const { data, error } = await storage.createSignedUrls('b', ['ok.png', 'bad.png'], 60)
116
- expect(error).toBeNull()
117
- expect(data).toHaveLength(2)
118
- const ok = data!.find((d) => (d as { path: string }).path === 'ok.png') as { url: string }
119
- const bad = data!.find((d) => (d as { path: string }).path === 'bad.png') as { error: unknown }
120
- expect(ok.url).toContain('ok.png')
121
- expect(bad.error).toBeTruthy()
122
- })
123
-
124
- it('propage expiresInSeconds à chaque appel (ttl_secs)', async () => {
125
- const { storage, calls } = make((url) => {
126
- const key = new URL(url).searchParams.get('key')
127
- return json({ url: `http://signed/${key}`, expires_in: 120 })
128
- })
129
- await storage.createSignedUrls('b', ['a.png'], 120)
130
- expect(calls[0].url).toContain('ttl_secs=120')
131
- })
132
- })
133
-
134
- describe('storage.list — offset no-op', () => {
135
- it("n'inclut PAS offset dans l'URL même si fourni", async () => {
136
- const { storage, calls } = make(() => json([]))
137
- await storage.list('b', { offset: 10 })
138
- expect(calls[0].url).not.toContain('offset')
139
- })
140
-
141
- it('non-régression : prefix et limit toujours transmis', async () => {
142
- const { storage, calls } = make(() => json([]))
143
- await storage.list('b', { prefix: 'sub/', limit: 5, offset: 99 })
144
- expect(calls[0].url).toContain('prefix=sub%2F')
145
- expect(calls[0].url).toContain('limit=5')
146
- expect(calls[0].url).not.toContain('offset')
147
- })
148
-
149
- it('aucune option → aucune query string', async () => {
150
- const { storage, calls } = make(() => json([]))
151
- await storage.list('b')
152
- expect(calls[0].url).toBe('http://x/v1/storage/p/b')
153
- })
154
- })
@@ -1,87 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { encodeObjectPath } from '../src/path'
3
- import { StorageService } from '../src/StorageService'
4
- import { BaseAuthStore, isAuraError } from '@aurabase/core'
5
- import type { AuraClientLike } from '@aurabase/core'
6
-
7
- function make(responder: (url: string) => Response) {
8
- const calls: string[] = []
9
- const client: AuraClientLike = {
10
- baseUrl: 'http://x', projectId: 'p', apiKey: 'k', authStore: new BaseAuthStore(),
11
- fetchFn: (async (url: string) => { calls.push(String(url)); return responder(String(url)) }) as unknown as typeof globalThis.fetch,
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
14
- }
15
- return { storage: new StorageService(client), calls }
16
- }
17
-
18
- describe('encodeObjectPath — anti-traversal + encodage', () => {
19
- it('laisse un chemin normal intact et préserve la structure de dossiers', () => {
20
- expect(encodeObjectPath('k.png')).toBe('k.png')
21
- expect(encodeObjectPath('users/1.png')).toBe('users/1.png')
22
- })
23
-
24
- it('encode les caractères qui casseraient l’URL ou injecteraient une query', () => {
25
- expect(encodeObjectPath('my photo.png')).toBe('my%20photo.png')
26
- expect(encodeObjectPath('f?admin=1#frag')).toBe('f%3Fadmin%3D1%23frag')
27
- // Un `%` littéral est ré-encodé (évite le double-décodage côté serveur).
28
- expect(encodeObjectPath('50%off')).toBe('50%25off')
29
- })
30
-
31
- it('retire les slashes de tête (pas de bucket//key ni de path absolu)', () => {
32
- expect(encodeObjectPath('/leading')).toBe('leading')
33
- expect(encodeObjectPath('///a/b')).toBe('a/b')
34
- })
35
-
36
- it('rejette tout segment de traversal `..`', () => {
37
- for (const p of ['..', '../secret', 'a/../b', 'a/b/..']) {
38
- let thrown: unknown
39
- try { encodeObjectPath(p) } catch (e) { thrown = e }
40
- expect(isAuraError(thrown)).toBe(true)
41
- expect((thrown as { code: string }).code).toBe('invalid_path')
42
- }
43
- })
44
-
45
- it('un `..` déjà encodé (%2E%2E) reste littéral (pas de traversal)', () => {
46
- // Le segment n'est pas `..`, il est ré-encodé → aucune normalisation possible.
47
- expect(encodeObjectPath('%2E%2E/x')).toBe('%252E%252E/x')
48
- })
49
- })
50
-
51
- describe('StorageService — application de l’encodage', () => {
52
- it('download() encode le path (pas d’injection de query string)', () => {
53
- const { storage, calls } = make(() => new Response(new Blob(['x']), { status: 200 }))
54
- // Ne pas await : on veut juste l'URL construite au premier fetch.
55
- void storage.download('b', 'f?admin=1').then(() => {})
56
- // La requête part de façon paresseuse ; on force le déclenchement.
57
- return storage.download('b', 'f?admin=1').then(() => {
58
- const url = calls[calls.length - 1]
59
- expect(url).toContain('/b/f%3Fadmin%3D1')
60
- expect(url).not.toContain('?admin=1')
61
- })
62
- })
63
-
64
- it('download() lève synchroniquement sur `..`', () => {
65
- const { storage } = make(() => new Response(null, { status: 200 }))
66
- expect(() => storage.download('b', 'a/../../secret')).toThrow()
67
- })
68
-
69
- it('getPublicUrl() lève sur `..`, encode sinon', () => {
70
- const { storage } = make(() => new Response(null, { status: 200 }))
71
- expect(() => storage.getPublicUrl('b', '../x')).toThrow()
72
- expect(storage.getPublicUrl('b', 'dir/my file.png')).toContain('/b/dir/my%20file.png')
73
- })
74
-
75
- it('getMetadata() renvoie {error invalid_path} sur `..` (never-throw)', async () => {
76
- const { storage } = make(() => new Response(null, { status: 200 }))
77
- const { data, error } = await storage.getMetadata('b', '../etc')
78
- expect(data).toBeNull()
79
- expect(error?.code).toBe('invalid_path')
80
- })
81
-
82
- it('remove() renvoie {error} si une des clés fait du traversal', async () => {
83
- const { storage } = make(() => new Response(JSON.stringify({ data: null }), { status: 200 }))
84
- const { error } = await storage.remove('b', ['ok.png', '../evil'])
85
- expect(error?.code).toBe('invalid_path')
86
- })
87
- })
@@ -1,79 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { renderTransformParams } from '../src/transform'
3
- import { StorageService } from '../src/StorageService'
4
- import { BaseAuthStore } from '@aurabase/core'
5
- import type { AuraClientLike } from '@aurabase/core'
6
-
7
- describe('renderTransformParams', () => {
8
- it('mappe resize→fit et garde width/height/quality', () => {
9
- const qs = renderTransformParams({ width: 200, height: 100, resize: 'cover', quality: 80 }).toString()
10
- expect(qs).toContain('width=200'); expect(qs).toContain('height=100')
11
- expect(qs).toContain('fit=cover'); expect(qs).toContain('quality=80')
12
- expect(qs).not.toContain('resize=')
13
- })
14
- it("omet format quand 'origin'", () => {
15
- const qs = renderTransformParams({ format: 'origin', width: 50 }).toString()
16
- expect(qs).not.toContain('format='); expect(qs).toContain('width=50')
17
- })
18
- it('passe format webp', () => {
19
- expect(renderTransformParams({ format: 'webp' }).toString()).toContain('format=webp')
20
- })
21
- it('borne quality 20-100', () => {
22
- expect(renderTransformParams({ quality: 5 }).get('quality')).toBe('20')
23
- expect(renderTransformParams({ quality: 500 }).get('quality')).toBe('100')
24
- })
25
- })
26
-
27
- // -- Fixtures partagées avec download.test.ts (mock AuraClientLike minimal) --
28
-
29
- function make(responder: (url: string) => Response, store = new BaseAuthStore()) {
30
- const calls: string[] = []
31
- const client: AuraClientLike = {
32
- baseUrl: 'http://x', projectId: 'p', apiKey: 'k', authStore: store,
33
- fetchFn: (async (url: string) => { calls.push(String(url)); return responder(String(url)) }) as unknown as typeof globalThis.fetch,
34
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
36
- }
37
- return { storage: new StorageService(client), calls }
38
- }
39
-
40
- describe('getPublicUrl / download avec { transform }', () => {
41
- it('getPublicUrl appende la query transform', () => {
42
- const { storage } = make(() => new Response(null, { status: 200 }))
43
- const url = storage.getPublicUrl('b', 'k.png', { transform: { width: 50 } })
44
- expect(url).toContain('?width=50')
45
- })
46
-
47
- it('download appende la query transform à l’URL figée du builder', async () => {
48
- const { storage, calls } = make(() => new Response(new Blob(['x']), { status: 200 }))
49
- await storage.download('b', 'k.png', { transform: { width: 50, resize: 'cover' } })
50
- expect(calls[0]).toContain('width=50')
51
- expect(calls[0]).toContain('fit=cover')
52
- })
53
- })
54
-
55
- describe('createSignedUrl avec { transform }', () => {
56
- it('appende la query transform à l’URL signée retournée par le backend', async () => {
57
- const { storage } = make(() =>
58
- new Response(JSON.stringify({ url: 'http://x/signed?sig=abc', expires_in: 600 }), {
59
- status: 200,
60
- headers: { 'Content-Type': 'application/json' },
61
- }),
62
- )
63
- const { data, error } = await storage.createSignedUrl('b', 'k.png', 600, { transform: { width: 50 } })
64
- expect(error).toBeNull()
65
- expect(data?.url).toContain('sig=abc')
66
- expect(data?.url).toContain('width=50')
67
- })
68
-
69
- it('sans transform, laisse l’URL signée inchangée', async () => {
70
- const { storage } = make(() =>
71
- new Response(JSON.stringify({ url: 'http://x/signed?sig=abc', expires_in: 600 }), {
72
- status: 200,
73
- headers: { 'Content-Type': 'application/json' },
74
- }),
75
- )
76
- const { data } = await storage.createSignedUrl('b', 'k.png', 600)
77
- expect(data?.url).toBe('http://x/signed?sig=abc')
78
- })
79
- })
@@ -1,5 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": { "outDir": "dist", "rootDir": "src" },
4
- "include": ["src"]
5
- }
@@ -1,11 +0,0 @@
1
- import { defineConfig } from 'tsup'
2
-
3
- export default defineConfig({
4
- entry: ['src/index.ts'],
5
- format: ['cjs', 'esm'],
6
- dts: true,
7
- splitting: false,
8
- clean: true,
9
- treeshake: true,
10
- minify: false,
11
- })
@@ -1,24 +0,0 @@
1
- packages:
2
- - 'packages/*'
3
-
4
- catalog:
5
- tsup: ^8.0.0
6
- typescript: ^5.5.0
7
- vitest: ^4.1.6
8
- '@types/node': 20.14.15
9
-
10
- # Durcissement supply-chain (pnpm v10.16+) — imposé par le hook semgrep du projet.
11
- # - minimumReleaseAge : attendre 7 jours (10080 min) avant d'installer une version fraîchement publiée
12
- # - blockExoticSubdeps : bloquer les sous-dépendances de sources non fiables (git, tarball…)
13
- # - trustPolicy : empêcher un downgrade malveillant des réglages de sécurité
14
- minimumReleaseAge: 10080
15
- blockExoticSubdeps: true
16
- trustPolicy: no-downgrade
17
- # Exemption ciblée : chokidar@4.0.3 (dépendance transitive de tsup, l'outil de build)
18
- # a perdu son attestation de provenance — le mainteneur a cessé de signer ses publications
19
- # (les 4.0.0/4.0.1 étaient signées). Ce n'est pas une compromission. La politique stricte
20
- # reste appliquée partout ailleurs. Réf. pnpm.io/settings#trustpolicyexclude (v10.22+).
21
- trustPolicyExclude:
22
- - 'chokidar@4.0.3'
23
- allowBuilds:
24
- esbuild: true
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "lib": ["ES2022", "DOM"],
7
- "strict": true,
8
- "esModuleInterop": true,
9
- "skipLibCheck": true,
10
- "declaration": true,
11
- "declarationMap": true,
12
- "sourceMap": true,
13
- "types": ["vitest/globals"]
14
- }
15
- }