@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,22 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*|*MINGW*|*MSYS*)
6
- if command -v cygpath > /dev/null 2>&1; then
7
- basedir=`cygpath -w "$basedir"`
8
- fi
9
- ;;
10
- esac
11
-
12
- if [ -z "$NODE_PATH" ]; then
13
- export NODE_PATH="/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules/vitest/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/node_modules"
14
- else
15
- export NODE_PATH="/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules/vitest/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/vitest@4.1.9_@types+node@20.14.15_vite@8.1.3_@types+node@20.14.15_esbuild@0.27.7_/node_modules:/Users/affanedaylami/aurabase/aurabase-js/node_modules/.pnpm/node_modules:$NODE_PATH"
16
- fi
17
- if [ -x "$basedir/node" ]; then
18
- exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
19
- else
20
- exec node "$basedir/../vitest/vitest.mjs" "$@"
21
- fi
22
- # cmd-shim-target=/Users/affanedaylami/aurabase/aurabase-js/packages/storage/node_modules/vitest/vitest.mjs
@@ -1 +0,0 @@
1
- {"version":"4.1.9","results":[[":tests/download.test.ts",{"duration":383.5393750000003,"failed":false}],[":tests/path.test.ts",{"duration":285.0919170000002,"failed":false}],[":tests/transform.test.ts",{"duration":522.0009580000005,"failed":false}],[":tests/parity.test.ts",{"duration":719.0756669999996,"failed":false}]]}
@@ -1,60 +0,0 @@
1
- {
2
- "name": "@aurabase/storage",
3
- "version": "0.3.0",
4
- "description": "Service de stockage objet du SDK Aurabase (buckets, upload/download, URLs signées)",
5
- "type": "module",
6
- "main": "dist/index.cjs",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": {
12
- "types": "./dist/index.d.ts",
13
- "default": "./dist/index.js"
14
- },
15
- "require": {
16
- "types": "./dist/index.d.cts",
17
- "default": "./dist/index.cjs"
18
- }
19
- }
20
- },
21
- "sideEffects": false,
22
- "files": [
23
- "dist",
24
- "README.md",
25
- "LICENSE"
26
- ],
27
- "engines": {
28
- "node": ">=20.0.0"
29
- },
30
- "license": "MIT",
31
- "author": "Aurabase",
32
- "repository": {
33
- "type": "git",
34
- "url": "git+https://github.com/daylami555/aurabase.git",
35
- "directory": "aurabase-js/packages/storage"
36
- },
37
- "homepage": "https://github.com/daylami555/aurabase/tree/main/aurabase-js/packages/storage#readme",
38
- "bugs": {
39
- "url": "https://github.com/daylami555/aurabase/issues"
40
- },
41
- "keywords": [
42
- "aurabase",
43
- "baas",
44
- "sdk",
45
- "storage"
46
- ],
47
- "scripts": {
48
- "build": "tsup",
49
- "test": "vitest run --passWithNoTests",
50
- "typecheck": "tsc --noEmit"
51
- },
52
- "dependencies": {
53
- "@aurabase/core": "workspace:*"
54
- },
55
- "devDependencies": {
56
- "tsup": "catalog:",
57
- "typescript": "catalog:",
58
- "vitest": "catalog:"
59
- }
60
- }
@@ -1,60 +0,0 @@
1
- import { AuraError } from '@aurabase/core'
2
- import type { AuraResponse } from '@aurabase/core'
3
-
4
- type DownloadFn = () => Promise<Response>
5
-
6
- async function runDownload<T>(fn: DownloadFn, extract: (r: Response) => T | Promise<T>): Promise<AuraResponse<T>> {
7
- let res: Response
8
- try {
9
- res = await fn()
10
- } catch (err) {
11
- return {
12
- data: null,
13
- error: new AuraError(0, { error: { code: 'network_error', message: err instanceof Error ? err.message : 'Download failed' } }),
14
- }
15
- }
16
- if (!res.ok) return { data: null, error: new AuraError(res.status) }
17
- return { data: await extract(res), error: null }
18
- }
19
-
20
- /** Download paresseux (Blob par défaut). La requête ne part qu'à l'await ; résultat mémoïsé. */
21
- export class BlobDownloadBuilder implements PromiseLike<AuraResponse<Blob>> {
22
- private _promise: Promise<AuraResponse<Blob>> | null = null
23
- constructor(private readonly _fn: DownloadFn) {}
24
-
25
- asStream(): StreamDownloadBuilder {
26
- return new StreamDownloadBuilder(this._fn)
27
- }
28
-
29
- private _run(): Promise<AuraResponse<Blob>> {
30
- if (!this._promise) this._promise = runDownload(this._fn, (r) => r.blob())
31
- return this._promise
32
- }
33
-
34
- then<TR1 = AuraResponse<Blob>, TR2 = never>(
35
- onfulfilled?: ((v: AuraResponse<Blob>) => TR1 | PromiseLike<TR1>) | null,
36
- onrejected?: ((e: unknown) => TR2 | PromiseLike<TR2>) | null,
37
- ): Promise<TR1 | TR2> {
38
- return this._run().then(onfulfilled, onrejected)
39
- }
40
- }
41
-
42
- /** Variante flux — `res.body` (ReadableStream). */
43
- export class StreamDownloadBuilder implements PromiseLike<AuraResponse<ReadableStream<Uint8Array>>> {
44
- private _promise: Promise<AuraResponse<ReadableStream<Uint8Array>>> | null = null
45
- constructor(private readonly _fn: DownloadFn) {}
46
-
47
- private _run(): Promise<AuraResponse<ReadableStream<Uint8Array>>> {
48
- if (!this._promise) {
49
- this._promise = runDownload(this._fn, (r) => r.body as ReadableStream<Uint8Array>)
50
- }
51
- return this._promise
52
- }
53
-
54
- then<TR1 = AuraResponse<ReadableStream<Uint8Array>>, TR2 = never>(
55
- onfulfilled?: ((v: AuraResponse<ReadableStream<Uint8Array>>) => TR1 | PromiseLike<TR1>) | null,
56
- onrejected?: ((e: unknown) => TR2 | PromiseLike<TR2>) | null,
57
- ): Promise<TR1 | TR2> {
58
- return this._run().then(onfulfilled, onrejected)
59
- }
60
- }
@@ -1,323 +0,0 @@
1
- import { BaseService } from '@aurabase/core'
2
- import { isTokenExpired, refreshOnce, AuraError } from '@aurabase/core'
3
- import type {
4
- AuraResponse,
5
- FileEntry,
6
- ImageTransform,
7
- ObjectMeta,
8
- StorageBucket,
9
- UploadResult,
10
- } from '@aurabase/core'
11
- import type { AuraClientLike } from '@aurabase/core'
12
- import { BlobDownloadBuilder } from './DownloadBuilder'
13
- import { encodeObjectPath } from './path'
14
- import { renderTransformParams } from './transform'
15
-
16
- export class StorageService extends BaseService {
17
- constructor(client: AuraClientLike) {
18
- super(client)
19
- }
20
-
21
- private get prefix(): string {
22
- return `/v1/storage/${this.client.projectId}`
23
- }
24
-
25
- // -- Buckets ----------------------------------------------------------------
26
-
27
- async listBuckets(): Promise<AuraResponse<StorageBucket[]>> {
28
- return this.request('GET', `${this.prefix}/buckets`)
29
- }
30
-
31
- async getBucket(id: string): Promise<AuraResponse<StorageBucket>> {
32
- return this.request('GET', `${this.prefix}/buckets/${id}`)
33
- }
34
-
35
- async createBucket(
36
- name: string,
37
- options?: { public?: boolean; fileSizeLimit?: number; allowedMimeTypes?: string[] },
38
- ): Promise<AuraResponse<StorageBucket>> {
39
- return this.request('POST', `${this.prefix}/buckets`, {
40
- name,
41
- public: options?.public ?? false,
42
- file_size_limit: options?.fileSizeLimit,
43
- allowed_mime_types: options?.allowedMimeTypes,
44
- })
45
- }
46
-
47
- /**
48
- * Met à jour un bucket existant (mise à jour PARTIELLE : seuls les champs
49
- * fournis sont envoyés). Mapping identique à `createBucket`
50
- * (`public`/`file_size_limit`/`allowed_mime_types`).
51
- *
52
- * Backend route: PATCH /v1/storage/{project_id}/buckets/{id}
53
- */
54
- async updateBucket(
55
- id: string,
56
- options?: { public?: boolean; fileSizeLimit?: number; allowedMimeTypes?: string[] },
57
- ): Promise<AuraResponse<StorageBucket>> {
58
- const body: Record<string, unknown> = {}
59
- if (options?.public !== undefined) body.public = options.public
60
- if (options?.fileSizeLimit !== undefined) body.file_size_limit = options.fileSizeLimit
61
- if (options?.allowedMimeTypes !== undefined) body.allowed_mime_types = options.allowedMimeTypes
62
- return this.request('PATCH', `${this.prefix}/buckets/${id}`, body)
63
- }
64
-
65
- async deleteBucket(id: string): Promise<AuraResponse<null>> {
66
- return this.request('DELETE', `${this.prefix}/buckets/${id}`)
67
- }
68
-
69
- // -- Objects ----------------------------------------------------------------
70
-
71
- /**
72
- * Upload a file to a bucket.
73
- *
74
- * Le serveur génère une clé unique `<uuid>.<ext>` (relative au bucket).
75
- * Réutilisez directement `data.key` pour download(), remove(), copy(), etc.
76
- *
77
- * @example
78
- * const { data } = await client.storage.upload('avatars', 'photo.png', file)
79
- * await client.storage.download('avatars', data!.key) // fonctionne directement
80
- *
81
- * Backend route: POST /v1/storage/{project_id}/{bucket}
82
- */
83
- async upload(
84
- bucketId: string,
85
- path: string,
86
- file: Blob | File | ArrayBuffer,
87
- options?: { contentType?: string; upsert?: boolean; metadata?: Record<string, string> },
88
- ): Promise<AuraResponse<UploadResult>> {
89
- const formData = new FormData()
90
- const blob =
91
- file instanceof Blob
92
- ? file
93
- : new Blob([file], { type: options?.contentType ?? 'application/octet-stream' })
94
- formData.append('file', blob, path)
95
- if (options?.upsert) formData.append('upsert', 'true')
96
- // Métadonnées objet : tout champ multipart ≠ `file`/`upsert` est rangé par le
97
- // backend dans `custom_meta` → métadonnées S3 relues par `getMetadata`.
98
- if (options?.metadata) {
99
- for (const [k, v] of Object.entries(options.metadata)) formData.append(k, v)
100
- }
101
-
102
- return this.request('POST', `${this.prefix}/${bucketId}`, formData as unknown)
103
- }
104
-
105
- /**
106
- * Download paresseux d'un fichier. Renvoie un builder (Blob par défaut, `.asStream()` pour
107
- * le flux) ; la requête part à l'`await`. Refresh proactif du token avant la requête.
108
- * `options?.transform` (image) : appende `renderTransformParams(...)` à l'URL — figée à
109
- * l'appel, le builder reste inchangé.
110
- * Backend route: GET /v1/storage/{project_id}/{bucket}/{*key}
111
- */
112
- download(bucketId: string, path: string, options?: { transform?: ImageTransform }): BlobDownloadBuilder {
113
- // Encodage anti-traversal + neutralisation des caractères d'URL. Lève
114
- // synchroniquement (AuraError) sur un segment `..`.
115
- let url = this.url(`${this.prefix}/${encodeURIComponent(bucketId)}/${encodeObjectPath(path)}`)
116
- if (options?.transform) {
117
- const qs = renderTransformParams(options.transform).toString()
118
- if (qs) url = `${url}?${qs}`
119
- }
120
- const client = this.client
121
- const downloadFn = async (): Promise<Response> => {
122
- const store = client.authStore
123
- if (store.token && store.refreshToken && isTokenExpired(store.token, 30)) {
124
- await refreshOnce(client)
125
- }
126
- const headers: Record<string, string> = {}
127
- if (store.token) headers['Authorization'] = `Bearer ${store.token}`
128
- if (client.apiKey) headers['apikey'] = client.apiKey
129
- return client.fetchFn(url, { headers })
130
- }
131
- return new BlobDownloadBuilder(downloadFn)
132
- }
133
-
134
- /**
135
- * List files in a bucket.
136
- *
137
- * ⚠️ `offset` n'est PAS supporté par le backend (`ListQuery` ne connaît que
138
- * `prefix`+`limit`) : le paramètre est accepté pour compatibilité ascendante
139
- * mais IGNORÉ (jamais envoyé au serveur). Pour restreindre les résultats,
140
- * utilisez `prefix`. La vraie pagination (continuation token) relève du backend.
141
- *
142
- * Backend route: GET /v1/storage/{project_id}/{bucket}
143
- */
144
- async list(bucketId: string, options?: { prefix?: string; limit?: number; offset?: number }): Promise<AuraResponse<FileEntry[]>> {
145
- const params = new URLSearchParams()
146
- if (options?.prefix) params.set('prefix', options.prefix)
147
- if (options?.limit !== undefined) params.set('limit', String(options.limit))
148
- // `offset` volontairement NON transmis : ignoré par le backend (cf. JSDoc).
149
- const qs = params.toString()
150
- const sep = qs ? '?' : ''
151
- return this.request('GET', `${this.prefix}/${bucketId}${sep}${qs}`)
152
- }
153
-
154
- /**
155
- * Delete one or more files from a bucket.
156
- * Backend route: DELETE /v1/storage/{project_id}/{bucket}/{*key}
157
- * Note: for single file deletion, paths[0] is used. Multi-delete is done in sequence.
158
- */
159
- async remove(bucketId: string, paths: string[]): Promise<AuraResponse<null>> {
160
- // Encodage anti-traversal de chaque clé (never-throw : on renvoie l'erreur).
161
- let keys: string[]
162
- try {
163
- keys = paths.map((p) => encodeObjectPath(p))
164
- } catch (e) {
165
- return { data: null, error: e as AuraError }
166
- }
167
- const b = encodeURIComponent(bucketId)
168
- // Backend supports single file deletion per request
169
- // For multiple files, call sequentially
170
- if (keys.length === 1) {
171
- return this.request('DELETE', `${this.prefix}/${b}/${keys[0]}`)
172
- }
173
- // Multi-delete: fire all in parallel, return success if all succeed
174
- const results = await Promise.all(
175
- keys.map((k) => this.request('DELETE', `${this.prefix}/${b}/${k}`)),
176
- )
177
- const failed = results.find((r) => r.error)
178
- if (failed) return failed as AuraResponse<null>
179
- return { data: null, error: null }
180
- }
181
-
182
- /**
183
- * Copy a file within a bucket.
184
- *
185
- * `fromPath`/`toPath` sont relatifs au bucket (cohérent avec `download`/
186
- * `remove`/`upload`) — le SDK les préfixe par `bucketId` pour produire les
187
- * clés MinIO complètes attendues par le backend.
188
- *
189
- * Backend route: POST /v1/storage/{project_id}/{bucket}/copy
190
- */
191
- async copy(bucketId: string, fromPath: string, toPath: string): Promise<AuraResponse<{ key: string }>> {
192
- return this.request('POST', `${this.prefix}/${bucketId}/copy`, {
193
- src_key: `${bucketId}/${fromPath}`,
194
- dst_key: `${bucketId}/${toPath}`,
195
- })
196
- }
197
-
198
- /**
199
- * Move/rename a file within a bucket.
200
- *
201
- * `fromPath`/`toPath` sont relatifs au bucket (cohérent avec `download`/
202
- * `remove`/`upload`) — le SDK les préfixe par `bucketId` pour produire les
203
- * clés MinIO complètes attendues par le backend.
204
- *
205
- * Backend route: POST /v1/storage/{project_id}/{bucket}/move
206
- */
207
- async move(bucketId: string, fromPath: string, toPath: string): Promise<AuraResponse<{ key: string }>> {
208
- return this.request('POST', `${this.prefix}/${bucketId}/move`, {
209
- src_key: `${bucketId}/${fromPath}`,
210
- dst_key: `${bucketId}/${toPath}`,
211
- })
212
- }
213
-
214
- /**
215
- * Get file metadata.
216
- * Backend route: GET /v1/storage/{project_id}/{bucket}/meta/{*key}
217
- */
218
- async getMetadata(bucketId: string, path: string): Promise<AuraResponse<ObjectMeta>> {
219
- let key: string
220
- try {
221
- key = encodeObjectPath(path)
222
- } catch (e) {
223
- return { data: null, error: e as AuraError }
224
- }
225
- return this.request('GET', `${this.prefix}/${encodeURIComponent(bucketId)}/meta/${key}`)
226
- }
227
-
228
- /**
229
- * Generate a signed (temporary) download URL.
230
- *
231
- * `options?.transform` (image) : dérisqué en réel (stack live) — les params transform
232
- * sont HORS HMAC (le backend ne les couvre pas dans la signature), donc on les appende
233
- * à l'URL signée APRÈS réception de `{ url, expires_in }`, sans toucher à la requête
234
- * `signed-url` elle-même.
235
- * Backend route: GET /v1/storage/{project_id}/{bucket}/signed-url?key=...&ttl_secs=...
236
- */
237
- async createSignedUrl(
238
- bucketId: string,
239
- path: string,
240
- expiresInSeconds = 3600,
241
- options?: { transform?: ImageTransform },
242
- ): Promise<AuraResponse<{ url: string; expires_in: number }>> {
243
- const params = new URLSearchParams({ key: path, ttl_secs: String(expiresInSeconds) })
244
- const res = await this.request<{ url: string; expires_in: number }>(
245
- 'GET',
246
- `${this.prefix}/${bucketId}/signed-url?${params.toString()}`,
247
- )
248
- if (res.data && options?.transform) {
249
- const qs = renderTransformParams(options.transform).toString()
250
- if (qs) {
251
- const sep = res.data.url.includes('?') ? '&' : '?'
252
- res.data = { ...res.data, url: `${res.data.url}${sep}${qs}` }
253
- }
254
- }
255
- return res
256
- }
257
-
258
- /**
259
- * Génère plusieurs URLs signées en une passe (batch).
260
- *
261
- * Il n'existe pas d'endpoint batch côté backend : l'implémentation fait un
262
- * fan-out `Promise.all` sur `createSignedUrl` (même patron que `remove()`),
263
- * RÉSILIENT PAR-ITEM — chaque entrée est soit `{ path, url, expires_in }`
264
- * (succès), soit `{ path, error }` (échec), sans faire échouer les autres.
265
- *
266
- * @example
267
- * const { data } = await client.storage.createSignedUrls('avatars', ['a.png', 'b.png'])
268
- * data?.forEach((r) => 'url' in r ? use(r.url) : console.warn(r.path, r.error))
269
- */
270
- async createSignedUrls(
271
- bucketId: string,
272
- paths: string[],
273
- expiresInSeconds = 3600,
274
- options?: { transform?: ImageTransform },
275
- ): Promise<AuraResponse<Array<{ path: string; url: string; expires_in: number } | { path: string; error: AuraError }>>> {
276
- const results = await Promise.all(
277
- paths.map(async (path) => {
278
- const res = await this.createSignedUrl(bucketId, path, expiresInSeconds, options)
279
- if (res.error || !res.data) {
280
- return { path, error: res.error ?? new AuraError(0, { error: { code: 'unknown', message: 'No data' } }) }
281
- }
282
- return { path, url: res.data.url, expires_in: res.data.expires_in }
283
- }),
284
- )
285
- return { data: results, error: null }
286
- }
287
-
288
- /**
289
- * Generate a signed upload URL (presigned POST/PUT).
290
- * Backend route: GET /v1/storage/{project_id}/{bucket}/upload-url?key=...&ttl_secs=...
291
- */
292
- async createSignedUploadUrl(
293
- bucketId: string,
294
- path: string,
295
- expiresInSeconds = 3600,
296
- ): Promise<AuraResponse<{ url: string; expires_in: number }>> {
297
- const params = new URLSearchParams({ key: path, ttl_secs: String(expiresInSeconds) })
298
- return this.request('GET', `${this.prefix}/${bucketId}/upload-url?${params.toString()}`)
299
- }
300
-
301
- /**
302
- * Construit une URL vers un fichier d'un bucket.
303
- *
304
- * ⚠️ Cette URL N'EST PAS accessible sans authentification : le gateway exige
305
- * une clé API (`apikey`/`x-api-key`) sur toutes les routes storage, y compris
306
- * pour les buckets créés avec `public: true` (ce flag n'est actuellement pas
307
- * vérifié côté gateway — une requête non authentifiée renvoie 401). Pour
308
- * partager un fichier sans authentification, utilisez `createSignedUrl()`,
309
- * qui génère une URL signée HMAC vérifiée côté serveur sans clé API.
310
- *
311
- * `options?.transform` (image) : appende `renderTransformParams(...)` en query string.
312
- * Backend route: GET /v1/storage/{project_id}/{bucket}/{*key} (clé API requise)
313
- */
314
- getPublicUrl(bucketId: string, path: string, options?: { transform?: ImageTransform }): string {
315
- // Lève synchroniquement (AuraError) sur un segment `..`.
316
- const base = this.url(`${this.prefix}/${encodeURIComponent(bucketId)}/${encodeObjectPath(path)}`)
317
- if (options?.transform) {
318
- const qs = renderTransformParams(options.transform).toString()
319
- if (qs) return `${base}?${qs}`
320
- }
321
- return base
322
- }
323
- }
@@ -1,2 +0,0 @@
1
- export { StorageService } from './StorageService'
2
- export { BlobDownloadBuilder, StreamDownloadBuilder } from './DownloadBuilder'
@@ -1,35 +0,0 @@
1
- import { AuraError } from '@aurabase/core'
2
-
3
- /**
4
- * Encode un chemin d'objet storage pour interpolation SÛRE dans un path d'URL.
5
- *
6
- * Deux protections :
7
- * 1. **Anti-traversal** — rejette tout segment `..`. Sans ça, un `../` non
8
- * neutralisé serait normalisé par `fetch`/le navigateur AVANT l'envoi
9
- * (`/storage/proj/bucketA/../../bucketB/x` → `/storage/proj/bucketB/x`),
10
- * permettant un accès cross-bucket. Le backend traite les clés S3 de façon
11
- * littérale et ne filtre pas `..` : la défense doit donc être ici aussi.
12
- * 2. **Encodage per-segment** — `encodeURIComponent` sur chaque segment
13
- * (les `/` séparateurs sont préservés pour garder la structure de dossiers).
14
- * Neutralise `?`, `#`, `%`, espaces… qui casseraient l'URL ou injecteraient
15
- * une query string. Le double-décodage est évité (`%2E%2E` reste littéral).
16
- *
17
- * @throws {AuraError} code `invalid_path` si un segment `..` est présent.
18
- */
19
- export function encodeObjectPath(path: string): string {
20
- // Retire les slashes de tête : le préfixe bucket est ajouté séparément, et un
21
- // path absolu (`/x`) ne doit pas produire `bucket//x`.
22
- const trimmed = path.replace(/^\/+/, '')
23
- const segments = trimmed.split('/')
24
- for (const seg of segments) {
25
- if (seg === '..') {
26
- throw new AuraError(0, {
27
- error: {
28
- code: 'invalid_path',
29
- message: 'Path traversal ("..") is not allowed in storage object paths',
30
- },
31
- })
32
- }
33
- }
34
- return segments.map((s) => encodeURIComponent(s)).join('/')
35
- }
@@ -1,15 +0,0 @@
1
- import type { ImageTransform } from '@aurabase/core'
2
-
3
- /** Mappe une ImageTransform (vocabulaire Supabase) vers les query params du backend
4
- * de rendu Aurabase (`fit`, `format`, `quality`, `width`, `height`). */
5
- export function renderTransformParams(t: ImageTransform): URLSearchParams {
6
- const p = new URLSearchParams()
7
- // Garde `Number.isFinite` : un NaN/Infinity (calcul amont non vérifié) est de type
8
- // 'number' mais produirait `width=NaN` → 400 backend ; on l'ignore silencieusement.
9
- if (Number.isFinite(t.width)) p.set('width', String(Math.max(1, Math.floor(t.width as number))))
10
- if (Number.isFinite(t.height)) p.set('height', String(Math.max(1, Math.floor(t.height as number))))
11
- if (t.resize) p.set('fit', t.resize) // cover/contain/fill : mêmes valeurs backend
12
- if (Number.isFinite(t.quality)) p.set('quality', String(Math.min(100, Math.max(20, Math.floor(t.quality as number)))))
13
- if (t.format && t.format !== 'origin') p.set('format', t.format)
14
- return p
15
- }
@@ -1,64 +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
- function b64url(o: unknown) { return btoa(JSON.stringify(o)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') }
7
- function expiredJwt() { return `${b64url({ alg: 'HS256' })}.${b64url({ exp: Math.floor(Date.now() / 1000) - 60 })}.s` }
8
- function validJwt() { return `${b64url({ alg: 'HS256' })}.${b64url({ exp: Math.floor(Date.now() / 1000) + 3600 })}.s` }
9
- function fakeUser() { return { id: 'u', email: null, role: 'authenticated', email_verified: true, is_banned: false, is_anonymous: false, mfa_enabled: false, user_metadata: {}, app_metadata: {}, created_at: '2025-01-01T00:00:00Z' } }
10
-
11
- function make(responder: (url: string) => Response, store = new BaseAuthStore()) {
12
- const calls: string[] = []
13
- const client: AuraClientLike = {
14
- baseUrl: 'http://x', projectId: 'p', apiKey: 'k', authStore: store,
15
- fetchFn: (async (url: string) => { calls.push(String(url)); return responder(String(url)) }) as unknown as typeof globalThis.fetch,
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- auth: { refreshSession: async () => ({ data: null, error: null }) as any },
18
- }
19
- return { storage: new StorageService(client), calls }
20
- }
21
-
22
- describe('storage.download — builder paresseux', () => {
23
- it('Blob par défaut', async () => {
24
- const { storage } = make(() => new Response(new Blob(['hello']), { status: 200 }))
25
- const { data, error } = await storage.download('b', 'k.png')
26
- expect(error).toBeNull()
27
- expect(data).toBeInstanceOf(Blob)
28
- })
29
-
30
- it('mémoïsé : une seule requête même sur double await', async () => {
31
- const { storage, calls } = make(() => new Response(new Blob(['x']), { status: 200 }))
32
- const dl = storage.download('b', 'k.png')
33
- await dl
34
- await dl
35
- expect(calls.length).toBe(1)
36
- })
37
-
38
- it('.asStream() → ReadableStream', async () => {
39
- const { storage } = make(() => new Response(new Blob(['x']), { status: 200 }))
40
- const { data } = await storage.download('b', 'k.png').asStream()
41
- expect(data).toBeInstanceOf(ReadableStream)
42
- })
43
-
44
- it('!ok → erreur status', async () => {
45
- const { storage } = make(() => new Response(null, { status: 404 }))
46
- const { data, error } = await storage.download('b', 'missing')
47
- expect(data).toBeNull()
48
- expect(error?.status).toBe(404)
49
- })
50
-
51
- it('refresh proactif si token expiré (refresh AVANT download)', async () => {
52
- const store = new BaseAuthStore()
53
- store.save(expiredJwt(), 'rt', fakeUser())
54
- const { storage, calls } = make((url) => {
55
- if (url.includes('/v1/auth/')) {
56
- return new Response(JSON.stringify({ access_token: validJwt(), refresh_token: 'rt2', token_type: 'bearer', expires_in: 3600, user: fakeUser() }), { status: 200, headers: { 'Content-Type': 'application/json' } })
57
- }
58
- return new Response(new Blob(['x']), { status: 200 })
59
- }, store)
60
- await storage.download('b', 'k.png')
61
- expect(calls[0]).toContain('/v1/auth/p/refresh')
62
- expect(calls[1]).toContain('/b/k.png')
63
- })
64
- })