@supabase/storage-js 2.86.2 → 2.87.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.
- package/dist/main/lib/version.d.ts +1 -1
- package/dist/main/lib/version.js +1 -1
- package/dist/main/packages/StorageAnalyticsClient.d.ts +37 -38
- package/dist/main/packages/StorageAnalyticsClient.d.ts.map +1 -1
- package/dist/main/packages/StorageAnalyticsClient.js +47 -37
- package/dist/main/packages/StorageAnalyticsClient.js.map +1 -1
- package/dist/module/lib/version.d.ts +1 -1
- package/dist/module/lib/version.js +1 -1
- package/dist/module/packages/StorageAnalyticsClient.d.ts +37 -38
- package/dist/module/packages/StorageAnalyticsClient.d.ts.map +1 -1
- package/dist/module/packages/StorageAnalyticsClient.js +47 -37
- package/dist/module/packages/StorageAnalyticsClient.js.map +1 -1
- package/dist/tsconfig.module.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/umd/supabase.js +1 -1
- package/package.json +2 -2
- package/src/lib/version.ts +1 -1
- package/src/packages/StorageAnalyticsClient.ts +60 -39
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "2.
|
|
1
|
+
export declare const version = "2.87.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/main/lib/version.js
CHANGED
|
@@ -7,5 +7,5 @@ exports.version = void 0;
|
|
|
7
7
|
// - Debugging and support (identifying which version is running)
|
|
8
8
|
// - Telemetry and logging (version reporting in errors/analytics)
|
|
9
9
|
// - Ensuring build artifacts match the published package version
|
|
10
|
-
exports.version = '2.
|
|
10
|
+
exports.version = '2.87.0';
|
|
11
11
|
//# sourceMappingURL=version.js.map
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
import { IcebergRestCatalog } from 'iceberg-js';
|
|
1
|
+
import { IcebergRestCatalog, IcebergError } from 'iceberg-js';
|
|
2
2
|
import { StorageError } from '../lib/errors';
|
|
3
3
|
import { Fetch } from '../lib/fetch';
|
|
4
4
|
import { AnalyticBucket } from '../lib/types';
|
|
5
|
+
type WrapAsyncMethod<T> = T extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<{
|
|
6
|
+
data: R;
|
|
7
|
+
error: null;
|
|
8
|
+
} | {
|
|
9
|
+
data: null;
|
|
10
|
+
error: IcebergError;
|
|
11
|
+
}> : T;
|
|
12
|
+
export type WrappedIcebergRestCatalog = {
|
|
13
|
+
[K in keyof IcebergRestCatalog]: WrapAsyncMethod<IcebergRestCatalog[K]>;
|
|
14
|
+
};
|
|
5
15
|
/**
|
|
6
16
|
* Client class for managing Analytics Buckets using Iceberg tables
|
|
7
17
|
* Provides methods for creating, listing, and deleting analytics buckets
|
|
@@ -191,12 +201,14 @@ export default class StorageAnalyticsClient {
|
|
|
191
201
|
* Get an Iceberg REST Catalog client configured for a specific analytics bucket
|
|
192
202
|
* Use this to perform advanced table and namespace operations within the bucket
|
|
193
203
|
* The returned client provides full access to the Apache Iceberg REST Catalog API
|
|
204
|
+
* with the Supabase `{ data, error }` pattern for consistent error handling on all operations.
|
|
194
205
|
*
|
|
195
206
|
* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.
|
|
196
207
|
*
|
|
197
208
|
* @category Analytics Buckets
|
|
198
209
|
* @param bucketName - The name of the analytics bucket (warehouse) to connect to
|
|
199
|
-
* @returns
|
|
210
|
+
* @returns The wrapped Iceberg catalog client
|
|
211
|
+
* @throws {StorageError} If the bucket name is invalid
|
|
200
212
|
*
|
|
201
213
|
* @example Get catalog and create table
|
|
202
214
|
* ```js
|
|
@@ -210,10 +222,10 @@ export default class StorageAnalyticsClient {
|
|
|
210
222
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
211
223
|
*
|
|
212
224
|
* // Create a namespace
|
|
213
|
-
* await catalog.createNamespace({ namespace: ['default'] })
|
|
225
|
+
* const { error: nsError } = await catalog.createNamespace({ namespace: ['default'] })
|
|
214
226
|
*
|
|
215
227
|
* // Create a table with schema
|
|
216
|
-
* await catalog.createTable(
|
|
228
|
+
* const { data: tableMetadata, error: tableError } = await catalog.createTable(
|
|
217
229
|
* { namespace: ['default'] },
|
|
218
230
|
* {
|
|
219
231
|
* name: 'events',
|
|
@@ -247,7 +259,13 @@ export default class StorageAnalyticsClient {
|
|
|
247
259
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
248
260
|
*
|
|
249
261
|
* // List all tables in the default namespace
|
|
250
|
-
* const tables = await catalog.listTables({ namespace: ['default'] })
|
|
262
|
+
* const { data: tables, error: listError } = await catalog.listTables({ namespace: ['default'] })
|
|
263
|
+
* if (listError) {
|
|
264
|
+
* if (listError.isNotFound()) {
|
|
265
|
+
* console.log('Namespace not found')
|
|
266
|
+
* }
|
|
267
|
+
* return
|
|
268
|
+
* }
|
|
251
269
|
* console.log(tables) // [{ namespace: ['default'], name: 'events' }]
|
|
252
270
|
* ```
|
|
253
271
|
*
|
|
@@ -256,7 +274,7 @@ export default class StorageAnalyticsClient {
|
|
|
256
274
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
257
275
|
*
|
|
258
276
|
* // List all namespaces
|
|
259
|
-
* const namespaces = await catalog.listNamespaces()
|
|
277
|
+
* const { data: namespaces } = await catalog.listNamespaces()
|
|
260
278
|
*
|
|
261
279
|
* // Create namespace with properties
|
|
262
280
|
* await catalog.createNamespace(
|
|
@@ -270,56 +288,37 @@ export default class StorageAnalyticsClient {
|
|
|
270
288
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
271
289
|
*
|
|
272
290
|
* // Drop table with purge option (removes all data)
|
|
273
|
-
* await catalog.dropTable(
|
|
291
|
+
* const { error: dropError } = await catalog.dropTable(
|
|
274
292
|
* { namespace: ['default'], name: 'events' },
|
|
275
293
|
* { purge: true }
|
|
276
294
|
* )
|
|
277
295
|
*
|
|
296
|
+
* if (dropError?.isNotFound()) {
|
|
297
|
+
* console.log('Table does not exist')
|
|
298
|
+
* }
|
|
299
|
+
*
|
|
278
300
|
* // Drop namespace (must be empty)
|
|
279
301
|
* await catalog.dropNamespace({ namespace: ['default'] })
|
|
280
302
|
* ```
|
|
281
303
|
*
|
|
282
|
-
* @example Error handling with catalog operations
|
|
283
|
-
* ```js
|
|
284
|
-
* import { IcebergError } from 'iceberg-js'
|
|
285
|
-
*
|
|
286
|
-
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
287
|
-
*
|
|
288
|
-
* try {
|
|
289
|
-
* await catalog.dropTable({ namespace: ['default'], name: 'events' }, { purge: true })
|
|
290
|
-
* } catch (error) {
|
|
291
|
-
* // Handle 404 errors (resource not found)
|
|
292
|
-
* const is404 =
|
|
293
|
-
* (error instanceof IcebergError && error.status === 404) ||
|
|
294
|
-
* error?.status === 404 ||
|
|
295
|
-
* error?.details?.error?.code === 404
|
|
296
|
-
*
|
|
297
|
-
* if (is404) {
|
|
298
|
-
* console.log('Table does not exist')
|
|
299
|
-
* } else {
|
|
300
|
-
* throw error // Re-throw other errors
|
|
301
|
-
* }
|
|
302
|
-
* }
|
|
303
|
-
* ```
|
|
304
|
-
*
|
|
305
304
|
* @remarks
|
|
306
305
|
* This method provides a bridge between Supabase's bucket management and the standard
|
|
307
306
|
* Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.
|
|
308
307
|
* All authentication and configuration is handled automatically using your Supabase credentials.
|
|
309
308
|
*
|
|
310
|
-
* **Error Handling**:
|
|
311
|
-
*
|
|
309
|
+
* **Error Handling**: Invalid bucket names throw immediately. All catalog
|
|
310
|
+
* operations return `{ data, error }` where errors are `IcebergError` instances from iceberg-js.
|
|
311
|
+
* Use helper methods like `error.isNotFound()` or check `error.status` for specific error handling.
|
|
312
|
+
* Use `.throwOnError()` on the analytics client if you prefer exceptions for catalog operations.
|
|
312
313
|
*
|
|
313
314
|
* **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently
|
|
314
315
|
* deletes all table data. Without it, the table is marked as deleted but data remains.
|
|
315
316
|
*
|
|
316
|
-
* **Library Dependency**: The returned catalog
|
|
317
|
-
*
|
|
317
|
+
* **Library Dependency**: The returned catalog wraps `IcebergRestCatalog` from iceberg-js.
|
|
318
|
+
* For complete API documentation and advanced usage, refer to the
|
|
318
319
|
* [iceberg-js documentation](https://supabase.github.io/iceberg-js/).
|
|
319
|
-
*
|
|
320
|
-
* For advanced Iceberg operations beyond bucket management, you can also install and use
|
|
321
|
-
* the `iceberg-js` package directly with manual configuration.
|
|
322
320
|
*/
|
|
323
|
-
from(bucketName: string):
|
|
321
|
+
from(bucketName: string): WrappedIcebergRestCatalog;
|
|
324
322
|
}
|
|
323
|
+
export {};
|
|
325
324
|
//# sourceMappingURL=StorageAnalyticsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageAnalyticsClient.d.ts","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"StorageAnalyticsClient.d.ts","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -231,12 +231,14 @@ class StorageAnalyticsClient {
|
|
|
231
231
|
* Get an Iceberg REST Catalog client configured for a specific analytics bucket
|
|
232
232
|
* Use this to perform advanced table and namespace operations within the bucket
|
|
233
233
|
* The returned client provides full access to the Apache Iceberg REST Catalog API
|
|
234
|
+
* with the Supabase `{ data, error }` pattern for consistent error handling on all operations.
|
|
234
235
|
*
|
|
235
236
|
* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.
|
|
236
237
|
*
|
|
237
238
|
* @category Analytics Buckets
|
|
238
239
|
* @param bucketName - The name of the analytics bucket (warehouse) to connect to
|
|
239
|
-
* @returns
|
|
240
|
+
* @returns The wrapped Iceberg catalog client
|
|
241
|
+
* @throws {StorageError} If the bucket name is invalid
|
|
240
242
|
*
|
|
241
243
|
* @example Get catalog and create table
|
|
242
244
|
* ```js
|
|
@@ -250,10 +252,10 @@ class StorageAnalyticsClient {
|
|
|
250
252
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
251
253
|
*
|
|
252
254
|
* // Create a namespace
|
|
253
|
-
* await catalog.createNamespace({ namespace: ['default'] })
|
|
255
|
+
* const { error: nsError } = await catalog.createNamespace({ namespace: ['default'] })
|
|
254
256
|
*
|
|
255
257
|
* // Create a table with schema
|
|
256
|
-
* await catalog.createTable(
|
|
258
|
+
* const { data: tableMetadata, error: tableError } = await catalog.createTable(
|
|
257
259
|
* { namespace: ['default'] },
|
|
258
260
|
* {
|
|
259
261
|
* name: 'events',
|
|
@@ -287,7 +289,13 @@ class StorageAnalyticsClient {
|
|
|
287
289
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
288
290
|
*
|
|
289
291
|
* // List all tables in the default namespace
|
|
290
|
-
* const tables = await catalog.listTables({ namespace: ['default'] })
|
|
292
|
+
* const { data: tables, error: listError } = await catalog.listTables({ namespace: ['default'] })
|
|
293
|
+
* if (listError) {
|
|
294
|
+
* if (listError.isNotFound()) {
|
|
295
|
+
* console.log('Namespace not found')
|
|
296
|
+
* }
|
|
297
|
+
* return
|
|
298
|
+
* }
|
|
291
299
|
* console.log(tables) // [{ namespace: ['default'], name: 'events' }]
|
|
292
300
|
* ```
|
|
293
301
|
*
|
|
@@ -296,7 +304,7 @@ class StorageAnalyticsClient {
|
|
|
296
304
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
297
305
|
*
|
|
298
306
|
* // List all namespaces
|
|
299
|
-
* const namespaces = await catalog.listNamespaces()
|
|
307
|
+
* const { data: namespaces } = await catalog.listNamespaces()
|
|
300
308
|
*
|
|
301
309
|
* // Create namespace with properties
|
|
302
310
|
* await catalog.createNamespace(
|
|
@@ -310,55 +318,35 @@ class StorageAnalyticsClient {
|
|
|
310
318
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
311
319
|
*
|
|
312
320
|
* // Drop table with purge option (removes all data)
|
|
313
|
-
* await catalog.dropTable(
|
|
321
|
+
* const { error: dropError } = await catalog.dropTable(
|
|
314
322
|
* { namespace: ['default'], name: 'events' },
|
|
315
323
|
* { purge: true }
|
|
316
324
|
* )
|
|
317
325
|
*
|
|
326
|
+
* if (dropError?.isNotFound()) {
|
|
327
|
+
* console.log('Table does not exist')
|
|
328
|
+
* }
|
|
329
|
+
*
|
|
318
330
|
* // Drop namespace (must be empty)
|
|
319
331
|
* await catalog.dropNamespace({ namespace: ['default'] })
|
|
320
332
|
* ```
|
|
321
333
|
*
|
|
322
|
-
* @example Error handling with catalog operations
|
|
323
|
-
* ```js
|
|
324
|
-
* import { IcebergError } from 'iceberg-js'
|
|
325
|
-
*
|
|
326
|
-
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
327
|
-
*
|
|
328
|
-
* try {
|
|
329
|
-
* await catalog.dropTable({ namespace: ['default'], name: 'events' }, { purge: true })
|
|
330
|
-
* } catch (error) {
|
|
331
|
-
* // Handle 404 errors (resource not found)
|
|
332
|
-
* const is404 =
|
|
333
|
-
* (error instanceof IcebergError && error.status === 404) ||
|
|
334
|
-
* error?.status === 404 ||
|
|
335
|
-
* error?.details?.error?.code === 404
|
|
336
|
-
*
|
|
337
|
-
* if (is404) {
|
|
338
|
-
* console.log('Table does not exist')
|
|
339
|
-
* } else {
|
|
340
|
-
* throw error // Re-throw other errors
|
|
341
|
-
* }
|
|
342
|
-
* }
|
|
343
|
-
* ```
|
|
344
|
-
*
|
|
345
334
|
* @remarks
|
|
346
335
|
* This method provides a bridge between Supabase's bucket management and the standard
|
|
347
336
|
* Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.
|
|
348
337
|
* All authentication and configuration is handled automatically using your Supabase credentials.
|
|
349
338
|
*
|
|
350
|
-
* **Error Handling**:
|
|
351
|
-
*
|
|
339
|
+
* **Error Handling**: Invalid bucket names throw immediately. All catalog
|
|
340
|
+
* operations return `{ data, error }` where errors are `IcebergError` instances from iceberg-js.
|
|
341
|
+
* Use helper methods like `error.isNotFound()` or check `error.status` for specific error handling.
|
|
342
|
+
* Use `.throwOnError()` on the analytics client if you prefer exceptions for catalog operations.
|
|
352
343
|
*
|
|
353
344
|
* **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently
|
|
354
345
|
* deletes all table data. Without it, the table is marked as deleted but data remains.
|
|
355
346
|
*
|
|
356
|
-
* **Library Dependency**: The returned catalog
|
|
357
|
-
*
|
|
347
|
+
* **Library Dependency**: The returned catalog wraps `IcebergRestCatalog` from iceberg-js.
|
|
348
|
+
* For complete API documentation and advanced usage, refer to the
|
|
358
349
|
* [iceberg-js documentation](https://supabase.github.io/iceberg-js/).
|
|
359
|
-
*
|
|
360
|
-
* For advanced Iceberg operations beyond bucket management, you can also install and use
|
|
361
|
-
* the `iceberg-js` package directly with manual configuration.
|
|
362
350
|
*/
|
|
363
351
|
from(bucketName) {
|
|
364
352
|
// Validate bucket name using same rules as Supabase Storage API backend
|
|
@@ -370,7 +358,7 @@ class StorageAnalyticsClient {
|
|
|
370
358
|
// The base URL is /storage/v1/iceberg
|
|
371
359
|
// Note: IcebergRestCatalog from iceberg-js automatically adds /v1/ prefix to API paths
|
|
372
360
|
// so we should NOT append /v1 here (it would cause double /v1/v1/ in the URL)
|
|
373
|
-
|
|
361
|
+
const catalog = new iceberg_js_1.IcebergRestCatalog({
|
|
374
362
|
baseUrl: this.url,
|
|
375
363
|
catalogName: bucketName, // Maps to the warehouse parameter in Supabase's implementation
|
|
376
364
|
auth: {
|
|
@@ -379,6 +367,28 @@ class StorageAnalyticsClient {
|
|
|
379
367
|
},
|
|
380
368
|
fetch: this.fetch,
|
|
381
369
|
});
|
|
370
|
+
const shouldThrowOnError = this.shouldThrowOnError;
|
|
371
|
+
const wrappedCatalog = new Proxy(catalog, {
|
|
372
|
+
get(target, prop) {
|
|
373
|
+
const value = target[prop];
|
|
374
|
+
if (typeof value !== 'function') {
|
|
375
|
+
return value;
|
|
376
|
+
}
|
|
377
|
+
return (...args) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
378
|
+
try {
|
|
379
|
+
const data = yield value.apply(target, args);
|
|
380
|
+
return { data, error: null };
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
if (shouldThrowOnError) {
|
|
384
|
+
throw error;
|
|
385
|
+
}
|
|
386
|
+
return { data: null, error: error };
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
return wrappedCatalog;
|
|
382
392
|
}
|
|
383
393
|
}
|
|
384
394
|
exports.default = StorageAnalyticsClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageAnalyticsClient.js","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"StorageAnalyticsClient.js","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "2.
|
|
1
|
+
export declare const version = "2.87.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
// - Debugging and support (identifying which version is running)
|
|
5
5
|
// - Telemetry and logging (version reporting in errors/analytics)
|
|
6
6
|
// - Ensuring build artifacts match the published package version
|
|
7
|
-
export const version = '2.
|
|
7
|
+
export const version = '2.87.0';
|
|
8
8
|
//# sourceMappingURL=version.js.map
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
import { IcebergRestCatalog } from 'iceberg-js';
|
|
1
|
+
import { IcebergRestCatalog, IcebergError } from 'iceberg-js';
|
|
2
2
|
import { StorageError } from '../lib/errors';
|
|
3
3
|
import { Fetch } from '../lib/fetch';
|
|
4
4
|
import { AnalyticBucket } from '../lib/types';
|
|
5
|
+
type WrapAsyncMethod<T> = T extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<{
|
|
6
|
+
data: R;
|
|
7
|
+
error: null;
|
|
8
|
+
} | {
|
|
9
|
+
data: null;
|
|
10
|
+
error: IcebergError;
|
|
11
|
+
}> : T;
|
|
12
|
+
export type WrappedIcebergRestCatalog = {
|
|
13
|
+
[K in keyof IcebergRestCatalog]: WrapAsyncMethod<IcebergRestCatalog[K]>;
|
|
14
|
+
};
|
|
5
15
|
/**
|
|
6
16
|
* Client class for managing Analytics Buckets using Iceberg tables
|
|
7
17
|
* Provides methods for creating, listing, and deleting analytics buckets
|
|
@@ -191,12 +201,14 @@ export default class StorageAnalyticsClient {
|
|
|
191
201
|
* Get an Iceberg REST Catalog client configured for a specific analytics bucket
|
|
192
202
|
* Use this to perform advanced table and namespace operations within the bucket
|
|
193
203
|
* The returned client provides full access to the Apache Iceberg REST Catalog API
|
|
204
|
+
* with the Supabase `{ data, error }` pattern for consistent error handling on all operations.
|
|
194
205
|
*
|
|
195
206
|
* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.
|
|
196
207
|
*
|
|
197
208
|
* @category Analytics Buckets
|
|
198
209
|
* @param bucketName - The name of the analytics bucket (warehouse) to connect to
|
|
199
|
-
* @returns
|
|
210
|
+
* @returns The wrapped Iceberg catalog client
|
|
211
|
+
* @throws {StorageError} If the bucket name is invalid
|
|
200
212
|
*
|
|
201
213
|
* @example Get catalog and create table
|
|
202
214
|
* ```js
|
|
@@ -210,10 +222,10 @@ export default class StorageAnalyticsClient {
|
|
|
210
222
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
211
223
|
*
|
|
212
224
|
* // Create a namespace
|
|
213
|
-
* await catalog.createNamespace({ namespace: ['default'] })
|
|
225
|
+
* const { error: nsError } = await catalog.createNamespace({ namespace: ['default'] })
|
|
214
226
|
*
|
|
215
227
|
* // Create a table with schema
|
|
216
|
-
* await catalog.createTable(
|
|
228
|
+
* const { data: tableMetadata, error: tableError } = await catalog.createTable(
|
|
217
229
|
* { namespace: ['default'] },
|
|
218
230
|
* {
|
|
219
231
|
* name: 'events',
|
|
@@ -247,7 +259,13 @@ export default class StorageAnalyticsClient {
|
|
|
247
259
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
248
260
|
*
|
|
249
261
|
* // List all tables in the default namespace
|
|
250
|
-
* const tables = await catalog.listTables({ namespace: ['default'] })
|
|
262
|
+
* const { data: tables, error: listError } = await catalog.listTables({ namespace: ['default'] })
|
|
263
|
+
* if (listError) {
|
|
264
|
+
* if (listError.isNotFound()) {
|
|
265
|
+
* console.log('Namespace not found')
|
|
266
|
+
* }
|
|
267
|
+
* return
|
|
268
|
+
* }
|
|
251
269
|
* console.log(tables) // [{ namespace: ['default'], name: 'events' }]
|
|
252
270
|
* ```
|
|
253
271
|
*
|
|
@@ -256,7 +274,7 @@ export default class StorageAnalyticsClient {
|
|
|
256
274
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
257
275
|
*
|
|
258
276
|
* // List all namespaces
|
|
259
|
-
* const namespaces = await catalog.listNamespaces()
|
|
277
|
+
* const { data: namespaces } = await catalog.listNamespaces()
|
|
260
278
|
*
|
|
261
279
|
* // Create namespace with properties
|
|
262
280
|
* await catalog.createNamespace(
|
|
@@ -270,56 +288,37 @@ export default class StorageAnalyticsClient {
|
|
|
270
288
|
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
271
289
|
*
|
|
272
290
|
* // Drop table with purge option (removes all data)
|
|
273
|
-
* await catalog.dropTable(
|
|
291
|
+
* const { error: dropError } = await catalog.dropTable(
|
|
274
292
|
* { namespace: ['default'], name: 'events' },
|
|
275
293
|
* { purge: true }
|
|
276
294
|
* )
|
|
277
295
|
*
|
|
296
|
+
* if (dropError?.isNotFound()) {
|
|
297
|
+
* console.log('Table does not exist')
|
|
298
|
+
* }
|
|
299
|
+
*
|
|
278
300
|
* // Drop namespace (must be empty)
|
|
279
301
|
* await catalog.dropNamespace({ namespace: ['default'] })
|
|
280
302
|
* ```
|
|
281
303
|
*
|
|
282
|
-
* @example Error handling with catalog operations
|
|
283
|
-
* ```js
|
|
284
|
-
* import { IcebergError } from 'iceberg-js'
|
|
285
|
-
*
|
|
286
|
-
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
287
|
-
*
|
|
288
|
-
* try {
|
|
289
|
-
* await catalog.dropTable({ namespace: ['default'], name: 'events' }, { purge: true })
|
|
290
|
-
* } catch (error) {
|
|
291
|
-
* // Handle 404 errors (resource not found)
|
|
292
|
-
* const is404 =
|
|
293
|
-
* (error instanceof IcebergError && error.status === 404) ||
|
|
294
|
-
* error?.status === 404 ||
|
|
295
|
-
* error?.details?.error?.code === 404
|
|
296
|
-
*
|
|
297
|
-
* if (is404) {
|
|
298
|
-
* console.log('Table does not exist')
|
|
299
|
-
* } else {
|
|
300
|
-
* throw error // Re-throw other errors
|
|
301
|
-
* }
|
|
302
|
-
* }
|
|
303
|
-
* ```
|
|
304
|
-
*
|
|
305
304
|
* @remarks
|
|
306
305
|
* This method provides a bridge between Supabase's bucket management and the standard
|
|
307
306
|
* Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.
|
|
308
307
|
* All authentication and configuration is handled automatically using your Supabase credentials.
|
|
309
308
|
*
|
|
310
|
-
* **Error Handling**:
|
|
311
|
-
*
|
|
309
|
+
* **Error Handling**: Invalid bucket names throw immediately. All catalog
|
|
310
|
+
* operations return `{ data, error }` where errors are `IcebergError` instances from iceberg-js.
|
|
311
|
+
* Use helper methods like `error.isNotFound()` or check `error.status` for specific error handling.
|
|
312
|
+
* Use `.throwOnError()` on the analytics client if you prefer exceptions for catalog operations.
|
|
312
313
|
*
|
|
313
314
|
* **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently
|
|
314
315
|
* deletes all table data. Without it, the table is marked as deleted but data remains.
|
|
315
316
|
*
|
|
316
|
-
* **Library Dependency**: The returned catalog
|
|
317
|
-
*
|
|
317
|
+
* **Library Dependency**: The returned catalog wraps `IcebergRestCatalog` from iceberg-js.
|
|
318
|
+
* For complete API documentation and advanced usage, refer to the
|
|
318
319
|
* [iceberg-js documentation](https://supabase.github.io/iceberg-js/).
|
|
319
|
-
*
|
|
320
|
-
* For advanced Iceberg operations beyond bucket management, you can also install and use
|
|
321
|
-
* the `iceberg-js` package directly with manual configuration.
|
|
322
320
|
*/
|
|
323
|
-
from(bucketName: string):
|
|
321
|
+
from(bucketName: string): WrappedIcebergRestCatalog;
|
|
324
322
|
}
|
|
323
|
+
export {};
|
|
325
324
|
//# sourceMappingURL=StorageAnalyticsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageAnalyticsClient.d.ts","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"StorageAnalyticsClient.d.ts","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"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"}
|