@motherbase/client 1.3.1 → 1.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 (57) hide show
  1. package/README.md +284 -265
  2. package/dist/auth.d.ts +143 -14
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +317 -14
  5. package/dist/auth.js.map +1 -1
  6. package/dist/channel.d.ts +15 -12
  7. package/dist/channel.d.ts.map +1 -1
  8. package/dist/channel.js.map +1 -1
  9. package/dist/compat.d.ts +40 -0
  10. package/dist/compat.d.ts.map +1 -0
  11. package/dist/compat.js +98 -0
  12. package/dist/compat.js.map +1 -0
  13. package/dist/cookie.d.ts +10 -2
  14. package/dist/cookie.d.ts.map +1 -1
  15. package/dist/cookie.js +13 -5
  16. package/dist/cookie.js.map +1 -1
  17. package/dist/database.d.ts +20 -1
  18. package/dist/database.d.ts.map +1 -1
  19. package/dist/functions.d.ts +36 -0
  20. package/dist/functions.d.ts.map +1 -1
  21. package/dist/functions.js +56 -5
  22. package/dist/functions.js.map +1 -1
  23. package/dist/http.d.ts +27 -0
  24. package/dist/http.d.ts.map +1 -1
  25. package/dist/http.js +57 -9
  26. package/dist/http.js.map +1 -1
  27. package/dist/index.d.ts +72 -5
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +163 -12
  30. package/dist/index.js.map +1 -1
  31. package/dist/postgrest.d.ts +88 -1
  32. package/dist/postgrest.d.ts.map +1 -1
  33. package/dist/postgrest.js +179 -17
  34. package/dist/postgrest.js.map +1 -1
  35. package/dist/query.d.ts +97 -0
  36. package/dist/query.d.ts.map +1 -0
  37. package/dist/query.js +94 -0
  38. package/dist/query.js.map +1 -0
  39. package/dist/session.d.ts +12 -1
  40. package/dist/session.d.ts.map +1 -1
  41. package/dist/session.js +49 -3
  42. package/dist/session.js.map +1 -1
  43. package/dist/storage.d.ts +172 -5
  44. package/dist/storage.d.ts.map +1 -1
  45. package/dist/storage.js +249 -6
  46. package/dist/storage.js.map +1 -1
  47. package/dist/testing.d.ts +38 -0
  48. package/dist/testing.d.ts.map +1 -0
  49. package/dist/testing.js +50 -0
  50. package/dist/testing.js.map +1 -0
  51. package/dist/types.d.ts +257 -20
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/warn.d.ts +4 -0
  54. package/dist/warn.d.ts.map +1 -0
  55. package/dist/warn.js +27 -0
  56. package/dist/warn.js.map +1 -0
  57. package/package.json +10 -2
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/dist/storage.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { FileObject, FileVisibility, MotherbaseResponse, StorageRemoveRespo
3
3
  export interface UploadOptions {
4
4
  /** Object visibility. Defaults to the backend's default (private). */
5
5
  visibility?: FileVisibility;
6
- /** Passed through to the backend as the content type hint. */
6
+ /** Content type stored with the object. Overrides what the file itself declares. */
7
7
  contentType?: string;
8
8
  upsert?: boolean;
9
9
  }
@@ -15,6 +15,29 @@ export interface UploadResult {
15
15
  /** `bucket/key`. */
16
16
  fullPath: string;
17
17
  }
18
+ /** A bucket, in the supabase-js shape. `id` is the slug. */
19
+ export interface BucketInfo {
20
+ id: string;
21
+ name: string;
22
+ owner: string;
23
+ public: boolean;
24
+ created_at: string | null;
25
+ updated_at: string | null;
26
+ }
27
+ /** One object's metadata, in the supabase-js `info()` shape. */
28
+ export interface ObjectInfo {
29
+ name: string;
30
+ id: string;
31
+ version: string | null;
32
+ bucket_id: string;
33
+ created_at: string | null;
34
+ updated_at: string | null;
35
+ last_accessed_at: string | null;
36
+ size: number;
37
+ content_type: string | null;
38
+ cache_control: string | null;
39
+ metadata: Record<string, unknown>;
40
+ }
18
41
  export interface ListOptions {
19
42
  limit?: number;
20
43
  offset?: number;
@@ -28,7 +51,11 @@ export declare class StorageBucket {
28
51
  private readonly http;
29
52
  private readonly baseUrl;
30
53
  private readonly bucket;
31
- constructor(http: HttpClient, baseUrl: string, bucket: string);
54
+ /** Used only by `uploadToSignedUrl`, which PUTs straight to object storage. */
55
+ private readonly fetchImpl;
56
+ constructor(http: HttpClient, baseUrl: string, bucket: string,
57
+ /** Used only by `uploadToSignedUrl`, which PUTs straight to object storage. */
58
+ fetchImpl: typeof fetch);
32
59
  /**
33
60
  * Route for one object. A bare uuid is treated as a file id (the pre-path
34
61
  * addressing form, which existing callers have stored); anything else is a
@@ -36,6 +63,41 @@ export declare class StorageBucket {
36
63
  */
37
64
  private objectPath;
38
65
  upload(path: string, file: UploadInput, options?: UploadOptions): Promise<MotherbaseResponse<UploadResult>>;
66
+ /**
67
+ * Upload several objects, a few at a time, reporting progress per file.
68
+ *
69
+ * Uploading a folder is the common case and `Promise.all` is the common
70
+ * mistake: a hundred parallel multipart posts saturate the connection, and
71
+ * the server rate limiter answers 429 to the tail of them. Four at a time
72
+ * finishes sooner in practice and fails less.
73
+ *
74
+ * One failing file does not cancel the rest. The result reports every entry
75
+ * in the order it was given, each with its own error or `null`, so the caller
76
+ * can retry exactly what failed.
77
+ *
78
+ * ponytail: progress is per file, not per byte. Byte-level progress needs
79
+ * XMLHttpRequest, which does not exist outside a browser; if a progress bar
80
+ * has to move within one large file, that is the upgrade path.
81
+ */
82
+ uploadMany(files: Array<{
83
+ path: string;
84
+ file: UploadInput;
85
+ options?: UploadOptions;
86
+ }>, options?: {
87
+ /** Uploads in flight at once. Default 4. */
88
+ concurrency?: number;
89
+ /** Called after each file settles, with how many have settled so far. */
90
+ onProgress?: (progress: {
91
+ completed: number;
92
+ total: number;
93
+ path: string;
94
+ error: string | null;
95
+ }) => void;
96
+ }): Promise<MotherbaseResponse<Array<{
97
+ path: string;
98
+ data: UploadResult | null;
99
+ error: string | null;
100
+ }>>>;
39
101
  download(path: string): Promise<MotherbaseResponse<Blob>>;
40
102
  remove(paths: string[]): Promise<MotherbaseResponse<StorageRemoveResponse[]>>;
41
103
  /** Objects under a prefix, in the Supabase response shape. */
@@ -48,25 +110,130 @@ export declare class StorageBucket {
48
110
  };
49
111
  /**
50
112
  * A download URL for the object, valid for `expiresIn` seconds (default 3600,
51
- * maximum 7 days — the AWS SigV4 ceiling; anything outside that is a `400`).
113
+ * maximum 7 days: the AWS SigV4 ceiling; anything outside that is a `400`).
52
114
  *
53
115
  * `expiresAt` reports when the URL actually stops working, and is `null` when
54
116
  * nothing expires: a public object's URL is permanent, and a private object on
55
117
  * the `local` storage driver resolves to the authenticated streaming endpoint,
56
118
  * which is bound to the session rather than to a clock and so cannot be handed
57
- * to a third party at all. Check it rather than assuming `expiresIn` applied —
119
+ * to a third party at all. Check it rather than assuming `expiresIn` applied,
58
120
  * that assumption is exactly what this used to get wrong, silently.
59
121
  */
60
122
  createSignedUrl(path: string, expiresIn?: number): Promise<MotherbaseResponse<{
61
123
  signedUrl: string;
62
124
  expiresAt: string | null;
63
125
  }>>;
126
+ /**
127
+ * Sign several objects in one call.
128
+ *
129
+ * There is no batch endpoint behind this: it signs each key and reports per
130
+ * entry, exactly as supabase-js does, so one missing object yields one entry
131
+ * with an `error` rather than failing the whole batch.
132
+ */
133
+ createSignedUrls(paths: string[], expiresIn?: number): Promise<MotherbaseResponse<Array<{
134
+ path: string;
135
+ signedUrl: string | null;
136
+ error: string | null;
137
+ }>>>;
138
+ /**
139
+ * Replace the object at `path`. In supabase-js `update` is `upload` with
140
+ * upsert forced on, and the same is true here.
141
+ */
142
+ update(path: string, file: UploadInput, options?: UploadOptions): Promise<MotherbaseResponse<UploadResult>>;
143
+ /** Copy an object to another key in this bucket. */
144
+ copy(from: string, to: string, options?: {
145
+ upsert?: boolean;
146
+ }): Promise<MotherbaseResponse<{
147
+ path: string;
148
+ }>>;
149
+ /** Move an object to another key in this bucket (copy, then delete the source). */
150
+ move(from: string, to: string, options?: {
151
+ upsert?: boolean;
152
+ }): Promise<MotherbaseResponse<{
153
+ path: string;
154
+ }>>;
155
+ private transfer;
156
+ /** One object's metadata, without downloading it. */
157
+ info(path: string): Promise<MotherbaseResponse<ObjectInfo>>;
158
+ /**
159
+ * Whether an object exists and this caller can read it.
160
+ *
161
+ * A 404 is the answer `false`, not a failure. Anything else (a 403, a network
162
+ * error) is reported as an error rather than as "no": treating an
163
+ * authorization failure as absence is how a UI ends up offering to create
164
+ * something that is already there.
165
+ */
166
+ exists(path: string): Promise<MotherbaseResponse<boolean>>;
167
+ /**
168
+ * Mint a URL the browser can PUT the bytes to directly, skipping this server.
169
+ *
170
+ * Unlike supabase-js this needs the file's `size` and content type up front:
171
+ * the upload is reserved against the bucket quota and the signature is bound
172
+ * to that exact length, which is what stops a signed URL from becoming an
173
+ * unbounded write. Pair it with `uploadToSignedUrl`.
174
+ *
175
+ * Requires the S3 driver; the local driver has no presigned uploads.
176
+ */
177
+ createSignedUploadUrl(path: string, options: {
178
+ size: number;
179
+ contentType?: string;
180
+ visibility?: FileVisibility;
181
+ }): Promise<MotherbaseResponse<{
182
+ signedUrl: string;
183
+ token: string;
184
+ path: string;
185
+ }>>;
186
+ /**
187
+ * Upload to a URL from `createSignedUploadUrl`: PUT the bytes to storage,
188
+ * then tell the server the object landed. The finalise step is what makes the
189
+ * row readable, so a PUT that succeeds and a finalise that fails leaves the
190
+ * reservation to expire rather than a half-visible object.
191
+ */
192
+ uploadToSignedUrl(path: string, token: string, file: Blob, options?: {
193
+ contentType?: string;
194
+ }): Promise<MotherbaseResponse<UploadResult>>;
64
195
  }
65
196
  /** Supabase-compatible storage client: `client.storage.from(bucket)`. */
66
197
  export declare class StorageClient {
67
198
  private readonly http;
68
199
  private readonly baseUrl;
69
- constructor(http: HttpClient, baseUrl: string);
200
+ private readonly fetchImpl;
201
+ constructor(http: HttpClient, baseUrl: string, fetchImpl: typeof fetch);
70
202
  from(bucket: string): StorageBucket;
203
+ /**
204
+ * Bucket administration, supabase-js shaped.
205
+ *
206
+ * Every method here needs a SECRET project API key, which is the same rule
207
+ * Supabase applies (bucket administration is a service-role operation). With
208
+ * a publishable key they resolve with a 401 error, so keep them in server
209
+ * code and setup scripts, never in a browser bundle.
210
+ */
211
+ listBuckets(): Promise<MotherbaseResponse<BucketInfo[]>>;
212
+ getBucket(id: string): Promise<MotherbaseResponse<BucketInfo>>;
213
+ createBucket(id: string, options?: {
214
+ public?: boolean;
215
+ name?: string;
216
+ }): Promise<MotherbaseResponse<BucketInfo>>;
217
+ updateBucket(id: string, options: {
218
+ public?: boolean;
219
+ name?: string;
220
+ }): Promise<MotherbaseResponse<BucketInfo>>;
221
+ /** Delete every object in the bucket, keeping the bucket itself. */
222
+ emptyBucket(id: string): Promise<MotherbaseResponse<{
223
+ emptied: boolean;
224
+ removed: number;
225
+ }>>;
226
+ /**
227
+ * Delete the bucket. A bucket that still holds objects is a `409` unless
228
+ * `force` is set, which queues a background deletion of its contents: an
229
+ * accidental `deleteBucket` must not be able to destroy a project's files in
230
+ * one unqualified call.
231
+ */
232
+ deleteBucket(id: string, options?: {
233
+ force?: boolean;
234
+ }): Promise<MotherbaseResponse<{
235
+ deleted: boolean;
236
+ }>>;
237
+ private bucketCall;
71
238
  }
72
239
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EAErB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC;CACpF;AAaD,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGjC;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAQZ,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IA0BtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IASzD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAqBnF,8DAA8D;IACxD,IAAI,CAAC,MAAM,SAAK,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC;IAoB7F,2FAA2F;IAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;IAS3D;;;;;;;;;;OAUG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAWhF;AAED,yEAAyE;AACzE,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAc,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAA1C,IAAI,EAAE,UAAU,EAAmB,OAAO,EAAE,MAAM;IAE/E,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;CAGpC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/dist/storage.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { toError } from './http.js';
2
2
  import { HTTP_ROUTES, contractPath } from '@motherbase/contracts';
3
+ /** Bucket administration lives one level up from an object route. */
4
+ const BUCKET_ROUTE = `${HTTP_ROUTES.files}/bucket`;
3
5
  /**
4
6
  * Supabase-compatible storage bucket handle over the authenticated
5
7
  * `/api/files` endpoints.
@@ -11,10 +13,13 @@ import { HTTP_ROUTES, contractPath } from '@motherbase/contracts';
11
13
  */
12
14
  const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
13
15
  export class StorageBucket {
14
- constructor(http, baseUrl, bucket) {
16
+ constructor(http, baseUrl, bucket,
17
+ /** Used only by `uploadToSignedUrl`, which PUTs straight to object storage. */
18
+ fetchImpl) {
15
19
  this.http = http;
16
20
  this.baseUrl = baseUrl;
17
21
  this.bucket = bucket;
22
+ this.fetchImpl = fetchImpl;
18
23
  }
19
24
  /**
20
25
  * Route for one object. A bare uuid is treated as a file id (the pre-path
@@ -23,6 +28,9 @@ export class StorageBucket {
23
28
  */
24
29
  objectPath(pathOrId, kind) {
25
30
  if (UUID.test(pathOrId)) {
31
+ if (kind === 'object-info') {
32
+ throw new Error('info() addresses objects by path. Pass the key you uploaded under, not a file id.');
33
+ }
26
34
  return contractPath.file(pathOrId, kind === 'object-url' ? 'url' : 'raw');
27
35
  }
28
36
  const key = pathOrId.split('/').map(encodeURIComponent).join('/');
@@ -32,7 +40,13 @@ export class StorageBucket {
32
40
  try {
33
41
  const form = new FormData();
34
42
  if (typeof Blob !== 'undefined' && file instanceof Blob) {
35
- form.append('file', file, path);
43
+ // `contentType` used to be documented as a hint and then dropped on the
44
+ // floor: the server reads the mime type off the multipart part, so the
45
+ // only way to honour it is to retype the blob. `slice()` with a type is
46
+ // the retyping that does not copy the bytes, which matters at upload
47
+ // sizes.
48
+ const body = options.contentType ? file.slice(0, file.size, options.contentType) : file;
49
+ form.append('file', body, path);
36
50
  }
37
51
  else {
38
52
  form.append('file', file);
@@ -57,6 +71,45 @@ export class StorageBucket {
57
71
  return { data: null, error: toError(err) };
58
72
  }
59
73
  }
74
+ /**
75
+ * Upload several objects, a few at a time, reporting progress per file.
76
+ *
77
+ * Uploading a folder is the common case and `Promise.all` is the common
78
+ * mistake: a hundred parallel multipart posts saturate the connection, and
79
+ * the server rate limiter answers 429 to the tail of them. Four at a time
80
+ * finishes sooner in practice and fails less.
81
+ *
82
+ * One failing file does not cancel the rest. The result reports every entry
83
+ * in the order it was given, each with its own error or `null`, so the caller
84
+ * can retry exactly what failed.
85
+ *
86
+ * ponytail: progress is per file, not per byte. Byte-level progress needs
87
+ * XMLHttpRequest, which does not exist outside a browser; if a progress bar
88
+ * has to move within one large file, that is the upgrade path.
89
+ */
90
+ async uploadMany(files, options = {}) {
91
+ const total = files.length;
92
+ const concurrency = Math.max(1, Math.min(options.concurrency ?? 4, total || 1));
93
+ const results = new Array(total);
94
+ let next = 0;
95
+ let completed = 0;
96
+ // A shared cursor rather than fixed slices: one slow file would otherwise
97
+ // hold up its whole slice while other workers sit idle.
98
+ const worker = async () => {
99
+ for (;;) {
100
+ const index = next++;
101
+ if (index >= total)
102
+ return;
103
+ const entry = files[index];
104
+ const { data, error } = await this.upload(entry.path, entry.file, entry.options);
105
+ results[index] = { path: entry.path, data: data ?? null, error: error?.message ?? null };
106
+ completed += 1;
107
+ options.onProgress?.({ completed, total, path: entry.path, error: error?.message ?? null });
108
+ }
109
+ };
110
+ await Promise.all(Array.from({ length: concurrency }, worker));
111
+ return { data: results, error: null };
112
+ }
60
113
  async download(path) {
61
114
  try {
62
115
  const res = await this.http.requestRaw(this.objectPath(path, 'object'));
@@ -115,13 +168,13 @@ export class StorageBucket {
115
168
  }
116
169
  /**
117
170
  * A download URL for the object, valid for `expiresIn` seconds (default 3600,
118
- * maximum 7 days — the AWS SigV4 ceiling; anything outside that is a `400`).
171
+ * maximum 7 days: the AWS SigV4 ceiling; anything outside that is a `400`).
119
172
  *
120
173
  * `expiresAt` reports when the URL actually stops working, and is `null` when
121
174
  * nothing expires: a public object's URL is permanent, and a private object on
122
175
  * the `local` storage driver resolves to the authenticated streaming endpoint,
123
176
  * which is bound to the session rather than to a clock and so cannot be handed
124
- * to a third party at all. Check it rather than assuming `expiresIn` applied —
177
+ * to a third party at all. Check it rather than assuming `expiresIn` applied,
125
178
  * that assumption is exactly what this used to get wrong, silently.
126
179
  */
127
180
  async createSignedUrl(path, expiresIn) {
@@ -134,15 +187,205 @@ export class StorageBucket {
134
187
  return { data: null, error: toError(err) };
135
188
  }
136
189
  }
190
+ /**
191
+ * Sign several objects in one call.
192
+ *
193
+ * There is no batch endpoint behind this: it signs each key and reports per
194
+ * entry, exactly as supabase-js does, so one missing object yields one entry
195
+ * with an `error` rather than failing the whole batch.
196
+ */
197
+ async createSignedUrls(paths, expiresIn) {
198
+ const results = await Promise.all(paths.map(async (path) => {
199
+ const { data, error } = await this.createSignedUrl(path, expiresIn);
200
+ return { path, signedUrl: data?.signedUrl ?? null, error: error?.message ?? null };
201
+ }));
202
+ return { data: results, error: null };
203
+ }
204
+ /**
205
+ * Replace the object at `path`. In supabase-js `update` is `upload` with
206
+ * upsert forced on, and the same is true here.
207
+ */
208
+ async update(path, file, options = {}) {
209
+ return this.upload(path, file, { ...options, upsert: true });
210
+ }
211
+ /** Copy an object to another key in this bucket. */
212
+ async copy(from, to, options = {}) {
213
+ return this.transfer('copy', from, to, options);
214
+ }
215
+ /** Move an object to another key in this bucket (copy, then delete the source). */
216
+ async move(from, to, options = {}) {
217
+ return this.transfer('move', from, to, options);
218
+ }
219
+ async transfer(action, from, to, options) {
220
+ try {
221
+ const res = await this.http.request(`${HTTP_ROUTES.files}/${action}`, { method: 'POST', body: { bucket: this.bucket, from, to, upsert: options.upsert === true } });
222
+ return { data: { path: res.fullPath ?? `${this.bucket}/${to}` }, error: null };
223
+ }
224
+ catch (err) {
225
+ return { data: null, error: toError(err) };
226
+ }
227
+ }
228
+ /** One object's metadata, without downloading it. */
229
+ async info(path) {
230
+ try {
231
+ const res = await this.http.request(this.objectPath(path, 'object-info'));
232
+ return { data: res, error: null };
233
+ }
234
+ catch (err) {
235
+ return { data: null, error: toError(err) };
236
+ }
237
+ }
238
+ /**
239
+ * Whether an object exists and this caller can read it.
240
+ *
241
+ * A 404 is the answer `false`, not a failure. Anything else (a 403, a network
242
+ * error) is reported as an error rather than as "no": treating an
243
+ * authorization failure as absence is how a UI ends up offering to create
244
+ * something that is already there.
245
+ */
246
+ async exists(path) {
247
+ const { data, error } = await this.info(path);
248
+ if (data)
249
+ return { data: true, error: null };
250
+ if (error?.status === 404)
251
+ return { data: false, error: null };
252
+ return { data: null, error: error ?? { message: 'Unknown storage error' } };
253
+ }
254
+ /**
255
+ * Mint a URL the browser can PUT the bytes to directly, skipping this server.
256
+ *
257
+ * Unlike supabase-js this needs the file's `size` and content type up front:
258
+ * the upload is reserved against the bucket quota and the signature is bound
259
+ * to that exact length, which is what stops a signed URL from becoming an
260
+ * unbounded write. Pair it with `uploadToSignedUrl`.
261
+ *
262
+ * Requires the S3 driver; the local driver has no presigned uploads.
263
+ */
264
+ async createSignedUploadUrl(path, options) {
265
+ try {
266
+ const res = await this.http.request(`${HTTP_ROUTES.files}/presign`, {
267
+ method: 'POST',
268
+ body: {
269
+ bucket: this.bucket,
270
+ path,
271
+ size: options.size,
272
+ mime: options.contentType,
273
+ visibility: options.visibility,
274
+ },
275
+ });
276
+ // supabase-js's `token` is opaque to the caller and is handed straight
277
+ // back to uploadToSignedUrl, so it carries what finalisation needs.
278
+ const token = JSON.stringify({ url: res.uploadUrl, id: res.file.id });
279
+ return { data: { signedUrl: res.uploadUrl, token, path }, error: null };
280
+ }
281
+ catch (err) {
282
+ return { data: null, error: toError(err) };
283
+ }
284
+ }
285
+ /**
286
+ * Upload to a URL from `createSignedUploadUrl`: PUT the bytes to storage,
287
+ * then tell the server the object landed. The finalise step is what makes the
288
+ * row readable, so a PUT that succeeds and a finalise that fails leaves the
289
+ * reservation to expire rather than a half-visible object.
290
+ */
291
+ async uploadToSignedUrl(path, token, file, options = {}) {
292
+ let parsed;
293
+ try {
294
+ parsed = JSON.parse(token);
295
+ }
296
+ catch {
297
+ return { data: null, error: { message: 'Invalid upload token. Use the token from createSignedUploadUrl().' } };
298
+ }
299
+ if (!parsed.url || !parsed.id) {
300
+ return { data: null, error: { message: 'Invalid upload token. Use the token from createSignedUploadUrl().' } };
301
+ }
302
+ try {
303
+ const put = await this.fetchImpl(parsed.url, {
304
+ method: 'PUT',
305
+ body: file,
306
+ headers: { 'Content-Type': options.contentType ?? file.type ?? 'application/octet-stream' },
307
+ });
308
+ if (!put.ok) {
309
+ return { data: null, error: { message: `Upload failed with status ${put.status}`, status: put.status } };
310
+ }
311
+ await this.http.request(`${contractPath.file(parsed.id)}/finalize`, { method: 'POST' });
312
+ return { data: { path, id: parsed.id, fullPath: `${this.bucket}/${path}` }, error: null };
313
+ }
314
+ catch (err) {
315
+ return { data: null, error: toError(err) };
316
+ }
317
+ }
137
318
  }
138
319
  /** Supabase-compatible storage client: `client.storage.from(bucket)`. */
139
320
  export class StorageClient {
140
- constructor(http, baseUrl) {
321
+ constructor(http, baseUrl, fetchImpl) {
141
322
  this.http = http;
142
323
  this.baseUrl = baseUrl;
324
+ this.fetchImpl = fetchImpl;
143
325
  }
144
326
  from(bucket) {
145
- return new StorageBucket(this.http, this.baseUrl, bucket);
327
+ return new StorageBucket(this.http, this.baseUrl, bucket, this.fetchImpl);
328
+ }
329
+ /**
330
+ * Bucket administration, supabase-js shaped.
331
+ *
332
+ * Every method here needs a SECRET project API key, which is the same rule
333
+ * Supabase applies (bucket administration is a service-role operation). With
334
+ * a publishable key they resolve with a 401 error, so keep them in server
335
+ * code and setup scripts, never in a browser bundle.
336
+ */
337
+ async listBuckets() {
338
+ try {
339
+ const res = await this.http.request(BUCKET_ROUTE);
340
+ return { data: res.buckets, error: null };
341
+ }
342
+ catch (err) {
343
+ return { data: null, error: toError(err) };
344
+ }
345
+ }
346
+ async getBucket(id) {
347
+ return this.bucketCall(`${BUCKET_ROUTE}/${encodeURIComponent(id)}`);
348
+ }
349
+ async createBucket(id, options = {}) {
350
+ return this.bucketCall(BUCKET_ROUTE, 'POST', { id, name: options.name, public: options.public === true });
351
+ }
352
+ async updateBucket(id, options) {
353
+ return this.bucketCall(`${BUCKET_ROUTE}/${encodeURIComponent(id)}`, 'PUT', options);
354
+ }
355
+ /** Delete every object in the bucket, keeping the bucket itself. */
356
+ async emptyBucket(id) {
357
+ try {
358
+ const res = await this.http.request(`${BUCKET_ROUTE}/${encodeURIComponent(id)}/empty`, { method: 'POST' });
359
+ return { data: res, error: null };
360
+ }
361
+ catch (err) {
362
+ return { data: null, error: toError(err) };
363
+ }
364
+ }
365
+ /**
366
+ * Delete the bucket. A bucket that still holds objects is a `409` unless
367
+ * `force` is set, which queues a background deletion of its contents: an
368
+ * accidental `deleteBucket` must not be able to destroy a project's files in
369
+ * one unqualified call.
370
+ */
371
+ async deleteBucket(id, options = {}) {
372
+ try {
373
+ const query = options.force ? '?force=true' : '';
374
+ const res = await this.http.request(`${BUCKET_ROUTE}/${encodeURIComponent(id)}${query}`, { method: 'DELETE' });
375
+ return { data: res, error: null };
376
+ }
377
+ catch (err) {
378
+ return { data: null, error: toError(err) };
379
+ }
380
+ }
381
+ async bucketCall(path, method = 'GET', body) {
382
+ try {
383
+ const res = await this.http.request(path, { method, body });
384
+ return { data: res, error: null };
385
+ }
386
+ catch (err) {
387
+ return { data: null, error: toError(err) };
388
+ }
146
389
  }
147
390
  }
148
391
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Test-only client: run a query as a specific user, or as nobody.
3
+ *
4
+ * A row level security policy is a claim about who can see what, and the only
5
+ * honest way to check it is to issue the same query as several callers and
6
+ * compare the results. Without this, doing that in a test means creating users
7
+ * and signing in as each of them through the real auth flow, which is slow
8
+ * enough that most policies end up untested and wrong.
9
+ *
10
+ * ```ts
11
+ * const asAlice = createTestClient(url, secretKey, { as: alice.id })
12
+ * const asBob = createTestClient(url, secretKey, { as: bob.id })
13
+ * const asAnon = createTestClient(url, secretKey, { as: 'anon' })
14
+ *
15
+ * expect((await asAlice.from('notes').select('*')).data).toHaveLength(1)
16
+ * expect((await asBob.from('notes').select('*')).data).toHaveLength(0)
17
+ * ```
18
+ *
19
+ * This is a server-side tool. It needs the project's SECRET key, which bypasses
20
+ * RLS and must never reach a browser, so importing this module from application
21
+ * code is a mistake even though nothing here can stop you. The server refuses
22
+ * the impersonation header outright when the key is anything else, so the worst
23
+ * case is a failed request rather than a privilege escalation.
24
+ */
25
+ import { MotherbaseClient } from './index.js';
26
+ import type { ClientOptions } from './types.js';
27
+ import type { GenericDatabase, GenericSchema, DefaultSchemaName, SchemaOf } from './database.js';
28
+ /** The header the server reads. Exported so a raw fetch can do the same thing. */
29
+ export declare const IMPERSONATE_HEADER = "x-motherbase-impersonate";
30
+ export interface TestClientOptions extends ClientOptions {
31
+ /**
32
+ * Who to run as: a user id, `'anon'` for a signed-out visitor, or
33
+ * `'service_role'` to keep the secret key's own bypass-everything identity.
34
+ */
35
+ as: string;
36
+ }
37
+ export declare function createTestClient<Database = GenericDatabase, SchemaName = DefaultSchemaName<Database>, Schema extends GenericSchema = SchemaOf<Database, SchemaName>>(url: string, secretKey: string, options: TestClientOptions): MotherbaseClient<Database, SchemaName, Schema>;
38
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAgB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEjG,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,GAAG,eAAe,EAC1B,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EACxC,MAAM,SAAS,aAAa,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,EAE7D,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAuBhD"}