@boltic/sdk 0.0.3 → 0.0.5

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.
@@ -1,3 +1,17 @@
1
+ declare interface AddIndexRequest {
2
+ field_names: string[];
3
+ method: 'btree' | 'hash' | 'spgist' | 'gin' | 'brin';
4
+ }
5
+
6
+ declare interface AddIndexResponse {
7
+ index_name: string;
8
+ method: string;
9
+ fields: string[];
10
+ field_ids?: string[];
11
+ created_at?: string;
12
+ created_by?: string;
13
+ }
14
+
1
15
  declare type AlignmentType = 'left' | 'center' | 'right';
2
16
 
3
17
  /**
@@ -64,6 +78,7 @@ declare class BolticClient {
64
78
  private columnResource;
65
79
  private recordResource;
66
80
  private sqlResource;
81
+ private indexResource;
67
82
  private currentDatabase;
68
83
  private clientOptions;
69
84
  constructor(apiKey: string, options?: ClientOptions);
@@ -96,6 +111,11 @@ declare class BolticClient {
96
111
  message?: string | undefined;
97
112
  }>>;
98
113
  };
114
+ get indexes(): {
115
+ addIndex: (tableName: string, payload: AddIndexRequest) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<AddIndexResponse>>;
116
+ listIndexes: (tableName: string, query: ListIndexesQuery) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<ListIndexesResponse>>;
117
+ deleteIndex: (tableName: string, indexName: string) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<DeleteIndexResponse>>;
118
+ };
99
119
  table(name: string): TableBuilder;
100
120
  from(tableName: string): {
101
121
  columns: () => {
@@ -124,6 +144,11 @@ declare class BolticClient {
124
144
  }>>;
125
145
  };
126
146
  record: () => RecordBuilder;
147
+ indexes: () => {
148
+ addIndex: (payload: AddIndexRequest) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<AddIndexResponse>>;
149
+ listIndexes: (query: ListIndexesQuery) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<ListIndexesResponse>>;
150
+ deleteIndex: (indexName: string) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<DeleteIndexResponse>>;
151
+ };
127
152
  };
128
153
  get records(): {
129
154
  insert: (tableName: string, data: RecordData) => Promise<BolticErrorResponse_2 | BolticSuccessResponse<RecordWithId>>;
@@ -397,6 +422,10 @@ declare const DateFormatEnum: Readonly<{
397
422
 
398
423
  declare type DecimalType = '00' | '0.0' | '0.00' | '0.000' | '0.0000' | '0.00000' | '0.000000';
399
424
 
425
+ declare interface DeleteIndexResponse {
426
+ message?: string;
427
+ }
428
+
400
429
  declare type Environment = 'local' | 'sit' | 'uat' | 'prod';
401
430
 
402
431
  declare interface EnvironmentConfig {
@@ -492,6 +521,20 @@ declare interface HttpResponse<T = unknown> {
492
521
  headers: Record<string, string>;
493
522
  }
494
523
 
524
+ declare interface IndexListItem {
525
+ schemaname?: string;
526
+ relname?: string;
527
+ indexrelname: string;
528
+ method?: string;
529
+ idx_scan?: number;
530
+ idx_tup_read?: number;
531
+ idx_tup_fetch?: number;
532
+ field_ids?: string[];
533
+ fields?: string[];
534
+ created_at?: string;
535
+ created_by?: string;
536
+ }
537
+
495
538
  declare interface InterceptorManager {
496
539
  request: {
497
540
  use(interceptor: RequestInterceptor): number;
@@ -520,6 +563,31 @@ declare class InterceptorManagerImpl implements InterceptorManager {
520
563
  executeErrorInterceptors(error: unknown): Promise<unknown>;
521
564
  }
522
565
 
566
+ declare interface ListIndexesQuery {
567
+ page?: {
568
+ page_no: number;
569
+ page_size: number;
570
+ };
571
+ filters?: Array<{
572
+ field: string;
573
+ operator: string;
574
+ values: unknown[];
575
+ }>;
576
+ sort?: Array<{
577
+ field: string;
578
+ direction: 'asc' | 'desc';
579
+ }>;
580
+ }
581
+
582
+ declare interface ListIndexesResponse {
583
+ items: IndexListItem[];
584
+ page?: {
585
+ page_no: number;
586
+ page_size: number;
587
+ total?: number;
588
+ };
589
+ }
590
+
523
591
  export declare interface MockClientOptions {
524
592
  apiKey?: string;
525
593
  environment?: 'local' | 'sit' | 'uat' | 'prod';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./test-client-BI3VkYA6.js");class t{static async*fromSSE(e){if(!e.body)throw new Error("Response body is null");const t=e.body.getReader(),s=new TextDecoder;try{for(;;){const{done:e,value:o}=await t.read();if(e)break;const r=s.decode(o,{stream:!0}).split("\n");for(const t of r)if(t.startsWith("data: ")){const e=t.slice(6);"[DONE]"!==e&&(yield e)}}}finally{t.releaseLock()}}static async*fromChunked(e){if(!e.body)throw new Error("Response body is null");const t=e.body.getReader(),s=new TextDecoder;try{for(;;){const{done:e,value:o}=await t.read();if(e)break;const r=s.decode(o,{stream:!0});yield r}}finally{t.releaseLock()}}static async collectAll(e){let t="";for await(const s of e)t+=s;return t}static async*fromString(e,t=10){for(let s=0;s<e.length;s+=t)yield e.slice(s,s+t),await new Promise(e=>setTimeout(e,50))}static async*map(e,t){for await(const s of e)yield await t(s)}static async*filter(e,t){for await(const s of e)await t(s)&&(yield s)}static async*take(e,t){let s=0;for await(const o of e){if(s>=t)break;yield o,s++}}}exports.createErrorResponse=e.createErrorResponse,exports.createMockResponse=e.createMockResponse,exports.createTestClient=e.createTestClient,exports.SqlTestClient=class{constructor(e){this.sql=e}async generateSQL(e,s){const o=await this.sql.textToSQL(e,s);return t.collectAll(o)}async executeSQL(e){return this.sql.executeSQL(e)}async*simulateStreamingSQL(e,t=10,s=50){for(let o=0;o<e.length;o+=t)yield e.slice(o,o+t),await new Promise(e=>setTimeout(e,s))}},exports.TEST_UTILS_VERSION="1.0.0";
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./test-client-DfOmma3t.js");class t{static async*fromSSE(e){if(!e.body)throw new Error("Response body is null");const t=e.body.getReader(),s=new TextDecoder;try{for(;;){const{done:e,value:o}=await t.read();if(e)break;const r=s.decode(o,{stream:!0}).split("\n");for(const t of r)if(t.startsWith("data: ")){const e=t.slice(6);"[DONE]"!==e&&(yield e)}}}finally{t.releaseLock()}}static async*fromChunked(e){if(!e.body)throw new Error("Response body is null");const t=e.body.getReader(),s=new TextDecoder;try{for(;;){const{done:e,value:o}=await t.read();if(e)break;const r=s.decode(o,{stream:!0});yield r}}finally{t.releaseLock()}}static async collectAll(e){let t="";for await(const s of e)t+=s;return t}static async*fromString(e,t=10){for(let s=0;s<e.length;s+=t)yield e.slice(s,s+t),await new Promise(e=>setTimeout(e,50))}static async*map(e,t){for await(const s of e)yield await t(s)}static async*filter(e,t){for await(const s of e)await t(s)&&(yield s)}static async*take(e,t){let s=0;for await(const o of e){if(s>=t)break;yield o,s++}}}exports.createErrorResponse=e.createErrorResponse,exports.createMockResponse=e.createMockResponse,exports.createTestClient=e.createTestClient,exports.SqlTestClient=class{constructor(e){this.sql=e}async generateSQL(e,s){const o=await this.sql.textToSQL(e,s);return t.collectAll(o)}async executeSQL(e){return this.sql.executeSQL(e)}async*simulateStreamingSQL(e,t=10,s=50){for(let o=0;o<e.length;o+=t)yield e.slice(o,o+t),await new Promise(e=>setTimeout(e,s))}},exports.TEST_UTILS_VERSION="1.0.0";
2
2
  //# sourceMappingURL=testing.js.map
@@ -1,4 +1,4 @@
1
- import { o, p, q } from "./test-client-BffJwqJq.mjs";
1
+ import { o, p, q } from "./test-client-rQ1AmTo6.mjs";
2
2
  class StreamingUtils {
3
3
  /**
4
4
  * Convert Server-Sent Events to AsyncIterable
package/dist/sdk.js CHANGED
@@ -1636,6 +1636,7 @@ class TableResource extends BaseResource {
1636
1636
  const config = client.getConfig();
1637
1637
  this.tablesApiClient = new TablesApiClient(config.apiKey, {
1638
1638
  environment: config.environment,
1639
+ region: config.region,
1639
1640
  timeout: config.timeout,
1640
1641
  debug: config.debug,
1641
1642
  retryAttempts: config.retryAttempts,
@@ -1929,6 +1930,7 @@ class ColumnResource extends BaseResource {
1929
1930
  const config = client.getConfig();
1930
1931
  this.columnsApiClient = new ColumnsApiClient(config.apiKey, {
1931
1932
  environment: config.environment,
1933
+ region: config.region,
1932
1934
  timeout: config.timeout,
1933
1935
  debug: config.debug,
1934
1936
  retryAttempts: config.retryAttempts,
@@ -1937,6 +1939,7 @@ class ColumnResource extends BaseResource {
1937
1939
  });
1938
1940
  this.tablesApiClient = new TablesApiClient(config.apiKey, {
1939
1941
  environment: config.environment,
1942
+ region: config.region,
1940
1943
  timeout: config.timeout,
1941
1944
  debug: config.debug,
1942
1945
  retryAttempts: config.retryAttempts,
@@ -2295,6 +2298,209 @@ class ColumnResource extends BaseResource {
2295
2298
  return tableInfo?.id || null;
2296
2299
  }
2297
2300
  }
2301
+ const INDEX_ENDPOINTS = {
2302
+ create: {
2303
+ path: "/tables/indexes/{table_id}",
2304
+ method: "POST",
2305
+ authenticated: true
2306
+ },
2307
+ list: {
2308
+ path: "/tables/indexes/{table_id}/list",
2309
+ method: "POST",
2310
+ authenticated: true
2311
+ },
2312
+ delete: {
2313
+ path: "/tables/indexes/{table_id}",
2314
+ method: "DELETE",
2315
+ authenticated: true
2316
+ }
2317
+ };
2318
+ const buildIndexEndpointPath = (endpoint, params = {}) => {
2319
+ let path = endpoint.path;
2320
+ Object.entries(params).forEach(([key, value]) => {
2321
+ path = path.replace(`{${key}}`, encodeURIComponent(value));
2322
+ });
2323
+ const unreplacedParams = path.match(/\{([^}]+)\}/g);
2324
+ if (unreplacedParams) {
2325
+ throw new Error(`Missing path parameters: ${unreplacedParams.join(", ")}`);
2326
+ }
2327
+ return path;
2328
+ };
2329
+ class IndexesApiClient {
2330
+ constructor(apiKey, config = {}) {
2331
+ this.config = { apiKey, ...config };
2332
+ this.httpAdapter = createHttpAdapter();
2333
+ const environment = config.environment || "prod";
2334
+ const region = config.region || "asia-south1";
2335
+ this.baseURL = this.getBaseURL(environment, region);
2336
+ }
2337
+ getBaseURL(environment, region) {
2338
+ const regionConfig = REGION_CONFIGS[region];
2339
+ if (!regionConfig) {
2340
+ throw new Error(`Unsupported region: ${region}`);
2341
+ }
2342
+ const envConfig = regionConfig[environment];
2343
+ if (!envConfig) {
2344
+ throw new Error(
2345
+ `Unsupported environment: ${environment} for region: ${region}`
2346
+ );
2347
+ }
2348
+ return `${envConfig.baseURL}/v1`;
2349
+ }
2350
+ async addIndex(tableId, request) {
2351
+ try {
2352
+ const endpoint = INDEX_ENDPOINTS.create;
2353
+ const url = `${this.baseURL}${buildIndexEndpointPath(endpoint, { table_id: tableId })}`;
2354
+ const response = await this.httpAdapter.request({
2355
+ url,
2356
+ method: endpoint.method,
2357
+ headers: this.buildHeaders(),
2358
+ data: request,
2359
+ timeout: this.config.timeout
2360
+ });
2361
+ return response.data;
2362
+ } catch (error) {
2363
+ return this.formatErrorResponse(error);
2364
+ }
2365
+ }
2366
+ async listIndexes(tableId, query) {
2367
+ try {
2368
+ const endpoint = INDEX_ENDPOINTS.list;
2369
+ const url = `${this.baseURL}${buildIndexEndpointPath(endpoint, { table_id: tableId })}`;
2370
+ const response = await this.httpAdapter.request({
2371
+ url,
2372
+ method: endpoint.method,
2373
+ headers: this.buildHeaders(),
2374
+ data: query,
2375
+ timeout: this.config.timeout
2376
+ });
2377
+ return response.data;
2378
+ } catch (error) {
2379
+ return this.formatErrorResponse(error);
2380
+ }
2381
+ }
2382
+ async deleteIndex(tableId, request) {
2383
+ try {
2384
+ const endpoint = INDEX_ENDPOINTS.delete;
2385
+ const url = `${this.baseURL}${buildIndexEndpointPath(endpoint, { table_id: tableId })}`;
2386
+ const response = await this.httpAdapter.request({
2387
+ url,
2388
+ method: endpoint.method,
2389
+ headers: this.buildHeaders(),
2390
+ data: request,
2391
+ timeout: this.config.timeout
2392
+ });
2393
+ return response.data;
2394
+ } catch (error) {
2395
+ return this.formatErrorResponse(error);
2396
+ }
2397
+ }
2398
+ buildHeaders() {
2399
+ return {
2400
+ "Content-Type": "application/json",
2401
+ Accept: "application/json",
2402
+ "x-boltic-token": this.config.apiKey
2403
+ };
2404
+ }
2405
+ formatErrorResponse(error) {
2406
+ if (this.config.debug) {
2407
+ console.error("Indexes API Error:", error);
2408
+ }
2409
+ if (error && typeof error === "object" && "response" in error) {
2410
+ const apiError = error;
2411
+ if (apiError.response?.data?.error) {
2412
+ return apiError.response.data;
2413
+ }
2414
+ return {
2415
+ error: {
2416
+ code: "API_ERROR",
2417
+ message: error.message || "Unknown API error",
2418
+ meta: [`Status: ${apiError.response?.status || "unknown"}`]
2419
+ }
2420
+ };
2421
+ }
2422
+ if (error && typeof error === "object" && "message" in error) {
2423
+ return {
2424
+ error: {
2425
+ code: "CLIENT_ERROR",
2426
+ message: error.message,
2427
+ meta: ["Client-side error occurred"]
2428
+ }
2429
+ };
2430
+ }
2431
+ return {
2432
+ error: {
2433
+ code: "UNKNOWN_ERROR",
2434
+ message: "An unexpected error occurred",
2435
+ meta: ["Unknown error type"]
2436
+ }
2437
+ };
2438
+ }
2439
+ }
2440
+ class IndexResource {
2441
+ constructor(client) {
2442
+ this.client = client;
2443
+ const config = client.getConfig();
2444
+ this.apiClient = new IndexesApiClient(config.apiKey, {
2445
+ environment: config.environment,
2446
+ region: config.region,
2447
+ timeout: config.timeout,
2448
+ debug: config.debug,
2449
+ retryAttempts: config.retryAttempts,
2450
+ retryDelay: config.retryDelay,
2451
+ headers: config.headers
2452
+ });
2453
+ this.tableResource = new TableResource(client);
2454
+ }
2455
+ async resolveTableId(tableName) {
2456
+ const tableResult = await this.tableResource.findByName(tableName);
2457
+ if (!tableResult.data) throw new Error(`Table not found: ${tableName}`);
2458
+ return tableResult.data.id;
2459
+ }
2460
+ async addIndex(tableName, request) {
2461
+ try {
2462
+ const tableId = await this.resolveTableId(tableName);
2463
+ return await this.apiClient.addIndex(tableId, request);
2464
+ } catch (error) {
2465
+ return {
2466
+ error: {
2467
+ code: "CLIENT_ERROR",
2468
+ message: error?.message || "Failed to add index",
2469
+ meta: ["IndexResource.addIndex"]
2470
+ }
2471
+ };
2472
+ }
2473
+ }
2474
+ async listIndexes(tableName, query) {
2475
+ try {
2476
+ const tableId = await this.resolveTableId(tableName);
2477
+ return await this.apiClient.listIndexes(tableId, query);
2478
+ } catch (error) {
2479
+ return {
2480
+ error: {
2481
+ code: "CLIENT_ERROR",
2482
+ message: error?.message || "Failed to list indexes",
2483
+ meta: ["IndexResource.listIndexes"]
2484
+ }
2485
+ };
2486
+ }
2487
+ }
2488
+ async deleteIndex(tableName, indexName) {
2489
+ try {
2490
+ const tableId = await this.resolveTableId(tableName);
2491
+ const request = { index_name: indexName };
2492
+ return await this.apiClient.deleteIndex(tableId, request);
2493
+ } catch (error) {
2494
+ return {
2495
+ error: {
2496
+ code: "CLIENT_ERROR",
2497
+ message: error?.message || "Failed to delete index",
2498
+ meta: ["IndexResource.deleteIndex"]
2499
+ }
2500
+ };
2501
+ }
2502
+ }
2503
+ }
2298
2504
  const RECORD_ENDPOINTS = {
2299
2505
  insert: {
2300
2506
  path: "/tables/{table_id}/records",
@@ -2669,11 +2875,13 @@ class RecordResource {
2669
2875
  this.client = client;
2670
2876
  this.apiClient = new RecordsApiClient(client.getConfig().apiKey, {
2671
2877
  environment: client.getConfig().environment,
2878
+ region: client.getConfig().region,
2672
2879
  timeout: client.getConfig().timeout,
2673
2880
  debug: client.getConfig().debug
2674
2881
  });
2675
2882
  this.tablesApiClient = new TablesApiClient(client.getConfig().apiKey, {
2676
2883
  environment: client.getConfig().environment,
2884
+ region: client.getConfig().region,
2677
2885
  timeout: client.getConfig().timeout,
2678
2886
  debug: client.getConfig().debug
2679
2887
  });
@@ -3759,6 +3967,7 @@ class BolticClient {
3759
3967
  this.columnResource = new ColumnResource(this.baseClient);
3760
3968
  this.recordResource = new RecordResource(this.baseClient);
3761
3969
  this.sqlResource = new SqlResource(this.baseClient);
3970
+ this.indexResource = new IndexResource(this.baseClient);
3762
3971
  this.currentDatabase = {
3763
3972
  databaseName: "Default"
3764
3973
  };
@@ -3792,6 +4001,14 @@ class BolticClient {
3792
4001
  delete: (tableName, columnName) => this.columnResource.delete(tableName, columnName)
3793
4002
  };
3794
4003
  }
4004
+ // Direct index operations
4005
+ get indexes() {
4006
+ return {
4007
+ addIndex: (tableName, payload) => this.indexResource.addIndex(tableName, payload),
4008
+ listIndexes: (tableName, query) => this.indexResource.listIndexes(tableName, query),
4009
+ deleteIndex: (tableName, indexName) => this.indexResource.deleteIndex(tableName, indexName)
4010
+ };
4011
+ }
3795
4012
  // Fluent table operations
3796
4013
  table(name) {
3797
4014
  const tableBuilder = createTableBuilder({ name });
@@ -3824,6 +4041,12 @@ class BolticClient {
3824
4041
  record: () => createRecordBuilder({
3825
4042
  tableName,
3826
4043
  recordResource: this.recordResource
4044
+ }),
4045
+ // Indexes - Method 2: Function chaining under from(tableName)
4046
+ indexes: () => ({
4047
+ addIndex: (payload) => this.indexResource.addIndex(tableName, payload),
4048
+ listIndexes: (query) => this.indexResource.listIndexes(tableName, query),
4049
+ deleteIndex: (indexName) => this.indexResource.deleteIndex(tableName, indexName)
3827
4050
  })
3828
4051
  };
3829
4052
  }
@@ -3934,6 +4157,7 @@ class BolticClient {
3934
4157
  this.columnResource = new ColumnResource(this.baseClient);
3935
4158
  this.recordResource = new RecordResource(this.baseClient);
3936
4159
  this.sqlResource = new SqlResource(this.baseClient);
4160
+ this.indexResource = new IndexResource(this.baseClient);
3937
4161
  }
3938
4162
  // Security methods to prevent API key exposure
3939
4163
  toString() {