@polardbx/pxbaas-client 0.0.0-stage → 0.1.0-beta.10

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 (50) hide show
  1. package/README.md +56 -2
  2. package/dist/drivers/apps.driver.d.ts +128 -0
  3. package/dist/drivers/apps.driver.d.ts.map +1 -0
  4. package/dist/drivers/apps.driver.js +90 -0
  5. package/dist/drivers/apps.driver.js.map +1 -0
  6. package/dist/drivers/auth-admin.driver.d.ts +78 -0
  7. package/dist/drivers/auth-admin.driver.d.ts.map +1 -0
  8. package/dist/drivers/auth-admin.driver.js +145 -0
  9. package/dist/drivers/auth-admin.driver.js.map +1 -0
  10. package/dist/drivers/functions.driver.d.ts +75 -0
  11. package/dist/drivers/functions.driver.d.ts.map +1 -0
  12. package/dist/drivers/functions.driver.js +173 -0
  13. package/dist/drivers/functions.driver.js.map +1 -0
  14. package/dist/drivers/meta.driver.d.ts +80 -0
  15. package/dist/drivers/meta.driver.d.ts.map +1 -0
  16. package/dist/drivers/meta.driver.js +198 -0
  17. package/dist/drivers/meta.driver.js.map +1 -0
  18. package/dist/drivers/share-links.driver.d.ts +42 -0
  19. package/dist/drivers/share-links.driver.d.ts.map +1 -0
  20. package/dist/drivers/share-links.driver.js +55 -0
  21. package/dist/drivers/share-links.driver.js.map +1 -0
  22. package/dist/drivers/storage.driver.d.ts +87 -0
  23. package/dist/drivers/storage.driver.d.ts.map +1 -0
  24. package/dist/drivers/storage.driver.js +182 -0
  25. package/dist/drivers/storage.driver.js.map +1 -0
  26. package/dist/drivers/tenant-admin.driver.d.ts +130 -0
  27. package/dist/drivers/tenant-admin.driver.d.ts.map +1 -0
  28. package/dist/drivers/tenant-admin.driver.js +222 -0
  29. package/dist/drivers/tenant-admin.driver.js.map +1 -0
  30. package/dist/drivers/tenant-ddl.driver.d.ts +106 -0
  31. package/dist/drivers/tenant-ddl.driver.d.ts.map +1 -0
  32. package/dist/drivers/tenant-ddl.driver.js +131 -0
  33. package/dist/drivers/tenant-ddl.driver.js.map +1 -0
  34. package/dist/drivers/zero.driver.d.ts +125 -0
  35. package/dist/drivers/zero.driver.d.ts.map +1 -0
  36. package/dist/drivers/zero.driver.js +165 -0
  37. package/dist/drivers/zero.driver.js.map +1 -0
  38. package/dist/errors.d.ts +37 -0
  39. package/dist/errors.d.ts.map +1 -0
  40. package/dist/errors.js +64 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/index.d.ts +27 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +37 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/types.d.ts +26 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +5 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +57 -3
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Functions Driver - Edge Functions Management API client
3
+ *
4
+ * Endpoints:
5
+ * - POST /v1/projects/{ref}/functions/deploy?slug={slug} - Deploy function
6
+ * - GET /v1/projects/{ref}/functions - List functions
7
+ * - GET /v1/projects/{ref}/functions/{slug} - Get function details
8
+ * - DELETE /v1/projects/{ref}/functions/{slug} - Delete function
9
+ */
10
+ import axios from 'axios';
11
+ import FormData from 'form-data';
12
+ import { readFile } from 'node:fs/promises';
13
+ import { basename } from 'node:path';
14
+ export class FunctionsDriver {
15
+ client;
16
+ serviceRoleKey;
17
+ tenantId;
18
+ projectRef;
19
+ constructor(options) {
20
+ this.serviceRoleKey = options.serviceRoleKey;
21
+ this.tenantId = options.tenantId;
22
+ this.projectRef = options.projectRef ?? 'default';
23
+ this.client = axios.create({
24
+ baseURL: `${options.endpoint}/v1/projects/${this.projectRef}`,
25
+ timeout: options.timeout ?? 60000, // 60s for deploy
26
+ headers: {
27
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
28
+ },
29
+ });
30
+ }
31
+ getHeaders() {
32
+ const headers = {
33
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
34
+ };
35
+ // Note: Do NOT include apikey header for Functions Management API
36
+ // Kong will inject X-Tenant-Id from the JWT
37
+ return headers;
38
+ }
39
+ handleError(error) {
40
+ if (axios.isAxiosError(error)) {
41
+ const axiosError = error;
42
+ const status = axiosError.response?.status;
43
+ const data = axiosError.response?.data;
44
+ let message = axiosError.message;
45
+ if (status === 401) {
46
+ message = 'Authentication failed. Please check your service_role key and run "pxbaas login" again.';
47
+ }
48
+ else if (status === 403) {
49
+ message = 'Permission denied. Functions Management API requires service_role key.';
50
+ }
51
+ else if (status === 404) {
52
+ message = 'Function not found. Please check the slug and try again.';
53
+ }
54
+ else if (status === 400) {
55
+ // Common issue: metadata part missing or incorrectly formatted
56
+ const errorMsg = data?.message;
57
+ if (typeof errorMsg === 'string' && errorMsg.includes('metadata')) {
58
+ message = 'Invalid metadata format. Ensure metadata is passed as a form field without filename.';
59
+ }
60
+ else {
61
+ message = typeof errorMsg === 'string' ? errorMsg : 'Bad request';
62
+ }
63
+ }
64
+ else if (data?.message) {
65
+ message = typeof data.message === 'string' ? data.message : String(data.message);
66
+ }
67
+ throw new Error(`Functions API error (${status ?? 'unknown'}): ${message}`);
68
+ }
69
+ throw error;
70
+ }
71
+ /**
72
+ * Deploy a function
73
+ *
74
+ * IMPORTANT: metadata must be passed as a form field WITHOUT filename,
75
+ * not as a file upload. This is a common source of 400 errors.
76
+ */
77
+ async deploy(options) {
78
+ try {
79
+ const formData = new FormData();
80
+ // Prepare metadata (MUST be without filename)
81
+ const metadata = {
82
+ name: options.slug,
83
+ entrypoint_path: options.entrypointPath ?? 'index.ts',
84
+ verify_jwt: options.verifyJwt ?? true,
85
+ };
86
+ // Add metadata as a form field (NOT as a file)
87
+ formData.append('metadata', JSON.stringify(metadata), {
88
+ contentType: 'application/json',
89
+ // IMPORTANT: Do NOT set filename here
90
+ });
91
+ // Add files
92
+ for (const file of options.files) {
93
+ const content = file.content ?? await readFile(file.path, 'utf-8');
94
+ // Preserve nested paths (assets/style.css); fall back to basename.
95
+ const filename = file.relativePath ?? basename(file.path);
96
+ formData.append('file', content, {
97
+ // form-data basenames a custom `filename` (lib/form_data.js
98
+ // `_getContentDisposition`), which flattens nested artifact paths such as
99
+ // `frontend/dist/index.html` and makes the Management API reject the
100
+ // candidate. `filepath` is normalized instead, so the nesting survives.
101
+ // Both options serialize to the same `Content-Disposition` header.
102
+ ...(filename.includes('/')
103
+ ? { filepath: filename }
104
+ : { filename }),
105
+ contentType: this.getContentType(filename),
106
+ });
107
+ }
108
+ const response = await this.client.post(`/functions/deploy`, formData, {
109
+ headers: {
110
+ ...this.getHeaders(),
111
+ ...formData.getHeaders(),
112
+ },
113
+ params: {
114
+ slug: options.slug,
115
+ },
116
+ });
117
+ return response.data;
118
+ }
119
+ catch (error) {
120
+ this.handleError(error);
121
+ }
122
+ }
123
+ /**
124
+ * List all deployed functions
125
+ */
126
+ async list() {
127
+ try {
128
+ const response = await this.client.get('/functions', { headers: this.getHeaders() });
129
+ return response.data ?? [];
130
+ }
131
+ catch (error) {
132
+ this.handleError(error);
133
+ }
134
+ }
135
+ /**
136
+ * Get function details
137
+ */
138
+ async get(slug) {
139
+ try {
140
+ const response = await this.client.get(`/functions/${slug}`, { headers: this.getHeaders() });
141
+ return response.data;
142
+ }
143
+ catch (error) {
144
+ this.handleError(error);
145
+ }
146
+ }
147
+ /**
148
+ * Delete a function
149
+ */
150
+ async delete(slug) {
151
+ try {
152
+ await this.client.delete(`/functions/${slug}`, { headers: this.getHeaders() });
153
+ }
154
+ catch (error) {
155
+ this.handleError(error);
156
+ }
157
+ }
158
+ /**
159
+ * Get content type based on file extension
160
+ */
161
+ getContentType(filename) {
162
+ const ext = filename.split('.').pop()?.toLowerCase();
163
+ const contentTypes = {
164
+ 'ts': 'application/typescript',
165
+ 'js': 'application/javascript',
166
+ 'json': 'application/json',
167
+ 'md': 'text/markdown',
168
+ 'txt': 'text/plain',
169
+ };
170
+ return contentTypes[ext ?? ''] ?? 'application/octet-stream';
171
+ }
172
+ }
173
+ //# sourceMappingURL=functions.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.driver.js","sourceRoot":"","sources":["../../src/drivers/functions.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Meta API Driver - PolarDB-X BaaS 元数据 API 客户端
3
+ *
4
+ * Endpoints:
5
+ * - POST /pg/query - Execute SQL query
6
+ * - GET /pg/tables - List tables
7
+ * - GET /pg/tables/{table}/columns - Get table columns
8
+ * - GET /pg/tables/{table}/indexes - Get table indexes
9
+ * - GET /pg/types - Get data types
10
+ */
11
+ export interface QueryResult {
12
+ rows: Record<string, unknown>[];
13
+ rowCount: number;
14
+ fields?: Array<{
15
+ name: string;
16
+ dataType: string;
17
+ }>;
18
+ }
19
+ export interface TableColumn {
20
+ name: string;
21
+ dataType: string;
22
+ isNullable: boolean;
23
+ defaultValue: string | null;
24
+ isPrimaryKey: boolean;
25
+ comment?: string;
26
+ }
27
+ export interface TableIndex {
28
+ name: string;
29
+ columns: string[];
30
+ isUnique: boolean;
31
+ isPrimary: boolean;
32
+ type: string;
33
+ }
34
+ export interface TableInfo {
35
+ schema: string;
36
+ name: string;
37
+ type: 'table' | 'view';
38
+ rowCount?: number;
39
+ comment?: string;
40
+ }
41
+ export interface MetaDriverOptions {
42
+ endpoint: string;
43
+ anonKey: string;
44
+ serviceRoleKey?: string;
45
+ tenantId?: string;
46
+ timeout?: number;
47
+ /** Append method/url/status/response-body to thrown errors (CLI `--debug`). */
48
+ debug?: boolean;
49
+ }
50
+ export declare class MetaDriver {
51
+ private client;
52
+ private anonKey;
53
+ private serviceRoleKey?;
54
+ private tenantId?;
55
+ private debug;
56
+ constructor(options: MetaDriverOptions);
57
+ private getHeaders;
58
+ private handleError;
59
+ /**
60
+ * Execute SQL query
61
+ */
62
+ query(sql: string, useServiceRole?: boolean): Promise<QueryResult>;
63
+ /**
64
+ * List all tables in the database
65
+ */
66
+ listTables(useServiceRole?: boolean, schema?: string): Promise<TableInfo[]>;
67
+ /**
68
+ * Get table columns
69
+ */
70
+ getTableColumns(tableName: string, schema?: string, useServiceRole?: boolean): Promise<TableColumn[]>;
71
+ /**
72
+ * Get table indexes
73
+ */
74
+ getTableIndexes(tableName: string, schema?: string, useServiceRole?: boolean): Promise<TableIndex[]>;
75
+ /**
76
+ * Get database data types
77
+ */
78
+ getTypes(useServiceRole?: boolean): Promise<Record<string, string>>;
79
+ }
80
+ //# sourceMappingURL=meta.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiCD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;gBAEX,OAAO,EAAE,iBAAiB;IAetC,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAa/E;;OAEG;IACG,UAAU,CAAC,cAAc,GAAE,OAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBvF;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,EAAE,cAAc,GAAE,OAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAuB3H;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,EAAE,cAAc,GAAE,OAAc,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB1H;;OAEG;IACG,QAAQ,CAAC,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAgBjF"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Meta API Driver - PolarDB-X BaaS 元数据 API 客户端
3
+ *
4
+ * Endpoints:
5
+ * - POST /pg/query - Execute SQL query
6
+ * - GET /pg/tables - List tables
7
+ * - GET /pg/tables/{table}/columns - Get table columns
8
+ * - GET /pg/tables/{table}/indexes - Get table indexes
9
+ * - GET /pg/types - Get data types
10
+ */
11
+ import axios from 'axios';
12
+ import { formatApiError } from '../errors.js';
13
+ /**
14
+ * PG-Meta returns BARE JSON arrays (pg-meta style), not a {data,error} envelope.
15
+ * Normalize either shape into a QueryResult.
16
+ */
17
+ function toQueryResult(body) {
18
+ if (Array.isArray(body)) {
19
+ const rows = body;
20
+ return {
21
+ rows,
22
+ rowCount: rows.length,
23
+ fields: rows.length > 0 ? Object.keys(rows[0]).map((name) => ({ name, dataType: 'unknown' })) : [],
24
+ };
25
+ }
26
+ const wrapped = body;
27
+ if (wrapped && typeof wrapped === 'object') {
28
+ if (wrapped.error)
29
+ throw new Error(`Query failed: ${wrapped.error}`);
30
+ if (wrapped.data)
31
+ return wrapped.data;
32
+ }
33
+ return { rows: [], rowCount: 0 };
34
+ }
35
+ function unwrapArray(body) {
36
+ if (Array.isArray(body))
37
+ return body;
38
+ const wrapped = body;
39
+ if (wrapped && typeof wrapped === 'object') {
40
+ if (wrapped.error)
41
+ throw new Error(String(wrapped.error));
42
+ return wrapped.data ?? [];
43
+ }
44
+ return [];
45
+ }
46
+ export class MetaDriver {
47
+ client;
48
+ anonKey;
49
+ serviceRoleKey;
50
+ tenantId;
51
+ debug;
52
+ constructor(options) {
53
+ this.anonKey = options.anonKey;
54
+ this.serviceRoleKey = options.serviceRoleKey;
55
+ this.tenantId = options.tenantId;
56
+ this.debug = options.debug ?? false;
57
+ this.client = axios.create({
58
+ baseURL: `${options.endpoint}/pg`,
59
+ timeout: options.timeout ?? 30000,
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ },
63
+ });
64
+ }
65
+ getHeaders(useServiceRole = false) {
66
+ // Kong identifies the consumer via the `apikey` header (key-auth) and forwards
67
+ // `Authorization` downstream for JWT verification; both MUST carry the SAME key.
68
+ // Sending apikey=anon with Authorization=service_role makes Kong see the anon
69
+ // consumer, so admin-ACL routes like /pg/ return 403. Use one key for both.
70
+ const key = useServiceRole && this.serviceRoleKey ? this.serviceRoleKey : this.anonKey;
71
+ const headers = {
72
+ 'apikey': key,
73
+ 'Authorization': `Bearer ${key}`,
74
+ };
75
+ if (this.tenantId) {
76
+ headers['X-Tenant-Id'] = this.tenantId;
77
+ }
78
+ return headers;
79
+ }
80
+ handleError(error) {
81
+ if (axios.isAxiosError(error)) {
82
+ const axiosError = error;
83
+ const config = axiosError.config;
84
+ const data = axiosError.response?.data;
85
+ formatApiError('Meta', {
86
+ status: axiosError.response?.status,
87
+ data,
88
+ fallbackMessage: axiosError.message,
89
+ debug: this.debug
90
+ ? {
91
+ method: config?.method,
92
+ url: `${config?.baseURL ?? ''}${config?.url ?? ''}`,
93
+ responseBody: data === undefined ? undefined : JSON.stringify(data),
94
+ }
95
+ : undefined,
96
+ }, {
97
+ statusTexts: {
98
+ 401: 'Authentication failed. Please check your API keys and run "pxbaas login" again.',
99
+ 403: 'Permission denied. You may need service_role key for this operation.',
100
+ 404: 'Resource not found. Please check the table name and try again.',
101
+ },
102
+ });
103
+ }
104
+ throw error;
105
+ }
106
+ /**
107
+ * Execute SQL query
108
+ */
109
+ async query(sql, useServiceRole = false) {
110
+ try {
111
+ const response = await this.client.post('/query', { query: sql }, { headers: this.getHeaders(useServiceRole) });
112
+ return toQueryResult(response.data);
113
+ }
114
+ catch (error) {
115
+ this.handleError(error);
116
+ }
117
+ }
118
+ /**
119
+ * List all tables in the database
120
+ */
121
+ async listTables(useServiceRole = true, schema) {
122
+ try {
123
+ const response = await this.client.get('/tables', { headers: this.getHeaders(useServiceRole) });
124
+ const arr = unwrapArray(response.data);
125
+ const mapped = arr.map((t) => ({
126
+ schema: String(t.schema ?? 'public'),
127
+ name: String(t.name ?? t.table_name ?? ''),
128
+ type: (t.type === 'view' || t.table_type === 'VIEW') ? 'view' : 'table',
129
+ rowCount: t.live_rows_estimate != null ? Number(t.live_rows_estimate) : undefined,
130
+ comment: t.comment != null ? String(t.comment) : undefined,
131
+ }));
132
+ return schema ? mapped.filter((t) => t.schema === schema) : mapped;
133
+ }
134
+ catch (error) {
135
+ this.handleError(error);
136
+ }
137
+ }
138
+ /**
139
+ * Get table columns
140
+ */
141
+ async getTableColumns(tableName, schema = 'public', useServiceRole = true) {
142
+ // Use information_schema via /pg/query (reliable, schema-filtered) instead of
143
+ // the pg-meta /tables/{schema}.{table}/columns path (404 on this deployment).
144
+ const sql = `SELECT column_name AS name, data_type AS dataType, ` +
145
+ `CASE WHEN is_nullable='YES' THEN 1 ELSE 0 END AS isNullable, ` +
146
+ `column_default AS defaultValue, ` +
147
+ `CASE WHEN column_key='PRI' THEN 1 ELSE 0 END AS isPrimaryKey, ` +
148
+ `column_comment AS comment ` +
149
+ `FROM information_schema.columns ` +
150
+ `WHERE table_schema='${schema.replace(/'/g, "''")}' AND table_name='${tableName.replace(/'/g, "''")}' ` +
151
+ `ORDER BY ordinal_position`;
152
+ const r = await this.query(sql, useServiceRole);
153
+ return r.rows.map((row) => ({
154
+ name: String(row.name),
155
+ dataType: String(row.dataType),
156
+ isNullable: row.isNullable === 1 || row.isNullable === true,
157
+ defaultValue: row.defaultValue == null ? null : String(row.defaultValue),
158
+ isPrimaryKey: row.isPrimaryKey === 1 || row.isPrimaryKey === true,
159
+ comment: row.comment != null && row.comment !== '' ? String(row.comment) : undefined,
160
+ }));
161
+ }
162
+ /**
163
+ * Get table indexes
164
+ */
165
+ async getTableIndexes(tableName, schema = 'public', useServiceRole = true) {
166
+ const sql = `SELECT index_name AS name, ` +
167
+ `GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols, ` +
168
+ `CASE WHEN MIN(non_unique)=0 THEN 1 ELSE 0 END AS isUnique, ` +
169
+ `CASE WHEN index_name='PRIMARY' THEN 1 ELSE 0 END AS isPrimary ` +
170
+ `FROM information_schema.statistics ` +
171
+ `WHERE table_schema='${schema.replace(/'/g, "''")}' AND table_name='${tableName.replace(/'/g, "''")}' ` +
172
+ `GROUP BY index_name`;
173
+ const r = await this.query(sql, useServiceRole);
174
+ return r.rows.map((row) => ({
175
+ name: String(row.name),
176
+ columns: row.cols != null && row.cols !== '' ? String(row.cols).split(',') : [],
177
+ isUnique: row.isUnique === 1 || row.isUnique === true,
178
+ isPrimary: row.isPrimary === 1 || row.isPrimary === true,
179
+ type: 'BTREE',
180
+ }));
181
+ }
182
+ /**
183
+ * Get database data types
184
+ */
185
+ async getTypes(useServiceRole = false) {
186
+ try {
187
+ const response = await this.client.get('/types', { headers: this.getHeaders(useServiceRole) });
188
+ if (response.data.error) {
189
+ throw new Error(`Get types failed: ${response.data.error}`);
190
+ }
191
+ return response.data.data ?? {};
192
+ }
193
+ catch (error) {
194
+ this.handleError(error);
195
+ }
196
+ }
197
+ }
198
+ //# sourceMappingURL=meta.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.driver.js","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export type ShareLinkStatus = 'ACTIVE' | 'REVOKED' | 'EXPIRED';
2
+ export interface ShareLink {
3
+ id: string;
4
+ mount_id: string;
5
+ tenant_id: string;
6
+ function_slug: string;
7
+ status: ShareLinkStatus;
8
+ expires_at: string;
9
+ max_uses: number | null;
10
+ used_count: number;
11
+ session_generation: number;
12
+ created_by: string | null;
13
+ used_at: string | null;
14
+ revoked_at: string | null;
15
+ created_at: string;
16
+ updated_at: string;
17
+ }
18
+ /** Only create returns this short-lived capability; list/get/revoke never do. */
19
+ export interface CreatedShareLink extends ShareLink {
20
+ ticket: string;
21
+ }
22
+ export interface ShareLinksDriverOptions {
23
+ endpoint: string;
24
+ serviceRoleKey: string;
25
+ projectRef?: string;
26
+ timeout?: number;
27
+ }
28
+ export declare class ShareLinksDriver {
29
+ private readonly client;
30
+ constructor(options: ShareLinksDriverOptions);
31
+ create(functionSlug: string, options: {
32
+ expiresAt?: string;
33
+ expiresInSeconds?: number;
34
+ maxUses?: number;
35
+ tenantId?: string;
36
+ }): Promise<CreatedShareLink>;
37
+ list(functionSlug: string, tenantId?: string): Promise<ShareLink[]>;
38
+ get(functionSlug: string, shareId: string, tenantId?: string): Promise<ShareLink>;
39
+ revoke(functionSlug: string, shareId: string, tenantId?: string): Promise<ShareLink>;
40
+ private request;
41
+ }
42
+ //# sourceMappingURL=share-links.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-links.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AAE9D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,OAAO,EAAE,uBAAuB;IAQtC,MAAM,CACV,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GACA,OAAO,CAAC,gBAAgB,CAAC;IActB,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASnE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAUjF,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAU5E,OAAO;CAgBtB"}
@@ -0,0 +1,55 @@
1
+ import axios from 'axios';
2
+ import { formatApiError } from '../errors.js';
3
+ export class ShareLinksDriver {
4
+ client;
5
+ constructor(options) {
6
+ this.client = axios.create({
7
+ baseURL: `${options.endpoint.replace(/\/$/, '')}/v1/projects/${options.projectRef ?? 'default'}`,
8
+ timeout: options.timeout ?? 30_000,
9
+ headers: { Authorization: `Bearer ${options.serviceRoleKey}` },
10
+ });
11
+ }
12
+ async create(functionSlug, options) {
13
+ const response = await this.request(() => this.client.post(`/functions/${encodeURIComponent(functionSlug)}/shares`, {
14
+ ...(options.expiresAt ? { expires_at: options.expiresAt } : {}),
15
+ ...(options.expiresInSeconds !== undefined
16
+ ? { expires_in_seconds: options.expiresInSeconds }
17
+ : {}),
18
+ ...(options.maxUses !== undefined ? { max_uses: options.maxUses } : {}),
19
+ ...(options.tenantId ? { tenant_id: options.tenantId } : {}),
20
+ }));
21
+ return response.data;
22
+ }
23
+ async list(functionSlug, tenantId) {
24
+ const response = await this.request(() => this.client.get(`/functions/${encodeURIComponent(functionSlug)}/shares`, {
25
+ params: tenantId ? { tenant_id: tenantId } : undefined,
26
+ }));
27
+ return response.data.shares ?? [];
28
+ }
29
+ async get(functionSlug, shareId, tenantId) {
30
+ const response = await this.request(() => this.client.get(`/functions/${encodeURIComponent(functionSlug)}/shares/${encodeURIComponent(shareId)}`, { params: tenantId ? { tenant_id: tenantId } : undefined }));
31
+ return response.data;
32
+ }
33
+ async revoke(functionSlug, shareId, tenantId) {
34
+ const response = await this.request(() => this.client.post(`/functions/${encodeURIComponent(functionSlug)}/shares/${encodeURIComponent(shareId)}/revoke`, tenantId ? { tenant_id: tenantId } : {}));
35
+ return response.data;
36
+ }
37
+ async request(operation) {
38
+ try {
39
+ return await operation();
40
+ }
41
+ catch (error) {
42
+ if (axios.isAxiosError(error)) {
43
+ const axiosError = error;
44
+ const data = axiosError.response?.data;
45
+ formatApiError('Share', {
46
+ status: axiosError.response?.status,
47
+ data,
48
+ fallbackMessage: axiosError.message,
49
+ });
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=share-links.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-links.driver.js","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"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"}