@supabase/storage-js 2.85.0 → 2.86.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/README.md +64 -0
- package/dist/main/lib/helpers.d.ts +16 -0
- package/dist/main/lib/helpers.d.ts.map +1 -1
- package/dist/main/lib/helpers.js +41 -1
- package/dist/main/lib/helpers.js.map +1 -1
- package/dist/main/lib/version.d.ts +1 -1
- package/dist/main/lib/version.js +1 -1
- package/dist/main/packages/StorageAnalyticsClient.d.ts +137 -0
- package/dist/main/packages/StorageAnalyticsClient.d.ts.map +1 -1
- package/dist/main/packages/StorageAnalyticsClient.js +156 -0
- package/dist/main/packages/StorageAnalyticsClient.js.map +1 -1
- package/dist/module/lib/helpers.d.ts +16 -0
- package/dist/module/lib/helpers.d.ts.map +1 -1
- package/dist/module/lib/helpers.js +39 -0
- package/dist/module/lib/helpers.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 +137 -0
- package/dist/module/packages/StorageAnalyticsClient.d.ts.map +1 -1
- package/dist/module/packages/StorageAnalyticsClient.js +158 -2
- 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 -1
- package/src/lib/helpers.ts +44 -0
- package/src/lib/version.ts +1 -1
- package/src/packages/StorageAnalyticsClient.ts +161 -1
package/README.md
CHANGED
|
@@ -488,6 +488,70 @@ if (error) {
|
|
|
488
488
|
|
|
489
489
|
> **Note:** A bucket cannot be deleted if it contains data. You must empty the bucket first.
|
|
490
490
|
|
|
491
|
+
#### Get Iceberg Catalog for Advanced Operations
|
|
492
|
+
|
|
493
|
+
For advanced operations like creating tables, namespaces, and querying Iceberg metadata, use the `from()` method to get a configured [iceberg-js](https://github.com/supabase/iceberg-js) client:
|
|
494
|
+
|
|
495
|
+
```typescript
|
|
496
|
+
// Get an Iceberg REST Catalog client for your analytics bucket
|
|
497
|
+
const catalog = analytics.from('analytics-data')
|
|
498
|
+
|
|
499
|
+
// Create a namespace
|
|
500
|
+
await catalog.createNamespace({ namespace: ['default'] }, { properties: { owner: 'data-team' } })
|
|
501
|
+
|
|
502
|
+
// Create a table with schema
|
|
503
|
+
await catalog.createTable(
|
|
504
|
+
{ namespace: ['default'] },
|
|
505
|
+
{
|
|
506
|
+
name: 'events',
|
|
507
|
+
schema: {
|
|
508
|
+
type: 'struct',
|
|
509
|
+
fields: [
|
|
510
|
+
{ id: 1, name: 'id', type: 'long', required: true },
|
|
511
|
+
{ id: 2, name: 'timestamp', type: 'timestamp', required: true },
|
|
512
|
+
{ id: 3, name: 'user_id', type: 'string', required: false },
|
|
513
|
+
],
|
|
514
|
+
'schema-id': 0,
|
|
515
|
+
'identifier-field-ids': [1],
|
|
516
|
+
},
|
|
517
|
+
'partition-spec': {
|
|
518
|
+
'spec-id': 0,
|
|
519
|
+
fields: [],
|
|
520
|
+
},
|
|
521
|
+
'write-order': {
|
|
522
|
+
'order-id': 0,
|
|
523
|
+
fields: [],
|
|
524
|
+
},
|
|
525
|
+
properties: {
|
|
526
|
+
'write.format.default': 'parquet',
|
|
527
|
+
},
|
|
528
|
+
}
|
|
529
|
+
)
|
|
530
|
+
|
|
531
|
+
// List tables in namespace
|
|
532
|
+
const tables = await catalog.listTables({ namespace: ['default'] })
|
|
533
|
+
console.log(tables) // [{ namespace: ['default'], name: 'events' }]
|
|
534
|
+
|
|
535
|
+
// Load table metadata
|
|
536
|
+
const table = await catalog.loadTable({ namespace: ['default'], name: 'events' })
|
|
537
|
+
|
|
538
|
+
// Update table properties
|
|
539
|
+
await catalog.updateTable(
|
|
540
|
+
{ namespace: ['default'], name: 'events' },
|
|
541
|
+
{ properties: { 'read.split.target-size': '134217728' } }
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
// Drop table
|
|
545
|
+
await catalog.dropTable({ namespace: ['default'], name: 'events' })
|
|
546
|
+
|
|
547
|
+
// Drop namespace
|
|
548
|
+
await catalog.dropNamespace({ namespace: ['default'] })
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
**Returns:** `IcebergRestCatalog` instance from [iceberg-js](https://github.com/supabase/iceberg-js)
|
|
552
|
+
|
|
553
|
+
> **Note:** The `from()` method returns an Iceberg REST Catalog client that provides full access to the Apache Iceberg REST API. For complete documentation of available operations, see the [iceberg-js documentation](https://supabase.github.io/iceberg-js/).
|
|
554
|
+
|
|
491
555
|
### Error Handling
|
|
492
556
|
|
|
493
557
|
Analytics buckets use the same error handling pattern as the rest of the Storage SDK:
|
|
@@ -8,5 +8,21 @@ export declare const recursiveToCamel: (item: Record<string, any>) => unknown;
|
|
|
8
8
|
* source: https://github.com/sindresorhus/is-plain-obj
|
|
9
9
|
*/
|
|
10
10
|
export declare const isPlainObject: (value: object) => boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Validates if a given bucket name is valid according to Supabase Storage API rules
|
|
13
|
+
* Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()
|
|
14
|
+
*
|
|
15
|
+
* Rules:
|
|
16
|
+
* - Length: 1-100 characters
|
|
17
|
+
* - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters
|
|
18
|
+
* - Safe special characters: ! - . * ' ( ) space & $ @ = ; : + , ?
|
|
19
|
+
* - Forbidden: path separators (/, \), path traversal (..), leading/trailing whitespace
|
|
20
|
+
*
|
|
21
|
+
* AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html
|
|
22
|
+
*
|
|
23
|
+
* @param bucketName - The bucket name to validate
|
|
24
|
+
* @returns true if valid, false otherwise
|
|
25
|
+
*/
|
|
26
|
+
export declare const isValidBucketName: (bucketName: string) => boolean;
|
|
11
27
|
export {};
|
|
12
28
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,OAAO,KAAK,CAAA;AAEzB,eAAO,MAAM,YAAY,GAAI,cAAc,KAAK,KAAG,KAKlD,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,OAAO,QAEzC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,OAc5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAa7C,CAAA"}
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,OAAO,KAAK,CAAA;AAEzB,eAAO,MAAM,YAAY,GAAI,cAAc,KAAK,KAAG,KAKlD,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,OAAO,QAEzC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,OAc5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAa7C,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,KAAG,OA2BtD,CAAA"}
|
package/dist/main/lib/helpers.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isPlainObject = exports.recursiveToCamel = exports.resolveResponse = exports.resolveFetch = void 0;
|
|
3
|
+
exports.isValidBucketName = exports.isPlainObject = exports.recursiveToCamel = exports.resolveResponse = exports.resolveFetch = void 0;
|
|
4
4
|
const resolveFetch = (customFetch) => {
|
|
5
5
|
if (customFetch) {
|
|
6
6
|
return (...args) => customFetch(...args);
|
|
@@ -44,4 +44,44 @@ const isPlainObject = (value) => {
|
|
|
44
44
|
!(Symbol.iterator in value));
|
|
45
45
|
};
|
|
46
46
|
exports.isPlainObject = isPlainObject;
|
|
47
|
+
/**
|
|
48
|
+
* Validates if a given bucket name is valid according to Supabase Storage API rules
|
|
49
|
+
* Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()
|
|
50
|
+
*
|
|
51
|
+
* Rules:
|
|
52
|
+
* - Length: 1-100 characters
|
|
53
|
+
* - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters
|
|
54
|
+
* - Safe special characters: ! - . * ' ( ) space & $ @ = ; : + , ?
|
|
55
|
+
* - Forbidden: path separators (/, \), path traversal (..), leading/trailing whitespace
|
|
56
|
+
*
|
|
57
|
+
* AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html
|
|
58
|
+
*
|
|
59
|
+
* @param bucketName - The bucket name to validate
|
|
60
|
+
* @returns true if valid, false otherwise
|
|
61
|
+
*/
|
|
62
|
+
const isValidBucketName = (bucketName) => {
|
|
63
|
+
if (!bucketName || typeof bucketName !== 'string') {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Check length constraints (1-100 characters)
|
|
67
|
+
if (bucketName.length === 0 || bucketName.length > 100) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// Check for leading/trailing whitespace
|
|
71
|
+
if (bucketName.trim() !== bucketName) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// Explicitly reject path separators (security)
|
|
75
|
+
// Note: Consecutive periods (..) are allowed by backend - the AWS restriction
|
|
76
|
+
// on relative paths applies to object keys, not bucket names
|
|
77
|
+
if (bucketName.includes('/') || bucketName.includes('\\')) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Validate against allowed character set
|
|
81
|
+
// Pattern matches backend regex: /^(\w|!|-|\.|\*|'|\(|\)| |&|\$|@|=|;|:|\+|,|\?)*$/
|
|
82
|
+
// This explicitly excludes path separators (/, \) and other problematic characters
|
|
83
|
+
const bucketNameRegex = /^[\w!.\*'() &$@=;:+,?-]+$/;
|
|
84
|
+
return bucketNameRegex.test(bucketName);
|
|
85
|
+
};
|
|
86
|
+
exports.isValidBucketName = isValidBucketName;
|
|
47
87
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":";;;AAEO,MAAM,YAAY,GAAG,CAAC,WAAmB,EAAS,EAAE;IACzD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AACpC,CAAC,CAAA;AALY,QAAA,YAAY,gBAKxB;AAEM,MAAM,eAAe,GAAG,GAAoB,EAAE;IACnD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAFY,QAAA,eAAe,mBAE3B;AAEM,MAAM,gBAAgB,GAAG,CAAC,IAAyB,EAAW,EAAE;IACrE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,wBAAgB,EAAC,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,CAAA;IACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACxF,MAAM,CAAC,MAAM,CAAC,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAdY,QAAA,gBAAgB,oBAc5B;AAED;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAAC,KAAa,EAAW,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,OAAO,CACL,CAAC,SAAS,KAAK,IAAI;QACjB,SAAS,KAAK,MAAM,CAAC,SAAS;QAC9B,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;QAC9B,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAC5B,CAAA;AACH,CAAC,CAAA;AAbY,QAAA,aAAa,iBAazB"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "2.
|
|
1
|
+
export declare const version = "2.86.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.86.0';
|
|
11
11
|
//# sourceMappingURL=version.js.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IcebergRestCatalog } from 'iceberg-js';
|
|
1
2
|
import { StorageError } from '../lib/errors';
|
|
2
3
|
import { Fetch } from '../lib/fetch';
|
|
3
4
|
import { AnalyticBucket } from '../lib/types';
|
|
@@ -184,5 +185,141 @@ export default class StorageAnalyticsClient {
|
|
|
184
185
|
data: null;
|
|
185
186
|
error: StorageError;
|
|
186
187
|
}>;
|
|
188
|
+
/**
|
|
189
|
+
* @alpha
|
|
190
|
+
*
|
|
191
|
+
* Get an Iceberg REST Catalog client configured for a specific analytics bucket
|
|
192
|
+
* Use this to perform advanced table and namespace operations within the bucket
|
|
193
|
+
* The returned client provides full access to the Apache Iceberg REST Catalog API
|
|
194
|
+
*
|
|
195
|
+
* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.
|
|
196
|
+
*
|
|
197
|
+
* @category Analytics Buckets
|
|
198
|
+
* @param bucketName - The name of the analytics bucket (warehouse) to connect to
|
|
199
|
+
* @returns Configured IcebergRestCatalog instance for advanced Iceberg operations
|
|
200
|
+
*
|
|
201
|
+
* @example Get catalog and create table
|
|
202
|
+
* ```js
|
|
203
|
+
* // First, create an analytics bucket
|
|
204
|
+
* const { data: bucket, error: bucketError } = await supabase
|
|
205
|
+
* .storage
|
|
206
|
+
* .analytics
|
|
207
|
+
* .createBucket('analytics-data')
|
|
208
|
+
*
|
|
209
|
+
* // Get the Iceberg catalog for that bucket
|
|
210
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
211
|
+
*
|
|
212
|
+
* // Create a namespace
|
|
213
|
+
* await catalog.createNamespace({ namespace: ['default'] })
|
|
214
|
+
*
|
|
215
|
+
* // Create a table with schema
|
|
216
|
+
* await catalog.createTable(
|
|
217
|
+
* { namespace: ['default'] },
|
|
218
|
+
* {
|
|
219
|
+
* name: 'events',
|
|
220
|
+
* schema: {
|
|
221
|
+
* type: 'struct',
|
|
222
|
+
* fields: [
|
|
223
|
+
* { id: 1, name: 'id', type: 'long', required: true },
|
|
224
|
+
* { id: 2, name: 'timestamp', type: 'timestamp', required: true },
|
|
225
|
+
* { id: 3, name: 'user_id', type: 'string', required: false }
|
|
226
|
+
* ],
|
|
227
|
+
* 'schema-id': 0,
|
|
228
|
+
* 'identifier-field-ids': [1]
|
|
229
|
+
* },
|
|
230
|
+
* 'partition-spec': {
|
|
231
|
+
* 'spec-id': 0,
|
|
232
|
+
* fields: []
|
|
233
|
+
* },
|
|
234
|
+
* 'write-order': {
|
|
235
|
+
* 'order-id': 0,
|
|
236
|
+
* fields: []
|
|
237
|
+
* },
|
|
238
|
+
* properties: {
|
|
239
|
+
* 'write.format.default': 'parquet'
|
|
240
|
+
* }
|
|
241
|
+
* }
|
|
242
|
+
* )
|
|
243
|
+
* ```
|
|
244
|
+
*
|
|
245
|
+
* @example List tables in namespace
|
|
246
|
+
* ```js
|
|
247
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
248
|
+
*
|
|
249
|
+
* // List all tables in the default namespace
|
|
250
|
+
* const tables = await catalog.listTables({ namespace: ['default'] })
|
|
251
|
+
* console.log(tables) // [{ namespace: ['default'], name: 'events' }]
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* @example Working with namespaces
|
|
255
|
+
* ```js
|
|
256
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
257
|
+
*
|
|
258
|
+
* // List all namespaces
|
|
259
|
+
* const namespaces = await catalog.listNamespaces()
|
|
260
|
+
*
|
|
261
|
+
* // Create namespace with properties
|
|
262
|
+
* await catalog.createNamespace(
|
|
263
|
+
* { namespace: ['production'] },
|
|
264
|
+
* { properties: { owner: 'data-team', env: 'prod' } }
|
|
265
|
+
* )
|
|
266
|
+
* ```
|
|
267
|
+
*
|
|
268
|
+
* @example Cleanup operations
|
|
269
|
+
* ```js
|
|
270
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
271
|
+
*
|
|
272
|
+
* // Drop table with purge option (removes all data)
|
|
273
|
+
* await catalog.dropTable(
|
|
274
|
+
* { namespace: ['default'], name: 'events' },
|
|
275
|
+
* { purge: true }
|
|
276
|
+
* )
|
|
277
|
+
*
|
|
278
|
+
* // Drop namespace (must be empty)
|
|
279
|
+
* await catalog.dropNamespace({ namespace: ['default'] })
|
|
280
|
+
* ```
|
|
281
|
+
*
|
|
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
|
+
* @remarks
|
|
306
|
+
* This method provides a bridge between Supabase's bucket management and the standard
|
|
307
|
+
* Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.
|
|
308
|
+
* All authentication and configuration is handled automatically using your Supabase credentials.
|
|
309
|
+
*
|
|
310
|
+
* **Error Handling**: Operations may throw `IcebergError` from the iceberg-js library.
|
|
311
|
+
* Always handle 404 errors gracefully when checking for resource existence.
|
|
312
|
+
*
|
|
313
|
+
* **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently
|
|
314
|
+
* deletes all table data. Without it, the table is marked as deleted but data remains.
|
|
315
|
+
*
|
|
316
|
+
* **Library Dependency**: The returned catalog is an instance of `IcebergRestCatalog`
|
|
317
|
+
* from iceberg-js. For complete API documentation and advanced usage, refer to the
|
|
318
|
+
* [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
|
+
*/
|
|
323
|
+
from(bucketName: string): IcebergRestCatalog;
|
|
187
324
|
}
|
|
188
325
|
//# sourceMappingURL=StorageAnalyticsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageAnalyticsClient.d.ts","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StorageAnalyticsClient.d.ts","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,OAAO,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,KAAK,EAAqB,MAAM,cAAc,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IAC5C,SAAS,CAAC,KAAK,EAAE,KAAK,CAAA;IACtB,SAAS,CAAC,kBAAkB,UAAQ;IAEpC;;;;;;;;;;;;;;;;OAgBG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAO,EAAE,KAAK,CAAC,EAAE,KAAK;IAM/E;;;;;;;;;;OAUG;IACI,YAAY,IAAI,IAAI;IAK3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CACrC;QACE,IAAI,EAAE,cAAc,CAAA;QACpB,KAAK,EAAE,IAAI,CAAA;KACZ,GACD;QACE,IAAI,EAAE,IAAI,CAAA;QACV,KAAK,EAAE,YAAY,CAAA;KACpB,CACJ;IAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,CAAA;QACjD,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CACP;QACE,IAAI,EAAE,cAAc,EAAE,CAAA;QACtB,KAAK,EAAE,IAAI,CAAA;KACZ,GACD;QACE,IAAI,EAAE,IAAI,CAAA;QACV,KAAK,EAAE,YAAY,CAAA;KACpB,CACJ;IA4BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAC3C;QACE,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;QACzB,KAAK,EAAE,IAAI,CAAA;KACZ,GACD;QACE,IAAI,EAAE,IAAI,CAAA;QACV,KAAK,EAAE,YAAY,CAAA;KACpB,CACJ;IAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsIG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB;CAuB7C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
+
const iceberg_js_1 = require("iceberg-js");
|
|
4
5
|
const constants_1 = require("../lib/constants");
|
|
5
6
|
const errors_1 = require("../lib/errors");
|
|
6
7
|
const fetch_1 = require("../lib/fetch");
|
|
@@ -224,6 +225,161 @@ class StorageAnalyticsClient {
|
|
|
224
225
|
}
|
|
225
226
|
});
|
|
226
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* @alpha
|
|
230
|
+
*
|
|
231
|
+
* Get an Iceberg REST Catalog client configured for a specific analytics bucket
|
|
232
|
+
* Use this to perform advanced table and namespace operations within the bucket
|
|
233
|
+
* The returned client provides full access to the Apache Iceberg REST Catalog API
|
|
234
|
+
*
|
|
235
|
+
* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.
|
|
236
|
+
*
|
|
237
|
+
* @category Analytics Buckets
|
|
238
|
+
* @param bucketName - The name of the analytics bucket (warehouse) to connect to
|
|
239
|
+
* @returns Configured IcebergRestCatalog instance for advanced Iceberg operations
|
|
240
|
+
*
|
|
241
|
+
* @example Get catalog and create table
|
|
242
|
+
* ```js
|
|
243
|
+
* // First, create an analytics bucket
|
|
244
|
+
* const { data: bucket, error: bucketError } = await supabase
|
|
245
|
+
* .storage
|
|
246
|
+
* .analytics
|
|
247
|
+
* .createBucket('analytics-data')
|
|
248
|
+
*
|
|
249
|
+
* // Get the Iceberg catalog for that bucket
|
|
250
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
251
|
+
*
|
|
252
|
+
* // Create a namespace
|
|
253
|
+
* await catalog.createNamespace({ namespace: ['default'] })
|
|
254
|
+
*
|
|
255
|
+
* // Create a table with schema
|
|
256
|
+
* await catalog.createTable(
|
|
257
|
+
* { namespace: ['default'] },
|
|
258
|
+
* {
|
|
259
|
+
* name: 'events',
|
|
260
|
+
* schema: {
|
|
261
|
+
* type: 'struct',
|
|
262
|
+
* fields: [
|
|
263
|
+
* { id: 1, name: 'id', type: 'long', required: true },
|
|
264
|
+
* { id: 2, name: 'timestamp', type: 'timestamp', required: true },
|
|
265
|
+
* { id: 3, name: 'user_id', type: 'string', required: false }
|
|
266
|
+
* ],
|
|
267
|
+
* 'schema-id': 0,
|
|
268
|
+
* 'identifier-field-ids': [1]
|
|
269
|
+
* },
|
|
270
|
+
* 'partition-spec': {
|
|
271
|
+
* 'spec-id': 0,
|
|
272
|
+
* fields: []
|
|
273
|
+
* },
|
|
274
|
+
* 'write-order': {
|
|
275
|
+
* 'order-id': 0,
|
|
276
|
+
* fields: []
|
|
277
|
+
* },
|
|
278
|
+
* properties: {
|
|
279
|
+
* 'write.format.default': 'parquet'
|
|
280
|
+
* }
|
|
281
|
+
* }
|
|
282
|
+
* )
|
|
283
|
+
* ```
|
|
284
|
+
*
|
|
285
|
+
* @example List tables in namespace
|
|
286
|
+
* ```js
|
|
287
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
288
|
+
*
|
|
289
|
+
* // List all tables in the default namespace
|
|
290
|
+
* const tables = await catalog.listTables({ namespace: ['default'] })
|
|
291
|
+
* console.log(tables) // [{ namespace: ['default'], name: 'events' }]
|
|
292
|
+
* ```
|
|
293
|
+
*
|
|
294
|
+
* @example Working with namespaces
|
|
295
|
+
* ```js
|
|
296
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
297
|
+
*
|
|
298
|
+
* // List all namespaces
|
|
299
|
+
* const namespaces = await catalog.listNamespaces()
|
|
300
|
+
*
|
|
301
|
+
* // Create namespace with properties
|
|
302
|
+
* await catalog.createNamespace(
|
|
303
|
+
* { namespace: ['production'] },
|
|
304
|
+
* { properties: { owner: 'data-team', env: 'prod' } }
|
|
305
|
+
* )
|
|
306
|
+
* ```
|
|
307
|
+
*
|
|
308
|
+
* @example Cleanup operations
|
|
309
|
+
* ```js
|
|
310
|
+
* const catalog = supabase.storage.analytics.from('analytics-data')
|
|
311
|
+
*
|
|
312
|
+
* // Drop table with purge option (removes all data)
|
|
313
|
+
* await catalog.dropTable(
|
|
314
|
+
* { namespace: ['default'], name: 'events' },
|
|
315
|
+
* { purge: true }
|
|
316
|
+
* )
|
|
317
|
+
*
|
|
318
|
+
* // Drop namespace (must be empty)
|
|
319
|
+
* await catalog.dropNamespace({ namespace: ['default'] })
|
|
320
|
+
* ```
|
|
321
|
+
*
|
|
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
|
+
* @remarks
|
|
346
|
+
* This method provides a bridge between Supabase's bucket management and the standard
|
|
347
|
+
* Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.
|
|
348
|
+
* All authentication and configuration is handled automatically using your Supabase credentials.
|
|
349
|
+
*
|
|
350
|
+
* **Error Handling**: Operations may throw `IcebergError` from the iceberg-js library.
|
|
351
|
+
* Always handle 404 errors gracefully when checking for resource existence.
|
|
352
|
+
*
|
|
353
|
+
* **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently
|
|
354
|
+
* deletes all table data. Without it, the table is marked as deleted but data remains.
|
|
355
|
+
*
|
|
356
|
+
* **Library Dependency**: The returned catalog is an instance of `IcebergRestCatalog`
|
|
357
|
+
* from iceberg-js. For complete API documentation and advanced usage, refer to the
|
|
358
|
+
* [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
|
+
*/
|
|
363
|
+
from(bucketName) {
|
|
364
|
+
// Validate bucket name using same rules as Supabase Storage API backend
|
|
365
|
+
if (!(0, helpers_1.isValidBucketName)(bucketName)) {
|
|
366
|
+
throw new errors_1.StorageError('Invalid bucket name: File, folder, and bucket names must follow AWS object key naming guidelines ' +
|
|
367
|
+
'and should avoid the use of any other characters.');
|
|
368
|
+
}
|
|
369
|
+
// Construct the Iceberg REST Catalog URL
|
|
370
|
+
// The base URL is /storage/v1/iceberg
|
|
371
|
+
// Note: IcebergRestCatalog from iceberg-js automatically adds /v1/ prefix to API paths
|
|
372
|
+
// so we should NOT append /v1 here (it would cause double /v1/v1/ in the URL)
|
|
373
|
+
return new iceberg_js_1.IcebergRestCatalog({
|
|
374
|
+
baseUrl: this.url,
|
|
375
|
+
catalogName: bucketName, // Maps to the warehouse parameter in Supabase's implementation
|
|
376
|
+
auth: {
|
|
377
|
+
type: 'custom',
|
|
378
|
+
getHeaders: () => tslib_1.__awaiter(this, void 0, void 0, function* () { return this.headers; }),
|
|
379
|
+
},
|
|
380
|
+
fetch: this.fetch,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
227
383
|
}
|
|
228
384
|
exports.default = StorageAnalyticsClient;
|
|
229
385
|
//# sourceMappingURL=StorageAnalyticsClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageAnalyticsClient.js","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":";;;AAAA,gDAAkD;AAClD,0CAA4D;AAC5D,wCAAuD;AACvD,
|
|
1
|
+
{"version":3,"file":"StorageAnalyticsClient.js","sourceRoot":"","sources":["../../../src/packages/StorageAnalyticsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,21 @@ export declare const recursiveToCamel: (item: Record<string, any>) => unknown;
|
|
|
8
8
|
* source: https://github.com/sindresorhus/is-plain-obj
|
|
9
9
|
*/
|
|
10
10
|
export declare const isPlainObject: (value: object) => boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Validates if a given bucket name is valid according to Supabase Storage API rules
|
|
13
|
+
* Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()
|
|
14
|
+
*
|
|
15
|
+
* Rules:
|
|
16
|
+
* - Length: 1-100 characters
|
|
17
|
+
* - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters
|
|
18
|
+
* - Safe special characters: ! - . * ' ( ) space & $ @ = ; : + , ?
|
|
19
|
+
* - Forbidden: path separators (/, \), path traversal (..), leading/trailing whitespace
|
|
20
|
+
*
|
|
21
|
+
* AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html
|
|
22
|
+
*
|
|
23
|
+
* @param bucketName - The bucket name to validate
|
|
24
|
+
* @returns true if valid, false otherwise
|
|
25
|
+
*/
|
|
26
|
+
export declare const isValidBucketName: (bucketName: string) => boolean;
|
|
11
27
|
export {};
|
|
12
28
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,OAAO,KAAK,CAAA;AAEzB,eAAO,MAAM,YAAY,GAAI,cAAc,KAAK,KAAG,KAKlD,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,OAAO,QAEzC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,OAc5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAa7C,CAAA"}
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,OAAO,KAAK,CAAA;AAEzB,eAAO,MAAM,YAAY,GAAI,cAAc,KAAK,KAAG,KAKlD,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,OAAO,QAEzC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,OAc5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAa7C,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,KAAG,OA2BtD,CAAA"}
|
|
@@ -37,4 +37,43 @@ export const isPlainObject = (value) => {
|
|
|
37
37
|
!(Symbol.toStringTag in value) &&
|
|
38
38
|
!(Symbol.iterator in value));
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* Validates if a given bucket name is valid according to Supabase Storage API rules
|
|
42
|
+
* Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()
|
|
43
|
+
*
|
|
44
|
+
* Rules:
|
|
45
|
+
* - Length: 1-100 characters
|
|
46
|
+
* - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters
|
|
47
|
+
* - Safe special characters: ! - . * ' ( ) space & $ @ = ; : + , ?
|
|
48
|
+
* - Forbidden: path separators (/, \), path traversal (..), leading/trailing whitespace
|
|
49
|
+
*
|
|
50
|
+
* AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html
|
|
51
|
+
*
|
|
52
|
+
* @param bucketName - The bucket name to validate
|
|
53
|
+
* @returns true if valid, false otherwise
|
|
54
|
+
*/
|
|
55
|
+
export const isValidBucketName = (bucketName) => {
|
|
56
|
+
if (!bucketName || typeof bucketName !== 'string') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Check length constraints (1-100 characters)
|
|
60
|
+
if (bucketName.length === 0 || bucketName.length > 100) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Check for leading/trailing whitespace
|
|
64
|
+
if (bucketName.trim() !== bucketName) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// Explicitly reject path separators (security)
|
|
68
|
+
// Note: Consecutive periods (..) are allowed by backend - the AWS restriction
|
|
69
|
+
// on relative paths applies to object keys, not bucket names
|
|
70
|
+
if (bucketName.includes('/') || bucketName.includes('\\')) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Validate against allowed character set
|
|
74
|
+
// Pattern matches backend regex: /^(\w|!|-|\.|\*|'|\(|\)| |&|\$|@|=|;|:|\+|,|\?)*$/
|
|
75
|
+
// This explicitly excludes path separators (/, \) and other problematic characters
|
|
76
|
+
const bucketNameRegex = /^[\w!.\*'() &$@=;:+,?-]+$/;
|
|
77
|
+
return bucketNameRegex.test(bucketName);
|
|
78
|
+
};
|
|
40
79
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAmB,EAAS,EAAE;IACzD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAoB,EAAE;IACnD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAyB,EAAW,EAAE;IACrE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,CAAA;IACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACxF,MAAM,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAW,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,OAAO,CACL,CAAC,SAAS,KAAK,IAAI;QACjB,SAAS,KAAK,MAAM,CAAC,SAAS;QAC9B,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;QAC9B,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAC5B,CAAA;AACH,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/lib/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "2.
|
|
1
|
+
export declare const version = "2.86.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.86.0';
|
|
8
8
|
//# sourceMappingURL=version.js.map
|